From ad79740b4dce8aa24ff7b11aa636cf966025de19 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sun, 22 Jun 2025 09:16:57 -0600 Subject: [PATCH 01/16] Introduce native-generic switch --- .gitea/workflows/ci.yml | 10 ++- src/compiler.bbb | 188 +++++++++++++++++++++++++--------------- src/compiler.cpp | 47 +++++++--- src/compiler.hpp | 2 + src/emitter.cpp | 18 ++-- 5 files changed, 174 insertions(+), 91 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5df8b3d..5d26db2 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -53,7 +53,8 @@ jobs: run: | set -eux mkdir -p $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) - cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) + cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic + cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/native/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native - name: Release (locally) if: ${{ (github.ref == 'refs/heads/main') }} shell: bash @@ -61,8 +62,8 @@ jobs: BB_CI: 1 run: | set -eux - cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler $HOME/bloat-buster-artifacts/releases/main/ - + cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic $HOME/bloat-buster-artifacts/releases/main/ + cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native $HOME/bloat-buster-artifacts/releases/main/ - name: Release (web) uses: akkuman/gitea-release-action@v1 if: ${{ (github.ref == 'refs/heads/main') }} @@ -70,4 +71,5 @@ jobs: NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18 with: files: |- - /home/act_runner/bloat-buster-artifacts/releases/main/compiler + /home/act_runner/bloat-buster-artifacts/releases/main/compiler_generic + /home/act_runner/bloat-buster-artifacts/releases/main/compiler_native diff --git a/src/compiler.bbb b/src/compiler.bbb index 620797f..d31a008 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -1012,6 +1012,7 @@ CompileFile = struct relative_file_path: []u8, build_mode: BuildMode, has_debug_info: u1, + host_cpu_model: u1, silent: u1, } @@ -1031,11 +1032,16 @@ Target = struct { cpu: CPUArchitecture, os: OperatingSystem, + host_cpu_model: u1, } -target_get_native = fn () Target +target_get_native = fn (host_cpu_model: u1) Target { - return { .cpu = .x86_64, .os = .linux }; + return { + .cpu = .x86_64, + .os = .linux, + .host_cpu_model = host_cpu_model, + }; } target_compare = fn (a: Target, b: Target) u1 @@ -12704,6 +12710,16 @@ enter_struct_pointer_for_coerced_access = fn (module: &Module, source_value: &LL } } +coerce_integer_or_pointer_to_integer_or_pointer = fn (module: &Module, source: &LLVMValue, source_type: &Type, destination_type: &Type) &LLVMValue +{ + if (source_type != destination_type) + { + #trap(); + } + + return source; +} + create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_type: &Type, destination_value: &LLVMValue, destination_type: &Type, destination_size: u64, destination_volatile: u1) void { >source_size = get_byte_size(source_type); @@ -12758,7 +12774,14 @@ create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_typ } else if (type_is_integer_backing(source_type)) { - #trap(); + >int_type = integer_type(module, { .bit_count = destination_size * 8, .signed = 0 }); + >value = coerce_integer_or_pointer_to_integer_or_pointer(module, source_value, source_type, int_type); + create_store(module, { + .source = value, + .destination = destination_value, + .type = int_type, + zero, + }); } else { @@ -12786,11 +12809,6 @@ create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_typ } } -coerce_integer_or_pointer_to_integer_or_pointer = fn (module: &Module, source: &LLVMValue, source_type: &Type, destination_type: &Type) &LLVMValue -{ - #trap(); -} - create_coerced_load = fn (module: &Module, source: &LLVMValue, source_type: &Type, destination_type: &Type) &LLVMValue { >result: &LLVMValue = zero; @@ -17179,11 +17197,20 @@ emit = fn (module: &Module) void >cpu_model: &u8 = zero; >cpu_features: &u8 = zero; - if (target_compare(module.target, target_get_native())) + if (target_compare(module.target, target_get_native(module.target.host_cpu_model))) { target_triple = host_target_triple; - cpu_model = host_cpu_model; - cpu_features = host_cpu_features; + + if (module.target.host_cpu_model) + { + cpu_model = host_cpu_model; + cpu_features = host_cpu_features; + } + else + { + cpu_model = "generic"; + cpu_features = ""; + } } else { @@ -18273,30 +18300,45 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >base_name = relative_file_path[base_start..extension_start]; >is_compiler = string_equal(relative_file_path, "src/compiler.bbb"); + + os_make_directory(base_cache_dir.pointer); + >base_dir = arena_join_string(arena, [ base_cache_dir, "/", - #enum_name(#build_mode), - "_", - #select(#has_debug_info(), "di", "nodi"), - ][..]); - >outputh_path_dir = arena_join_string(arena, [ - base_dir, - #select(is_compiler, "/compiler/", "/"), - #enum_name(compile_options.build_mode), - "_", - #select(compile_options.has_debug_info, "di", "nodi"), + #select(compile_options.host_cpu_model, "native", "generic"), + ][..]); + + os_make_directory(base_dir.pointer); + + base_dir = arena_join_string(arena, [ + base_dir, + "/", + #enum_name(#build_mode), + "_", + #select(#has_debug_info(), "di", "nodi"), ][..]); - os_make_directory(base_cache_dir.pointer); os_make_directory(base_dir.pointer); if (is_compiler) { - >compiler_dir = arena_join_string(arena, [ base_dir, "/compiler" ][..]); - os_make_directory(compiler_dir.pointer); + base_dir = arena_join_string(arena, [ + base_dir, + "/compiler", + ][..]); + + os_make_directory(base_dir.pointer); } + >outputh_path_dir = arena_join_string(arena, [ + base_dir, + "/", + #enum_name(compile_options.build_mode), + "_", + #select(compile_options.has_debug_info, "di", "nodi"), + ][..]); + os_make_directory(outputh_path_dir.pointer); >outputh_path_base = arena_join_string(arena, [ outputh_path_dir, "/", base_name ][..]); @@ -18456,7 +18498,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 .content = file_content, .path = file_path, .has_debug_info = compile_options.has_debug_info, - .target = target_get_native(), + .target = target_get_native(compile_options.host_cpu_model), .silent = compile_options.silent, }; @@ -18608,6 +18650,7 @@ names: [_][]u8 = } >debug_info_array: [_]u1 = [1, 0]; + >is_host_cpu_model_array: [_]u1 = [1, 0]; >command = command_string_to_enum.enum_value; @@ -18661,6 +18704,7 @@ names: [_][]u8 = compile_file(arena, { .relative_file_path = relative_file_path, .build_mode = build_mode, + .host_cpu_model = 0, .has_debug_info = has_debug_info, .silent = 0, }, envp); @@ -18673,6 +18717,47 @@ names: [_][]u8 = } for (name: names) + { + for (is_host_cpu_model: is_host_cpu_model_array) + { + for (build_mode: #enum_values(BuildMode)) + { + for (has_debug_info: debug_info_array) + { + >position = arena.position; + + >relative_file_path = arena_join_string(arena, [ "tests/", name, ".bbb" ][..]); + >executable_path = compile_file(arena, { + .relative_file_path = relative_file_path, + .build_mode = build_mode, + .has_debug_info = has_debug_info, + .host_cpu_model = is_host_cpu_model, + .silent = 1, + }, envp); + + >arguments: [_]&u8 = [ + executable_path.pointer, + zero, + ]; + >args = arguments[..arguments.length - 1]; + >execution = os_execute(arena, args, envp, zero); + + >success = execution.termination_kind == .exit and execution.termination_code == 0; + + if (!success) + { + #trap(); + } + + arena.position = position; + } + } + } + } + }, + .reproduce => + { + for (is_host_cpu_model: is_host_cpu_model_array) { for (build_mode: #enum_values(BuildMode)) { @@ -18680,16 +18765,20 @@ names: [_][]u8 = { >position = arena.position; - >relative_file_path = arena_join_string(arena, [ "tests/", name, ".bbb" ][..]); + // Produce the compiler + >relative_file_path = "src/compiler.bbb"; >executable_path = compile_file(arena, { - .relative_file_path = relative_file_path, - .build_mode = build_mode, - .has_debug_info = has_debug_info, - .silent = 1, - }, envp); + .relative_file_path = relative_file_path, + .host_cpu_model = is_host_cpu_model, + .build_mode = build_mode, + .has_debug_info = has_debug_info, + .silent = 1, + }, envp); + // Test the compiler >arguments: [_]&u8 = [ executable_path.pointer, + "test", zero, ]; >args = arguments[..arguments.length - 1]; @@ -18707,43 +18796,6 @@ names: [_][]u8 = } } }, - .reproduce => - { - for (build_mode: #enum_values(BuildMode)) - { - for (has_debug_info: debug_info_array) - { - >position = arena.position; - - // Produce the compiler - >relative_file_path = "src/compiler.bbb"; - >executable_path = compile_file(arena, { - .relative_file_path = relative_file_path, - .build_mode = build_mode, - .has_debug_info = has_debug_info, - .silent = 1, - }, envp); - - // Test the compiler - >arguments: [_]&u8 = [ - executable_path.pointer, - "test", - zero, - ]; - >args = arguments[..arguments.length - 1]; - >execution = os_execute(arena, args, envp, zero); - - >success = execution.termination_kind == .exit and execution.termination_code == 0; - - if (!success) - { - #trap(); - } - - arena.position = position; - } - } - }, } return 0; diff --git a/src/compiler.cpp b/src/compiler.cpp index 876235a..73076bb 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -163,22 +163,39 @@ fn String compile_file(Arena* arena, Compile options) auto is_compiler = relative_file_path.equal(string_literal("src/compiler.bbb")); - String output_path_dir_parts[] = { + make_directory(base_cache_dir); + + String cpu_dir_parts[] = { string_literal(base_cache_dir), - is_compiler ? string_literal("/compiler/") : string_literal("/"), + string_literal("/"), + options.host_cpu_model ? string_literal("native") : string_literal("generic"), + }; + + auto cpu_dir = arena_join_string(arena, array_to_slice(cpu_dir_parts)); + + make_directory(cstr(cpu_dir)); + + auto base_dir = cpu_dir; + + if (is_compiler) + { + String compiler_dir_parts[] = { + base_dir, + string_literal("/compiler"), + }; + base_dir = arena_join_string(arena, array_to_slice(compiler_dir_parts)); + make_directory(cstr(base_dir)); + } + + String output_path_dir_parts[] = { + base_dir, + string_literal("/"), build_mode_to_string(options.build_mode), string_literal("_"), options.has_debug_info ? string_literal("di") : string_literal("nodi"), }; auto output_path_dir = arena_join_string(arena, array_to_slice(output_path_dir_parts)); - make_directory(base_cache_dir); - - if (is_compiler) - { - make_directory(base_cache_dir "/compiler"); - } - make_directory(cstr(output_path_dir)); String output_path_base_parts[] = { @@ -341,6 +358,7 @@ fn String compile_file(Arena* arena, Compile options) .target = { .cpu = CPUArchitecture::x86_64, .os = OperatingSystem::linux_, + .host_cpu_model = options.host_cpu_model, }, .build_mode = options.build_mode, .has_debug_info = options.has_debug_info, @@ -583,6 +601,7 @@ void entry_point(Slice arguments, Slice envp) } bool has_debug_info_array[] = {true, false}; + bool is_host_cpu_model_array[] = {true, false}; for (auto name: names) { @@ -596,11 +615,11 @@ void entry_point(Slice arguments, Slice envp) auto relative_file_path = arena_join_string(arena, array_to_slice(relative_file_path_parts)); auto executable_path = compile_file(arena, { - .relative_file_path = relative_file_path, - .build_mode = build_mode, - .has_debug_info = has_debug_info, - .silent = true, - }); + .relative_file_path = relative_file_path, + .build_mode = build_mode, + .has_debug_info = has_debug_info, + .silent = true, + }); char* const arguments[] = { diff --git a/src/compiler.hpp b/src/compiler.hpp index 56962e0..50836dd 100644 --- a/src/compiler.hpp +++ b/src/compiler.hpp @@ -247,6 +247,7 @@ struct Target { CPUArchitecture cpu; OperatingSystem os; + bool host_cpu_model; }; fn Target target_get_native() @@ -270,6 +271,7 @@ struct Compile String relative_file_path; BuildMode build_mode; bool has_debug_info; + bool host_cpu_model; bool silent; }; diff --git a/src/emitter.cpp b/src/emitter.cpp index 48c1448..42dd043 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -416,15 +416,23 @@ fn void llvm_initialize(Module* module) module->scope.llvm = di_compile_unit; } - char* target_triple = {}; - char* cpu_model = {}; - char* cpu_features = {}; + const char* target_triple = {}; + const char* cpu_model = {}; + const char* cpu_features = {}; if (target_compare(module->target, target_get_native())) { target_triple = llvm_global.host_triple; - cpu_model = llvm_global.host_cpu_model; - cpu_features = llvm_global.host_cpu_features; + if (module->target.host_cpu_model) + { + cpu_model = llvm_global.host_cpu_model; + cpu_features = llvm_global.host_cpu_features; + } + else + { + cpu_model = "generic"; + cpu_features = ""; + } } else { -- 2.43.0 From a6cd3bf713b3c5748a2135278243b879a1305654 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sun, 22 Jun 2025 14:08:24 -0600 Subject: [PATCH 02/16] Pass cpu model option --- src/compiler.bbb | 20 +++++++++++++++++++- src/compiler.cpp | 21 ++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/compiler.bbb b/src/compiler.bbb index d31a008..0ed37e1 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -18665,6 +18665,7 @@ names: [_][]u8 = >build_mode: BuildMode = .debug_none; >has_debug_info: u1 = 1; + >is_host_cpu_model: u1 = 1; if (argument_count >= 4) { @@ -18693,6 +18694,23 @@ names: [_][]u8 = } } + if (argument_count >= 6) + { + >is_host_cpu_model_string = c_string_to_slice(arguments[5]); + if (string_equal(is_host_cpu_model_string, "true")) + { + is_host_cpu_model = 1; + } + else if (string_equal(is_host_cpu_model_string, "false")) + { + is_host_cpu_model = 0; + } + else + { + return 1; + } + } + >relative_file_path_pointer = arguments[2]; if (!relative_file_path_pointer) { @@ -18704,7 +18722,7 @@ names: [_][]u8 = compile_file(arena, { .relative_file_path = relative_file_path, .build_mode = build_mode, - .host_cpu_model = 0, + .host_cpu_model = is_host_cpu_model, .has_debug_info = has_debug_info, .silent = 0, }, envp); diff --git a/src/compiler.cpp b/src/compiler.cpp index 73076bb..53b871e 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -535,6 +535,7 @@ void entry_point(Slice arguments, Slice envp) auto build_mode = BuildMode::debug_none; auto has_debug_info = true; + auto is_host_cpu_model = true; if (arguments.length >= 4) { @@ -583,12 +584,30 @@ void entry_point(Slice arguments, Slice envp) } } + if (arguments.length >= 6) + { + auto is_host_cpu_model_string = c_string_to_slice(arguments[5]); + if (is_host_cpu_model_string.equal(string_literal("true"))) + { + is_host_cpu_model = true; + } + else if (is_host_cpu_model_string.equal(string_literal("false"))) + { + is_host_cpu_model = false; + } + else + { + bb_fail_with_message(string_literal("Wrong value for is_host_cpu_model\n")); + } + } + auto relative_file_path = c_string_to_slice(arguments[2]); compile_file(arena, { .relative_file_path = relative_file_path, .build_mode = build_mode, .has_debug_info = has_debug_info, + .host_cpu_model = is_host_cpu_model, .silent = false, }); } break; @@ -601,7 +620,6 @@ void entry_point(Slice arguments, Slice envp) } bool has_debug_info_array[] = {true, false}; - bool is_host_cpu_model_array[] = {true, false}; for (auto name: names) { @@ -649,6 +667,7 @@ void entry_point(Slice arguments, Slice envp) .relative_file_path = string_literal("src/compiler.bbb"), .build_mode = compiler_build_mode, .has_debug_info = compiler_has_debug_info, + .host_cpu_model = true, .silent = true, }); -- 2.43.0 From 640c4ed37259afc2cbb6429f1ef949cd15bcbf6d Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sun, 22 Jun 2025 15:58:31 -0600 Subject: [PATCH 03/16] Rewrite tests to be more efficient --- src/compiler.bbb | 122 +- src/compiler.cpp | 126 +- tests/abi_enum_bool.bbb | 36 - tests/argv.bbb | 13 - tests/assignment_operators.bbb | 35 - tests/basic_array.bbb | 5 - tests/basic_bool_call.bbb | 16 - tests/basic_branch.bbb | 12 - tests/basic_call.bbb | 9 - tests/basic_enum.bbb | 18 - tests/basic_macro.bbb | 11 - tests/basic_pointer.bbb | 6 - tests/basic_shortcircuiting_if.bbb | 12 - tests/basic_slice.bbb | 22 - tests/basic_string.bbb | 16 - tests/basic_struct_passing.bbb | 140 -- tests/basic_switch.bbb | 26 - tests/basic_union.bbb | 15 - tests/basic_varargs.bbb | 29 - tests/basic_while.bbb | 38 - tests/bits.bbb | 18 - tests/bits_no_backing_type.bbb | 13 - tests/bits_return_u1.bbb | 17 - tests/bits_zero.bbb | 35 - tests/bool_array.bbb | 12 - tests/bool_pair.bbb | 18 - tests/break_continue.bbb | 31 - tests/byte_size.bbb | 6 - tests/c_abi.bbb | 539 ------ tests/c_abi0.bbb | 20 - tests/c_abi1.bbb | 18 - tests/c_function_pointer.bbb | 7 - tests/c_med_struct_ints.bbb | 51 - tests/c_ret_struct_array.bbb | 27 - tests/c_split_struct_ints.bbb | 36 - tests/c_string_to_slice.bbb | 33 - tests/c_struct_with_array.bbb | 26 - tests/comments.bbb | 7 - tests/comparison.bbb | 14 - tests/concat_logical_or.bbb | 9 - tests/constant_add.bbb | 4 - tests/constant_and.bbb | 4 - tests/constant_div.bbb | 4 - tests/constant_global_reference.bbb | 7 - tests/constant_mul.bbb | 4 - tests/constant_or.bbb | 4 - tests/constant_rem.bbb | 4 - tests/constant_shift_left.bbb | 4 - tests/constant_shift_right.bbb | 4 - tests/constant_sub.bbb | 5 - tests/constant_xor.bbb | 4 - tests/else_if.bbb | 16 - tests/else_if_complicated.bbb | 37 - tests/empty_if.bbb | 12 - tests/enum_arbitrary_abi.bbb | 22 - tests/enum_array.bbb | 22 - tests/enum_debug_info.bbb | 38 - tests/enum_name.bbb | 24 - tests/extend.bbb | 5 - tests/extern.bbb | 5 - tests/field_access_left_assign.bbb | 24 - tests/field_parent_pointer.bbb | 43 - tests/for_each.bbb | 32 - tests/for_each_int.bbb | 10 - tests/forward_declared_type.bbb | 17 - tests/function_pointer.bbb | 10 - tests/generic_macro.bbb | 11 - tests/generic_pointer_array.bbb | 15 - tests/generic_pointer_macro.bbb | 25 - tests/global.bbb | 5 - tests/global_struct.bbb | 28 - tests/if_no_else.bbb | 9 - tests/if_no_else_void.bbb | 14 - tests/indirect.bbb | 45 - tests/indirect_struct.bbb | 46 - tests/indirect_varargs.bbb | 62 - tests/integer_formats.bbb | 7 - tests/integer_hex.bbb | 5 - tests/integer_max.bbb | 5 - tests/leading_trailing_zeroes.bbb | 10 - tests/local_type_inference.bbb | 10 - tests/min_max.bbb | 10 - tests/minimal.bbb | 5 - tests/minimal_stack.bbb | 5 - tests/minimal_stack_arithmetic.bbb | 5 - tests/minimal_stack_arithmetic2.bbb | 6 - tests/minimal_stack_arithmetic3.bbb | 6 - tests/noreturn_macro.bbb | 27 - tests/not_pointer.bbb | 7 - tests/opaque.bbb | 16 - tests/pointer.bbb | 11 - tests/pointer_cast.bbb | 7 - tests/pointer_decay.bbb | 8 - tests/pointer_struct_initialization.bbb | 32 - tests/pointer_sub.bbb | 9 - tests/ret_c_bool.bbb | 9 - tests/return_array.bbb | 22 - tests/return_small_struct.bbb | 20 - tests/return_type_builtin.bbb | 5 - tests/return_u64_u64.bbb | 16 - tests/select.bbb | 7 - tests/self_referential_struct.bbb | 11 - tests/shortcircuiting_if.bbb | 16 - tests/slice.bbb | 34 - tests/slice_array_literal.bbb | 13 - tests/slice_of_slices.bbb | 31 - tests/slice_only_start.bbb | 11 - tests/small_struct_ints.bbb | 47 - tests/stack_add.bbb | 6 - tests/stack_negation.bbb | 5 - tests/stack_sub.bbb | 6 - tests/strict_array_type.bbb | 5 - tests/string_to_enum.bbb | 20 - tests/struct.bbb | 20 - tests/struct_assignment.bbb | 46 - tests/struct_u64_u64.bbb | 25 - tests/struct_varargs.bbb | 47 - tests/struct_zero.bbb | 35 - tests/switch_else.bbb | 22 - tests/switch_else_empty.bbb | 23 - tests/tests.bbb | 2328 +++++++++++++++++++++++ tests/type_alias.bbb | 6 - tests/u1_return.bbb | 11 - tests/unreachable.bbb | 9 - tests/varargs.bbb | 66 - 125 files changed, 2332 insertions(+), 3050 deletions(-) delete mode 100644 tests/abi_enum_bool.bbb delete mode 100644 tests/argv.bbb delete mode 100644 tests/assignment_operators.bbb delete mode 100644 tests/basic_array.bbb delete mode 100644 tests/basic_bool_call.bbb delete mode 100644 tests/basic_branch.bbb delete mode 100644 tests/basic_call.bbb delete mode 100644 tests/basic_enum.bbb delete mode 100644 tests/basic_macro.bbb delete mode 100644 tests/basic_pointer.bbb delete mode 100644 tests/basic_shortcircuiting_if.bbb delete mode 100644 tests/basic_slice.bbb delete mode 100644 tests/basic_string.bbb delete mode 100644 tests/basic_struct_passing.bbb delete mode 100644 tests/basic_switch.bbb delete mode 100644 tests/basic_union.bbb delete mode 100644 tests/basic_varargs.bbb delete mode 100644 tests/basic_while.bbb delete mode 100644 tests/bits.bbb delete mode 100644 tests/bits_no_backing_type.bbb delete mode 100644 tests/bits_return_u1.bbb delete mode 100644 tests/bits_zero.bbb delete mode 100644 tests/bool_array.bbb delete mode 100644 tests/bool_pair.bbb delete mode 100644 tests/break_continue.bbb delete mode 100644 tests/byte_size.bbb delete mode 100644 tests/c_abi.bbb delete mode 100644 tests/c_abi0.bbb delete mode 100644 tests/c_abi1.bbb delete mode 100644 tests/c_function_pointer.bbb delete mode 100644 tests/c_med_struct_ints.bbb delete mode 100644 tests/c_ret_struct_array.bbb delete mode 100644 tests/c_split_struct_ints.bbb delete mode 100644 tests/c_string_to_slice.bbb delete mode 100644 tests/c_struct_with_array.bbb delete mode 100644 tests/comments.bbb delete mode 100644 tests/comparison.bbb delete mode 100644 tests/concat_logical_or.bbb delete mode 100644 tests/constant_add.bbb delete mode 100644 tests/constant_and.bbb delete mode 100644 tests/constant_div.bbb delete mode 100644 tests/constant_global_reference.bbb delete mode 100644 tests/constant_mul.bbb delete mode 100644 tests/constant_or.bbb delete mode 100644 tests/constant_rem.bbb delete mode 100644 tests/constant_shift_left.bbb delete mode 100644 tests/constant_shift_right.bbb delete mode 100644 tests/constant_sub.bbb delete mode 100644 tests/constant_xor.bbb delete mode 100644 tests/else_if.bbb delete mode 100644 tests/else_if_complicated.bbb delete mode 100644 tests/empty_if.bbb delete mode 100644 tests/enum_arbitrary_abi.bbb delete mode 100644 tests/enum_array.bbb delete mode 100644 tests/enum_debug_info.bbb delete mode 100644 tests/enum_name.bbb delete mode 100644 tests/extend.bbb delete mode 100644 tests/extern.bbb delete mode 100644 tests/field_access_left_assign.bbb delete mode 100644 tests/field_parent_pointer.bbb delete mode 100644 tests/for_each.bbb delete mode 100644 tests/for_each_int.bbb delete mode 100644 tests/forward_declared_type.bbb delete mode 100644 tests/function_pointer.bbb delete mode 100644 tests/generic_macro.bbb delete mode 100644 tests/generic_pointer_array.bbb delete mode 100644 tests/generic_pointer_macro.bbb delete mode 100644 tests/global.bbb delete mode 100644 tests/global_struct.bbb delete mode 100644 tests/if_no_else.bbb delete mode 100644 tests/if_no_else_void.bbb delete mode 100644 tests/indirect.bbb delete mode 100644 tests/indirect_struct.bbb delete mode 100644 tests/indirect_varargs.bbb delete mode 100644 tests/integer_formats.bbb delete mode 100644 tests/integer_hex.bbb delete mode 100644 tests/integer_max.bbb delete mode 100644 tests/leading_trailing_zeroes.bbb delete mode 100644 tests/local_type_inference.bbb delete mode 100644 tests/min_max.bbb delete mode 100644 tests/minimal.bbb delete mode 100644 tests/minimal_stack.bbb delete mode 100644 tests/minimal_stack_arithmetic.bbb delete mode 100644 tests/minimal_stack_arithmetic2.bbb delete mode 100644 tests/minimal_stack_arithmetic3.bbb delete mode 100644 tests/noreturn_macro.bbb delete mode 100644 tests/not_pointer.bbb delete mode 100644 tests/opaque.bbb delete mode 100644 tests/pointer.bbb delete mode 100644 tests/pointer_cast.bbb delete mode 100644 tests/pointer_decay.bbb delete mode 100644 tests/pointer_struct_initialization.bbb delete mode 100644 tests/pointer_sub.bbb delete mode 100644 tests/ret_c_bool.bbb delete mode 100644 tests/return_array.bbb delete mode 100644 tests/return_small_struct.bbb delete mode 100644 tests/return_type_builtin.bbb delete mode 100644 tests/return_u64_u64.bbb delete mode 100644 tests/select.bbb delete mode 100644 tests/self_referential_struct.bbb delete mode 100644 tests/shortcircuiting_if.bbb delete mode 100644 tests/slice.bbb delete mode 100644 tests/slice_array_literal.bbb delete mode 100644 tests/slice_of_slices.bbb delete mode 100644 tests/slice_only_start.bbb delete mode 100644 tests/small_struct_ints.bbb delete mode 100644 tests/stack_add.bbb delete mode 100644 tests/stack_negation.bbb delete mode 100644 tests/stack_sub.bbb delete mode 100644 tests/strict_array_type.bbb delete mode 100644 tests/string_to_enum.bbb delete mode 100644 tests/struct.bbb delete mode 100644 tests/struct_assignment.bbb delete mode 100644 tests/struct_u64_u64.bbb delete mode 100644 tests/struct_varargs.bbb delete mode 100644 tests/struct_zero.bbb delete mode 100644 tests/switch_else.bbb delete mode 100644 tests/switch_else_empty.bbb create mode 100644 tests/tests.bbb delete mode 100644 tests/type_alias.bbb delete mode 100644 tests/u1_return.bbb delete mode 100644 tests/unreachable.bbb delete mode 100644 tests/varargs.bbb diff --git a/src/compiler.bbb b/src/compiler.bbb index 0ed37e1..26d2e8e 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -18479,7 +18479,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 library_names = library_buffer[..library_count]; library_paths = { .pointer = &llvm_bindings_library, .length = 1 }; } - else if (string_equal(base_name, "c_abi")) + else if (string_equal(base_name, "tests")) { library_paths = { .pointer = &c_abi_library, .length = 1 }; } @@ -18509,125 +18509,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 names: [_][]u8 = [ - "minimal", - "comments", - "constant_add", - "constant_and", - "constant_div", - "constant_mul", - "constant_rem", - "constant_or", - "constant_sub", - "constant_xor", - "constant_shift_left", - "constant_shift_right", - "minimal_stack", - "minimal_stack_arithmetic", - "minimal_stack_arithmetic2", - "minimal_stack_arithmetic3", - "stack_negation", - "stack_add", - "stack_sub", - "extend", - "integer_max", - "integer_hex", - "basic_pointer", - "basic_call", - "basic_branch", - "basic_array", - "basic_enum", - "basic_slice", - "basic_string", - "basic_varargs", - "basic_while", - "pointer", - "pointer_cast", - "u1_return", - "local_type_inference", - "global", - "function_pointer", - "extern", - "byte_size", - "argv", - "assignment_operators", - "not_pointer", - "bits", - "bits_no_backing_type", - "bits_return_u1", - "bits_zero", - "comparison", - "global_struct", - "if_no_else", - "if_no_else_void", - "indirect", - "indirect_struct", - "indirect_varargs", - "ret_c_bool", - "return_type_builtin", - "return_u64_u64", - "select", - "slice", - "small_struct_ints", - "struct_assignment", - "struct", - "struct_u64_u64", - "struct_varargs", - "struct_zero", - "unreachable", - "varargs", - "c_abi0", - "c_abi1", - "c_med_struct_ints", - "c_ret_struct_array", - "c_split_struct_ints", - "c_string_to_slice", - "c_struct_with_array", - "c_function_pointer", - "basic_bool_call", - "abi_enum_bool", - "return_small_struct", - "c_abi", - "string_to_enum", - "empty_if", - "else_if", - "else_if_complicated", - "basic_shortcircuiting_if", - "shortcircuiting_if", - "field_access_left_assign", - "for_each", - "pointer_decay", - "enum_name", - "slice_of_slices", - "type_alias", - "integer_formats", - "for_each_int", - "bool_array", - "basic_union", - "break_continue", - "constant_global_reference", - "concat_logical_or", - "strict_array_type", - "pointer_struct_initialization", - "slice_array_literal", - "slice_only_start", - "basic_macro", - "generic_macro", - "generic_pointer_macro", - "noreturn_macro", - "generic_pointer_array", - "self_referential_struct", - "forward_declared_type", - "enum_array", - "opaque", - "basic_struct_passing", - "enum_arbitrary_abi", - "enum_debug_info", - "return_array", - "bool_pair", - "min_max", - "field_parent_pointer", - "leading_trailing_zeroes", - "pointer_sub", + "tests", ]; [export] main = fn [cc(c)] (argument_count: u32, argv: &&u8, envp: &&u8) s32 diff --git a/src/compiler.cpp b/src/compiler.cpp index 53b871e..729b640 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -339,7 +339,7 @@ fn String compile_file(Arena* arena, Compile options) library_names = { library_buffer, library_count }; library_paths = { &llvm_bindings_library, 1 }; } - else if (base_name.equal(string_literal("c_abi"))) + else if (base_name.equal(string_literal("tests"))) { library_paths = { &c_abi_library, 1 }; } @@ -370,129 +370,7 @@ fn String compile_file(Arena* arena, Compile options) global_variable String names[] = { - string_literal("minimal"), - string_literal("comments"), - string_literal("constant_add"), - string_literal("constant_and"), - string_literal("constant_div"), - string_literal("constant_mul"), - string_literal("constant_rem"), - string_literal("constant_or"), - string_literal("constant_sub"), - string_literal("constant_xor"), - string_literal("constant_shift_left"), - string_literal("constant_shift_right"), - string_literal("minimal_stack"), - string_literal("minimal_stack_arithmetic"), - string_literal("minimal_stack_arithmetic2"), - string_literal("minimal_stack_arithmetic3"), - string_literal("stack_negation"), - string_literal("stack_add"), - string_literal("stack_sub"), - string_literal("extend"), - string_literal("integer_max"), - string_literal("integer_hex"), - string_literal("basic_pointer"), - string_literal("basic_call"), - string_literal("basic_branch"), - string_literal("basic_array"), - string_literal("basic_enum"), - string_literal("basic_slice"), - string_literal("basic_string"), - string_literal("basic_varargs"), - string_literal("basic_while"), - string_literal("pointer"), - string_literal("pointer_cast"), - string_literal("u1_return"), - string_literal("local_type_inference"), - string_literal("global"), - string_literal("function_pointer"), - string_literal("extern"), - string_literal("byte_size"), - string_literal("argv"), - string_literal("assignment_operators"), - string_literal("not_pointer"), - string_literal("bits"), - string_literal("bits_no_backing_type"), - string_literal("bits_return_u1"), - string_literal("bits_zero"), - string_literal("comparison"), - string_literal("global_struct"), - string_literal("if_no_else"), - string_literal("if_no_else_void"), - string_literal("indirect"), - string_literal("indirect_struct"), - string_literal("indirect_varargs"), - string_literal("ret_c_bool"), - string_literal("return_type_builtin"), - string_literal("return_u64_u64"), - string_literal("select"), - string_literal("slice"), - string_literal("small_struct_ints"), - string_literal("struct_assignment"), - string_literal("struct"), - string_literal("struct_u64_u64"), - string_literal("struct_varargs"), - string_literal("struct_zero"), - string_literal("unreachable"), - string_literal("varargs"), - string_literal("c_abi0"), - string_literal("c_abi1"), - string_literal("c_med_struct_ints"), - string_literal("c_ret_struct_array"), - string_literal("c_split_struct_ints"), - string_literal("c_string_to_slice"), - string_literal("c_struct_with_array"), - string_literal("c_function_pointer"), - string_literal("basic_bool_call"), - string_literal("abi_enum_bool"), - string_literal("return_small_struct"), - string_literal("c_abi"), - string_literal("string_to_enum"), - string_literal("empty_if"), - string_literal("else_if"), - string_literal("else_if_complicated"), - string_literal("basic_shortcircuiting_if"), - string_literal("shortcircuiting_if"), - string_literal("field_access_left_assign"), - string_literal("for_each"), - string_literal("pointer_decay"), - string_literal("enum_name"), - string_literal("slice_of_slices"), - string_literal("type_alias"), - string_literal("integer_formats"), - string_literal("for_each_int"), - string_literal("bool_array"), - string_literal("basic_union"), - string_literal("break_continue"), - string_literal("constant_global_reference"), - string_literal("concat_logical_or"), - string_literal("strict_array_type"), - string_literal("pointer_struct_initialization"), - string_literal("slice_array_literal"), - string_literal("slice_only_start"), - - string_literal("basic_macro"), - string_literal("generic_macro"), - - string_literal("generic_pointer_macro"), - string_literal("noreturn_macro"), - string_literal("generic_pointer_array"), - - string_literal("self_referential_struct"), - string_literal("forward_declared_type"), - - string_literal("enum_array"), - string_literal("opaque"), - string_literal("basic_struct_passing"), - string_literal("enum_arbitrary_abi"), - string_literal("enum_debug_info"), - string_literal("return_array"), - string_literal("bool_pair"), - string_literal("min_max"), - string_literal("field_parent_pointer"), - string_literal("leading_trailing_zeroes"), - string_literal("pointer_sub"), + string_literal("tests"), }; void entry_point(Slice arguments, Slice envp) diff --git a/tests/abi_enum_bool.bbb b/tests/abi_enum_bool.bbb deleted file mode 100644 index 56999dc..0000000 --- a/tests/abi_enum_bool.bbb +++ /dev/null @@ -1,36 +0,0 @@ -Foo = enum { - a, - b, - c, - d, - e, - f, - g, -} - -S = struct -{ - enum: Foo, - some_boolean: u1, -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >s: S = { - .enum = .f, - .some_boolean = 1, - }; - - require(s.enum == .f); - require(s.some_boolean); - - return 0; -} diff --git a/tests/argv.bbb b/tests/argv.bbb deleted file mode 100644 index 690c97a..0000000 --- a/tests/argv.bbb +++ /dev/null @@ -1,13 +0,0 @@ -[export] main = fn [cc(c)] (argument_count: u32, argument_pointer: &&u8) s32 -{ - if (argument_count != 1) - { - return 1; - } - >arg = argument_pointer[0]; - if (arg != argument_pointer[0]) - { - return 1; - } - return 0; -} diff --git a/tests/assignment_operators.bbb b/tests/assignment_operators.bbb deleted file mode 100644 index b72d2dd..0000000 --- a/tests/assignment_operators.bbb +++ /dev/null @@ -1,35 +0,0 @@ -unsigned = fn(n: s32) s32 -{ - >result: u32 = #extend(n); - result >>= 1; - result <<= 1; - result ^= 1; - result |= 1; - result &= 1; - result += 1; - result -= 1; - result /= 1; - result %= 1; - result *= 0; - - return #extend(result); -} - -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0; - >pointer = &result; - pointer -= 1; - pointer += 1; - result >>= 1; - result <<= 1; - result ^= 1; - result |= 1; - result &= 1; - result += 1; - result -= 1; - result /= 1; - result %= 1; - result *= 0; - return unsigned(result); -} diff --git a/tests/basic_array.bbb b/tests/basic_array.bbb deleted file mode 100644 index a496845..0000000 --- a/tests/basic_array.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >array: [_]s32 = [3, 2, 1, 0]; - return array[3]; -} diff --git a/tests/basic_bool_call.bbb b/tests/basic_bool_call.bbb deleted file mode 100644 index 7b9b28d..0000000 --- a/tests/basic_bool_call.bbb +++ /dev/null @@ -1,16 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -bb_bool = fn (x: u8) void -{ - require(#truncate(x)); -} - -[export] main = fn [cc(c)] () s32 -{ - bb_bool(1); - return 0; -} - diff --git a/tests/basic_branch.bbb b/tests/basic_branch.bbb deleted file mode 100644 index 788d962..0000000 --- a/tests/basic_branch.bbb +++ /dev/null @@ -1,12 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 1; - if (result != 1) - { - return 1; - } - else - { - return 0; - } -} diff --git a/tests/basic_call.bbb b/tests/basic_call.bbb deleted file mode 100644 index 0e60991..0000000 --- a/tests/basic_call.bbb +++ /dev/null @@ -1,9 +0,0 @@ -foo = fn() s32 -{ - return 0; -} - -[export] main = fn[cc(c)] () s32 -{ - return foo(); -} diff --git a/tests/basic_enum.bbb b/tests/basic_enum.bbb deleted file mode 100644 index a83edab..0000000 --- a/tests/basic_enum.bbb +++ /dev/null @@ -1,18 +0,0 @@ -E = enum -{ - zero = 0, - one = 1, - two = 2, - three = 3, -} - -[export] main = fn [cc(c)] () s32 -{ - >a: E = .three; - >b: E = .two; - >c: E = .one; - >a_int: s32 = #extend(#int_from_enum(a)); - >b_int: s32 = #extend(#int_from_enum(b)); - >c_int: s32 = #extend(#int_from_enum(c)); - return a_int - (b_int + c_int); -} diff --git a/tests/basic_macro.bbb b/tests/basic_macro.bbb deleted file mode 100644 index 4ddfb9a..0000000 --- a/tests/basic_macro.bbb +++ /dev/null @@ -1,11 +0,0 @@ -sub = macro (a: s32, b: s32) s32 -{ - return a - b; -} - -[export] main = fn [cc(c)] () s32 -{ - >a = sub(1, 1); - >b = sub(2, 2); - return a + b; -} diff --git a/tests/basic_pointer.bbb b/tests/basic_pointer.bbb deleted file mode 100644 index 5b6591c..0000000 --- a/tests/basic_pointer.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 0; - >pointer = &a; - return pointer.&; -} diff --git a/tests/basic_shortcircuiting_if.bbb b/tests/basic_shortcircuiting_if.bbb deleted file mode 100644 index c938530..0000000 --- a/tests/basic_shortcircuiting_if.bbb +++ /dev/null @@ -1,12 +0,0 @@ -[export] main = fn [cc(c)] (argument_count: u32) s32 -{ - >a: s32 = 0; - if (argument_count != 3 and? argument_count != 2) - { - return 0; - } - else - { - return 1; - } -} diff --git a/tests/basic_slice.bbb b/tests/basic_slice.bbb deleted file mode 100644 index 8de1662..0000000 --- a/tests/basic_slice.bbb +++ /dev/null @@ -1,22 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -slice_receiver = fn (slice: []u8) void -{ - require(slice.length == 3); - require(slice[0] == 0); - require(slice[1] == 1); - require(slice[2] == 2); -} - -[export] main = fn [cc(c)] () s32 -{ - >a: [_]u8 = [0, 1, 2]; - slice_receiver(a[..]); - return 0; -} diff --git a/tests/basic_string.bbb b/tests/basic_string.bbb deleted file mode 100644 index 1d40df7..0000000 --- a/tests/basic_string.bbb +++ /dev/null @@ -1,16 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >string = "abc"; - require(string[0] == 'a'); - require(string[1] == 'b'); - require(string[2] == 'c'); - return 0; -} diff --git a/tests/basic_struct_passing.bbb b/tests/basic_struct_passing.bbb deleted file mode 100644 index 37bc6d1..0000000 --- a/tests/basic_struct_passing.bbb +++ /dev/null @@ -1,140 +0,0 @@ -CallingConvention = enum -{ - c, -} - -InlineBehavior = enum -{ - default = 0, - always_inline = 1, - no_inline = 2, - inline_hint = 3, -} - -FunctionAttributes = struct -{ - inline_behavior: InlineBehavior, - naked: u1, -} - -Type = struct; - -TypeId = enum -{ - void, - noreturn, - forward_declaration, - integer, - function, - pointer, - array, - enum, - struct, - bits, - alias, - union, - unresolved, - vector, - floating_point, - enum_array, - opaque, -} - -TypeInteger = struct -{ - bit_count: u32, - signed: u1, -} - -TypePointer = struct -{ - element_type: &Type, - next: &Type, -} - -AbiRegisterCountSystemV = struct -{ - gpr: u32, - sse: u32, -}; - -AbiRegisterCount = union -{ - system_v: AbiRegisterCountSystemV, -}; - -AbiInformation = struct -{ - foo: u32, -} - -TypeFunction = struct -{ - semantic_return_type: &Type, - semantic_argument_types: []&Type, - calling_convention: CallingConvention, - is_variable_arguments: u1, - - abi_argument_types: []&Type, - abi_return_type: &Type, - available_registers: AbiRegisterCount, - argument_abis: []AbiInformation, - return_abi: AbiInformation, -} - -TypeContent = union -{ - integer: TypeInteger, - function: TypeFunction, - pointer: TypePointer, -} - -Type = struct -{ - content: TypeContent, - id: TypeId, - name: []u8, - next: &Type, -} - -give_me_string = fn () []u8 -{ - return "foooo"; -} - -get_type = fn (src: &Type, type: Type) &Type -{ - src.& = type; - return src; -} - -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -[export] main = fn [cc(c)] () s32 -{ - >buffer: Type = undefined; - >pointer = &buffer; - require(pointer == &buffer); - require(pointer != zero); - >result = get_type(pointer, { - .content = { - .pointer = { - .element_type = pointer, - zero, - }, - }, - .id = .pointer, - .name = give_me_string(), - zero, - }); - - require(pointer != zero); - require(pointer == &buffer); - require(buffer.content.pointer.element_type == pointer); - require(buffer.id == .pointer); - - return 0; -} diff --git a/tests/basic_switch.bbb b/tests/basic_switch.bbb deleted file mode 100644 index 075439e..0000000 --- a/tests/basic_switch.bbb +++ /dev/null @@ -1,26 +0,0 @@ -E = enum -{ - a, - b, - c, -} - -[export] main = fn [cc(c)] () s32 -{ - >some_enum: E = .a; - switch (some_enum) - { - .a => - { - return 0; - }, - .b => - { - return 1; - }, - .c => - { - return 1; - }, - } -} diff --git a/tests/basic_union.bbb b/tests/basic_union.bbb deleted file mode 100644 index ff33f7c..0000000 --- a/tests/basic_union.bbb +++ /dev/null @@ -1,15 +0,0 @@ -U = union -{ - s: s32, - u: u32, -} - -[export] main = fn [cc(c)] () s32 -{ - >my_union: U = { - .s = -1, - }; - if (my_union.s != -1) #trap(); - if (my_union.u != 0xffffffff) #trap(); - return 0; -} diff --git a/tests/basic_varargs.bbb b/tests/basic_varargs.bbb deleted file mode 100644 index b51087c..0000000 --- a/tests/basic_varargs.bbb +++ /dev/null @@ -1,29 +0,0 @@ -va_arg_fn = fn [cc(c)] (first_arg: u32, ...) void -{ - if (first_arg != 123456789) - { - #trap(); - } - - >va = #va_start(); - - >a = #va_arg(&va, u32); - if (a != 987654321) - { - #trap(); - } - - >first_arg_b = #va_arg(&va, u32); - if (first_arg_b != 123456789) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >first_arg: u32 = 123456789; - >a: u32 = 987654321; - va_arg_fn(first_arg, a, first_arg); - return 0; -} diff --git a/tests/basic_while.bbb b/tests/basic_while.bbb deleted file mode 100644 index 70d877e..0000000 --- a/tests/basic_while.bbb +++ /dev/null @@ -1,38 +0,0 @@ -c_string_length = fn (c_string: &u8) u64 -{ - >it = c_string; - - while (it.&) - { - it = it + 1; - } - - return #int_from_pointer(it) - #int_from_pointer(c_string); -} - -[export] main = fn (argument_count: u32, argument_pointer: &&u8) s32 -{ - if (argument_count == 0) - { - return 1; - } - - >first_arg = argument_pointer[0]; - if (!first_arg) - { - return 1; - } - - >arg_length = c_string_length(first_arg); - if (arg_length == 0) - { - return 1; - } - - if (first_arg[arg_length] != 0) - { - return 1; - } - - return 0; -} diff --git a/tests/bits.bbb b/tests/bits.bbb deleted file mode 100644 index 5048119..0000000 --- a/tests/bits.bbb +++ /dev/null @@ -1,18 +0,0 @@ -BitField = bits u8 -{ - a: u2, - b: u2, - c: u2, - d: u2, -}; - -[export] main = fn [cc(c)] () s32 -{ - >b: BitField = { - .a = 3, - .b = 2, - .c = 2, - .d = 3, - }; - return #extend((b.a - b.d) + (b.b - b.c)); -} diff --git a/tests/bits_no_backing_type.bbb b/tests/bits_no_backing_type.bbb deleted file mode 100644 index 7dea283..0000000 --- a/tests/bits_no_backing_type.bbb +++ /dev/null @@ -1,13 +0,0 @@ -A = bits { - a: u1, - b: u1, -} - -[export] main = fn [cc(c)] () s32 -{ - >a: A = { - .a = 1, - .b = 1, - }; - return #extend(a.a - a.b); -} diff --git a/tests/bits_return_u1.bbb b/tests/bits_return_u1.bbb deleted file mode 100644 index af251ce..0000000 --- a/tests/bits_return_u1.bbb +++ /dev/null @@ -1,17 +0,0 @@ -S = bits u32 -{ - a: u1, - b: u1, - c: u1, -} - -foo = fn () u1 -{ - >a: S = { .a = 1, .b = 1, .c = 0 }; - return a.c; -} - -[export] main = fn [cc(c)] () s32 -{ - return #extend(foo() == 1); -} diff --git a/tests/bits_zero.bbb b/tests/bits_zero.bbb deleted file mode 100644 index d6169b4..0000000 --- a/tests/bits_zero.bbb +++ /dev/null @@ -1,35 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -S = bits -{ - a: u1, - b: u1, - c: u1, -} - -[export] main = fn () s32 -{ - >a: S = zero; - - require(a.a == 0); - require(a.b == 0); - require(a.c == 0); - - >b: S = { - .a = 1, - .b = 1, - zero, - }; - - require(b.a == 1); - require(b.b == 1); - require(b.c == 0); - - return 0; -} diff --git a/tests/bool_array.bbb b/tests/bool_array.bbb deleted file mode 100644 index 3b02e41..0000000 --- a/tests/bool_array.bbb +++ /dev/null @@ -1,12 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >signs: [2]u1 = [0, 0]; - >accumulator: s32 = 0; - - for (s: signs) - { - accumulator += #extend(s); - } - - return accumulator; -} diff --git a/tests/bool_pair.bbb b/tests/bool_pair.bbb deleted file mode 100644 index 13eed46..0000000 --- a/tests/bool_pair.bbb +++ /dev/null @@ -1,18 +0,0 @@ -BoolPair = struct -{ - a: u1, - b: u1, -} - -bool_pair = fn () BoolPair -{ - return { .a = 0, .b = 1 }; -} - -[export] main = fn [cc(c)] () s32 -{ - >result = bool_pair(); - if (result.a) #trap(); - if (!result.b) #trap(); - return 0; -} diff --git a/tests/break_continue.bbb b/tests/break_continue.bbb deleted file mode 100644 index 07bf915..0000000 --- a/tests/break_continue.bbb +++ /dev/null @@ -1,31 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 0; - - while (a < 10) - { - if (a == 3) - { - break; - } - - a += 1; - continue; - } - - >b: s32 = 2; - for (i: 0..10) - { - if (b == 2) - { - b += 1; - continue; - } - else - { - break; - } - } - - return a - b; -} diff --git a/tests/byte_size.bbb b/tests/byte_size.bbb deleted file mode 100644 index a07d92f..0000000 --- a/tests/byte_size.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = #byte_size(s32); - >b: s32 = #byte_size(s32); - return a - b; -} diff --git a/tests/c_abi.bbb b/tests/c_abi.bbb deleted file mode 100644 index 261128c..0000000 --- a/tests/c_abi.bbb +++ /dev/null @@ -1,539 +0,0 @@ -Struct_u64_u64 = struct -{ - a: u64, - b: u64, -} - -BigStruct = struct -{ - a: u64, - b: u64, - c: u64, - d: u64, - e: u8, -} - -SmallPackedStruct = bits u8 -{ - a: u2, - b: u2, - c: u2, - d: u2, -} - -SmallStructInts = struct -{ - a: u8, - b: u8, - c: u8, - d: u8, -} - -SplitStructInt = struct -{ - a: u64, - b: u8, - c: u32, -} - -MedStructInts = struct -{ - x: s32, - y: s32, - z: s32, -} - -Rect = struct -{ - left: u32, - right: u32, - top: u32, - bottom: u32, -} - -StructWithArray = struct -{ - a: s32, - padding: [4]u8, - b: s64, -} - -ByRef = struct -{ - val: s32, - arr: [15]s32, -} - -ByValOrigin = struct -{ - x: u64, - y: u64, - z: u64, -} - -ByValSize = struct -{ - width: u64, - height: u64, - depth: u64, -} - -ByVal = struct -{ - origin: ByValOrigin, - size: ByValSize, -} - -[extern] run_c_tests = fn [cc(c)] () void; - -[extern] c_u8 = fn [cc(c)] (x: u8) void; -[extern] c_u16 = fn [cc(c)] (x: u16) void; -[extern] c_u32 = fn [cc(c)] (x: u32) void; -[extern] c_u64 = fn [cc(c)] (x: u64) void; - -[extern] c_s8 = fn [cc(c)] (x: s8) void; -[extern] c_s16 = fn [cc(c)] (x: s16) void; -[extern] c_s32 = fn [cc(c)] (x: s32) void; -[extern] c_s64 = fn [cc(c)] (x: s64) void; - -[extern] c_bool = fn [cc(c)] (x: u8) void; - -[extern] c_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void; -[extern] c_ret_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64; - -[extern] c_struct_u64_u64_0 = fn [cc(c)] (a: Struct_u64_u64) void; -[extern] c_struct_u64_u64_1 = fn [cc(c)] (a: u64, b: Struct_u64_u64) void; -[extern] c_struct_u64_u64_2 = fn [cc(c)] (a: u64, b: u64, c: Struct_u64_u64) void; -[extern] c_struct_u64_u64_3 = fn [cc(c)] (a: u64, b: u64, c: u64, d: Struct_u64_u64) void; -[extern] c_struct_u64_u64_4 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: Struct_u64_u64) void; -[extern] c_struct_u64_u64_5 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: Struct_u64_u64) void; -[extern] c_struct_u64_u64_6 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: Struct_u64_u64) void; -[extern] c_struct_u64_u64_7 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, h: Struct_u64_u64) void; -[extern] c_struct_u64_u64_8 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, h: u64, i: Struct_u64_u64) void; - -[extern] c_big_struct = fn [cc(c)] (x: BigStruct) void; -[extern] c_small_struct_ints = fn [cc(c)] (x: SmallStructInts) void; -[extern] c_ret_small_struct_ints = fn [cc(c)] () SmallStructInts; -[extern] c_med_struct_ints = fn [cc(c)] (x: MedStructInts) void; -[extern] c_ret_med_struct_ints = fn [cc(c)] () MedStructInts; -[extern] c_small_packed_struct = fn [cc(c)] (x: SmallPackedStruct) void; -[extern] c_ret_small_packed_struct = fn [cc(c)] () SmallPackedStruct; -[extern] c_split_struct_ints = fn [cc(c)] (x: SplitStructInt) void; -[extern] c_big_struct_both = fn [cc(c)] (x: BigStruct) BigStruct; -[extern] c_multiple_struct_ints = fn [cc(c)] (a: Rect, b: Rect) void; - -[extern] c_ret_bool = fn [cc(c)] () u8; - -[extern] c_ret_u8 = fn [cc(c)] () u8; -[extern] c_ret_u16 = fn [cc(c)] () u16; -[extern] c_ret_u32 = fn [cc(c)] () u32; -[extern] c_ret_u64 = fn [cc(c)] () u64; - -[extern] c_ret_s8 = fn [cc(c)] () s8; -[extern] c_ret_s16 = fn [cc(c)] () s16; -[extern] c_ret_s32 = fn [cc(c)] () s32; -[extern] c_ret_s64 = fn [cc(c)] () s64; - -[extern] c_struct_with_array = fn [cc(c)] (x: StructWithArray) void; -[extern] c_ret_struct_with_array = fn [cc(c)] () StructWithArray; - -[extern] c_modify_by_ref_param = fn [cc(c)] (x: ByRef) ByRef; -[extern] c_func_ptr_byval = fn [cc(c)] (a: u64, b: u64, c: ByVal, d: u64, e: u64, f: u64) void; - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - run_c_tests(); - c_u8(0xff); - c_u16(0xfffe); - c_u32(0xfffffffd); - c_u64(0xfffffffffffffffc); - - //if (has_i128) { - // c_struct_u128({ .value = 0xfffffffffffffffc, }); - //} - - c_s8(-1); - c_s16(-2); - c_s32(-3); - c_s64(-4); - - //if (has_i128) { - // c_struct_i128({ .value = -6, }); - //} - - c_bool(1); - - c_five_integers(12, 34, 56, 78, 90); - - >s = c_ret_struct_u64_u64(); - require(s.a == 21); - require(s.b == 22); - c_struct_u64_u64_0({ .a = 23, .b = 24, }); - c_struct_u64_u64_1(0, { .a = 25, .b = 26, }); - c_struct_u64_u64_2(0, 1, { .a = 27, .b = 28, }); - c_struct_u64_u64_3(0, 1, 2, { .a = 29, .b = 30, }); - c_struct_u64_u64_4(0, 1, 2, 3, { .a = 31, .b = 32, }); - c_struct_u64_u64_5(0, 1, 2, 3, 4, { .a = 33, .b = 34, }); - c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, { .a = 35, .b = 36, }); - c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, { .a = 37, .b = 38, }); - c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, { .a = 39, .b = 40, }); - - >big_struct: BigStruct = { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - .e = 5, - }; - c_big_struct(big_struct); - - >small: SmallStructInts = { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - }; - c_small_struct_ints(small); - >small2 = c_ret_small_struct_ints(); - require(small2.a == 1); - require(small2.b == 2); - require(small2.c == 3); - require(small2.d == 4); - - >med: MedStructInts = { - .x = 1, - .y = 2, - .z = 3, - }; - c_med_struct_ints(med); - >med2 = c_ret_med_struct_ints(); - require(med2.x == 1); - require(med2.y == 2); - require(med2.z == 3); - - >p: SmallPackedStruct = { .a = 0, .b = 1, .c = 2, .d = 3, }; - c_small_packed_struct(p); - >p2 = c_ret_small_packed_struct(); - require(p2.a == 0); - require(p2.b == 1); - require(p2.c == 2); - require(p2.d == 3); - - >split: SplitStructInt = { - .a = 1234, - .b = 100, - .c = 1337, - }; - c_split_struct_ints(split); - - > big: BigStruct = { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - .e = 5, - }; - >big2 = c_big_struct_both(big); - require(big2.a == 10); - require(big2.b == 11); - require(big2.c == 12); - require(big2.d == 13); - require(big2.e == 14); - - >r1: Rect = { - .left = 1, - .right = 21, - .top = 16, - .bottom = 4, - }; - >r2: Rect = { - .left = 178, - .right = 189, - .top = 21, - .bottom = 15, - }; - c_multiple_struct_ints(r1, r2); - - require(c_ret_bool() == 1); - - require(c_ret_u8() == 0xff); - require(c_ret_u16() == 0xffff); - require(c_ret_u32() == 0xffffffff); - require(c_ret_u64() == 0xffffffffffffffff); - - require(c_ret_s8() == -1); - require(c_ret_s16() == -1); - require(c_ret_s32() == -1); - require(c_ret_s64() == -1); - - c_struct_with_array({ .a = 1, .padding = [0, 0, 0, 0], .b = 2, }); - - >x = c_ret_struct_with_array(); - require(x.a == 4); - require(x.b == 155); - - >res = c_modify_by_ref_param({ .val = 1, .arr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }); - require(res.val == 42); - - >function_pointer = &c_func_ptr_byval; - function_pointer(1, 2, { .origin = { .x = 9, .y = 10, .z = 11, }, .size = { .width = 12, .height = 13, .depth = 14, }, }, 3, 4, 5); - return 0; -} - -[export] bb_u8 = fn [cc(c)] (x: u8) void -{ - require(x == 0xff); -} - -[export] bb_u16 = fn [cc(c)] (x: u16) void -{ - require(x == 0xfffe); -} - -[export] bb_u32 = fn [cc(c)] (x: u32) void -{ - require(x == 0xfffffffd); -} - -[export] bb_u64 = fn [cc(c)] (x: u64) void -{ - require(x == 0xfffffffffffffffc); -} - -[export] bb_s8 = fn [cc(c)] (x: s8) void -{ - require(x == -1); -} - -[export] bb_s16 = fn [cc(c)] (x: s16) void -{ - require(x == -2); -} - -[export] bb_s32 = fn [cc(c)] (x: s32) void -{ - require(x == -3); -} - -[export] bb_s64 = fn [cc(c)] (x: s64) void -{ - require(x == -4); -} - -[export] bb_ptr = fn [cc(c)] (x: &u8) void -{ - require(#int_from_pointer(x) == 0xdeadbeef); -} - -[export] bb_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void -{ - require(a == 12); - require(b == 34); - require(c == 56); - require(d == 78); - require(e == 90); -} - -[export] bb_bool = fn [cc(c)] (x: u8) void -{ - require(#truncate(x)); -} - -[export] bb_ret_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64 -{ - return { .a = 1, .b = 2, }; -} - -[export] bb_struct_u64_u64_0 = fn [cc(c)] (s: Struct_u64_u64) void -{ - require(s.a == 3); - require(s.b == 4); -} - -[export] bb_struct_u64_u64_1 = fn [cc(c)] (_: u64, s: Struct_u64_u64) void -{ - require(s.a == 5); - require(s.b == 6); -} - -[export] bb_struct_u64_u64_2 = fn [cc(c)] (_: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 7); - require(s.b == 8); -} - -[export] bb_struct_u64_u64_3 = fn [cc(c)] (_: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 9); - require(s.b == 10); -} - -[export] bb_struct_u64_u64_4 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 11); - require(s.b == 12); -} - -[export] bb_struct_u64_u64_5 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 13); - require(s.b == 14); -} - -[export] bb_struct_u64_u64_6 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 15); - require(s.b == 16); -} - -[export] bb_struct_u64_u64_7 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 17); - require(s.b == 18); -} - -[export] bb_struct_u64_u64_8 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void -{ - require(s.a == 19); - require(s.b == 20); -} - -[export] bb_big_struct = fn [cc(c)] (x: BigStruct) void -{ - require(x.a == 1); - require(x.b == 2); - require(x.c == 3); - require(x.d == 4); - require(x.e == 5); -} - -[export] bb_small_packed_struct = fn [cc(c)] (x: SmallPackedStruct) void -{ - require(x.a == 0); - require(x.b == 1); - require(x.c == 2); - require(x.d == 3); -} - -[export] bb_split_struct_ints = fn [cc(c)] (x: SplitStructInt) void -{ - require(x.a == 1234); - require(x.b == 100); - require(x.c == 1337); -} - -[export] bb_big_struct_both = fn [cc(c)] (x: BigStruct) BigStruct -{ - require(x.a == 30); - require(x.b == 31); - require(x.c == 32); - require(x.d == 33); - require(x.e == 34); - >s: BigStruct = { - .a = 20, - .b = 21, - .c = 22, - .d = 23, - .e = 24, - }; - return s; -} - -[export] bb_ret_bool = fn [cc(c)] () u8 -{ - return 1; -} - -[export] bb_ret_u8 = fn [cc(c)] () u8 -{ - return 0xff; -} - -[export] bb_ret_u16 = fn [cc(c)] () u16 -{ - return 0xffff; -} - -[export] bb_ret_u32 = fn [cc(c)] () u32 -{ - return 0xffffffff; -} - -[export] bb_ret_u64 = fn [cc(c)] () u64 -{ - return 0xffffffffffffffff; -} - -[export] bb_ret_s8 = fn [cc(c)] () s8 -{ - return -1; -} - -[export] bb_ret_s16 = fn [cc(c)] () s16 -{ - return -1; -} - -[export] bb_ret_s32 = fn [cc(c)] () s32 -{ - return -1; -} - -[export] bb_ret_s64 = fn [cc(c)] () s64 -{ - return -1; -} - -[export] bb_ret_small_struct_ints = fn [cc(c)] () SmallStructInts -{ - return { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - }; -} - -[export] bb_ret_med_struct_ints = fn [cc(c)] () MedStructInts -{ - return { - .x = 1, - .y = 2, - .z = 3, - }; -} - -[export] bb_multiple_struct_ints = fn [cc(c)] (x: Rect, y: Rect) void -{ - require(x.left == 1); - require(x.right == 21); - require(x.top == 16); - require(x.bottom == 4); - require(y.left == 178); - require(y.right == 189); - require(y.top == 21); - require(y.bottom == 15); -} - -[export] bb_small_struct_ints = fn [cc(c)] (x: SmallStructInts) void -{ - require(x.a == 1); - require(x.b == 2); - require(x.c == 3); - require(x.d == 4); -} - -[export] bb_med_struct_ints = fn [cc(c)] (s: MedStructInts) void -{ - require(s.x == 1); - require(s.y == 2); - require(s.z == 3); -} diff --git a/tests/c_abi0.bbb b/tests/c_abi0.bbb deleted file mode 100644 index 6c5162d..0000000 --- a/tests/c_abi0.bbb +++ /dev/null @@ -1,20 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -c_u8 = fn [cc(c)] (x: u8) void -{ - require(x == 0xff); -} - -[export] main = fn [cc(c)] () s32 -{ - >v: u8 = 0xff; - c_u8(v); - return 0; -} - diff --git a/tests/c_abi1.bbb b/tests/c_abi1.bbb deleted file mode 100644 index 6f41eee..0000000 --- a/tests/c_abi1.bbb +++ /dev/null @@ -1,18 +0,0 @@ -require = fn(ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -c_u16 = fn [cc(c)] (v: u16) void -{ - require(v == 0xfffe); -} - -[export] main = fn [cc(c)] () s32 -{ - c_u16(0xfffe); - return 0; -} diff --git a/tests/c_function_pointer.bbb b/tests/c_function_pointer.bbb deleted file mode 100644 index 6e6911b..0000000 --- a/tests/c_function_pointer.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[extern] exit = fn [cc(c)] (exit_code: s32) noreturn; - -[export] main = fn [cc(c)] () s32 -{ - >c_function_pointer = &exit; - c_function_pointer(0); -} diff --git a/tests/c_med_struct_ints.bbb b/tests/c_med_struct_ints.bbb deleted file mode 100644 index 01e366b..0000000 --- a/tests/c_med_struct_ints.bbb +++ /dev/null @@ -1,51 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} -MedStructInts = struct -{ - x: s32, - y: s32, - z: s32, -} - -bb_ret_med_struct_ints = fn [cc(c)] () MedStructInts -{ - return { - .x = 1, - .y = 2, - .z = 3, - }; -} - -c_med_struct_ints = fn [cc(c)] (s: MedStructInts) void -{ - require(s.x == 1); - require(s.y == 2); - require(s.z == 3); - - >s2 = bb_ret_med_struct_ints(); - - require(s2.x == 1); - require(s2.y == 2); - require(s2.z == 3); -} - -[export] main = fn [cc(c)] () s32 -{ - >med: MedStructInts = { - .x = 1, - .y = 2, - .z = 3, - }; - c_med_struct_ints(med); - >med2 = bb_ret_med_struct_ints(); - require(med2.x == 1); - require(med2.y == 2); - require(med2.z == 3); - - return 0; -} diff --git a/tests/c_ret_struct_array.bbb b/tests/c_ret_struct_array.bbb deleted file mode 100644 index 2707d0d..0000000 --- a/tests/c_ret_struct_array.bbb +++ /dev/null @@ -1,27 +0,0 @@ -StructWithArray = struct -{ - a: u32, - padding: [4]u8, - c: u64, -}; - -c_ret_struct_with_array = fn [cc(c)] () StructWithArray -{ - return { .a = 4, .padding = [ 0, 0, 0, 0 ], .c = 155 }; -} - -require = fn(ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >s = c_ret_struct_with_array(); - require(s.a == 4); - require(s.c == 155); - return 0; -} diff --git a/tests/c_split_struct_ints.bbb b/tests/c_split_struct_ints.bbb deleted file mode 100644 index 69a62d5..0000000 --- a/tests/c_split_struct_ints.bbb +++ /dev/null @@ -1,36 +0,0 @@ -SplitStructInt = struct -{ - a: u64, - b: u8, - c: u32, -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -bb_split_struct_ints = fn [cc(c)] (x: SplitStructInt) void -{ - require(x.a == 1234); - require(x.b == 100); - require(x.c == 1337); -} - -[export] main = fn [cc(c)] () s32 -{ - >split: SplitStructInt = { - .a = 1234, - .b = 100, - .c = 1337, - }; - - bb_split_struct_ints(split); - >a: s32 = #truncate(split.a); - >b: s32 = #extend(split.b); - >c: s32 = #extend(split.c); - return a + b + 3 - c; -} diff --git a/tests/c_string_to_slice.bbb b/tests/c_string_to_slice.bbb deleted file mode 100644 index e9d78d2..0000000 --- a/tests/c_string_to_slice.bbb +++ /dev/null @@ -1,33 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -c_string_length = fn (c_string: &u8) u64 -{ - >it = c_string; - - while (it.&) - { - it = it + 1; - } - - return #int_from_pointer(it) - #int_from_pointer(c_string); -} - -c_string_slice_build = fn (c_string: &u8, length: u64) []u8 -{ - return c_string[0..length]; -} - -[export] main = fn [cc(c)] (argument_count: u32, argument_pointer: &&u8) s32 -{ - >length = c_string_length(argument_pointer[0]); - >string = c_string_slice_build(argument_pointer[0], length); - require(string.pointer == argument_pointer[0]); - require(string.length == length); - return 0; -} diff --git a/tests/c_struct_with_array.bbb b/tests/c_struct_with_array.bbb deleted file mode 100644 index acf4dac..0000000 --- a/tests/c_struct_with_array.bbb +++ /dev/null @@ -1,26 +0,0 @@ -require = fn(ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -StructWithArray = struct -{ - a: u32, - padding: [4]u8, - b: u64, -} - -c_struct_with_array = fn [cc(c)] (x: StructWithArray) void -{ - require(x.a == 1); - require(x.b == 2); -} - -[export] main = fn [cc(c)] () s32 -{ - c_struct_with_array({ .a = 1, .padding = [0, 0, 0, 0], .b = 2 }); - return 0; -} diff --git a/tests/comments.bbb b/tests/comments.bbb deleted file mode 100644 index e69fc6e..0000000 --- a/tests/comments.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[export] main = fn [cc(c)] () s32 // This is a comment -// This is a comment -{ // This is a comment - // This is a comment - return 0; // This is a comment -}// This is a comment -// This is a comment diff --git a/tests/comparison.bbb b/tests/comparison.bbb deleted file mode 100644 index 4d558c3..0000000 --- a/tests/comparison.bbb +++ /dev/null @@ -1,14 +0,0 @@ -trivial_comparison = fn (a: u32, b: u32) u1 -{ - return a + 1 == b + 1; -} - -[export] main = fn [cc(c)] (argument_count: u32) s32 -{ - >result = trivial_comparison(argument_count, argument_count); - if (!result) - { - #trap(); - } - return 0; -} diff --git a/tests/concat_logical_or.bbb b/tests/concat_logical_or.bbb deleted file mode 100644 index 5b14498..0000000 --- a/tests/concat_logical_or.bbb +++ /dev/null @@ -1,9 +0,0 @@ -is_space = fn (ch: u8) u1 -{ - return ch == ' ' or ch == '\n' or ch == '\t' or ch == '\r'; -} - -[export] main = fn [cc(c)] () s32 -{ - return #extend(is_space('f')); -} diff --git a/tests/constant_add.bbb b/tests/constant_add.bbb deleted file mode 100644 index 5366bca..0000000 --- a/tests/constant_add.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return -1 + 1; -} diff --git a/tests/constant_and.bbb b/tests/constant_and.bbb deleted file mode 100644 index bc8c00e..0000000 --- a/tests/constant_and.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 1 & 2; -} diff --git a/tests/constant_div.bbb b/tests/constant_div.bbb deleted file mode 100644 index 513116f..0000000 --- a/tests/constant_div.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0 / 5; -} diff --git a/tests/constant_global_reference.bbb b/tests/constant_global_reference.bbb deleted file mode 100644 index d0059f6..0000000 --- a/tests/constant_global_reference.bbb +++ /dev/null @@ -1,7 +0,0 @@ -i2315_abc: s32 = 5; -asjdkj = i2315_abc - i2315_abc; - -[export] main = fn [cc(c)] () s32 -{ - return asjdkj; -} diff --git a/tests/constant_mul.bbb b/tests/constant_mul.bbb deleted file mode 100644 index db66565..0000000 --- a/tests/constant_mul.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 1 * 0; -} diff --git a/tests/constant_or.bbb b/tests/constant_or.bbb deleted file mode 100644 index 4392873..0000000 --- a/tests/constant_or.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0 | 0; -} diff --git a/tests/constant_rem.bbb b/tests/constant_rem.bbb deleted file mode 100644 index f30b973..0000000 --- a/tests/constant_rem.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 5 % 5; -} diff --git a/tests/constant_shift_left.bbb b/tests/constant_shift_left.bbb deleted file mode 100644 index 8a3c197..0000000 --- a/tests/constant_shift_left.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0 << 1; -} diff --git a/tests/constant_shift_right.bbb b/tests/constant_shift_right.bbb deleted file mode 100644 index af22c4b..0000000 --- a/tests/constant_shift_right.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0 >> 1; -} diff --git a/tests/constant_sub.bbb b/tests/constant_sub.bbb deleted file mode 100644 index 458bba9..0000000 --- a/tests/constant_sub.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 1 - 1; -} - diff --git a/tests/constant_xor.bbb b/tests/constant_xor.bbb deleted file mode 100644 index 78dbee3..0000000 --- a/tests/constant_xor.bbb +++ /dev/null @@ -1,4 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0 ^ 0; -} diff --git a/tests/else_if.bbb b/tests/else_if.bbb deleted file mode 100644 index d56ed61..0000000 --- a/tests/else_if.bbb +++ /dev/null @@ -1,16 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0; - if (result == 1) - { - return 1; - } - else if (result == 0) - { - return 0; - } - else - { - return 5; - } -} diff --git a/tests/else_if_complicated.bbb b/tests/else_if_complicated.bbb deleted file mode 100644 index 91585c1..0000000 --- a/tests/else_if_complicated.bbb +++ /dev/null @@ -1,37 +0,0 @@ -Foo = enum -{ - a,b,c, -} - -[export] main = fn [cc(c)] (argument_count: u32) s32 -{ - >result: s32 = 0; - >foo: Foo = .b; - switch (foo) - { - .b => - { - if (argument_count != 0) - { - >a: s32 = 1; - if (result == 1) - { - } - else if (result == 0) - { - return 0; - } - else - { - return 5; - } - return a; - } - }, - else => - { - } - } - - return 0; -} diff --git a/tests/empty_if.bbb b/tests/empty_if.bbb deleted file mode 100644 index 68bb130..0000000 --- a/tests/empty_if.bbb +++ /dev/null @@ -1,12 +0,0 @@ -[export] main = fn [cc(c)] (argument_count: u32) s32 -{ - >result: s32 = 0; - if (argument_count != 1) - { - result = 1; - } - else - { - } - return result; -} diff --git a/tests/enum_arbitrary_abi.bbb b/tests/enum_arbitrary_abi.bbb deleted file mode 100644 index e98d1b7..0000000 --- a/tests/enum_arbitrary_abi.bbb +++ /dev/null @@ -1,22 +0,0 @@ -SomeEnum = enum -{ - a, - b, - c, - d, -} - -foo = fn (arg: SomeEnum) SomeEnum -{ - return arg; -} - -[export] main = fn [cc(c)] () s32 -{ - >some_e: SomeEnum = .c; - >a = foo(some_e); - >b = foo(.d); - if (a != .c) #trap(); - if (b != .d) #trap(); - return 0; -} diff --git a/tests/enum_array.bbb b/tests/enum_array.bbb deleted file mode 100644 index 42a99c8..0000000 --- a/tests/enum_array.bbb +++ /dev/null @@ -1,22 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -E = enum -{ - a, - b, - c, - d, -} - -[export] main = fn [cc(c)] () s32 -{ - >some_enum_array: enum_array[E](u32) = [ .a = 4, .b = 3, .c = 2, .d = 1 ]; - require(some_enum_array[.a] == 4); - require(some_enum_array[.b] == 3); - require(some_enum_array[.c] == 2); - require(some_enum_array[.d] == 1); - return 0; -} diff --git a/tests/enum_debug_info.bbb b/tests/enum_debug_info.bbb deleted file mode 100644 index 9fb82ec..0000000 --- a/tests/enum_debug_info.bbb +++ /dev/null @@ -1,38 +0,0 @@ -TypeId = enum -{ - void, - noreturn, - forward_declaration, - integer, - function, - pointer, - array, - enum, - struct, - bits, - alias, - union, - unresolved, - vector, - floating_point, - enum_array, - opaque, -} - -Type = struct -{ - arr: [5]u32, - id: TypeId, - a: [2]u64, - b: u64, -} - -[export] main = fn [cc(c)] () s32 -{ - >t: Type = { - .id = .integer, - zero, - }; - t.arr[0] = 1; - return 0; -} diff --git a/tests/enum_name.bbb b/tests/enum_name.bbb deleted file mode 100644 index 2a03c95..0000000 --- a/tests/enum_name.bbb +++ /dev/null @@ -1,24 +0,0 @@ -E = enum -{ - my_expected_result, - a, - b, -} - -[extern] memcmp = fn [cc(c)] (a: &u8, b: &u8, byte_count: u64) s32; -string_equal = fn (slice_a: []u8, slice_b: []u8) u1 -{ - >result = slice_a.length == slice_b.length; - if (result) - { - result = memcmp(slice_a.pointer, slice_b.pointer, slice_a.length) == 0; - } - - return result; -} - -[export] main = fn [cc(c)] () s32 -{ - >some_enum: E = .my_expected_result; - return #extend(!string_equal(#enum_name(some_enum), "my_expected_result")); -} diff --git a/tests/extend.bbb b/tests/extend.bbb deleted file mode 100644 index 7518732..0000000 --- a/tests/extend.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s8 = 0; - return #extend(result); -} diff --git a/tests/extern.bbb b/tests/extern.bbb deleted file mode 100644 index 7bcbe8a..0000000 --- a/tests/extern.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[extern] exit = fn [cc(c)] (exit_code: s32) noreturn; -[export] main = fn [cc(c)] () s32 -{ - exit(0); -} diff --git a/tests/field_access_left_assign.bbb b/tests/field_access_left_assign.bbb deleted file mode 100644 index 9f0383e..0000000 --- a/tests/field_access_left_assign.bbb +++ /dev/null @@ -1,24 +0,0 @@ -S = struct -{ - a: u32, - b: u32, -} - -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -[export] main = fn [cc(c)] () s32 -{ - >s: S = { - .a = 2, - .b = 3, - }; - - s.a = s.b + 1; - s.b = s.a + 2; - require(s.a == 4); - require(s.b == 6); - return 0; -} diff --git a/tests/field_parent_pointer.bbb b/tests/field_parent_pointer.bbb deleted file mode 100644 index 4e10524..0000000 --- a/tests/field_parent_pointer.bbb +++ /dev/null @@ -1,43 +0,0 @@ -S = struct -{ - a: u8, - b: u32, - c: u8, -} - -assert = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -[export] main = fn [cc(c)] () s32 -{ - >s: S = { - .a = 241, - .b = 12356, - .c = 128, - }; - - >p_a = &s.a; - >p_a_struct: &S = #field_parent_pointer(p_a, "a"); - assert(p_a_struct == &s); - assert(p_a_struct.a == s.a); - assert(p_a_struct.b == s.b); - assert(p_a_struct.c == s.c); - - >p_b = &s.b; - >p_b_struct: &S = #field_parent_pointer(p_b, "b"); - assert(p_b_struct == &s); - assert(p_b_struct.a == s.a); - assert(p_b_struct.b == s.b); - assert(p_b_struct.c == s.c); - - >p_c = &s.c; - >p_c_struct: &S = #field_parent_pointer(p_c, "c"); - assert(p_c_struct == &s); - assert(p_c_struct.a == s.a); - assert(p_c_struct.b == s.b); - assert(p_c_struct.c == s.c); - - return 0; -} diff --git a/tests/for_each.bbb b/tests/for_each.bbb deleted file mode 100644 index c4ed0cd..0000000 --- a/tests/for_each.bbb +++ /dev/null @@ -1,32 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -[export] main = fn [cc(c)] () s32 -{ - >array: [_]u32 = [5, 3, 2]; - >counter: u32 = 0; - for (e : array) - { - counter += e; - } - - require(counter == 10); - - for (&e : array) - { - e.& += 1; - } - - >new_counter: u32 = 0; - - for (e : array) - { - new_counter += e; - } - - require(new_counter == counter + array.length); - - return 0; -} diff --git a/tests/for_each_int.bbb b/tests/for_each_int.bbb deleted file mode 100644 index c827a5f..0000000 --- a/tests/for_each_int.bbb +++ /dev/null @@ -1,10 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >top: s32 = 64; - >accumulator: s32 = 0; - for (i: 0..top) - { - accumulator += 1; - } - return accumulator - top; -} diff --git a/tests/forward_declared_type.bbb b/tests/forward_declared_type.bbb deleted file mode 100644 index 967e39e..0000000 --- a/tests/forward_declared_type.bbb +++ /dev/null @@ -1,17 +0,0 @@ -T = struct; -Foo = struct -{ - t: &T, -} - -T = struct -{ - f: Foo, -} - -[export] main = fn [cc(c)] () s32 -{ - >t: T = zero; - t.f.t = &t; - return 0; -} diff --git a/tests/function_pointer.bbb b/tests/function_pointer.bbb deleted file mode 100644 index 8f46be7..0000000 --- a/tests/function_pointer.bbb +++ /dev/null @@ -1,10 +0,0 @@ -foo = fn [cc(c)] () s32 -{ - return 123; -} - -[export] main = fn [cc(c)] () s32 -{ - >fn_ptr = &foo; - return fn_ptr() - 123; -} diff --git a/tests/generic_macro.bbb b/tests/generic_macro.bbb deleted file mode 100644 index 432dbe5..0000000 --- a/tests/generic_macro.bbb +++ /dev/null @@ -1,11 +0,0 @@ -sub = macro [T] (a: T, b: T) T -{ - return a - b; -} - -[export] main = fn [cc(c)] () s32 -{ - >a = sub[s32](1, 1); - >b = sub[u8](2, 2); - return a + #extend(b); -} diff --git a/tests/generic_pointer_array.bbb b/tests/generic_pointer_array.bbb deleted file mode 100644 index 31b9765..0000000 --- a/tests/generic_pointer_array.bbb +++ /dev/null @@ -1,15 +0,0 @@ -foo = macro[T](addr: &u64, count: u64) []T -{ - >pointer: &T = #pointer_cast(addr); - return pointer[..count]; -} - -[export] main = fn [cc(c)] () s32 -{ - >address_raw: u64 = 0xaaaaaaaaaaaaaaaa; - >some_var: &u64 = #pointer_from_int(address_raw); - >result: []&u8 = foo[&u8](some_var, 1); - if (#int_from_pointer(result.pointer) != address_raw) #trap(); - if (result.length != 1) #trap(); - return 0; -} diff --git a/tests/generic_pointer_macro.bbb b/tests/generic_pointer_macro.bbb deleted file mode 100644 index b78d463..0000000 --- a/tests/generic_pointer_macro.bbb +++ /dev/null @@ -1,25 +0,0 @@ -foo = macro [T] (ptr: &u32) &T -{ - return #pointer_cast(ptr); -} - -A = struct -{ - a: u32, -} - -B = struct -{ - b: u32, -} - -[export] main = fn [cc(c)] () s32 -{ - >var: u32 = 0; - >a = foo[A](&var); - >b = foo[B](&var); - a.a = 1; - if (b.b != 1) #trap(); - if (var != 1) #trap(); - return 0; -} diff --git a/tests/global.bbb b/tests/global.bbb deleted file mode 100644 index 1859a25..0000000 --- a/tests/global.bbb +++ /dev/null @@ -1,5 +0,0 @@ -result: s32 = 0; - -[export] main = fn [cc(c)] () s32 { - return result; -} diff --git a/tests/global_struct.bbb b/tests/global_struct.bbb deleted file mode 100644 index adb0454..0000000 --- a/tests/global_struct.bbb +++ /dev/null @@ -1,28 +0,0 @@ -S = struct -{ - a: u32, - b: u32, - c: u32, -} - -s: S = { - .a = 1, - .b = 2, - .c = 3, -}; - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn () s32 -{ - require(s.a == 1); - require(s.b == 2); - require(s.c == 3); - return 0; -} diff --git a/tests/if_no_else.bbb b/tests/if_no_else.bbb deleted file mode 100644 index 8e5d125..0000000 --- a/tests/if_no_else.bbb +++ /dev/null @@ -1,9 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 5; - if (a == 2) - { - return 1; - } - return 0; -} diff --git a/tests/if_no_else_void.bbb b/tests/if_no_else_void.bbb deleted file mode 100644 index 3875fda..0000000 --- a/tests/if_no_else_void.bbb +++ /dev/null @@ -1,14 +0,0 @@ -require = fn [cc(c)] (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0; - require(result == 0); - return result; -} diff --git a/tests/indirect.bbb b/tests/indirect.bbb deleted file mode 100644 index ff02f67..0000000 --- a/tests/indirect.bbb +++ /dev/null @@ -1,45 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -S = struct -{ - a: u32, - b: u32, - c: u32, - d: u32, - e: u32, - f: u32, -} - -ret = fn [cc(c)] () S -{ - return { .a = 56, .b = 57, .c = 58, .d = 59, .e = 60, .f = 61 }; -} - -arg = fn [cc(c)] (s: S) void -{ - require(s.a == 56); - require(s.b == 57); - require(s.c == 58); - require(s.d == 59); - require(s.e == 60); - require(s.f == 61); -} - -[export] main = fn [cc(c)] () s32 -{ - >s = ret(); - require(s.a == 56); - require(s.b == 57); - require(s.c == 58); - require(s.d == 59); - require(s.e == 60); - require(s.f == 61); - arg(s); - return 0; -} diff --git a/tests/indirect_struct.bbb b/tests/indirect_struct.bbb deleted file mode 100644 index 8fcc69d..0000000 --- a/tests/indirect_struct.bbb +++ /dev/null @@ -1,46 +0,0 @@ -Struct_u64_u64 = struct -{ - a: u64, - b: u64, -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -c_struct_u64_u64_5 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, s: Struct_u64_u64) void -{ - require(s.a == 33); - require(s.b == 34); -} - -c_struct_u64_u64_6 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, s: Struct_u64_u64) void -{ - require(s.a == 35); - require(s.b == 36); -} - -c_struct_u64_u64_7 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, s: Struct_u64_u64) void -{ - require(s.a == 37); - require(s.b == 38); -} - -c_struct_u64_u64_8 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, h: u64, s: Struct_u64_u64) void -{ - require(s.a == 39); - require(s.b == 40); -} - -[export] main = fn [cc(c)] () s32 -{ - c_struct_u64_u64_5(0, 0, 0, 0, 0, { .a = 33, .b = 34, }); - c_struct_u64_u64_6(0, 0, 0, 0, 0, 0, { .a = 35, .b = 36, }); - c_struct_u64_u64_7(0, 0, 0, 0, 0, 0, 0, { .a = 37, .b = 38, }); - c_struct_u64_u64_8(0, 0, 0, 0, 0, 0, 0, 0, { .a = 39, .b = 40, }); - return 0; -} diff --git a/tests/indirect_varargs.bbb b/tests/indirect_varargs.bbb deleted file mode 100644 index cf78be9..0000000 --- a/tests/indirect_varargs.bbb +++ /dev/null @@ -1,62 +0,0 @@ -S = struct -{ - a: u64, - b: u64, - c: u64, - d: u64, - e: u64 - f: u64, - g: u64, - h: u64, - i: u64, - j: u64 -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -va_arg_fn = fn [cc(c)] (first_arg: u32, ...) void -{ - if (first_arg != 123456789) - { - #trap(); - } - - >va = #va_start(); - - >s = #va_arg(&va, S); - require(s.a == 9); - require(s.b == 8); - require(s.c == 7); - require(s.d == 6); - require(s.e == 5); - require(s.f == 4); - require(s.g == 3); - require(s.h == 2); - require(s.i == 1); - require(s.j == 0); -} - -[export] main = fn [cc(c)] () s32 -{ - >first_arg: u32 = 123456789; - >s : S = { - .a = 9, - .b = 8, - .c = 7, - .d = 6, - .e = 5, - .f = 4, - .g = 3, - .h = 2, - .i = 1, - .j = 0, - }; - va_arg_fn(first_arg, s); - return 0; -} diff --git a/tests/integer_formats.bbb b/tests/integer_formats.bbb deleted file mode 100644 index 88c6bc1..0000000 --- a/tests/integer_formats.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 0o10; - >b: s32 = 0b1000; - >c: s32 = 0d0; - return a - b + c; -} diff --git a/tests/integer_hex.bbb b/tests/integer_hex.bbb deleted file mode 100644 index 8725225..0000000 --- a/tests/integer_hex.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0x0; - return result; -} diff --git a/tests/integer_max.bbb b/tests/integer_max.bbb deleted file mode 100644 index 585cf43..0000000 --- a/tests/integer_max.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a = #integer_max(u64); - return #truncate(a + 1); -} diff --git a/tests/leading_trailing_zeroes.bbb b/tests/leading_trailing_zeroes.bbb deleted file mode 100644 index bac6816..0000000 --- a/tests/leading_trailing_zeroes.bbb +++ /dev/null @@ -1,10 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: u32 = 0b111; - if (#leading_zeroes(a) != 29) #trap(); - if (#trailing_zeroes(a) != 0) #trap(); - >b: u8 = 0b11010; - if (#leading_zeroes(b) != 3) #trap(); - if (#trailing_zeroes(b) != 1) #trap(); - return 0; -} diff --git a/tests/local_type_inference.bbb b/tests/local_type_inference.bbb deleted file mode 100644 index 68db5e2..0000000 --- a/tests/local_type_inference.bbb +++ /dev/null @@ -1,10 +0,0 @@ -foo = fn() s32 -{ - return 0; -} -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 0; - >result = foo() + a; - return result; -} diff --git a/tests/min_max.bbb b/tests/min_max.bbb deleted file mode 100644 index 14b3c12..0000000 --- a/tests/min_max.bbb +++ /dev/null @@ -1,10 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: u32 = 1; - >b: u32 = 2; - >min = #min(a, b); - >max = #max(a, b); - if (min != a) #trap(); - if (max != b) #trap(); - return 0; -} diff --git a/tests/minimal.bbb b/tests/minimal.bbb deleted file mode 100644 index 774af15..0000000 --- a/tests/minimal.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - return 0; -} - diff --git a/tests/minimal_stack.bbb b/tests/minimal_stack.bbb deleted file mode 100644 index 0525a16..0000000 --- a/tests/minimal_stack.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0; - return result; -} diff --git a/tests/minimal_stack_arithmetic.bbb b/tests/minimal_stack_arithmetic.bbb deleted file mode 100644 index 14df665..0000000 --- a/tests/minimal_stack_arithmetic.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 1; - return a - 1; -} diff --git a/tests/minimal_stack_arithmetic2.bbb b/tests/minimal_stack_arithmetic2.bbb deleted file mode 100644 index 4c321bc..0000000 --- a/tests/minimal_stack_arithmetic2.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 1; - >b = a - 1; - return b; -} diff --git a/tests/minimal_stack_arithmetic3.bbb b/tests/minimal_stack_arithmetic3.bbb deleted file mode 100644 index c34d0f5..0000000 --- a/tests/minimal_stack_arithmetic3.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 1; - >b = 1 - a; - return b; -} diff --git a/tests/noreturn_macro.bbb b/tests/noreturn_macro.bbb deleted file mode 100644 index 0197244..0000000 --- a/tests/noreturn_macro.bbb +++ /dev/null @@ -1,27 +0,0 @@ -assert = macro (ok: u1) void -{ - if (!ok) - { - unreachable; - } -} - -align_forward = fn (value: u64, alignment: u64) u64 -{ - assert(alignment != 0); - >mask = alignment - 1; - >result = (value + mask) & ~mask; - return result; -} - -[export] main = fn [cc(c)] () s32 -{ - >result = align_forward(1, 64); - - if (result != 64) - { - #trap(); - } - - return 0; -} diff --git a/tests/not_pointer.bbb b/tests/not_pointer.bbb deleted file mode 100644 index 10d4d16..0000000 --- a/tests/not_pointer.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 0; - >ptr = &a; - >b = !ptr; - return #extend(b); -} diff --git a/tests/opaque.bbb b/tests/opaque.bbb deleted file mode 100644 index 23f8a8f..0000000 --- a/tests/opaque.bbb +++ /dev/null @@ -1,16 +0,0 @@ -OpaqueType = opaque; - -[extern] memcpy = fn [cc(c)] (destination: &s32, source: &s32, size: u64) &OpaqueType; - -[export] main = fn [cc(c)] () s32 -{ - >destination: s32 = 1; - >source: s32 = 0; - >opaque_pointer = memcpy(&destination, &source, #byte_size(s32)); - >pointer: &s32 = #pointer_cast(opaque_pointer); - if (pointer != &destination) - { - #trap(); - } - return destination; -} diff --git a/tests/pointer.bbb b/tests/pointer.bbb deleted file mode 100644 index 35e938e..0000000 --- a/tests/pointer.bbb +++ /dev/null @@ -1,11 +0,0 @@ -modify = fn (v: &s32) void -{ - v.& = 1; -} - -[export] main = fn [cc(c)] () s32 -{ - >value: s32 = 0; - modify(&value); - return #extend(value == 0); -} diff --git a/tests/pointer_cast.bbb b/tests/pointer_cast.bbb deleted file mode 100644 index 1146bea..0000000 --- a/tests/pointer_cast.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: u32 = 0; - >pointer = &result; - >signed_ptr: &s32 = #pointer_cast(pointer); - return signed_ptr.&; -} diff --git a/tests/pointer_decay.bbb b/tests/pointer_decay.bbb deleted file mode 100644 index ee60d48..0000000 --- a/tests/pointer_decay.bbb +++ /dev/null @@ -1,8 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >array: [_]s32 = [1, 3, 5]; - >pointer: &s32 = &array[0]; - >index: u64 = 0; - pointer[index] = 0; - return pointer[index]; -} diff --git a/tests/pointer_struct_initialization.bbb b/tests/pointer_struct_initialization.bbb deleted file mode 100644 index eda2b5b..0000000 --- a/tests/pointer_struct_initialization.bbb +++ /dev/null @@ -1,32 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) #trap(); -} - -S = struct -{ - a: u16, - b: u8, - c: u8, - d: u32, -} - -[export] main = fn [cc(c)] () s32 -{ - >s: S = zero; - - >p_s = &s; - p_s.& = { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - }; - - require(s.a == 1); - require(s.b == 2); - require(s.c == 3); - require(s.d == 4); - - return 0; -} diff --git a/tests/pointer_sub.bbb b/tests/pointer_sub.bbb deleted file mode 100644 index d6a04c4..0000000 --- a/tests/pointer_sub.bbb +++ /dev/null @@ -1,9 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: [_]s32 = [ 3, 1 ]; - >p0 = &a[0]; - >p1 = p0 + 1; - >sub: u32 = #truncate(p1 - p0); - if (sub != 1) #trap(); - return 0; -} diff --git a/tests/ret_c_bool.bbb b/tests/ret_c_bool.bbb deleted file mode 100644 index ddc73d7..0000000 --- a/tests/ret_c_bool.bbb +++ /dev/null @@ -1,9 +0,0 @@ -ret_c_bool = fn [cc(c)] () u8 -{ - return 0; -} - -[export] main = fn [cc(c)] () s32 -{ - return #extend(ret_c_bool()); -} diff --git a/tests/return_array.bbb b/tests/return_array.bbb deleted file mode 100644 index a9674db..0000000 --- a/tests/return_array.bbb +++ /dev/null @@ -1,22 +0,0 @@ -SomeEnum = enum -{ - a, - b, - c, - d, - e, - f, -} - -foo = fn () [2]SomeEnum -{ - return [ .f, .e ]; -} - -[export] main = fn [cc(c)] () s32 -{ - >result = foo(); - if (result[0] != .f) #trap(); - if (result[1] != .e) #trap(); - return 0; -} diff --git a/tests/return_small_struct.bbb b/tests/return_small_struct.bbb deleted file mode 100644 index 26f9e5c..0000000 --- a/tests/return_small_struct.bbb +++ /dev/null @@ -1,20 +0,0 @@ -S = struct -{ - a: u1, - b: u1, -} - -foo = fn [cc(c)] () S -{ - return { .a = 1, .b = 0 }; -} - -[export] main = fn [cc(c)] () s32 -{ - >s = foo(); - - if (s.a != 1) #trap(); - if (s.b != 0) #trap(); - - return 0; -} diff --git a/tests/return_type_builtin.bbb b/tests/return_type_builtin.bbb deleted file mode 100644 index cdfcabb..0000000 --- a/tests/return_type_builtin.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn () s32 -{ - >result: #ReturnType = 0; - return result; -} diff --git a/tests/return_u64_u64.bbb b/tests/return_u64_u64.bbb deleted file mode 100644 index 10b07aa..0000000 --- a/tests/return_u64_u64.bbb +++ /dev/null @@ -1,16 +0,0 @@ -Struct_u64_u64 = struct -{ - a: u64, - b: u64, -} - -return_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64 -{ - return { .a = 1, .b = 2 }; -} - -[export] main = fn [cc(c)] () s32 -{ - >r = return_struct_u64_u64(); - return #truncate(r.a + r.b - 3); -} diff --git a/tests/select.bbb b/tests/select.bbb deleted file mode 100644 index 75a609b..0000000 --- a/tests/select.bbb +++ /dev/null @@ -1,7 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >boolean: u1 = 1; - >true_value: s32 = 0; - >false_value: s32 = 1; - return #select(boolean, true_value, false_value); -} diff --git a/tests/self_referential_struct.bbb b/tests/self_referential_struct.bbb deleted file mode 100644 index f2f5463..0000000 --- a/tests/self_referential_struct.bbb +++ /dev/null @@ -1,11 +0,0 @@ -S = struct -{ - self: &S, -} - -[export] main = fn [cc(c)] () s32 -{ - >s: S = zero; - s.self = &s; - return 0; -} diff --git a/tests/shortcircuiting_if.bbb b/tests/shortcircuiting_if.bbb deleted file mode 100644 index 8a8b1c7..0000000 --- a/tests/shortcircuiting_if.bbb +++ /dev/null @@ -1,16 +0,0 @@ -[export] main = fn [cc(c)] (argument_count: u32) s32 -{ - >a: s32 = 0; - if (argument_count != 0 and? argument_count != 2 and? argument_count != 3 or? argument_count != 1) - { - return 0; - } - else if (argument_count == 5 or? a == 0) - { - return 45; - } - else - { - return 1; - } -} diff --git a/tests/slice.bbb b/tests/slice.bbb deleted file mode 100644 index 67ced61..0000000 --- a/tests/slice.bbb +++ /dev/null @@ -1,34 +0,0 @@ -c_string_length = fn (c_string: &u8) u64 -{ - >it = c_string; - - while (it.&) - { - it = it + 1; - } - - return #int_from_pointer(it) - #int_from_pointer(c_string); -} - -[export] main = fn (argument_count: u32, argument_pointer: &&u8) s32 -{ - if (argument_count == 0) - { - return 1; - } - >arg_ptr = argument_pointer[0]; - >a1 = arg_ptr[0..c_string_length(arg_ptr)]; - >a2 = a1[1..]; - - if (a1.pointer != a2.pointer - 1) - { - return 1; - } - - if (a1.length != a2.length + 1) - { - return 1; - } - - return 0; -} diff --git a/tests/slice_array_literal.bbb b/tests/slice_array_literal.bbb deleted file mode 100644 index 1f51463..0000000 --- a/tests/slice_array_literal.bbb +++ /dev/null @@ -1,13 +0,0 @@ -foo = fn (slices: [][]u8) void -{ - if (slices.length != 3) - { - #trap(); - } -} -[export] main = fn [cc(c)] () s32 -{ - >some_bool: u1 = 0; - foo([ "abc", #select(some_bool, "bcd", "cbd"), "sas", ][..]); - return 0; -} diff --git a/tests/slice_of_slices.bbb b/tests/slice_of_slices.bbb deleted file mode 100644 index 70faf0d..0000000 --- a/tests/slice_of_slices.bbb +++ /dev/null @@ -1,31 +0,0 @@ -[extern] memcmp = fn [cc(c)] (a: &u8, b: &u8, byte_count: u64) s32; - -join = fn (slice: []u8, parts: [][]u8) void -{ - >destination_i: u64 = 0; - - for (part: parts) - { - >source_i: u64 = 0; - - while (source_i < part.length) - { - slice[destination_i] = part[source_i]; - destination_i += 1; - source_i += 1; - } - } -} - -[export] main = fn [cc(c)] () s32 -{ - >a = "a"; - >b = "b"; - >ab = "ab"; - >buffer: [2]u8 = undefined; - >buffer_slice = buffer[..]; - join(buffer_slice, [ a, b ][..]); - - >result = memcmp(buffer_slice.pointer, ab.pointer, ab.length); - return result; -} diff --git a/tests/slice_only_start.bbb b/tests/slice_only_start.bbb deleted file mode 100644 index 2a6afca..0000000 --- a/tests/slice_only_start.bbb +++ /dev/null @@ -1,11 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >s = "abcde"; - >index: u64 = 3; - >s_sub = s[index..]; - if (s_sub[0] != 'd') - { - #trap(); - } - return 0; -} diff --git a/tests/small_struct_ints.bbb b/tests/small_struct_ints.bbb deleted file mode 100644 index 2e0e25a..0000000 --- a/tests/small_struct_ints.bbb +++ /dev/null @@ -1,47 +0,0 @@ -SmallStructInts = struct -{ - a: u8, - b: u8, - c: u8, - d: u8, -} - -bb_ret_small_struct_ints = fn [cc(c)] () SmallStructInts -{ - return { - .a = 1, - .b = 2, - .c = 3, - .d = 4, - }; -} - -require = fn(ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -c_small_struct_ints = fn [cc(c)] (x: SmallStructInts) void -{ - require(x.a == 1); - require(x.b == 2); - require(x.c == 3); - require(x.d == 4); - - >y = bb_ret_small_struct_ints(); - - require(y.a == 1); - require(y.b == 2); - require(y.c == 3); - require(y.d == 4); -} - -[export] main = fn [cc(c)] () s32 -{ - >s: SmallStructInts = { .a = 1, .b = 2, .c = 3, .d = 4 }; - c_small_struct_ints(s); - return 0; -} diff --git a/tests/stack_add.bbb b/tests/stack_add.bbb deleted file mode 100644 index 3d7ba44..0000000 --- a/tests/stack_add.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = -1; - >b: s32 = 1; - return a + b; -} diff --git a/tests/stack_negation.bbb b/tests/stack_negation.bbb deleted file mode 100644 index efb49a4..0000000 --- a/tests/stack_negation.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >v: s32 = 0; - return -v; -} diff --git a/tests/stack_sub.bbb b/tests/stack_sub.bbb deleted file mode 100644 index 04ad5cc..0000000 --- a/tests/stack_sub.bbb +++ /dev/null @@ -1,6 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >a: s32 = 1; - >b: s32 = 1; - return a - b; -} diff --git a/tests/strict_array_type.bbb b/tests/strict_array_type.bbb deleted file mode 100644 index 66ec212..0000000 --- a/tests/strict_array_type.bbb +++ /dev/null @@ -1,5 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >arr: [3]s32 = [3, 1, 0]; - return arr[2]; -} diff --git a/tests/string_to_enum.bbb b/tests/string_to_enum.bbb deleted file mode 100644 index 558384f..0000000 --- a/tests/string_to_enum.bbb +++ /dev/null @@ -1,20 +0,0 @@ -E = enum -{ - asd, - dsa, - gsa, -} - -[export] main = fn [cc(c)] () s32 -{ - >e = "dsa"; - >s2e = #string_to_enum(E, e); - >result: s32 = 1; - - if (s2e.is_valid) - { - result = #extend(s2e.enum_value != .dsa); - } - - return result; -} diff --git a/tests/struct.bbb b/tests/struct.bbb deleted file mode 100644 index 43bf668..0000000 --- a/tests/struct.bbb +++ /dev/null @@ -1,20 +0,0 @@ -Foo = struct { - x: s32, - y: s32, - z: s32, -}; - -foo = fn(arg: Foo) s32 { - return arg.z; -} - -[export] main = fn [cc(c)] () s32 -{ - >a: Foo = { - .x = 2, - .y = 1, - .z = 0, - }; - - return foo(a); -} diff --git a/tests/struct_assignment.bbb b/tests/struct_assignment.bbb deleted file mode 100644 index 7d168ef..0000000 --- a/tests/struct_assignment.bbb +++ /dev/null @@ -1,46 +0,0 @@ -S1 = struct -{ - a: u8, - b: u8, - c: u8, -} - -S2 = struct -{ - a: u8, - b: u8, - c: u8, -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -[export] main = fn [cc(c)] () s32 -{ - >s1: S1 = { - .a = 255, - .b = 254, - .c = 253, - }; - - >s2 :S2 = { - .a = s1.a, - .b = s1.b, - .c = s1.c, - }; - - require(s1.a == 255); - require(s1.b == 254); - require(s1.c == 253); - - require(s2.a == 255); - require(s2.b == 254); - require(s2.c == 253); - - return 0; -} diff --git a/tests/struct_u64_u64.bbb b/tests/struct_u64_u64.bbb deleted file mode 100644 index e6f5c1f..0000000 --- a/tests/struct_u64_u64.bbb +++ /dev/null @@ -1,25 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -Struct_u64_u64 = struct -{ - a: u64, - b: u64, -}; - -bb_struct_u64_u64_0 = fn [cc(c)] (s: Struct_u64_u64) void -{ - require(s.a == 3); - require(s.b == 4); -} - -[export] main = fn [cc(c)] () s32 -{ - bb_struct_u64_u64_0({ .a = 3, .b = 4 }); - return 0; -} diff --git a/tests/struct_varargs.bbb b/tests/struct_varargs.bbb deleted file mode 100644 index cc3478f..0000000 --- a/tests/struct_varargs.bbb +++ /dev/null @@ -1,47 +0,0 @@ -S = struct -{ - a: u32, - b: u32, - c: u64, - d: u64, - e: u64 -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -va_arg_fn = fn [cc(c)] (first_arg: u32, ...) void -{ - if (first_arg != 123456789) - { - #trap(); - } - - >va = #va_start(); - - >s = #va_arg(&va, S); - require(s.a == 5); - require(s.b == 4); - require(s.c == 3); - require(s.d == 2); - require(s.e == 1); -} - -[export] main = fn [cc(c)] () s32 -{ - >first_arg: u32 = 123456789; - >s : S = { - .a = 5, - .b = 4, - .c = 3, - .d = 2, - .e = 1, - }; - va_arg_fn(first_arg, s); - return 0; -} diff --git a/tests/struct_zero.bbb b/tests/struct_zero.bbb deleted file mode 100644 index 32f5b90..0000000 --- a/tests/struct_zero.bbb +++ /dev/null @@ -1,35 +0,0 @@ -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -S = struct -{ - a: u8, - b: u8, - c: u8, -} - -[export] main = fn () s32 -{ - >a: S = zero; - - require(a.a == 0); - require(a.b == 0); - require(a.c == 0); - - >b: S = { - .a = 1, - .b = 1, - zero, - }; - - require(b.a == 1); - require(b.b == 1); - require(b.c == 0); - - return 0; -} diff --git a/tests/switch_else.bbb b/tests/switch_else.bbb deleted file mode 100644 index a6550bb..0000000 --- a/tests/switch_else.bbb +++ /dev/null @@ -1,22 +0,0 @@ -E = enum -{ - a, - b, - c, -} - -[export] main = fn [cc(c)] () s32 -{ - >some_enum: E = .a; - switch (some_enum) - { - .a => - { - return 0; - }, - else => - { - return 1; - }, - } -} diff --git a/tests/switch_else_empty.bbb b/tests/switch_else_empty.bbb deleted file mode 100644 index af7db27..0000000 --- a/tests/switch_else_empty.bbb +++ /dev/null @@ -1,23 +0,0 @@ -E = enum -{ - a, - b, - c, -} - -[export] main = fn [cc(c)] () s32 -{ - >some_enum: E = .b; - switch (some_enum) - { - .a => - { - return 1; - }, - else => - { - }, - } - - return 0; -} diff --git a/tests/tests.bbb b/tests/tests.bbb new file mode 100644 index 0000000..58d8e2a --- /dev/null +++ b/tests/tests.bbb @@ -0,0 +1,2328 @@ +require = fn (ok: u1) void +{ + if (!ok) + { + #trap(); + } +} + +return_constant = fn () s32 // This is a comment +// This is a comment +{ // This is a comment + // This is a comment + return 0; // This is a comment +}// This is a comment +// This is a comment + +constant_add = fn () s32 +{ + return -1 + 1; +} + +constant_and = fn () s32 +{ + return 1 & 2; +} + +constant_div = fn () s32 +{ + return 0 / 5; +} + +constant_mul = fn () s32 +{ + return 1 * 0; +} + +constant_rem = fn () s32 +{ + return 5 % 5; +} + +constant_or = fn () s32 +{ + return 0 | 0; +} + +constant_sub = fn () s32 +{ + return 1 - 1; +} + +constant_xor = fn () s32 +{ + return 0 ^ 0; +} + +constant_shift_left = fn () s32 +{ + return 0 << 1; +} + +constant_shift_right = fn () s32 +{ + return 0 >> 1; +} + +minimal_stack = fn () s32 +{ + >a: s32 = 0; + return a; +} + +minimal_stack_arithmetic0 = fn () s32 +{ + >a: s32 = 1; + return a - 1; +} + +minimal_stack_arithmetic1 = fn () s32 +{ + >a: s32 = 1; + >b = a - 1; + return b; +} + +minimal_stack_arithmetic2 = fn () s32 +{ + >a: s32 = 1; + >b = 1 - a; + return b; +} + +stack_negation = fn () s32 +{ + >v: s32 = 0; + return -v; +} + +stack_add = fn () s32 +{ + >a: s32 = -1; + >b: s32 = 1; + return a + b; +} + +stack_sub = fn () s32 +{ + >a: s32 = 1; + >b: s32 = 1; + return a - b; +} + +extend = fn () s32 +{ + >a: s8 = 0; + return #extend(a); +} + +integer_max = fn () s32 +{ + >a = #integer_max(u64); + return #truncate(a + 1); +} + +integer_hex = fn () s32 +{ + >result: s32 = 0x0; + return result; +} + +basic_pointer = fn () s32 +{ + >a: s32 = 0; + >pointer = &a; + return pointer.&; +} + +basic_call_foo = fn () s32 +{ + return 0; +} + +basic_call = fn () s32 +{ + return basic_call_foo(); +} + +basic_branch = fn () s32 +{ + >result: s32 = 1; + if (result != 1) + { + return 1; + } + else + { + return 0; + } +} + +basic_array = fn () s32 +{ + >array: [_]s32 = [3, 2, 1, 0]; + return array[3]; +} + +BasicEnum = enum +{ + zero = 0, + one = 1, + two = 2, + three = 3, +} + +basic_enum = fn () s32 +{ + >a: BasicEnum = .three; + >b: BasicEnum = .two; + >c: BasicEnum = .one; + >a_int: s32 = #extend(#int_from_enum(a)); + >b_int: s32 = #extend(#int_from_enum(b)); + >c_int: s32 = #extend(#int_from_enum(c)); + + return a_int - (b_int + c_int); +} + +basic_slice_receiver = fn (slice: []u8) void +{ + require(slice.length == 3); + require(slice[0] == 0); + require(slice[1] == 1); + require(slice[2] == 2); +} + +basic_slice = fn () void +{ + >a: [_]u8 = [0, 1, 2]; + basic_slice_receiver(a[..]); +} + +basic_string = fn () void +{ + >string = "abc"; + require(string[0] == 'a'); + require(string[1] == 'b'); + require(string[2] == 'c'); +} + +basic_varargs_function = fn [cc(c)] (first_arg: u32, ...) void +{ + require(first_arg == 123456789); + + >va = #va_start(); + + >a = #va_arg(&va, u32); + + require(a == 987654321); + + >first_arg_b = #va_arg(&va, u32); + require(first_arg == first_arg_b); +} + +basic_varargs = fn () void +{ + >first_arg: u32 = 123456789; + >a: u32 = 987654321; + basic_varargs_function(first_arg, a, first_arg); +} + +c_string_length = fn (c_string: &u8) u64 +{ + >it = c_string; + + while (it.&) + { + it = it + 1; + } + + return #int_from_pointer(it) - #int_from_pointer(c_string); +} + +basic_while = fn (argc: s32, argv: &&u8) void +{ + require(argc != 0); + + >first_arg = argv[0]; + require(first_arg != zero); + + >arg_length = c_string_length(first_arg); + require(arg_length != 0); + + require(first_arg[arg_length] == 0); +} + +pointer_function = fn (v: &s32) void +{ + v.& = 1; +} + +pointer = fn () s32 +{ + >value: s32 = 0; + pointer_function(&value); + return #extend(value == 0); +} + +pointer_cast = fn () s32 +{ + >result: u32 = 0; + >p = &result; + >signed_pointer: &s32 = #pointer_cast(p); + return signed_pointer.&; +} + +u1_return_foo = fn () u1 +{ + >result: u1 = 0; + return result; +} + +u1_return = fn () s32 +{ + >result = u1_return_foo(); + return #extend(result); +} + +local_type_inference_foo = fn () s32 +{ + return 0; +} + +local_type_inference = fn () s32 +{ + >a: s32 = 0; + >result = local_type_inference_foo() + a; + return result; +} + +basic_global_foo: s32 = 0; + +basic_global = fn () s32 +{ + return basic_global_foo; +} + +basic_function_pointer_callback = fn () s32 +{ + return 123; +} + +basic_function_pointer = fn () s32 +{ + >function_pointer = &basic_function_pointer_callback; + return function_pointer() - 123; +} + +[extern] strlen = fn [cc(c)] (string: &u8) s64; + +basic_extern = fn () void +{ + >length = strlen("abc"); + require(length == 3); +} + +basic_byte_size = fn () void +{ + >sizeofu8: u8 = #byte_size(u8); + require(sizeofu8 == 1); + >sizeofu16: u8 = #byte_size(u16); + require(sizeofu16 == 2); + >sizeofs32: s32 = #byte_size(s32); + require(sizeofs32 == 4); + >sizeofs64: s32 = #byte_size(s64); + require(sizeofs64 == 8); +} + +unsigned_assignment_operators = fn(n: s32) s32 +{ + >result: u32 = #extend(n); + result >>= 1; + result <<= 1; + result ^= 1; + result |= 1; + result &= 1; + result += 1; + result -= 1; + result /= 1; + result %= 1; + result *= 0; + + return #extend(result); +} + +assignment_operators = fn () s32 +{ + >result: s32 = 0; + >pointer = &result; + pointer -= 1; + pointer += 1; + result >>= 1; + result <<= 1; + result ^= 1; + result |= 1; + result &= 1; + result += 1; + result -= 1; + result /= 1; + result %= 1; + result *= 0; + return unsigned_assignment_operators(result); +} + +not_pointer = fn () s32 +{ + >a: s32 = 0; + >ptr = &a; + >b = !ptr; + return #extend(b); +} + +BasicBitField = bits u8 +{ + a: u2, + b: u2, + c: u2, + d: u2, +} + +basic_bits = fn () void +{ + >bf: BasicBitField = { + .a = 3, + .b = 2, + .c = 2, + .d = 3, + }; + + require(bf.a == 3); + require(bf.b == 2); + require(bf.c == 2); + require(bf.d == 3); +} + +BitsNoBackingType = bits +{ + a: u1, + b: u1, +} + +bits_no_backing_type = fn () void +{ + >bf: BitsNoBackingType = { + .a = 1, + .b = 1, + }; + + require(bf.a == 1); + require(bf.b == 1); +} + +BitsU1 = bits u32 +{ + a: u1, + b: u1, + c: u1, +} + +bits_return_u1_function = fn () u1 +{ + >b1: BitsU1 = { + .a = 1, + .b = 1, + .c = 0, + }; + + return b1.c; +} + +bits_return_u1 = fn () void +{ + >b1 = bits_return_u1_function(); + require(b1 == 0); +} + +BitsZero = bits +{ + a: u1, + b: u1, + c: u1, +} + +bits_zero = fn () void +{ + >a_bz: BitsZero = zero; + + require(a_bz.a == 0); + require(a_bz.b == 0); + require(a_bz.c == 0); + + >b_bz: BitsZero = { + .a = 1, + .b = 1, + zero, + }; + + require(b_bz.a == 1); + require(b_bz.b == 1); + require(b_bz.c == 0); +} + +basic_comparison_trivial = fn (a: s32, b: s32) u1 +{ + return a + 1 == b + 1; +} + +basic_comparison = fn (argument_count: s32) void +{ + require(basic_comparison_trivial(argument_count, argument_count)); +} + +BasicGlobalStruct = struct +{ + a: u32, + b: u32, + c: u32, +} + +basic_global_struct_variable: BasicGlobalStruct = { + .a = 1, + .b = 2, + .c = 3, +}; + +basic_global_struct = fn () void +{ + require(basic_global_struct_variable.a == 1); + require(basic_global_struct_variable.b == 2); + require(basic_global_struct_variable.c == 3); +} + +if_no_else = fn () s32 +{ + >a: s32 = 5; + if (a == 2) + { + return 1; + } + + return 0; +} + +if_no_else_void = fn () void +{ + >result: s32 = 0; + if (result != 0) + { + #trap(); + } +} + +Indirect = struct +{ + a: u32, + b: u32, + c: u32, + d: u32, + e: u32, + f: u32, +} + +indirect_ret = fn [cc(c)] () Indirect +{ + return { .a = 56, .b = 57, .c = 58, .d = 59, .e = 60, .f = 61 }; +} + +indirect_arg = fn [cc(c)] (s: Indirect) void +{ + require(s.a == 56); + require(s.b == 57); + require(s.c == 58); + require(s.d == 59); + require(s.e == 60); + require(s.f == 61); +} + +basic_indirect = fn () void +{ + >s = indirect_ret(); + require(s.a == 56); + require(s.b == 57); + require(s.c == 58); + require(s.d == 59); + require(s.e == 60); + require(s.f == 61); + indirect_arg(s); +} + +IndirectVarArgs = struct +{ + a: u64, + b: u64, + c: u64, + d: u64, + e: u64 + f: u64, + g: u64, + h: u64, + i: u64, + j: u64 +} + +indirect_varargs_function = fn [cc(c)] (first_arg: u32, ...) void +{ + if (first_arg != 123456789) + { + #trap(); + } + + >va = #va_start(); + + >s = #va_arg(&va, IndirectVarArgs); + require(s.a == 9); + require(s.b == 8); + require(s.c == 7); + require(s.d == 6); + require(s.e == 5); + require(s.f == 4); + require(s.g == 3); + require(s.h == 2); + require(s.i == 1); + require(s.j == 0); +} + +indirect_varargs = fn () void +{ + >first_arg: u32 = 123456789; + >s: IndirectVarArgs = { + .a = 9, + .b = 8, + .c = 7, + .d = 6, + .e = 5, + .f = 4, + .g = 3, + .h = 2, + .i = 1, + .j = 0, + }; + indirect_varargs_function(first_arg, s); +} + +return_type_builtin = fn () s32 +{ + >result: #ReturnType = 0; + return result; +} + +Struct_u64_u64 = struct +{ + a: u64, + b: u64, +} + +return_struct_u64_u64_function = fn [cc(c)] () Struct_u64_u64 +{ + return { .a = 1, .b = 2 }; +} + +return_struct_u64_u64 = fn [cc(c)] () s32 +{ + >r = return_struct_u64_u64_function(); + return #truncate(r.a + r.b - 3); +} + +select = fn () s32 +{ + >boolean: u1 = 1; + >left: s32 = 0; + >right: s32 = 1; + return #select(boolean, left, right); +} + +slice2 = fn (argc: s32, argv: &&u8) void +{ + require(argc != 0); + >arg_ptr = argv[0]; + >a1 = arg_ptr[0..c_string_length(arg_ptr)]; + >a2 = a1[1..]; + + require(a1.pointer == a2.pointer - 1); + require(a1.length == a2.length + 1); +} + +SA1 = struct +{ + a: u8, + b: u8, + c: u8, +} + +SA2 = struct +{ + a: u8, + b: u8, + c: u8, +} + +struct_assignment = fn () void +{ + >s1: SA1 = { + .a = 255, + .b = 254, + .c = 253, + }; + >s2: SA2 = { + .a = s1.a, + .b = s1.b, + .c = s1.c, + }; + + require(s1.a == 255); + require(s1.b == 254); + require(s1.c == 253); + + require(s2.a == 255); + require(s2.b == 254); + require(s2.c == 253); +} + +BasicStruct = struct +{ + x: s32, + y: s32, + z: s32, +} + +basic_struct_fn = fn (s: BasicStruct) s32 +{ + return s.z; +} + +basic_struct = fn () s32 +{ + >a: BasicStruct = { + .x = 2, + .y = 1, + .z = 0, + }; + + return basic_struct_fn(a); +} + +struct_zero = fn () void +{ + >a: SA1 = zero; + + require(a.a == 0); + require(a.b == 0); + require(a.c == 0); + + >b: SA1 = { + .a = 1, + .b = 1, + zero, + }; + + require(b.a == 1); + require(b.b == 1); + require(b.c == 0); +} + +basic_unreachable = fn () s32 +{ + >result: s32 = 0; + + if (result != 0) + { + unreachable; + } + + return result; +} + +S = struct +{ + a: u32, + b: u32, + c: u64, + d: u64, + e: u64 +} + +va_arg_function = fn [cc(c)] (first_arg: u32, ...) void +{ + >va = #va_start(); + + >a = #va_arg(&va, u32); + >b = #va_arg(&va, S); + >c = #va_arg(&va, s64); + >d = #va_arg(&va, s32); + + require(first_arg == 123456789); + require(a == 123); + require(c == -1); + require(d == -2); + require(b.a == 1); + require(b.b == 2); + require(b.c == 3); + require(b.d == 4); + require(b.e == 5); + + #va_end(&va); +} + +S2 = struct +{ + a: u64, + b: u64, +} + +va_arg_function2 = fn [cc(c)] (...) void +{ + >va = #va_start(); + >s2 = #va_arg(&va, S2); + require(s2.a == 8); + require(s2.b == 9); + #va_end(&va); +} + +va_args = fn [cc(c)] () void +{ + >first_arg: u32 = 123456789; + >a: u32 = 123; + >b: S = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5 }; + >c: s64 = -1; + >d: s32 = -2; + va_arg_function(first_arg, a, b, c, d); + >s2: S2 = { .a = 8, .b = 9 }; + va_arg_function2(s2); +} + +EnumBoolEnum = enum { + a, + b, + c, + d, + e, + f, + g, +} + +EnumBoolStruct = struct +{ + enum: EnumBoolEnum, + bool: u1, +} + +enum_bool_struct = fn () void +{ + >s: EnumBoolStruct = { + .enum = .f, + .bool = 1, + }; + + require(s.enum == .f); + require(s.bool); +} + +BigStruct = struct +{ + a: u64, + b: u64, + c: u64, + d: u64, + e: u8, +} + +SmallPackedStruct = bits u8 +{ + a: u2, + b: u2, + c: u2, + d: u2, +} + +SmallStructInts = struct +{ + a: u8, + b: u8, + c: u8, + d: u8, +} + +SplitStructInt = struct +{ + a: u64, + b: u8, + c: u32, +} + +MedStructInts = struct +{ + x: s32, + y: s32, + z: s32, +} + +Rect = struct +{ + left: u32, + right: u32, + top: u32, + bottom: u32, +} + +StructWithArray = struct +{ + a: s32, + padding: [4]u8, + b: s64, +} + +ByRef = struct +{ + val: s32, + arr: [15]s32, +} + +ByValOrigin = struct +{ + x: u64, + y: u64, + z: u64, +} + +ByValSize = struct +{ + width: u64, + height: u64, + depth: u64, +} + +ByVal = struct +{ + origin: ByValOrigin, + size: ByValSize, +} + +[extern] run_c_tests = fn [cc(c)] () void; + +[extern] c_u8 = fn [cc(c)] (x: u8) void; +[extern] c_u16 = fn [cc(c)] (x: u16) void; +[extern] c_u32 = fn [cc(c)] (x: u32) void; +[extern] c_u64 = fn [cc(c)] (x: u64) void; + +[extern] c_s8 = fn [cc(c)] (x: s8) void; +[extern] c_s16 = fn [cc(c)] (x: s16) void; +[extern] c_s32 = fn [cc(c)] (x: s32) void; +[extern] c_s64 = fn [cc(c)] (x: s64) void; + +[extern] c_bool = fn [cc(c)] (x: u8) void; + +[extern] c_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void; +[extern] c_ret_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64; + +[extern] c_struct_u64_u64_0 = fn [cc(c)] (a: Struct_u64_u64) void; +[extern] c_struct_u64_u64_1 = fn [cc(c)] (a: u64, b: Struct_u64_u64) void; +[extern] c_struct_u64_u64_2 = fn [cc(c)] (a: u64, b: u64, c: Struct_u64_u64) void; +[extern] c_struct_u64_u64_3 = fn [cc(c)] (a: u64, b: u64, c: u64, d: Struct_u64_u64) void; +[extern] c_struct_u64_u64_4 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: Struct_u64_u64) void; +[extern] c_struct_u64_u64_5 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: Struct_u64_u64) void; +[extern] c_struct_u64_u64_6 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: Struct_u64_u64) void; +[extern] c_struct_u64_u64_7 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, h: Struct_u64_u64) void; +[extern] c_struct_u64_u64_8 = fn [cc(c)] (a: u64, b: u64, c: u64, d: u64, e: u64, f: u64, g: u64, h: u64, i: Struct_u64_u64) void; + +[extern] c_big_struct = fn [cc(c)] (x: BigStruct) void; +[extern] c_small_struct_ints = fn [cc(c)] (x: SmallStructInts) void; +[extern] c_ret_small_struct_ints = fn [cc(c)] () SmallStructInts; +[extern] c_med_struct_ints = fn [cc(c)] (x: MedStructInts) void; +[extern] c_ret_med_struct_ints = fn [cc(c)] () MedStructInts; +[extern] c_small_packed_struct = fn [cc(c)] (x: SmallPackedStruct) void; +[extern] c_ret_small_packed_struct = fn [cc(c)] () SmallPackedStruct; +[extern] c_split_struct_ints = fn [cc(c)] (x: SplitStructInt) void; +[extern] c_big_struct_both = fn [cc(c)] (x: BigStruct) BigStruct; +[extern] c_multiple_struct_ints = fn [cc(c)] (a: Rect, b: Rect) void; + +[extern] c_ret_bool = fn [cc(c)] () u8; + +[extern] c_ret_u8 = fn [cc(c)] () u8; +[extern] c_ret_u16 = fn [cc(c)] () u16; +[extern] c_ret_u32 = fn [cc(c)] () u32; +[extern] c_ret_u64 = fn [cc(c)] () u64; + +[extern] c_ret_s8 = fn [cc(c)] () s8; +[extern] c_ret_s16 = fn [cc(c)] () s16; +[extern] c_ret_s32 = fn [cc(c)] () s32; +[extern] c_ret_s64 = fn [cc(c)] () s64; + +[extern] c_struct_with_array = fn [cc(c)] (x: StructWithArray) void; +[extern] c_ret_struct_with_array = fn [cc(c)] () StructWithArray; + +[extern] c_modify_by_ref_param = fn [cc(c)] (x: ByRef) ByRef; +[extern] c_func_ptr_byval = fn [cc(c)] (a: u64, b: u64, c: ByVal, d: u64, e: u64, f: u64) void; + +[export] bb_u8 = fn [cc(c)] (x: u8) void +{ + require(x == 0xff); +} + +[export] bb_u16 = fn [cc(c)] (x: u16) void +{ + require(x == 0xfffe); +} + +[export] bb_u32 = fn [cc(c)] (x: u32) void +{ + require(x == 0xfffffffd); +} + +[export] bb_u64 = fn [cc(c)] (x: u64) void +{ + require(x == 0xfffffffffffffffc); +} + +[export] bb_s8 = fn [cc(c)] (x: s8) void +{ + require(x == -1); +} + +[export] bb_s16 = fn [cc(c)] (x: s16) void +{ + require(x == -2); +} + +[export] bb_s32 = fn [cc(c)] (x: s32) void +{ + require(x == -3); +} + +[export] bb_s64 = fn [cc(c)] (x: s64) void +{ + require(x == -4); +} + +[export] bb_ptr = fn [cc(c)] (x: &u8) void +{ + require(#int_from_pointer(x) == 0xdeadbeef); +} + +[export] bb_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void +{ + require(a == 12); + require(b == 34); + require(c == 56); + require(d == 78); + require(e == 90); +} + +[export] bb_bool = fn [cc(c)] (x: u8) void +{ + require(#truncate(x)); +} + +[export] bb_ret_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64 +{ + return { .a = 1, .b = 2, }; +} + +[export] bb_struct_u64_u64_0 = fn [cc(c)] (s: Struct_u64_u64) void +{ + require(s.a == 3); + require(s.b == 4); +} + +[export] bb_struct_u64_u64_1 = fn [cc(c)] (_: u64, s: Struct_u64_u64) void +{ + require(s.a == 5); + require(s.b == 6); +} + +[export] bb_struct_u64_u64_2 = fn [cc(c)] (_: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 7); + require(s.b == 8); +} + +[export] bb_struct_u64_u64_3 = fn [cc(c)] (_: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 9); + require(s.b == 10); +} + +[export] bb_struct_u64_u64_4 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 11); + require(s.b == 12); +} + +[export] bb_struct_u64_u64_5 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 13); + require(s.b == 14); +} + +[export] bb_struct_u64_u64_6 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 15); + require(s.b == 16); +} + +[export] bb_struct_u64_u64_7 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 17); + require(s.b == 18); +} + +[export] bb_struct_u64_u64_8 = fn [cc(c)] (_: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, _: u64, s: Struct_u64_u64) void +{ + require(s.a == 19); + require(s.b == 20); +} + +[export] bb_big_struct = fn [cc(c)] (x: BigStruct) void +{ + require(x.a == 1); + require(x.b == 2); + require(x.c == 3); + require(x.d == 4); + require(x.e == 5); +} + +[export] bb_small_packed_struct = fn [cc(c)] (x: SmallPackedStruct) void +{ + require(x.a == 0); + require(x.b == 1); + require(x.c == 2); + require(x.d == 3); +} + +[export] bb_split_struct_ints = fn [cc(c)] (x: SplitStructInt) void +{ + require(x.a == 1234); + require(x.b == 100); + require(x.c == 1337); +} + +[export] bb_big_struct_both = fn [cc(c)] (x: BigStruct) BigStruct +{ + require(x.a == 30); + require(x.b == 31); + require(x.c == 32); + require(x.d == 33); + require(x.e == 34); + >s: BigStruct = { + .a = 20, + .b = 21, + .c = 22, + .d = 23, + .e = 24, + }; + return s; +} + +[export] bb_ret_bool = fn [cc(c)] () u8 +{ + return 1; +} + +[export] bb_ret_u8 = fn [cc(c)] () u8 +{ + return 0xff; +} + +[export] bb_ret_u16 = fn [cc(c)] () u16 +{ + return 0xffff; +} + +[export] bb_ret_u32 = fn [cc(c)] () u32 +{ + return 0xffffffff; +} + +[export] bb_ret_u64 = fn [cc(c)] () u64 +{ + return 0xffffffffffffffff; +} + +[export] bb_ret_s8 = fn [cc(c)] () s8 +{ + return -1; +} + +[export] bb_ret_s16 = fn [cc(c)] () s16 +{ + return -1; +} + +[export] bb_ret_s32 = fn [cc(c)] () s32 +{ + return -1; +} + +[export] bb_ret_s64 = fn [cc(c)] () s64 +{ + return -1; +} + +[export] bb_ret_small_struct_ints = fn [cc(c)] () SmallStructInts +{ + return { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + }; +} + +[export] bb_ret_med_struct_ints = fn [cc(c)] () MedStructInts +{ + return { + .x = 1, + .y = 2, + .z = 3, + }; +} + +[export] bb_multiple_struct_ints = fn [cc(c)] (x: Rect, y: Rect) void +{ + require(x.left == 1); + require(x.right == 21); + require(x.top == 16); + require(x.bottom == 4); + require(y.left == 178); + require(y.right == 189); + require(y.top == 21); + require(y.bottom == 15); +} + +[export] bb_small_struct_ints = fn [cc(c)] (x: SmallStructInts) void +{ + require(x.a == 1); + require(x.b == 2); + require(x.c == 3); + require(x.d == 4); +} + +[export] bb_med_struct_ints = fn [cc(c)] (s: MedStructInts) void +{ + require(s.x == 1); + require(s.y == 2); + require(s.z == 3); +} + +c_abi_tests = fn () void +{ + run_c_tests(); + c_u8(0xff); + c_u16(0xfffe); + c_u32(0xfffffffd); + c_u64(0xfffffffffffffffc); + + //if (has_i128) { + // c_struct_u128({ .value = 0xfffffffffffffffc, }); + //} + + c_s8(-1); + c_s16(-2); + c_s32(-3); + c_s64(-4); + + //if (has_i128) { + // c_struct_i128({ .value = -6, }); + //} + + c_bool(1); + + c_five_integers(12, 34, 56, 78, 90); + + >s = c_ret_struct_u64_u64(); + require(s.a == 21); + require(s.b == 22); + c_struct_u64_u64_0({ .a = 23, .b = 24, }); + c_struct_u64_u64_1(0, { .a = 25, .b = 26, }); + c_struct_u64_u64_2(0, 1, { .a = 27, .b = 28, }); + c_struct_u64_u64_3(0, 1, 2, { .a = 29, .b = 30, }); + c_struct_u64_u64_4(0, 1, 2, 3, { .a = 31, .b = 32, }); + c_struct_u64_u64_5(0, 1, 2, 3, 4, { .a = 33, .b = 34, }); + c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, { .a = 35, .b = 36, }); + c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, { .a = 37, .b = 38, }); + c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, { .a = 39, .b = 40, }); + + >big_struct: BigStruct = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + .e = 5, + }; + c_big_struct(big_struct); + + >small: SmallStructInts = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + }; + c_small_struct_ints(small); + >small2 = c_ret_small_struct_ints(); + require(small2.a == 1); + require(small2.b == 2); + require(small2.c == 3); + require(small2.d == 4); + + >med: MedStructInts = { + .x = 1, + .y = 2, + .z = 3, + }; + c_med_struct_ints(med); + >med2 = c_ret_med_struct_ints(); + require(med2.x == 1); + require(med2.y == 2); + require(med2.z == 3); + + >p: SmallPackedStruct = { .a = 0, .b = 1, .c = 2, .d = 3, }; + c_small_packed_struct(p); + >p2 = c_ret_small_packed_struct(); + require(p2.a == 0); + require(p2.b == 1); + require(p2.c == 2); + require(p2.d == 3); + + >split: SplitStructInt = { + .a = 1234, + .b = 100, + .c = 1337, + }; + c_split_struct_ints(split); + + > big: BigStruct = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + .e = 5, + }; + >big2 = c_big_struct_both(big); + require(big2.a == 10); + require(big2.b == 11); + require(big2.c == 12); + require(big2.d == 13); + require(big2.e == 14); + + >r1: Rect = { + .left = 1, + .right = 21, + .top = 16, + .bottom = 4, + }; + >r2: Rect = { + .left = 178, + .right = 189, + .top = 21, + .bottom = 15, + }; + c_multiple_struct_ints(r1, r2); + + require(c_ret_bool() == 1); + + require(c_ret_u8() == 0xff); + require(c_ret_u16() == 0xffff); + require(c_ret_u32() == 0xffffffff); + require(c_ret_u64() == 0xffffffffffffffff); + + require(c_ret_s8() == -1); + require(c_ret_s16() == -1); + require(c_ret_s32() == -1); + require(c_ret_s64() == -1); + + c_struct_with_array({ .a = 1, .padding = [0, 0, 0, 0], .b = 2, }); + + >x = c_ret_struct_with_array(); + require(x.a == 4); + require(x.b == 155); + + >res = c_modify_by_ref_param({ .val = 1, .arr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }); + require(res.val == 42); + + >function_pointer = &c_func_ptr_byval; + function_pointer(1, 2, { .origin = { .x = 9, .y = 10, .z = 11, }, .size = { .width = 12, .height = 13, .depth = 14, }, }, 3, 4, 5); +} + +S2Enum = enum +{ + asd, + dsa, + gsa, +} + +string_to_enum = fn () s32 +{ + >e = "dsa"; + >s2e = #string_to_enum(S2Enum, e); + >result: s32 = 1; + + if (s2e.is_valid) + { + result = #extend(s2e.enum_value != .dsa); + } + + return result; +} + +empty_if = fn (argument_count: s32) s32 +{ + >result: s32 = 0; + + if (argument_count != 1) + { + result = 1; + } + else + { + } + + return result; +} + +else_if = fn () s32 +{ + >result: s32 = 0; + if (result == 1) + { + return 1; + } + else if (result == 0) + { + return 0; + } + else + { + return 5; + } +} + +ElseIfEnum = enum +{ + a, + b, + c, +} + +else_if_complicated = fn (argument_count: s32) s32 +{ + >result: s32 = 0; + >foo: ElseIfEnum = .b; + switch (foo) + { + .b => + { + if (argument_count != 0) + { + >a: s32 = 1; + if (result == 1) + { + } + else if (result == 0) + { + return 0; + } + else + { + return 5; + } + return a; + } + }, + else => + { + } + } + + return 0; +} + +basic_shortcircuiting_if = fn (argument_count: s32) s32 +{ + >a: s32 = 0; + if (argument_count != 3 and? argument_count != 2) + { + return 0; + } + else + { + return 1; + } +} + +shortcircuiting_if = fn (argument_count: s32) s32 +{ + >a: s32 = 0; + if (argument_count != 0 and? argument_count != 2 and? argument_count != 3 or? argument_count != 1) + { + return 0; + } + else if (argument_count == 5 or? a == 0) + { + return 45; + } + else + { + return 1; + } +} + +FieldAccessLeftAssign = struct +{ + a: u32, + b: u32, +} + +field_access_left_assign = fn () void +{ + >s: FieldAccessLeftAssign = { + .a = 2, + .b = 3, + }; + + s.a = s.b + 1; + s.b = s.a + 2; + + require(s.a == 4); + require(s.b == 6); +} + +for_each = fn () void +{ + >array: [_]u32 = [5, 3, 2]; + >counter: u32 = 0; + for (e : array) + { + counter += e; + } + + require(counter == 10); + + for (&e : array) + { + e.& += 1; + } + + >new_counter: u32 = 0; + + for (e : array) + { + new_counter += e; + } + + require(new_counter == counter + array.length); +} + +pointer_decay = fn () s32 +{ + >array: [_]s32 = [1, 3, 5]; + >pointer: &s32 = &array[0]; + >index: u64 = 0; + pointer[index] = 0; + return pointer[index]; +} + +NameEnum = enum +{ + my_expected_result, + a, + b, +} + +[extern] memcmp = fn [cc(c)] (a: &u8, b: &u8, byte_count: u64) s32; + +string_equal = fn (slice_a: []u8, slice_b: []u8) u1 +{ + >result = slice_a.length == slice_b.length; + if (result) + { + result = memcmp(slice_a.pointer, slice_b.pointer, slice_a.length) == 0; + } + + return result; +} + +enum_name = fn () s32 +{ + >some_enum: NameEnum = .my_expected_result; + return #extend(!string_equal(#enum_name(some_enum), "my_expected_result")); +} + +join = fn (slice: []u8, parts: [][]u8) void +{ + >destination_i: u64 = 0; + + for (part: parts) + { + >source_i: u64 = 0; + + while (source_i < part.length) + { + slice[destination_i] = part[source_i]; + destination_i += 1; + source_i += 1; + } + } +} + +slice_of_slices = fn () s32 +{ + >a = "a"; + >b = "b"; + >ab = "ab"; + >buffer: [2]u8 = undefined; + >buffer_slice = buffer[..]; + join(buffer_slice, [ a, b ][..]); + + >result = memcmp(buffer_slice.pointer, ab.pointer, ab.length); + return result; +} + +int = typealias s32; + +type_alias = fn [cc(c)] () int +{ + return 0; +} + +integer_formats = fn () s32 +{ + >a: s32 = 0o10; + >b: s32 = 0b1000; + >c: s32 = 0d0; + return a - b + c; +} + +for_each_int = fn () s32 +{ + >top: s32 = 64; + >accumulator: s32 = 0; + for (i: 0..top) + { + accumulator += 1; + } + return accumulator - top; +} + +bool_array = fn () s32 +{ + >signs: [2]u1 = [0, 0]; + >accumulator: s32 = 0; + + for (s: signs) + { + accumulator += #extend(s); + } + + return accumulator; +} + +BasicUnion = union +{ + s: s32, + u: u32, +} + +basic_union = fn [cc(c)] () void +{ + >my_union: BasicUnion = { + .s = -1, + }; + require(my_union.s == -1); + require(my_union.u == 0xffffffff); +} + +break_continue = fn () s32 +{ + >a: s32 = 0; + + while (a < 10) + { + if (a == 3) + { + break; + } + + a += 1; + continue; + } + + >b: s32 = 2; + for (i: 0..10) + { + if (b == 2) + { + b += 1; + continue; + } + else + { + break; + } + } + + return a - b; +} + +i2315_abc: s32 = 5; +asjdkj = i2315_abc - i2315_abc; + +constant_global_reference = fn () s32 +{ + return asjdkj; +} + +is_space = fn (ch: u8) u1 +{ + return ch == ' ' or ch == '\n' or ch == '\t' or ch == '\r'; +} + +concat_logical_or = fn () s32 +{ + return #extend(is_space('f')); +} + +strict_array_type = fn () s32 +{ + >arr: [3]s32 = [3, 1, 0]; + return arr[2]; +} + +PointerStructInitialization = struct +{ + a: u16, + b: u8, + c: u8, + d: u32, +} + +pointer_struct_initialization = fn () void +{ + >s: PointerStructInitialization = zero; + + >p_s = &s; + p_s.& = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + }; + + require(s.a == 1); + require(s.b == 2); + require(s.c == 3); + require(s.d == 4); +} + +slice_array_literal_receiver = fn (slices: [][]u8) void +{ + require(slices.length == 3); +} + +slice_array_literal = fn () void +{ + >some_bool: u1 = 0; + slice_array_literal_receiver([ "abc", #select(some_bool, "bcd", "cbd"), "sas", ][..]); +} + +slice_only_start = fn () void +{ + >s = "abcde"; + >index: u64 = 3; + >s_sub = s[index..]; + require(s_sub[0] == 'd'); +} + +sub = macro (a: s32, b: s32) s32 +{ + return a - b; +} + +basic_macro = fn () s32 +{ + >a = sub(1, 1); + >b = sub(2, 2); + return a + b; +} + +sub_generic = macro [T] (a: T, b: T) T +{ + return a - b; +} + +generic_macro = fn () s32 +{ + >a = sub_generic[s32](1, 1); + >b = sub_generic[u8](2, 2); + return a + #extend(b); +} + +pointer_macro = macro [T] (ptr: &u32) &T +{ + return #pointer_cast(ptr); +} + +A = struct +{ + a: u32, +} + +B = struct +{ + b: u32, +} + +generic_pointer_macro = fn () void +{ + >var: u32 = 0; + >a = pointer_macro[A](&var); + >b = pointer_macro[B](&var); + a.a = 1; + require(b.b == 1); + require(var == 1); +} + +assert = macro (ok: u1) void +{ + if (!ok) + { + unreachable; + } +} + +align_forward = fn (value: u64, alignment: u64) u64 +{ + assert(alignment != 0); + >mask = alignment - 1; + >result = (value + mask) & ~mask; + return result; +} + +noreturn_macro = fn () void +{ + >result = align_forward(1, 64); + + if (result != 64) + { + #trap(); + } +} + +generic_pointer_array_macro = macro[T](addr: &u64, count: u64) []T +{ + >pointer: &T = #pointer_cast(addr); + return pointer[..count]; +} + +generic_pointer_array = fn () void +{ + >address_raw: u64 = 0xaaaaaaaaaaaaaaaa; + >some_var: &u64 = #pointer_from_int(address_raw); + >result: []&u8 = generic_pointer_array_macro[&u8](some_var, 1); + require(#int_from_pointer(result.pointer) == address_raw); + require(result.length == 1); +} + +SelfReferentialStruct = struct +{ + self: &SelfReferentialStruct, +} + +self_referential_struct = fn () void +{ + >s: SelfReferentialStruct = zero; + s.self = &s; + require(s.self == &s); +} + +ForwardDeclaredType = struct; +ForwardDeclaredTypeWrapper = struct +{ + forward: &ForwardDeclaredType, +} + +ForwardDeclaredType = struct +{ + f: ForwardDeclaredTypeWrapper, +} + +forward_declared_type = fn () void +{ + >f: ForwardDeclaredType = zero; + f.f.forward = &f; +} + +EnumArrayEnum = enum +{ + a, + b, + c, + d, +} + +enum_array = fn () void +{ + >some_enum_array: enum_array[EnumArrayEnum](u32) = [ .a = 4, .b = 3, .c = 2, .d = 1 ]; + require(some_enum_array[.a] == 4); + require(some_enum_array[.b] == 3); + require(some_enum_array[.c] == 2); + require(some_enum_array[.d] == 1); +} + +OpaqueType = opaque; + +[extern] memcpy = fn [cc(c)] (destination: &s32, source: &s32, size: u64) &OpaqueType; + +basic_opaque = fn () s32 +{ + >destination: s32 = 1; + >source: s32 = 0; + >opaque_pointer = memcpy(&destination, &source, #byte_size(s32)); + >pointer: &s32 = #pointer_cast(opaque_pointer); + if (pointer != &destination) + { + #trap(); + } + return destination; +} + +EnumArbitraryAbi = enum +{ + a, + b, + c, + d, +} + +enum_arbitrary_abi_function = fn (arg: EnumArbitraryAbi) EnumArbitraryAbi +{ + return arg; +} + +enum_arbitrary_abi = fn () void +{ + >some_e: EnumArbitraryAbi = .c; + >a = enum_arbitrary_abi_function(some_e); + >b = enum_arbitrary_abi_function(.d); + require(a == .c); + require(b == .d); +} + +TypeId = enum +{ + void, + noreturn, + forward_declaration, + integer, + function, + pointer, + array, + enum, + struct, + bits, + alias, + union, + unresolved, + vector, + floating_point, + enum_array, + opaque, +} + +Type = struct +{ + arr: [5]u32, + id: TypeId, + a: [2]u64, + b: u64, +} + +enum_debug_info = fn () void +{ + >t: Type = { + .id = .integer, + zero, + }; + t.arr[0] = 1; + t.arr[0] = 2; + t.arr[0] = 3; +} + +ReturnArrayEnum = enum +{ + a, + b, + c, + d, + e, + f, +} + +return_array_function = fn () [2]ReturnArrayEnum +{ + return [ .f, .e ]; +} + +return_array = fn () void +{ + >result = return_array_function(); + require(result[0] == .f); + require(result[1] == .e); +} + +BoolPair = struct +{ + a: u1, + b: u1, +} + +bool_pair_function = fn () BoolPair +{ + return { .a = 0, .b = 1 }; +} + +bool_pair = fn () void +{ + >result = bool_pair_function(); + require(!result.a); + require(result.b); +} + +min_max = fn () void +{ + >a: u32 = 1; + >b: u32 = 2; + >min = #min(a, b); + >max = #max(a, b); + require(min == a); + require(max == b); +} + +FieldParentPointerStruct = struct +{ + a: u8, + b: u32, + c: u8, +} + +field_parent_pointer = fn () void +{ + >s: FieldParentPointerStruct = { + .a = 241, + .b = 12356, + .c = 128, + }; + + >p_a = &s.a; + >p_a_struct: &FieldParentPointerStruct = #field_parent_pointer(p_a, "a"); + require(p_a_struct == &s); + require(p_a_struct.a == s.a); + require(p_a_struct.b == s.b); + require(p_a_struct.c == s.c); + + >p_b = &s.b; + >p_b_struct: &FieldParentPointerStruct = #field_parent_pointer(p_b, "b"); + require(p_b_struct == &s); + require(p_b_struct.a == s.a); + require(p_b_struct.b == s.b); + require(p_b_struct.c == s.c); + + >p_c = &s.c; + >p_c_struct: &FieldParentPointerStruct = #field_parent_pointer(p_c, "c"); + require(p_c_struct == &s); + require(p_c_struct.a == s.a); + require(p_c_struct.b == s.b); + require(p_c_struct.c == s.c); +} + +leading_trailing_zeroes = fn () void +{ + >a: u32 = 0b111; + require(#leading_zeroes(a) == 29); + require(#trailing_zeroes(a) == 0); + >b: u8 = 0b11010; + require(#leading_zeroes(b) == 3); + require(#trailing_zeroes(b) == 1); +} + +pointer_sub = fn () void +{ + >a: [_]s32 = [ 3, 1 ]; + >p0 = &a[0]; + >p1 = p0 + 1; + >sub: u32 = #truncate(p1 - p0); + require(sub == 1); +} + +[export] main = fn [cc(c)] (argc: s32, argv: &&u8, envp: &&u8) s32 +{ + >rc = return_constant(); + require(rc == 0); + + >const_add = constant_add(); + require(const_add == 0); + + >const_and = constant_and(); + require(const_and == 0); + + >const_div = constant_div(); + require(const_div == 0); + + >const_mul = constant_mul(); + require(const_mul == 0); + + >const_rem = constant_rem(); + require(const_rem == 0); + + >const_or = constant_or(); + require(const_or == 0); + + >const_sub = constant_sub(); + require(const_sub == 0); + + >const_xor = constant_xor(); + require(const_xor == 0); + + >const_shift_left = constant_shift_left(); + require(const_shift_left == 0); + + >const_shift_right = constant_shift_right(); + require(const_shift_right == 0); + + >min_stack = minimal_stack(); + require(min_stack == 0); + + >min_stack_arithmetic0 = minimal_stack_arithmetic0(); + require(min_stack_arithmetic0 == 0); + + >min_stack_arithmetic1 = minimal_stack_arithmetic1(); + require(min_stack_arithmetic1 == 0); + + >min_stack_arithmetic2 = minimal_stack_arithmetic2(); + require(min_stack_arithmetic2 == 0); + + >st_neg = stack_negation(); + require(st_neg == 0); + + >st_add = stack_add(); + require(st_add == 0); + + >st_sub = stack_sub(); + require(st_sub == 0); + + >ext = extend(); + require(ext == 0); + + >int_max = integer_max(); + require(int_max == 0); + + >int_hex = integer_hex(); + require(int_hex == 0); + + >b_pointer = basic_pointer(); + require(b_pointer == 0); + + >b_call = basic_call(); + require(b_call == 0); + + >b_branch = basic_branch(); + require(b_branch == 0); + + >b_array = basic_array(); + require(b_array == 0); + + >b_enum = basic_enum(); + require(b_enum == 0); + + basic_slice(); + + basic_string(); + + basic_varargs(); + + basic_while(argc, argv); + + >p = pointer(); + require(p == 0); + + >pc = pointer_cast(); + require(pc == 0); + + >u1_ret = u1_return(); + require(u1_ret == 0); + + >lti = local_type_inference(); + require(lti == 0); + + >bg = basic_global(); + require(bg == 0); + + >bfp = basic_function_pointer(); + require(bfp == 0); + + basic_extern(); + + basic_byte_size(); + + >assignment_ops = assignment_operators(); + require(assignment_ops == 0); + + >np = not_pointer(); + require(np == 0); + + basic_bits(); + + bits_no_backing_type(); + + bits_return_u1(); + + bits_zero(); + + basic_comparison(argc); + + basic_global_struct(); + + >if_ne = if_no_else(); + require(if_ne == 0); + + if_no_else_void(); + + basic_indirect(); + + indirect_varargs(); + + >rtb = return_type_builtin(); + require(rtb == 0); + + >rs6464 = return_struct_u64_u64(); + require(rs6464 == 0); + + >sel = select(); + require(sel == 0); + + slice2(argc, argv); + + struct_assignment(); + + >bs = basic_struct(); + require(bs == 0); + + struct_zero(); + + >bu = basic_unreachable(); + require(bu == 0); + + va_args(); + + enum_bool_struct(); + + c_abi_tests(); + + >s2e = string_to_enum(); + require(s2e == 0); + + >ei = empty_if(argc); + require(ei == 0); + + >eif = else_if(); + require(eif == 0); + + >ei_complicated = else_if_complicated(argc); + require(ei_complicated == 0); + + >basic_sif = basic_shortcircuiting_if(argc); + require(basic_sif == 0); + + >sif = shortcircuiting_if(argc); + require(sif == 0); + + field_access_left_assign(); + + for_each(); + + >pdecay = pointer_decay(); + require(pdecay == 0); + + >en = enum_name(); + require(en == 0); + + >sos = slice_of_slices(); + require(sos == 0); + + require(type_alias() == 0); + + >if = integer_formats(); + require(if == 0); + + >fei = for_each_int(); + require(fei == 0); + + >ba = bool_array(); + require(ba == 0); + + basic_union(); + + >bc = break_continue(); + require(bc == 0); + + >cgr = constant_global_reference(); + require(cgr == 0); + + >cc_logical_or = concat_logical_or(); + require(cc_logical_or == 0); + + >sat = strict_array_type(); + require(sat == 0); + + pointer_struct_initialization(); + + slice_array_literal(); + + slice_only_start(); + + >bm = basic_macro(); + require(bm == 0); + + >gm = generic_macro(); + require(gm == 0); + + generic_pointer_macro(); + + noreturn_macro(); + + generic_pointer_array(); + + self_referential_struct(); + + forward_declared_type(); + + enum_array(); + + >opq = basic_opaque(); + require(opq == 0); + + enum_arbitrary_abi(); + + enum_debug_info(); + + return_array(); + + bool_pair(); + + min_max(); + + field_parent_pointer(); + + leading_trailing_zeroes(); + + pointer_sub(); + + return 0; +} diff --git a/tests/type_alias.bbb b/tests/type_alias.bbb deleted file mode 100644 index 4ca70d3..0000000 --- a/tests/type_alias.bbb +++ /dev/null @@ -1,6 +0,0 @@ -int = typealias s32; - -[export] main = fn [cc(c)] () int -{ - return 0; -} diff --git a/tests/u1_return.bbb b/tests/u1_return.bbb deleted file mode 100644 index b7dee5c..0000000 --- a/tests/u1_return.bbb +++ /dev/null @@ -1,11 +0,0 @@ -foo = fn [cc(c)] () u1 -{ - >result: u1 = 0; - return result; -} - -[export] main = fn [cc(c)] () s32 -{ - >result = foo(); - return #extend(result); -} diff --git a/tests/unreachable.bbb b/tests/unreachable.bbb deleted file mode 100644 index d2c2e16..0000000 --- a/tests/unreachable.bbb +++ /dev/null @@ -1,9 +0,0 @@ -[export] main = fn [cc(c)] () s32 -{ - >result: s32 = 0; - if (result != 0) - { - unreachable; - } - return result; -} diff --git a/tests/varargs.bbb b/tests/varargs.bbb deleted file mode 100644 index 192af57..0000000 --- a/tests/varargs.bbb +++ /dev/null @@ -1,66 +0,0 @@ -S = struct -{ - a: u32, - b: u32, - c: u64, - d: u64, - e: u64 -} - -require = fn (ok: u1) void -{ - if (!ok) - { - #trap(); - } -} - -va_arg_function = fn [cc(c)] (first_arg: u32, ...) void -{ - >va = #va_start(); - - >a = #va_arg(&va, u32); - >b = #va_arg(&va, S); - >c = #va_arg(&va, s64); - >d = #va_arg(&va, s32); - - require(first_arg == 123456789); - require(a == 123); - require(c == -1); - require(d == -2); - require(b.a == 1); - require(b.b == 2); - require(b.c == 3); - require(b.d == 4); - require(b.e == 5); - - #va_end(&va); -} - -S2 = struct -{ - a: u64, - b: u64, -} - -va_arg_function2 = fn [cc(c)] (...) void -{ - >va = #va_start(); - >s2 = #va_arg(&va, S2); - require(s2.a == 8); - require(s2.b == 9); - #va_end(&va); -} - -[export] main = fn [cc(c)] () s32 -{ - >first_arg: u32 = 123456789; - >a: u32 = 123; - >b: S = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5 }; - >c: s64 = -1; - >d: s32 = -2; - va_arg_function(first_arg, a, b, c, d); - >s2: S2 = { .a = 8, .b = 9 }; - va_arg_function2(s2); - return 0; -} -- 2.43.0 From 911af6dba35edaee06272c913363004b461e45d4 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 10:02:07 -0600 Subject: [PATCH 04/16] Fix CMAKE_BUILD_TYPE --- generate.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate.sh b/generate.sh index 0fc07f6..c882262 100755 --- a/generate.sh +++ b/generate.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -set -eu +set -eux if [[ -z "${BB_CI:-}" ]]; then CMAKE_BUILD_TYPE=Debug @@ -43,5 +43,5 @@ if [[ -z "${CLANG_PATH:-}" ]]; then CLANGXX_PATH=clang++ fi -cmake .. -G Ninja -DCMAKE_C_COMPILER=$CLANG_PATH -DCMAKE_CXX_COMPILER=$CLANGXX_PATH -DCMAKE_LINKER_TYPE=$LINKER_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_PREFIX_PATH=$LLVM_PREFIX_PATH -DCMAKE_COLOR_DIAGNOSTICS=ON -DBB_CI=$BB_CI +cmake .. -G Ninja -DCMAKE_C_COMPILER=$CLANG_PATH -DCMAKE_CXX_COMPILER=$CLANGXX_PATH -DCMAKE_LINKER_TYPE=$LINKER_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DCMAKE_PREFIX_PATH=$LLVM_PREFIX_PATH -DCMAKE_COLOR_DIAGNOSTICS=ON -DBB_CI=$BB_CI cd .. -- 2.43.0 From 0c0fc1249afd13b34a77e27205e30618060a22fc Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 16:56:07 -0600 Subject: [PATCH 05/16] Upgrade to 20.1.7 and use release with assertions --- .gitea/workflows/ci.yml | 2 +- generate.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5d26db2..3359ab2 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest ] - BIRTH_CMAKE_BUILD_TYPE: [ Debug, Release ] + BIRTH_CMAKE_BUILD_TYPE: [ Release-assertions, Release ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/generate.sh b/generate.sh index c882262..19d2188 100755 --- a/generate.sh +++ b/generate.sh @@ -36,12 +36,12 @@ esac rm -rf $BUILD_DIR mkdir $BUILD_DIR cd $BUILD_DIR -LLVM_PREFIX_PATH=$HOME/dev/llvm/install/llvm_20.1.3_$BIRTH_ARCH-$BIRTH_OS-$LLVM_CMAKE_BUILD_TYPE +LLVM_PREFIX_PATH=$HOME/dev/llvm/install/llvm_20.1.7_$BIRTH_ARCH-$BIRTH_OS-$LLVM_CMAKE_BUILD_TYPE if [[ -z "${CLANG_PATH:-}" ]]; then CLANG_PATH=clang CLANGXX_PATH=clang++ fi -cmake .. -G Ninja -DCMAKE_C_COMPILER=$CLANG_PATH -DCMAKE_CXX_COMPILER=$CLANGXX_PATH -DCMAKE_LINKER_TYPE=$LINKER_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DCMAKE_PREFIX_PATH=$LLVM_PREFIX_PATH -DCMAKE_COLOR_DIAGNOSTICS=ON -DBB_CI=$BB_CI +cmake .. -G Ninja -DCMAKE_C_COMPILER=$CLANG_PATH -DCMAKE_CXX_COMPILER=$CLANGXX_PATH -DCMAKE_LINKER_TYPE=$LINKER_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE%%-*} -DCMAKE_PREFIX_PATH=$LLVM_PREFIX_PATH -DCMAKE_COLOR_DIAGNOSTICS=ON -DBB_CI=$BB_CI cd .. -- 2.43.0 From 706548743a93947692786c217c10307d0ab59c3e Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 17:26:50 -0600 Subject: [PATCH 06/16] Split CI files and emit debug --- .gitea/workflows/{ci.yml => main.yml} | 8 +++---- .gitea/workflows/pr.yml | 30 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) rename .gitea/workflows/{ci.yml => main.yml} (81%) create mode 100644 .gitea/workflows/pr.yml diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/main.yml similarity index 81% rename from .gitea/workflows/ci.yml rename to .gitea/workflows/main.yml index 3359ab2..0664e00 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/main.yml @@ -1,14 +1,11 @@ name: CI on: - pull_request: push: tags: - "**" branches: - main - schedule: - - cron: "0 0 * * *" env: BB_CI: 1 @@ -19,7 +16,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest ] - BIRTH_CMAKE_BUILD_TYPE: [ Release-assertions, Release ] + BIRTH_CMAKE_BUILD_TYPE: [ Debug, Release-assertions, Release ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -53,6 +50,7 @@ jobs: run: | set -eux mkdir -p $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) + cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Debug/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/native/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native - name: Release (locally) @@ -62,6 +60,7 @@ jobs: BB_CI: 1 run: | set -eux + cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug $HOME/bloat-buster-artifacts/releases/main/ cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic $HOME/bloat-buster-artifacts/releases/main/ cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native $HOME/bloat-buster-artifacts/releases/main/ - name: Release (web) @@ -71,5 +70,6 @@ jobs: NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18 with: files: |- + /home/act_runner/bloat-buster-artifacts/releases/main/compiler_generic_debug /home/act_runner/bloat-buster-artifacts/releases/main/compiler_generic /home/act_runner/bloat-buster-artifacts/releases/main/compiler_native diff --git a/.gitea/workflows/pr.yml b/.gitea/workflows/pr.yml new file mode 100644 index 0000000..b973236 --- /dev/null +++ b/.gitea/workflows/pr.yml @@ -0,0 +1,30 @@ +name: CI + +on: + pull_request: + +env: + BB_CI: 1 + +jobs: + ci: + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + BIRTH_CMAKE_BUILD_TYPE: [ Release-assertions, Release ] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Build and test (Packaged LLVM) + shell: bash + env: + BB_CI: 1 + CMAKE_BUILD_TYPE: ${{matrix.BIRTH_CMAKE_BUILD_TYPE}} + CLANG_PATH: clang-19 + CLANGXX_PATH: clang++-19 + run: | + set -eux + ./generate.sh + ./build.sh + ./build/bb test -- 2.43.0 From bc4e399fa8021b2d0224f883febf30d5688644a6 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 21:35:16 -0600 Subject: [PATCH 07/16] Add release scripts --- .gitea/workflows/main.yml | 16 ++++------------ ci/install.sh | 7 +++++++ ci/release.sh | 6 ++++++ ci/release_locally.sh | 10 ++++++++++ ci/reproduce.sh | 8 ++++++++ generate.sh | 5 ++++- 6 files changed, 39 insertions(+), 13 deletions(-) create mode 100755 ci/install.sh create mode 100755 ci/release.sh create mode 100755 ci/release_locally.sh create mode 100755 ci/reproduce.sh diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 0664e00..97de1a7 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -9,6 +9,7 @@ on: env: BB_CI: 1 + BUILD_DEBUG: 1 jobs: ci: @@ -29,11 +30,7 @@ jobs: CLANGXX_PATH: clang++-19 run: | set -eux - ./generate.sh - ./build.sh - ./build/bb test - mkdir -p $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE - mv ./self-hosted-bb-cache $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE/cache + ci/reproduce.sh release: needs: ci strategy: @@ -49,10 +46,7 @@ jobs: BB_CI: 1 run: | set -eux - mkdir -p $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) - cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Debug/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug - cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic - cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/native/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native + ci/install.sh - name: Release (locally) if: ${{ (github.ref == 'refs/heads/main') }} shell: bash @@ -60,9 +54,7 @@ jobs: BB_CI: 1 run: | set -eux - cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug $HOME/bloat-buster-artifacts/releases/main/ - cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic $HOME/bloat-buster-artifacts/releases/main/ - cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native $HOME/bloat-buster-artifacts/releases/main/ + ci/release.sh - name: Release (web) uses: akkuman/gitea-release-action@v1 if: ${{ (github.ref == 'refs/heads/main') }} diff --git a/ci/install.sh b/ci/install.sh new file mode 100755 index 0000000..16cd308 --- /dev/null +++ b/ci/install.sh @@ -0,0 +1,7 @@ +set -eux +mkdir -p $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) +if [[ -n "${BUILD_DEBUG:-}" ]]; then + cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Debug/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug +fi +cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic +cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/native/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native diff --git a/ci/release.sh b/ci/release.sh new file mode 100755 index 0000000..8e5ef24 --- /dev/null +++ b/ci/release.sh @@ -0,0 +1,6 @@ +set -eux +if [[ -n "${BUILD_DEBUG:-}" ]]; then + cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug $HOME/bloat-buster-artifacts/releases/main/ +fi +cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic $HOME/bloat-buster-artifacts/releases/main/ +cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native $HOME/bloat-buster-artifacts/releases/main/ diff --git a/ci/release_locally.sh b/ci/release_locally.sh new file mode 100755 index 0000000..db6a3d8 --- /dev/null +++ b/ci/release_locally.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -eux +if [[ -n "${BUILD_DEBUG:-}" ]]; then + export BUILD_DEBUG + CMAKE_BUILD_TYPE=Debug ./reproduce.sh +fi +CMAKE_BUILD_TYPE=Release ./reproduce.sh +CMAKE_BUILD_TYPE=Release-assertions ./reproduce.sh +./install.sh +./release.sh diff --git a/ci/reproduce.sh b/ci/reproduce.sh new file mode 100755 index 0000000..7cd3b47 --- /dev/null +++ b/ci/reproduce.sh @@ -0,0 +1,8 @@ +set -eux +rm -rf bb-cache self-hosted-bb-cache || true +./generate.sh +./build.sh +./build/bb test +mkdir -p $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE +mv ./self-hosted-bb-cache $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE/cache + diff --git a/generate.sh b/generate.sh index 19d2188..94c34f3 100755 --- a/generate.sh +++ b/generate.sh @@ -2,9 +2,12 @@ set -eux if [[ -z "${BB_CI:-}" ]]; then + BB_CI=0 +fi + +if [[ -z "${CMAKE_BUILD_TYPE:-}" ]]; then CMAKE_BUILD_TYPE=Debug LLVM_CMAKE_BUILD_TYPE=Release - BB_CI=0 else LLVM_CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE fi -- 2.43.0 From 57edde0823364154ebd916a90d29076ef9db844d Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 21:39:58 -0600 Subject: [PATCH 08/16] Change intrinsic character --- src/compiler.bbb | 776 +++++++++++++++++++++++------------------------ src/parser.cpp | 6 +- tests/tests.bbb | 128 ++++---- 3 files changed, 455 insertions(+), 455 deletions(-) diff --git a/src/compiler.bbb b/src/compiler.bbb index 26d2e8e..a28c1e1 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -1,6 +1,6 @@ report_error = fn () noreturn { - #trap(); + @trap(); } mode_t = typealias u64; @@ -145,7 +145,7 @@ next_power_of_two = fn (n: u64) u64 return n; } -string_no_match = #integer_max(u64); +string_no_match = @integer_max(u64); c_string_length = fn (c_string: &u8) u64 { @@ -156,7 +156,7 @@ c_string_length = fn (c_string: &u8) u64 it = it + 1; } - return #int_from_pointer(it) - #int_from_pointer(c_string); + return @int_from_pointer(it) - @int_from_pointer(c_string); } c_string_to_slice = fn (c_string: &u8) []u8 @@ -167,7 +167,7 @@ c_string_to_slice = fn (c_string: &u8) []u8 string_equal = fn(a: []u8, b: []u8) u1 { - >result: #ReturnType = 0; + >result: @ReturnType = 0; if (a.length == b.length) { @@ -281,7 +281,7 @@ os_linux_protection_flags = fn(map_flags: OS_ProtectionFlags) OS_Linux_PROT os_linux_map_flags = fn(map_flags: OS_MapFlags) OS_Linux_MAP { return { - .type = #select(map_flags.private, .private, .shared), + .type = @select(map_flags.private, .private, .shared), .anonymous = map_flags.anonymous, .no_reserve = map_flags.no_reserve, .populate = map_flags.populate, @@ -294,7 +294,7 @@ os_reserve = fn (base: u64, size: u64, protection: OS_ProtectionFlags, map: OS_M >protection_flags = os_linux_protection_flags(protection); >map_flags = os_linux_map_flags(map); >address = mmap(base, size, protection_flags, map_flags, -1, 0); - if (#int_from_pointer(address) == #integer_max(u64)) + if (@int_from_pointer(address) == @integer_max(u64)) { unreachable; } @@ -362,7 +362,7 @@ os_file_open = fn (path: &u8, flags: OpenFlags, permissions: OpenPermissions) Fi zero, }; - >mode: mode_t = #select(permissions.execute, 0o755, 0o644); + >mode: mode_t = @select(permissions.execute, 0o755, 0o644); >fd = open(path, o, mode); return fd; } @@ -383,14 +383,14 @@ os_file_get_size = fn (fd: File) u64 >stat: Stat = undefined; >result = fstat(fd, &stat); assert(result == 0); - return #extend(stat.size); + return @extend(stat.size); } os_file_read_partially = fn (fd: File, pointer: &u8, length: u64) u64 { >result = read(fd, pointer, length); assert(result > 0); - return #extend(result); + return @extend(result); } os_file_read = fn (fd: File, buffer: []u8, byte_count: u64) void @@ -410,7 +410,7 @@ os_file_write_partially = fn (fd: File, pointer: &u8, length: u64) u64 { >result = write(fd, pointer, length); assert(result > 0); - return #extend(result); + return @extend(result); } os_file_write = fn (fd: File, buffer: []u8) void @@ -448,7 +448,7 @@ Arena = struct reserved: [32]u8, } -minimum_position: u64 = #byte_size(Arena); +minimum_position: u64 = @byte_size(Arena); ArenaInitialization = struct { @@ -472,8 +472,8 @@ arena_initialize = fn (initialization: ArenaInitialization) &Arena .populate = 0, }; - >arena: &Arena = #pointer_cast(os_reserve(0, initialization.reserved_size, protection_flags, map_flags)); - os_commit(#int_from_pointer(arena), initialization.initial_size, { + >arena: &Arena = @pointer_cast(os_reserve(0, initialization.reserved_size, protection_flags, map_flags)); + os_commit(@int_from_pointer(arena), initialization.initial_size, { .read = 1, .write = 1, zero, @@ -504,14 +504,14 @@ arena_allocate_bytes = fn (arena: &Arena, size: u64, alignment: u64) &u8 >aligned_offset = align_forward(arena.position, alignment); >aligned_size_after = aligned_offset + size; - >arena_byte_pointer: &u8 = #pointer_cast(arena); + >arena_byte_pointer: &u8 = @pointer_cast(arena); if (aligned_size_after > arena.os_position) { >target_committed_size = align_forward(aligned_size_after, arena.granularity); >size_to_commit = target_committed_size - arena.os_position; >commit_pointer = arena_byte_pointer + arena.os_position; - os_commit(#int_from_pointer(commit_pointer), size_to_commit, { + os_commit(@int_from_pointer(commit_pointer), size_to_commit, { .read = 1, .write = 1, zero, @@ -528,12 +528,12 @@ arena_allocate_bytes = fn (arena: &Arena, size: u64, alignment: u64) &u8 arena_allocate = macro [T] (arena: &Arena, count: u64) &T { - return #pointer_cast(arena_allocate_bytes(arena, #byte_size(T) * count, #align_of(T))); + return @pointer_cast(arena_allocate_bytes(arena, @byte_size(T) * count, @align_of(T))); } arena_allocate_slice = macro [T] (arena: &Arena, count: u64) []T { - >pointer: &T = #pointer_cast(arena_allocate_bytes(arena, #byte_size(T) * count, #align_of(T))); + >pointer: &T = @pointer_cast(arena_allocate_bytes(arena, @byte_size(T) * count, @align_of(T))); return pointer[..count]; } @@ -571,7 +571,7 @@ arena_join_string = fn (arena: &Arena, pieces: [][]u8) []u8 exit_status = fn (s: u32) u8 { - return #truncate((s & 0xff00) >> 8); + return @truncate((s & 0xff00) >> 8); } term_sig = fn (s: u32) u32 @@ -581,7 +581,7 @@ term_sig = fn (s: u32) u32 stop_sig = fn (s: u32) u32 { - return #extend(exit_status(s)); + return @extend(exit_status(s)); } if_exited = fn (s: u32) u1 @@ -591,7 +591,7 @@ if_exited = fn (s: u32) u1 if_stopped = fn (s: u32) u1 { - >v: u16 = #truncate(((s & 0xffff) * 0x10001) >> 8); + >v: u16 = @truncate(((s & 0xffff) * 0x10001) >> 8); return v > 0x7f00; } @@ -655,7 +655,7 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex { if (pipe(&pipes[i]) == -1) { - #trap(); + @trap(); } } } @@ -666,13 +666,13 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex { -1 => { - #trap(); + @trap(); }, 0 => { for (i: 0..2) { - >fd: s32 = #truncate(i + 1); + >fd: s32 = @truncate(i + 1); switch (options.policies[i]) { @@ -698,7 +698,7 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex unreachable; } - #trap(); + @trap(); }, else => { @@ -718,8 +718,8 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex if (is_pipe0 or is_pipe1) { >element_count: u64 = 0; - element_count += #extend(is_pipe0); - element_count += #extend(is_pipe1); + element_count += @extend(is_pipe0); + element_count += @extend(is_pipe1); allocation = arena_allocate_slice[u8](arena, allocation_size * element_count); } @@ -732,7 +732,7 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex >buffer = allocation[offset..offset + allocation_size]; >byte_count = read(pipes[i][0], buffer.pointer, buffer.length); assert(byte_count >= 0); - result.streams[i] = buffer[..#extend(byte_count)]; + result.streams[i] = buffer[..@extend(byte_count)]; close(pipes[i][0]); offset += allocation_size; @@ -747,7 +747,7 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex if (if_exited(status)) { result.termination_kind = .exit; - result.termination_code = #extend(exit_status(status)); + result.termination_code = @extend(exit_status(status)); } else if (if_signaled(status)) { @@ -771,11 +771,11 @@ os_execute = fn (arena: &Arena, arguments: []&u8, environment: &&u8, options: Ex } else if (waitpid_result == -1) { - #trap(); + @trap(); } else { - #trap(); + @trap(); } }, } @@ -1350,7 +1350,7 @@ abi_set_padding_type = fn (abi_information: &AbiInformation, type: &Type) void abi_get_padding_type = fn (abi_information: &AbiInformation) &Type { - return #select(abi_can_have_padding_type(abi_information), abi_information.padding.type, zero); + return @select(abi_can_have_padding_type(abi_information), abi_information.padding.type, zero); } abi_set_direct_offset = fn (abi_information: &AbiInformation, offset: u32) void @@ -1592,7 +1592,7 @@ receives_type = fn (value: &Value) u1 }, else => { - #trap(); + @trap(); }, } } @@ -1624,7 +1624,7 @@ type_is_signed = fn (type: &Type) u1 }, else => { - #trap(); + @trap(); }, } } @@ -1676,7 +1676,7 @@ is_illegal_vector_type = fn (type: &Type) u1 { .vector => { - #trap(); + @trap(); } else => { return 0; }, } @@ -1714,13 +1714,13 @@ is_arbitrary_bit_integer = fn (type: &Type) u1 integer_max_value = fn (bit_count: u64, signed: u1) u64 { - >value: u64 = #select(bit_count == 64, ~0, (1 << (bit_count - #extend(signed))) - 1); + >value: u64 = @select(bit_count == 64, ~0, (1 << (bit_count - @extend(signed))) - 1); return value; } align_bit_count = fn (bit_count: u64) u64 { - >aligned_bit_count = #max(next_power_of_two(bit_count), 8); + >aligned_bit_count = @max(next_power_of_two(bit_count), 8); assert(aligned_bit_count % 8 == 0); return aligned_bit_count; } @@ -1791,7 +1791,7 @@ get_byte_size = fn (type: &Type) u64 }, else => { - #trap(); + @trap(); }, } } @@ -1802,7 +1802,7 @@ get_byte_alignment = fn (type: &Type) u32 { .integer => { - >aligned_byte_count: u32 = #truncate(aligned_byte_count_from_bit_count(type.content.integer.bit_count)); + >aligned_byte_count: u32 = @truncate(aligned_byte_count_from_bit_count(type.content.integer.bit_count)); assert(aligned_byte_count == 1 or aligned_byte_count == 2 or aligned_byte_count == 4 or aligned_byte_count == 8 or aligned_byte_count == 16); return aligned_byte_count; }, @@ -1842,7 +1842,7 @@ get_byte_alignment = fn (type: &Type) u32 }, else => { - #trap(); + @trap(); }, } } @@ -1895,7 +1895,7 @@ get_bit_size = fn (type: &Type) u64 }, else => { - #trap(); + @trap(); }, } } @@ -1904,7 +1904,7 @@ get_byte_allocation_size = fn (type: &Type) u64 { >size = get_byte_size(type); >alignment = get_byte_alignment(type); - >result = align_forward(size, #extend(alignment)); + >result = align_forward(size, @extend(alignment)); return result; } @@ -1955,7 +1955,7 @@ is_promotable_integer_type_for_abi = fn (type: &Type) u1 }, else => { - #trap(); + @trap(); } } } @@ -2392,7 +2392,7 @@ value_is_constant = fn (value: &Value) u1 }, else => { - #trap(); + @trap(); } } } @@ -2795,11 +2795,11 @@ llvm_create_global_variable = fn (module: &LLVMModule, type: &LLVMType, is_const assert(name.pointer[name.length] == 0); >global = LLVMAddGlobal(module, type, name.pointer); - LLVMSetGlobalConstant(global, #extend(is_constant)); + LLVMSetGlobalConstant(global, @extend(is_constant)); LLVMSetLinkage(global, linkage); LLVMSetInitializer(global, initial_value); LLVMSetThreadLocalMode(global, thread_local_mode); - LLVMSetExternallyInitialized(global, #extend(externally_initialized)); + LLVMSetExternallyInitialized(global, @extend(externally_initialized)); LLVMSetUnnamedAddress(global, unnamed_address); LLVMSetAlignment(global, alignment); @@ -3142,25 +3142,25 @@ Statement = struct scope_to_for = fn (scope: &Scope) &StatementFor { assert(scope.kind == .for_each); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } scope_to_block = fn (scope: &Scope) &Block { assert(scope.kind == .local); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } scope_to_function = fn (scope: &Scope) &ValueFunction { assert(scope.kind == .function); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } scope_to_module = fn (scope: &Scope) &Module { assert(scope.kind == .global); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } new_local = fn (module: &Module, scope: &Scope) &Local @@ -3255,7 +3255,7 @@ integer_type = fn (module: &Module, integer: TypeInteger) &Type { assert(integer.bit_count != 0); assert(integer.bit_count <= 64); - >index = #select(integer.bit_count == 128, i128_offset + #extend(integer.signed), integer.bit_count - 1 + 64 * #extend(integer.signed)); + >index = @select(integer.bit_count == 128, i128_offset + @extend(integer.signed), integer.bit_count - 1 + 64 * @extend(integer.signed)); >result = module.scope.types.first + index; assert(result.id == .integer); assert(result.content.integer.bit_count == integer.bit_count); @@ -3369,7 +3369,7 @@ format_integer_decimal = fn (buffer: []u8, v: u64) u64 while (value != 0) { - >digit_value: u8 = #truncate(value % 10); + >digit_value: u8 = @truncate(value % 10); >ascii_character = digit_value + '0'; value /= 10; reverse_buffer[reverse_index] = ascii_character; @@ -3524,15 +3524,15 @@ is_identifier = fn (ch: u8) u1 get_line = fn (module: &Module) u32 { >line = module.line_offset + 1; - assert(line <= #integer_max(u32)); - return #truncate(line); + assert(line <= @integer_max(u32)); + return @truncate(line); } get_column = fn (module: &Module) u32 { >column = module.offset - module.line_character_offset + 1; - assert(column <= #integer_max(u32)); - return #truncate(column); + assert(column <= @integer_max(u32)); + return @truncate(column); } Checkpoint = struct @@ -3566,8 +3566,8 @@ skip_space = fn (module: &Module) void while (module.offset < module.content.length and? is_space(module.content[module.offset])) { - module.line_offset += #extend(module.content[module.offset] == '\n'); - module.line_character_offset = #select(module.content[module.offset] == '\n', module.offset, module.line_character_offset); + module.line_offset += @extend(module.content[module.offset] == '\n'); + module.line_character_offset = @select(module.content[module.offset] == '\n', module.offset, module.line_character_offset); module.offset += 1; } @@ -3607,7 +3607,7 @@ consume_character_if_match = fn (module: &Module, expected_character: u8) u1 { >ch = module.content[module.offset]; is_ch = expected_character == ch; - module.offset += #extend(is_ch); + module.offset += @extend(is_ch); } return is_ch; @@ -3680,7 +3680,7 @@ parse_string_literal = fn (module: &Module) []u8 break; } - escape_character_count += #extend(ch == '\\'); + escape_character_count += @extend(ch == '\\'); module.offset += 1; } @@ -3763,7 +3763,7 @@ FunctionTypeAttribute = enum accumulate_decimal = fn(accumulator: u64, ch: u8) u64 { assert(is_decimal(ch)); - return (accumulator * 10) + #extend(ch - '0'); + return (accumulator * 10) + @extend(ch - '0'); } parse_decimal = fn (module: &Module) u64 @@ -3802,7 +3802,7 @@ accumulate_octal = fn (accumulator: u64, ch: u8) u64 { assert(is_octal(ch)); - return (accumulator * 8) + #extend(ch - '0'); + return (accumulator * 8) + @extend(ch - '0'); } parse_octal = fn (module: &Module) u64 @@ -3829,7 +3829,7 @@ parse_octal = fn (module: &Module) u64 accumulate_binary = fn (accumulator: u64, ch: u8) u64 { assert(is_binary(ch)); - return (accumulator * 2) + #extend(ch - '0'); + return (accumulator * 2) + @extend(ch - '0'); } parse_binary = fn (module: &Module) u64 @@ -3966,14 +3966,14 @@ get_anonymous_struct_pair = fn (module: &Module, low: &Type, high: &Type) &Type } >high_alignment = get_byte_alignment(high); - >alignment = #max(get_byte_alignment(low), high_alignment); - >high_offset = align_forward(get_byte_size(low), #extend(alignment)); - >byte_size = align_forward(high_offset + get_byte_size(high), #extend(alignment)); + >alignment = @max(get_byte_alignment(low), high_alignment); + >high_offset = align_forward(get_byte_size(low), @extend(alignment)); + >byte_size = align_forward(high_offset + get_byte_size(high), @extend(alignment)); assert(low.scope != zero); assert(high.scope != zero); - >scope = #select(low.scope.kind == .global, high.scope, low.scope); + >scope = @select(low.scope.kind == .global, high.scope, low.scope); >fields = arena_allocate_slice[Field](module.arena, 2); @@ -4024,12 +4024,12 @@ get_by_value_argument_pair = fn (module: &Module, low: &Type, high: &Type) &Type { >low_size = get_byte_allocation_size(low); >high_alignment = get_byte_alignment(high); - >high_start = align_forward(low_size, #extend(high_alignment)); + >high_start = align_forward(low_size, @extend(high_alignment)); assert(high_start != 0 and high_start <= 8); if (high_start != 8) { - #trap(); + @trap(); } >result = get_anonymous_struct_pair(module, low, high); @@ -4248,7 +4248,7 @@ get_enum_array_type = fn (module: &Module, enum_type: &Type, element_type: &Type assert(enum_type.scope != zero); assert(element_type.scope != zero); - >scope = #select(element_type.scope.kind == .global, enum_type.scope, element_type.scope); + >scope = @select(element_type.scope.kind == .global, enum_type.scope, element_type.scope); >enum_array_type = new_type(module, { .content = { @@ -4357,7 +4357,7 @@ resolve_alias = fn (module: &Module, type: &Type) &Type }, else => { - #trap(); + @trap(); }, } @@ -4460,7 +4460,7 @@ parse_function_header = fn (module: &Module, scope: &Scope, mandate_argument_nam while (module.offset < module.content.length) { >function_identifier = parse_identifier(module); - >function_keyword_s2e = #string_to_enum(FunctionKeyword, function_identifier); + >function_keyword_s2e = @string_to_enum(FunctionKeyword, function_identifier); if (!function_keyword_s2e.is_valid) { @@ -4477,7 +4477,7 @@ parse_function_header = fn (module: &Module, scope: &Scope, mandate_argument_nam expect_character(module, left_parenthesis); skip_space(module); >calling_convention_string = parse_identifier(module); - >calling_convention_s2e = #string_to_enum(CallingConvention, calling_convention_string); + >calling_convention_s2e = @string_to_enum(CallingConvention, calling_convention_string); if (!calling_convention_s2e.is_valid) { @@ -4570,7 +4570,7 @@ parse_function_header = fn (module: &Module, scope: &Scope, mandate_argument_nam if (semantic_argument_count != 0) { argument_types = arena_allocate_slice[&Type](module.arena, semantic_argument_count); - memcpy(#pointer_cast(argument_types.pointer), #pointer_cast(&semantic_argument_type_buffer), semantic_argument_count * #byte_size(&Type)); + memcpy(@pointer_cast(argument_types.pointer), @pointer_cast(&semantic_argument_type_buffer), semantic_argument_count * @byte_size(&Type)); } >function_type = get_function_type(module, { @@ -4614,7 +4614,7 @@ parse_type = fn (module: &Module, scope: &Scope) &Type { >identifier = parse_identifier(module); - >type_keyword_s2e = #string_to_enum(TypeKeyword, identifier); + >type_keyword_s2e = @string_to_enum(TypeKeyword, identifier); if (type_keyword_s2e.is_valid) { @@ -4835,12 +4835,12 @@ parse_type = fn (module: &Module, scope: &Scope) &Type } } } - else if (start_character == '#') + else if (start_character == '@') { module.offset += 1; >identifier = parse_identifier(module); - >intrinsic_s2e = #string_to_enum(TypeIntrinsic, identifier); + >intrinsic_s2e = @string_to_enum(TypeIntrinsic, identifier); if (!intrinsic_s2e.is_valid) { report_error(); @@ -4883,7 +4883,7 @@ accumulate_hexadecimal = fn (accumulator: u64, ch: u8) u64 unreachable; } - return (accumulator * 16) + #extend(value); + return (accumulator * 16) + @extend(value); } parse_hexadecimal = fn (module: &Module) u64 @@ -4959,7 +4959,7 @@ tokenize = fn (module: &Module) Token zero, }; }, - '#' => + '@' => { module.offset += 1; @@ -4967,7 +4967,7 @@ tokenize = fn (module: &Module) Token { >identifier = parse_identifier(module); - >value_intrinsic_s2e = #string_to_enum(ValueIntrinsic, identifier); + >value_intrinsic_s2e = @string_to_enum(ValueIntrinsic, identifier); if (value_intrinsic_s2e.is_valid) { >value_intrinsic = value_intrinsic_s2e.enum_value; @@ -4994,7 +4994,7 @@ tokenize = fn (module: &Module) Token >id: TokenId = undefined; switch (next_ch) { - '<' => { id = #select(module.content[start_index + 2] == '=', .assign_shift_left, .shift_left); }, + '<' => { id = @select(module.content[start_index + 2] == '=', .assign_shift_left, .shift_left); }, '=' => { id = .compare_less_equal; }, else => { id = .compare_less; }, } @@ -5021,7 +5021,7 @@ tokenize = fn (module: &Module) Token >id: TokenId = undefined; switch (next_ch) { - '>' => { id = #select(module.content[start_index + 2] == '=', .assign_shift_right, .shift_right); }, + '>' => { id = @select(module.content[start_index + 2] == '=', .assign_shift_right, .shift_right); }, '=' => { id = .compare_greater_equal; }, else => { id = .compare_greater; }, } @@ -5046,8 +5046,8 @@ tokenize = fn (module: &Module) Token { >next_ch = module.content[start_index + 1]; >is_compare_equal = next_ch == '='; - >id: TokenId = #select(is_compare_equal, .compare_equal, .assign); - module.offset += #extend(is_compare_equal) + 1; + >id: TokenId = @select(is_compare_equal, .compare_equal, .assign); + module.offset += @extend(is_compare_equal) + 1; token = { .id = id, zero, @@ -5124,7 +5124,7 @@ tokenize = fn (module: &Module) Token token = { .content = { .integer = { - .value = #extend(ch), + .value = @extend(ch), .kind = .character_literal, }, }, @@ -5148,7 +5148,7 @@ tokenize = fn (module: &Module) Token } >inferred_decimal = token_integer_kind == .decimal and next_ch != 'd'; - module.offset += 2 * #extend(token_integer_kind != .decimal or !inferred_decimal); + module.offset += 2 * @extend(token_integer_kind != .decimal or !inferred_decimal); } >value: u64 = undefined; @@ -5221,14 +5221,14 @@ tokenize = fn (module: &Module) Token token.id = id; - module.offset += #extend(next_ch == '=') + 1; + module.offset += @extend(next_ch == '=') + 1; }, else => { if (is_identifier_start(start_character)) { >identifier = parse_identifier(module); - >value_keyword_s2e = #string_to_enum(ValueKeyword, identifier); + >value_keyword_s2e = @string_to_enum(ValueKeyword, identifier); if (value_keyword_s2e.is_valid) { >value_keyword = value_keyword_s2e.enum_value; @@ -5242,10 +5242,10 @@ tokenize = fn (module: &Module) Token else { >advance = identifier.pointer[identifier.length] == '?'; - identifier.length += #extend(advance); - module.offset += #extend(advance); + identifier.length += @extend(advance); + module.offset += @extend(advance); - >operator_keyword_s2e = #string_to_enum(OperatorKeyword, identifier); + >operator_keyword_s2e = @string_to_enum(OperatorKeyword, identifier); if (operator_keyword_s2e.is_valid) { @@ -5260,8 +5260,8 @@ tokenize = fn (module: &Module) Token } else { - identifier.length -= #extend(advance); - module.offset -= #extend(advance); + identifier.length -= @extend(advance); + module.offset -= @extend(advance); token = { .content = { @@ -5288,13 +5288,13 @@ parse_precedence = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &V scope_to_macro_declaration = fn (scope: &Scope) &MacroDeclaration { assert(scope.kind == .macro_declaration); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } scope_to_macro_instantiation = fn (scope: &Scope) &MacroInstantiation { assert(scope.kind == .macro_instantiation); - return #field_parent_pointer(scope, "scope"); + return @field_parent_pointer(scope, "scope"); } reference_identifier = fn (module: &Module, current_scope: &Scope, identifier: []u8, kind: ValueKind) &Value @@ -5407,7 +5407,7 @@ reference_identifier = fn (module: &Module, current_scope: &Scope, identifier: [ { if (string_equal(identifier, constant_argument.name)) { - #trap(); + @trap(); } } @@ -5526,7 +5526,7 @@ parse_aggregate_initialization = fn (module: &Module, scope: &Scope, builder: Va } >elements = arena_allocate_slice[AggregateInitializationElement](module.arena, field_count); - memcpy(#pointer_cast(elements.pointer), #pointer_cast(&element_buffer), field_count * #byte_size(AggregateInitializationElement)); + memcpy(@pointer_cast(elements.pointer), @pointer_cast(&element_buffer), field_count * @byte_size(AggregateInitializationElement)); >result = new_value(module); result.& = { @@ -5586,7 +5586,7 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value >unary_builder = builder; unary_builder.precedence = .prefix; unary_builder.token = zero; - unary_builder.kind = #select(token.id == .ampersand, .left, builder.kind); + unary_builder.kind = @select(token.id == .ampersand, .left, builder.kind); >unary_value = parse_precedence(module, scope, unary_builder); @@ -5813,7 +5813,7 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value // TODO .va_copy => { - #trap(); + @trap(); }, .max, .min => { @@ -5947,7 +5947,7 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value } >values = arena_allocate_slice[&Value](module.arena, element_count); - memcpy(#pointer_cast(values.pointer), #pointer_cast(&value_buffer), element_count * #byte_size(&Value)); + memcpy(@pointer_cast(values.pointer), @pointer_cast(&value_buffer), element_count * @byte_size(&Value)); result = new_value(module); @@ -6152,7 +6152,7 @@ parse_call_arguments = fn (module: &Module, scope: &Scope) []&Value if (argument_count != 0) { arguments = arena_allocate_slice[&Value](module.arena, argument_count); - memcpy(#pointer_cast(arguments.pointer), #pointer_cast(&argument_buffer), argument_count * #byte_size(&Value)); + memcpy(@pointer_cast(arguments.pointer), @pointer_cast(&argument_buffer), argument_count * @byte_size(&Value)); } return arguments; @@ -6225,7 +6225,7 @@ parse_right = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value else => { unreachable; }, } - >right_precedence: Precedence = #enum_from_int(#int_from_enum(precedence) + 1); + >right_precedence: Precedence = @enum_from_int(@int_from_enum(precedence) + 1); >right_builder = builder; right_builder.precedence = right_precedence; right_builder.token = zero; @@ -6366,7 +6366,7 @@ parse_right = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value { .value => { - #trap(); + @trap(); }, .type => { @@ -6526,7 +6526,7 @@ parse_right_with_left = fn (module: &Module, scope: &Scope, builder: ValueBuilde >token_precedence = get_token_precedence(token); if (token_precedence == .assignment) { - token_precedence = #select(builder.allow_assignment_operators, token_precedence, .none); + token_precedence = @select(builder.allow_assignment_operators, token_precedence, .none); } if (precedence > token_precedence) @@ -6641,7 +6641,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement }; statement.id = .local; }, - '#' => + '@' => { statement.content = { .expression = parse_value(module, scope, zero), @@ -6666,7 +6666,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement skip_space(module); - >statement_start_keyword_s2e = #string_to_enum(StatementStartKeyword, statement_start_identifier); + >statement_start_keyword_s2e = @string_to_enum(StatementStartKeyword, statement_start_identifier); if (statement_start_keyword_s2e.is_valid) { >statement_start_keyword = statement_start_keyword_s2e.enum_value; @@ -6675,7 +6675,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement { ._ => { - #trap(); + @trap(); }, .return => { @@ -6767,7 +6767,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement skip_space(module); >is_left = module.content[module.offset] == '&'; - module.offset += #extend(is_left); + module.offset += @extend(is_left); >for_local_line = get_line(module); >for_local_column = get_column(module); @@ -6787,14 +6787,14 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement zero, }; - >kind: ValueKind = #select(is_left, .left, .right); + >kind: ValueKind = @select(is_left, .left, .right); left_value_buffer[left_value_count] = kind; left_value_count += 1; } else { - #trap(); + @trap(); } skip_space(module); @@ -6853,10 +6853,10 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement } >left_values = arena_allocate_slice[ValueKind](module.arena, left_value_count); - memcpy(#pointer_cast(left_values.pointer), #pointer_cast(&left_value_buffer), left_value_count * #byte_size(ValueKind)); + memcpy(@pointer_cast(left_values.pointer), @pointer_cast(&left_value_buffer), left_value_count * @byte_size(ValueKind)); >right_values = arena_allocate_slice[&Value](module.arena, right_value_count); - memcpy(#pointer_cast(right_values.pointer), #pointer_cast(&right_value_buffer), right_value_count * #byte_size(&Value)); + memcpy(@pointer_cast(right_values.pointer), @pointer_cast(&right_value_buffer), right_value_count * @byte_size(&Value)); statement.content.for.kinds = left_values; statement.content.for.iteratables = right_values; @@ -7003,7 +7003,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement } clause_values = arena_allocate_slice[StatementSwitchDiscriminant](module.arena, case_count); - memcpy(#pointer_cast(clause_values.pointer), #pointer_cast(&case_buffer), case_count * #byte_size(StatementSwitchDiscriminant)); + memcpy(@pointer_cast(clause_values.pointer), @pointer_cast(&case_buffer), case_count * @byte_size(StatementSwitchDiscriminant)); } skip_space(module); @@ -7028,7 +7028,7 @@ parse_statement = fn (module: &Module, scope: &Scope) &Statement } >clauses = arena_allocate_slice[StatementSwitchClause](module.arena, clause_count); - memcpy(#pointer_cast(clauses.pointer), #pointer_cast(&clause_buffer), clause_count * #byte_size(StatementSwitchClause)); + memcpy(@pointer_cast(clauses.pointer), @pointer_cast(&clause_buffer), clause_count * @byte_size(StatementSwitchClause)); require_semicolon = 0; @@ -7172,7 +7172,7 @@ parse_block = fn (module: &Module, parent_scope: &Scope) &Block enum_bit_count = fn (highest_value: u64) u64 { - >needed_bit_count: u64 = #select(highest_value == 0, 1, 64 - #leading_zeroes(highest_value)); + >needed_bit_count: u64 = @select(highest_value == 0, 1, 64 - @leading_zeroes(highest_value)); return needed_bit_count; } @@ -7200,7 +7200,7 @@ parse = fn (module: &Module) void while (module.offset < module.content.length) { >global_attribute_keyword_string = parse_identifier(module); - >global_attribute_keyword_s2e = #string_to_enum(GlobalAttributeKeyword, global_attribute_keyword_string); + >global_attribute_keyword_s2e = @string_to_enum(GlobalAttributeKeyword, global_attribute_keyword_string); if (!global_attribute_keyword_s2e.is_valid) { report_error(); @@ -7317,7 +7317,7 @@ parse = fn (module: &Module) void >global_keyword_string = parse_identifier(module); skip_space(module); - >global_keyword_s2e = #string_to_enum(GlobalKeyword, global_keyword_string); + >global_keyword_s2e = @string_to_enum(GlobalKeyword, global_keyword_string); is_global_keyword = global_keyword_s2e.is_valid; @@ -7388,10 +7388,10 @@ parse = fn (module: &Module) void consume_character_if_match(module, ';'); >fields = arena_allocate_slice[Field](module.arena, field_count); - memcpy(#pointer_cast(fields.pointer), #pointer_cast(&field_buffer), field_count * #byte_size(Field)); + memcpy(@pointer_cast(fields.pointer), @pointer_cast(&field_buffer), field_count * @byte_size(Field)); - >needed_bit_count = #max(next_power_of_two(field_bit_offset), 8); - if (needed_bit_count > #integer_max(u32)) + >needed_bit_count = @max(next_power_of_two(field_bit_offset), 8); + if (needed_bit_count > @integer_max(u32)) { report_error(); } @@ -7517,7 +7517,7 @@ parse = fn (module: &Module) void for (i: 0..field_count) { >value = int_value_buffer[i]; - highest_value = #max(highest_value, value); + highest_value = @max(highest_value, value); fields[i] = { .name = name_buffer[i], .value = value, @@ -7598,7 +7598,7 @@ parse = fn (module: &Module) void .column = global_column, }, .initial_value = zero, - .linkage = #select(is_export or is_extern, .external, .internal), + .linkage = @select(is_export or is_extern, .external, .internal), zero, }; } @@ -7625,7 +7625,7 @@ parse = fn (module: &Module) void .line = line, .column = 0, }, - .index = #truncate(i + 1), + .index = @truncate(i + 1), }; } @@ -7688,7 +7688,7 @@ parse = fn (module: &Module) void if (has_value) { - #trap(); + @trap(); } else { @@ -7727,7 +7727,7 @@ parse = fn (module: &Module) void expect_character(module, left_parenthesis); macro_declaration.constant_arguments = arena_allocate_slice[ConstantArgument](module.arena, constant_argument_count); - memcpy(#pointer_cast(macro_declaration.constant_arguments.pointer), #pointer_cast(&constant_argument_buffer), constant_argument_count * #byte_size(ConstantArgument)); + memcpy(@pointer_cast(macro_declaration.constant_arguments.pointer), @pointer_cast(&constant_argument_buffer), constant_argument_count * @byte_size(ConstantArgument)); if (module.first_macro_declaration) { @@ -7780,7 +7780,7 @@ parse = fn (module: &Module) void .column = argument_column, zero, }, - .index = #truncate(argument_index + 1), + .index = @truncate(argument_index + 1), }; argument_count += 1; @@ -7795,7 +7795,7 @@ parse = fn (module: &Module) void macro_declaration.return_type = return_type; >arguments = arena_allocate_slice[Argument](module.arena, argument_count); - memcpy(#pointer_cast(arguments.pointer), #pointer_cast(&argument_buffer), argument_count * #byte_size(Argument)); + memcpy(@pointer_cast(arguments.pointer), @pointer_cast(&argument_buffer), argument_count * @byte_size(Argument)); macro_declaration.arguments = arguments; skip_space(module); @@ -7866,7 +7866,7 @@ parse = fn (module: &Module) void >field_byte_size = get_byte_size(field_type); >field_byte_alignment = get_byte_alignment(field_type); // Align struct size by field alignment - >field_byte_offset = align_forward(byte_size, #extend(field_byte_alignment)); + >field_byte_offset = align_forward(byte_size, @extend(field_byte_alignment)); field_buffer[field_index] = { .name = field_name, @@ -7876,7 +7876,7 @@ parse = fn (module: &Module) void }; byte_size = field_byte_offset + field_byte_size; - byte_alignment = #max(byte_alignment, field_byte_alignment); + byte_alignment = @max(byte_alignment, field_byte_alignment); skip_space(module); @@ -7885,14 +7885,14 @@ parse = fn (module: &Module) void field_count += 1; } - byte_size = align_forward(byte_size, #extend(byte_alignment)); - assert(byte_size % #extend(byte_alignment) == 0); + byte_size = align_forward(byte_size, @extend(byte_alignment)); + assert(byte_size % @extend(byte_alignment) == 0); skip_space(module); consume_character_if_match(module, ';'); >fields = arena_allocate_slice[Field](module.arena, field_count); - memcpy(#pointer_cast(fields.pointer), #pointer_cast(&field_buffer), field_count * #byte_size(Field)); + memcpy(@pointer_cast(fields.pointer), @pointer_cast(&field_buffer), field_count * @byte_size(Field)); struct_type.content = { .struct = { @@ -7997,9 +7997,9 @@ parse = fn (module: &Module) void .line = field_line, }; - biggest_field = #select(field_size > byte_size, field_index, biggest_field); - alignment = #max(alignment, field_alignment); - byte_size = #max(byte_size, field_size); + biggest_field = @select(field_size > byte_size, field_index, biggest_field); + alignment = @max(alignment, field_alignment); + byte_size = @max(byte_size, field_size); skip_space(module); @@ -8010,7 +8010,7 @@ parse = fn (module: &Module) void consume_character_if_match(module, ';'); >fields = arena_allocate_slice[UnionField](module.arena, field_count); - memcpy(#pointer_cast(fields.pointer), #pointer_cast(&field_buffer), field_count * #byte_size(UnionField)); + memcpy(@pointer_cast(fields.pointer), @pointer_cast(&field_buffer), field_count * @byte_size(UnionField)); >biggest_size = get_byte_size(fields[biggest_field].type); assert(biggest_size == byte_size); @@ -8077,8 +8077,8 @@ resolve_type_in_place_abi = fn (module: &Module, type: &Type) void .integer => { >bit_count = type.content.integer.bit_count; - assert(bit_count <= #integer_max(u32)); - result = LLVMIntTypeInContext(module.llvm.context, #truncate(bit_count)); + assert(bit_count <= @integer_max(u32)); + result = LLVMIntTypeInContext(module.llvm.context, @truncate(bit_count)); }, .pointer, .opaque, @@ -8115,7 +8115,7 @@ resolve_type_in_place_abi = fn (module: &Module, type: &Type) void } >is_packed: u1 = 0; - result = LLVMStructTypeInContext(module.llvm.context, &llvm_type_buffer[0], #truncate(fields.length), #extend(is_packed)); + result = LLVMStructTypeInContext(module.llvm.context, &llvm_type_buffer[0], @truncate(fields.length), @extend(is_packed)); >llvm_size = LLVMStoreSizeOfType(module.llvm.target_data_layout, result); >size = get_byte_size(type); assert(llvm_size == size); @@ -8166,7 +8166,7 @@ resolve_type_in_place_abi = fn (module: &Module, type: &Type) void }, else => { - #trap(); + @trap(); }, } @@ -8200,7 +8200,7 @@ resolve_type_in_place_memory = fn (module: &Module, type: &Type) void { >byte_size = get_byte_size(type); >bit_count = byte_size * 8; - result = LLVMIntTypeInContext(module.llvm.context, #truncate(bit_count)); + result = LLVMIntTypeInContext(module.llvm.context, @truncate(bit_count)); }, .enum => { @@ -8232,7 +8232,7 @@ resolve_type_in_place_memory = fn (module: &Module, type: &Type) void }, else => { - #trap(); + @trap(); }, } @@ -8282,7 +8282,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void } else { - dwarf_encoding = #select(type.content.integer.signed, .signed, .unsigned); + dwarf_encoding = @select(type.content.integer.signed, .signed, .unsigned); } >flags: LLVMDIFlags = zero; @@ -8322,7 +8322,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void for (i: 0..fields.length) { >field = &fields[i]; - >enum_field = LLVMDIBuilderCreateEnumerator(module.llvm.di_builder, field.name.pointer, field.name.length, field.value, #extend(!type_is_signed(backing_type))); + >enum_field = LLVMDIBuilderCreateEnumerator(module.llvm.di_builder, field.name.pointer, field.name.length, field.value, @extend(!type_is_signed(backing_type))); field_buffer[i] = enum_field; } @@ -8361,7 +8361,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void >runtime_language: u32 = 0; >vtable_holder: &LLVMMetadata = zero; - >struct_type = LLVMDIBuilderCreateStructType(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, module.llvm.file, type.content.struct.line, byte_size * 8, alignment * 8, flags, derived_from, &llvm_type_buffer[0], #truncate(fields.length), runtime_language, vtable_holder, name.pointer, name.length); + >struct_type = LLVMDIBuilderCreateStructType(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, module.llvm.file, type.content.struct.line, byte_size * 8, alignment * 8, flags, derived_from, &llvm_type_buffer[0], @truncate(fields.length), runtime_language, vtable_holder, name.pointer, name.length); LLVMMetadataReplaceAllUsesWith(forward_declaration, struct_type); result = struct_type; }, @@ -8388,7 +8388,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void >derived_from: &LLVMMetadata = zero; >runtime_language: u32 = 0; >vtable_holder: &LLVMMetadata = zero; - >struct_type = LLVMDIBuilderCreateStructType(module.llvm.di_builder, module.scope.llvm, type.name.pointer, type.name.length, module.llvm.file, type.content.bits.line, size, alignment, flags, zero, &llvm_type_buffer[0], #truncate(fields.length), runtime_language, vtable_holder, type.name.pointer, type.name.length); + >struct_type = LLVMDIBuilderCreateStructType(module.llvm.di_builder, module.scope.llvm, type.name.pointer, type.name.length, module.llvm.file, type.content.bits.line, size, alignment, flags, zero, &llvm_type_buffer[0], @truncate(fields.length), runtime_language, vtable_holder, type.name.pointer, type.name.length); result = struct_type; }, .union => @@ -8420,7 +8420,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void >runtime_language: u32 = 0; - >union_type = LLVMDIBuilderCreateUnionType(module.llvm.di_builder, module.scope.llvm, type.name.pointer, type.name.length, module.llvm.file, type.content.union.line, byte_size * 8, alignment * 8, flags, &llvm_type_buffer[0], #truncate(fields.length), runtime_language, type.name.pointer, type.name.length); + >union_type = LLVMDIBuilderCreateUnionType(module.llvm.di_builder, module.scope.llvm, type.name.pointer, type.name.length, module.llvm.file, type.content.union.line, byte_size * 8, alignment * 8, flags, &llvm_type_buffer[0], @truncate(fields.length), runtime_language, type.name.pointer, type.name.length); LLVMMetadataReplaceAllUsesWith(forward_declaration, union_type); result = union_type; @@ -8451,7 +8451,7 @@ resolve_type_in_place_debug = fn (module: &Module, type: &Type) void }, else => { - #trap(); + @trap(); }, } @@ -8535,7 +8535,7 @@ abi_system_v_classify_post_merge = fn (aggregate_size: u64, classes: [2]AbiSyste if (result[1] == .x87_up) { - #trap(); + @trap(); } if (aggregate_size > 16 and (result[0] != .sse or result[1] != .sse_up)) @@ -8563,8 +8563,8 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen >result: [2]AbiSystemVClass = zero; >is_memory = options.base_offset >= 8; - >current_index: u64 = #extend(is_memory); - >not_current_index: u64 = #extend(!is_memory); + >current_index: u64 = @extend(is_memory); + >not_current_index: u64 = @extend(!is_memory); assert(current_index != not_current_index); result[current_index] = .memory; @@ -8587,7 +8587,7 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen } else if (bit_count == 128) { - #trap(); + @trap(); } else { @@ -8618,7 +8618,7 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen >offset = options.base_offset + field.offset; >member_type = field.type; >member_size = get_byte_size(member_type); - >member_alignment: u64 = #extend(get_byte_alignment(member_type)); + >member_alignment: u64 = @extend(get_byte_alignment(member_type)); >native_vector_size: u64 = 16; @@ -8653,7 +8653,7 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen }, .union => { - #trap(); + @trap(); } else => { unreachable; }, } @@ -8666,7 +8666,7 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen if (byte_size <= 64) { - if (options.base_offset % #extend(get_byte_alignment(type)) == 0) + if (options.base_offset % @extend(get_byte_alignment(type)) == 0) { >element_type = type.content.array.element_type; >element_size = get_byte_size(element_type); @@ -8718,7 +8718,7 @@ abi_system_v_classify_type = fn (type: &Type, options: AbiSystemVClassifyArgumen }, else => { - #trap(); + @trap(); }, } @@ -8749,7 +8749,7 @@ contains_no_user_data = fn (type: &Type, start: u64, end: u64) u1 break; } - >field_start = #select(field_offset < start, start - field_offset, 0); + >field_start = @select(field_offset < start, start - field_offset, 0); if (!contains_no_user_data(field.type, field_start, end - field_offset)) { @@ -8774,7 +8774,7 @@ contains_no_user_data = fn (type: &Type, start: u64, end: u64) u1 }, .enum_array => { - #trap(); + @trap(); }, else => { unreachable; }, } @@ -8793,7 +8793,7 @@ contains_no_user_data = fn (type: &Type, start: u64, end: u64) u1 break; } - >element_start = #select(offset < start, start - offset, 0); + >element_start = @select(offset < start, start - offset, 0); if (!contains_no_user_data(element_type, element_start, end - offset)) { @@ -8870,7 +8870,7 @@ abi_system_v_get_integer_type_at_offset = fn (module: &Module, type: &Type, offs } else { - #trap(); + @trap(); } }, .struct => @@ -8901,12 +8901,12 @@ abi_system_v_get_integer_type_at_offset = fn (module: &Module, type: &Type, offs .bits => { >backing_type = type.content.bits.backing_type; - return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, #select(source_type == type, backing_type, source_type), source_offset); + return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, @select(source_type == type, backing_type, source_type), source_offset); }, .enum => { >backing_type = type.content.enum.backing_type; - return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, #select(source_type == type, backing_type, source_type), source_offset); + return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, @select(source_type == type, backing_type, source_type), source_offset); }, .array => { @@ -8915,13 +8915,13 @@ abi_system_v_get_integer_type_at_offset = fn (module: &Module, type: &Type, offs >element_offset = (offset / element_size) * element_size; return abi_system_v_get_integer_type_at_offset(module, element_type, offset - element_offset, source_type, source_offset); }, - else => { #trap(); }, + else => { @trap(); }, } >source_size = get_byte_size(source_type); assert(source_size != source_offset); >byte_count = source_size - source_offset; - >bit_count = #select(byte_count > 8, 64, byte_count * 8); + >bit_count = @select(byte_count > 8, 64, byte_count * 8); >result = integer_type(module, { .bit_count = bit_count, .signed = 0 }); return result; } @@ -8997,7 +8997,7 @@ abi_system_v_get_extend = fn (options: AbiSystemVExtendOptions) AbiInformation zero, }; - abi_set_coerce_to_type(&result, #select(options.type != zero, options.type, options.semantic_type)); + abi_set_coerce_to_type(&result, @select(options.type != zero, options.type, options.semantic_type)); abi_set_padding_type(&result, zero); abi_set_direct_offset(&result, 0); abi_set_direct_alignment(&result, 0); @@ -9064,7 +9064,7 @@ abi_system_v_get_indirect_result = fn (module: &Module, type: &Type, free_gpr: u } else { - >alignment = #max(get_byte_alignment(type), 8); + >alignment = @max(get_byte_alignment(type), 8); >size = get_byte_size(type); if (free_gpr == 0 and alignment != 8 and size <= 8) @@ -9118,7 +9118,7 @@ abi_system_v_get_indirect_return_result = fn (type: &Type) AbiInformation } else { - #trap(); + @trap(); } } @@ -9165,7 +9165,7 @@ abi_system_v_classify_return_type = fn (module: &Module, semantic_return_type: & }, else => { - #trap(); + @trap(); }, } @@ -9181,12 +9181,12 @@ abi_system_v_classify_return_type = fn (module: &Module, semantic_return_type: & if (classes[0] == .none) { - #trap(); + @trap(); } }, else => { - #trap(); + @trap(); }, } @@ -9279,7 +9279,7 @@ abi_system_v_classify_argument_type = fn (module: &Module, semantic_argument_typ if (classes[0] == .none) { - #trap(); + @trap(); } }, else => { unreachable; }, @@ -9315,7 +9315,7 @@ abi_system_v_classify_argument = fn (module: &Module, available_registers: &AbiR if (options.register_call) { - #trap(); + @trap(); } >result = abi_system_v_classify_argument_type(module, semantic_argument_type, { @@ -9343,14 +9343,14 @@ abi_system_v_classify_argument = fn (module: &Module, available_registers: &AbiR if (abi_get_padding_type(&argument_abi)) { - #trap(); + @trap(); } argument_abi.abi_start = options.abi_start; >count: u16 = 0; - >abi_start: u64 = #extend(argument_abi.abi_start); + >abi_start: u64 = @extend(argument_abi.abi_start); switch (argument_abi.flags.kind) { @@ -9375,7 +9375,7 @@ abi_system_v_classify_argument = fn (module: &Module, available_registers: &AbiR abi_argument_type_buffer[abi_start + i] = field_type; } - count = #truncate(coerce_to_type.content.struct.fields.length); + count = @truncate(coerce_to_type.content.struct.fields.length); } else { @@ -9443,7 +9443,7 @@ add_value_attribute = fn (module: &Module, value: &LLVMValue, index: u32, add_ca if (attributes.alignment) { - add_enum_attribute(module, .align, #extend(attributes.alignment), add_callback, value, index); + add_enum_attribute(module, .align, @extend(attributes.alignment), add_callback, value, index); } if (attributes.sign_extend) @@ -9526,7 +9526,7 @@ emit_attributes = fn (module: &Module, value: &LLVMValue, add_callback: &LLVMAtt >abi_type = options.abi_argument_types[abi_index]; resolve_type_in_place(module, abi_type); - add_value_attribute(module, value, #extend(abi_index + 1), add_callback, semantic_return_type.llvm.memory, abi_type.llvm.abi, { + add_value_attribute(module, value, @extend(abi_index + 1), add_callback, semantic_return_type.llvm.memory, abi_type.llvm.abi, { .alignment = get_byte_alignment(semantic_return_type), .sign_extend = 0, .zero_extend = 0, @@ -9550,8 +9550,8 @@ emit_attributes = fn (module: &Module, value: &LLVMValue, add_callback: &LLVMAtt >abi_type = options.abi_argument_types[abi_index]; resolve_type_in_place(module, abi_type); - add_value_attribute(module, value, #extend(abi_index + 1), add_callback, abi.semantic_type.llvm.memory, abi_type.llvm.abi, { - .alignment = #select(abi.flags.kind == .indirect, 8, 0), + add_value_attribute(module, value, @extend(abi_index + 1), add_callback, abi.semantic_type.llvm.memory, abi_type.llvm.abi, { + .alignment = @select(abi.flags.kind == .indirect, 8, 0), .sign_extend = abi.flags.kind == .extend and abi.flags.sign_extension, .zero_extend = abi.flags.kind == .extend and !abi.flags.sign_extension, .no_alias = 0, @@ -9690,7 +9690,7 @@ create_store = fn (module: &Module, options: StoreOptions) void if (resolved_type.llvm.abi != memory_type) { - source_value = LLVMBuildIntCast2(module.llvm.builder, source_value, memory_type, #extend(type_is_signed(resolved_type)), ""); + source_value = LLVMBuildIntCast2(module.llvm.builder, source_value, memory_type, @extend(type_is_signed(resolved_type)), ""); } >alignment = options.alignment; @@ -9714,7 +9714,7 @@ memory_to_abi = fn (module: &Module, value: &LLVMValue, type: &Type) &LLVMValue >result = value; if (type.llvm.memory != type.llvm.abi) { - result = LLVMBuildIntCast2(module.llvm.builder, result, type.llvm.abi, #extend(type_is_signed(type)), ""); + result = LLVMBuildIntCast2(module.llvm.builder, result, type.llvm.abi, @extend(type_is_signed(type)), ""); } return result; } @@ -9762,8 +9762,8 @@ GEPOptions = struct create_gep = fn (module: &Module, options: GEPOptions) &LLVMValue { assert(options.indices.length == 1 or options.indices.length == 2); - >gep_function = #select(options.not_inbounds, &LLVMBuildGEP2, &LLVMBuildInBoundsGEP2); - >gep = gep_function(module.llvm.builder, options.type, options.pointer, options.indices.pointer, #truncate(options.indices.length), ""); + >gep_function = @select(options.not_inbounds, &LLVMBuildGEP2, &LLVMBuildInBoundsGEP2); + >gep = gep_function(module.llvm.builder, options.type, options.pointer, options.indices.pointer, @truncate(options.indices.length), ""); return gep; } @@ -9949,10 +9949,10 @@ get_enum_name_array_global = fn (module: &Module, enum_type: &Type) &Global >is_constant: u1 = 1; >null_terminate: u1 = 1; - >initial_value = LLVMConstStringInContext2(module.llvm.context, field.name.pointer, field.name.length, #extend(!null_terminate)); + >initial_value = LLVMConstStringInContext2(module.llvm.context, field.name.pointer, field.name.length, @extend(!null_terminate)); >alignment: u32 = 1; - >name_global = llvm_create_global_variable(module.llvm.module, LLVMArrayType2(u8_type.llvm.abi, field.name.length + #extend(null_terminate)), is_constant, .internal, initial_value, arena_join_string(module.arena, [ "string.", enum_type.name, ".", field.name ][..]), .none, 0, alignment, .global); + >name_global = llvm_create_global_variable(module.llvm.module, LLVMArrayType2(u8_type.llvm.abi, field.name.length + @extend(null_terminate)), is_constant, .internal, initial_value, arena_join_string(module.arena, [ "string.", enum_type.name, ".", field.name ][..]), .none, 0, alignment, .global); >constants: [_]&LLVMValue = [ name_global, @@ -10084,7 +10084,7 @@ resolve_type = fn (module: &Module, type: &Type) &Type }, else => { - #trap(); + @trap(); }, } @@ -10194,7 +10194,7 @@ clone_value = fn (module: &Module, scope: &Scope, old_value: &Value) &Value }, else => { - #trap(); + @trap(); }, } } @@ -10297,7 +10297,7 @@ clone_statement = fn (module: &Module, scope: &Scope, old_statement: &Statement) }, else => { - #trap(); + @trap(); }, } @@ -10344,7 +10344,7 @@ get_build_mode_enum = fn (module: &Module) &Type if (!result) { - >enum_names = #enum_names(BuildMode); + >enum_names = @enum_names(BuildMode); >enum_fields = arena_allocate_slice[EnumField](module.arena, enum_names.length); >field_value: u64 = 0; @@ -10386,7 +10386,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi if (expected_type != zero and? expected_type.id == .unresolved) { - #trap(); + @trap(); } >value_type: &Type = zero; @@ -10428,7 +10428,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi report_error(); } - #trap(); + @trap(); } else { @@ -10535,7 +10535,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi if (expected_type) { - #trap(); + @trap(); } else { @@ -10726,7 +10726,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi >enum_fields = enum_type.content.enum.fields; - >switch_instruction = LLVMBuildSwitch(module.llvm.builder, llvm_argument, else_block, #truncate(enum_fields.length)); + >switch_instruction = LLVMBuildSwitch(module.llvm.builder, llvm_argument, else_block, @truncate(enum_fields.length)); >backing_type = enum_type.llvm.abi; assert(backing_type != zero); @@ -10893,7 +10893,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi else => { // TODO - #trap(); + @trap(); }, } }, @@ -10979,7 +10979,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi switch (unary_type_id) { - .align_of => { value = #extend(get_byte_alignment(unary_type)); }, + .align_of => { value = @extend(get_byte_alignment(unary_type)); }, .byte_size => { value = get_byte_size(unary_type); }, .integer_max => { @@ -11198,7 +11198,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi } >pointer_element_type = array_like_type.content.pointer.element_type; - >indexing_type = #select(pointer_element_type.id == .enum_array, pointer_element_type.content.enum_array.enum_type, uint64(module)); + >indexing_type = @select(pointer_element_type.id == .enum_array, pointer_element_type.content.enum_array.enum_type, uint64(module)); analyze_type(module, value.content.array_expression.index, zero, { .indexing_type = indexing_type, .must_be_constant = analysis.must_be_constant }); @@ -11285,7 +11285,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi } >aggregate_element_type = aggregate_type.content.pointer.element_type; - >real_aggregate_type = #select(aggregate_element_type.id == .pointer, aggregate_element_type.content.pointer.element_type, aggregate_element_type); + >real_aggregate_type = @select(aggregate_element_type.id == .pointer, aggregate_element_type.content.pointer.element_type, aggregate_element_type); >resolved_aggregate_type = resolve_alias(module, real_aggregate_type); switch (resolved_aggregate_type.id) @@ -11313,7 +11313,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi >field_type = result_field.type; - value_type = #select(value.kind == .left, get_pointer_type(module, field_type), field_type); + value_type = @select(value.kind == .left, get_pointer_type(module, field_type), field_type); }, .union => { @@ -11776,7 +11776,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi report_error(); } - >declaration_index: u64 = #extend(result_field - fields.pointer); + >declaration_index: u64 = @extend(result_field - fields.pointer); >mask = 1 << declaration_index; >current_mask = field_mask; if (current_mask & mask) @@ -11867,7 +11867,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi >enum_alignment = get_byte_alignment(enum_type); >enum_size = get_byte_size(enum_type); - >byte_size = align_forward(enum_size + 1, #extend(enum_alignment)); + >byte_size = align_forward(enum_size + 1, @extend(enum_alignment)); >struct_fields = arena_allocate_slice[Field](module.arena, 2); @@ -12225,7 +12225,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi >is_definition: u1 = 1; >flags: LLVMDIFlags = zero; >is_optimized = build_mode_is_optimized(module.build_mode); - subprogram = LLVMDIBuilderCreateFunction(module.llvm.di_builder, module.scope.llvm, declaration.name.pointer, declaration.name.length, declaration.name.pointer, declaration.name.length, module.llvm.file, macro_instantiation.scope.line, subroutine_type, #extend(is_local_to_unit), #extend(is_definition), macro_instantiation.scope.line, flags, #extend(is_optimized)); + subprogram = LLVMDIBuilderCreateFunction(module.llvm.di_builder, module.scope.llvm, declaration.name.pointer, declaration.name.length, declaration.name.pointer, declaration.name.length, module.llvm.file, macro_instantiation.scope.line, subroutine_type, @extend(is_local_to_unit), @extend(is_definition), macro_instantiation.scope.line, flags, @extend(is_optimized)); } macro_instantiation.scope.llvm = subprogram; @@ -12264,7 +12264,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi { .value => { - #trap(); + @trap(); }, .type => { @@ -12337,7 +12337,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi LLVMSetCurrentDebugLocation2(module.llvm.builder, zero); >flags: LLVMDIFlags = zero; - >subroutine_type = LLVMDIBuilderCreateSubroutineType(module.llvm.di_builder, module.llvm.file, &type_buffer[0], #truncate(type_count), flags); + >subroutine_type = LLVMDIBuilderCreateSubroutineType(module.llvm.di_builder, module.llvm.file, &type_buffer[0], @truncate(type_count), flags); assert(macro_instantiation.scope.llvm != zero); llvm_subprogram_replace_type(subprogram, subroutine_type); } @@ -12406,7 +12406,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi } } }, - else => { #trap(); }, + else => { @trap(); }, } if (!field_type) @@ -12429,7 +12429,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi }, else => { - #trap(); + @trap(); }, } @@ -12457,7 +12457,7 @@ emit_intrinsic_call = fn (module: &Module, index: LLVMIntrinsicIndex, argument_t >intrinsic_id = module.llvm.intrinsic_table[index]; >intrinsic_function = LLVMGetIntrinsicDeclaration(module.llvm.module, intrinsic_id, argument_types.pointer, argument_types.length); >intrinsic_function_type = LLVMIntrinsicGetType(module.llvm.context, intrinsic_id, argument_types.pointer, argument_types.length); - >call = LLVMBuildCall2(module.llvm.builder, intrinsic_function_type, intrinsic_function, argument_values.pointer, #truncate(argument_values.length), ""); + >call = LLVMBuildCall2(module.llvm.builder, intrinsic_function_type, intrinsic_function, argument_values.pointer, @truncate(argument_values.length), ""); return call; } @@ -12471,7 +12471,7 @@ emit_binary = fn (module: &Module, left: &LLVMValue, left_type: &Type, right: &L >left_signed = type_is_signed(left_type); >right_signed = type_is_signed(left_type); assert(left_signed == right_signed); - >signed = #select(is_boolean, left_signed, resolved_value_type.content.integer.signed); + >signed = @select(is_boolean, left_signed, resolved_value_type.content.integer.signed); switch (id) { @@ -12489,11 +12489,11 @@ emit_binary = fn (module: &Module, left: &LLVMValue, left_type: &Type, right: &L { .max => { - intrinsic_index = #select(signed, ."llvm.smax", ."llvm.umax"); + intrinsic_index = @select(signed, ."llvm.smax", ."llvm.umax"); }, .min => { - intrinsic_index = #select(signed, ."llvm.smin", ."llvm.umin"); + intrinsic_index = @select(signed, ."llvm.smin", ."llvm.umin"); }, else => { unreachable; }, } @@ -12555,10 +12555,10 @@ emit_binary = fn (module: &Module, left: &LLVMValue, left_type: &Type, right: &L { .compare_equal => { predicate = .eq; }, .compare_not_equal => { predicate = .ne; }, - .compare_less => { predicate = #select(signed, .slt, .ult); }, - .compare_less_equal => { predicate = #select(signed, .sle, .ule); }, - .compare_greater => { predicate = #select(signed, .sgt, .ugt); }, - .compare_greater_equal => { predicate = #select(signed, .sge, .uge); }, + .compare_less => { predicate = @select(signed, .slt, .ult); }, + .compare_less_equal => { predicate = @select(signed, .sle, .ule); }, + .compare_greater => { predicate = @select(signed, .sgt, .ugt); }, + .compare_greater_equal => { predicate = @select(signed, .sge, .uge); }, } return LLVMBuildICmp(module.llvm.builder, predicate, left, right, ""); @@ -12658,7 +12658,7 @@ reanalyze_type_as_left_value = fn (module: &Module, value: &Value) void assert(value.kind == .right); invalidate_analysis(module, value); value.kind = .left; - >expected_type = #select(value.id == .aggregate_initialization, get_pointer_type(module, original_type), zero); + >expected_type = @select(value.id == .aggregate_initialization, get_pointer_type(module, original_type), zero); analyze_type(module, value, expected_type, zero); } @@ -12697,7 +12697,7 @@ enter_struct_pointer_for_coerced_access = fn (module: &Module, source_value: &LL >gep = LLVMBuildStructGEP2(module.llvm.builder, source_type.llvm.abi, source_value, 0, "coerce.dive"); if (first_field_type.id == .struct) { - #trap(); + @trap(); } else { @@ -12714,7 +12714,7 @@ coerce_integer_or_pointer_to_integer_or_pointer = fn (module: &Module, source: & { if (source_type != destination_type) { - #trap(); + @trap(); } return source; @@ -12739,9 +12739,9 @@ create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_typ { >destination_alignment = get_byte_alignment(destination_type); - if (source_type.id == .integer and destination_type.id == .pointer and source_size == align_forward(destination_size, #extend(destination_alignment))) + if (source_type.id == .integer and destination_type.id == .pointer and source_size == align_forward(destination_size, @extend(destination_alignment))) { - #trap(); + @trap(); } else if (source_type.id == .struct) { @@ -12751,8 +12751,8 @@ create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_typ { >field = &fields[i]; - >gep = LLVMBuildStructGEP2(module.llvm.builder, source_type.llvm.abi, destination_value, #truncate(i), ""); - >field_value = LLVMBuildExtractValue(module.llvm.builder, source_value, #truncate(i), ""); + >gep = LLVMBuildStructGEP2(module.llvm.builder, source_type.llvm.abi, destination_value, @truncate(i), ""); + >field_value = LLVMBuildExtractValue(module.llvm.builder, source_value, @truncate(i), ""); create_store(module, { .source = field_value, @@ -12788,7 +12788,7 @@ create_coerced_store = fn (module: &Module, source_value: &LLVMValue, source_typ // Coercion through memory >original_destination_alignment = get_byte_alignment(destination_type); - >source_alloca_alignment = #max(original_destination_alignment, get_byte_alignment(source_type)); + >source_alloca_alignment = @max(original_destination_alignment, get_byte_alignment(source_type)); >source_alloca = create_alloca(module, { .type = source_type, .name = "coerce", @@ -12815,7 +12815,7 @@ create_coerced_load = fn (module: &Module, source: &LLVMValue, source_type: &Typ if (type_is_abi_equal(module, source_type, destination_type)) { - #trap(); + @trap(); } else { @@ -12858,14 +12858,14 @@ create_coerced_load = fn (module: &Module, source: &LLVMValue, source_type: &Typ >scalable_vector_type: u1 = 0; if (scalable_vector_type) { - #trap(); + @trap(); } else { // Coercion through memory >original_destination_alignment = get_byte_alignment(destination_type); >source_alignment = get_byte_alignment(source_type); - >destination_alignment = #max(original_destination_alignment, source_alignment); + >destination_alignment = @max(original_destination_alignment, source_alignment); >destination_alloca = create_alloca(module, { .type = destination_type, .name = "coerce", @@ -12952,7 +12952,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type >uses_in_alloca: u1 = 0; if (uses_in_alloca) { - #trap(); + @trap(); } >llvm_indirect_return_value: &LLVMValue = zero; @@ -12982,7 +12982,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else { - #trap(); + @trap(); } assert(pointer != zero); @@ -12999,11 +12999,11 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else if (return_abi.flags.kind == .in_alloca) { - #trap(); + @trap(); } else { - #trap(); + @trap(); } }, else => {}, @@ -13043,9 +13043,9 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (is_named_argument) { // TODO: better slice single statement - >llvm_abi_argument_types = llvm_abi_argument_type_buffer_slice[#extend(argument_abi.abi_start)..#extend(argument_abi.abi_start + argument_abi.abi_count)]; - >destination_abi_argument_types = abi_argument_type_buffer_slice[#extend(argument_abi.abi_start)..#extend(argument_abi.abi_start + argument_abi.abi_count)]; - >source_abi_argument_types = raw_function_type.content.function.abi.abi_argument_types[#extend(argument_abi.abi_start)..#extend(argument_abi.abi_start + argument_abi.abi_count)]; + >llvm_abi_argument_types = llvm_abi_argument_type_buffer_slice[@extend(argument_abi.abi_start)..@extend(argument_abi.abi_start + argument_abi.abi_count)]; + >destination_abi_argument_types = abi_argument_type_buffer_slice[@extend(argument_abi.abi_start)..@extend(argument_abi.abi_start + argument_abi.abi_count)]; + >source_abi_argument_types = raw_function_type.content.function.abi.abi_argument_types[@extend(argument_abi.abi_start)..@extend(argument_abi.abi_start + argument_abi.abi_count)]; for (i: 0..argument_abi.abi_count) { @@ -13058,7 +13058,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (argument_abi.padding.type != zero) { - #trap(); + @trap(); } assert(abi_argument_count == argument_abi.abi_start); @@ -13082,13 +13082,13 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type switch (evaluation_kind) { .scalar => { v = semantic_call_argument_value; }, - .aggregate => { #trap(); }, - .complex => { #trap(); }, + .aggregate => { @trap(); }, + .complex => { @trap(); }, } if (!type_is_abi_equal(module, coerce_to_type, v.type)) { - #trap(); + @trap(); } llvm_abi_argument_value_buffer[abi_argument_count] = v.llvm; @@ -13098,13 +13098,13 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type { if (coerce_to_type.id == .struct and argument_abi.flags.kind == .direct and !argument_abi.flags.can_be_flattened) { - #trap(); + @trap(); } // TODO: fix this hack and collapse it into the generic path if (coerce_to_type == uint8(module) and semantic_argument_type == uint1(module)) { - #trap(); + @trap(); } else { @@ -13113,9 +13113,9 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type switch (evaluation_kind) { - .scalar => { #trap(); }, + .scalar => { @trap(); }, .aggregate => { src = semantic_call_argument_value; }, - .complex => { #trap(); }, + .complex => { @trap(); }, } assert(src != zero); @@ -13130,7 +13130,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type >source_type_is_scalable: u1 = 0; if (source_type_is_scalable) { - #trap(); + @trap(); } else { @@ -13149,7 +13149,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type }, else => { - #trap(); + @trap(); } } } @@ -13189,11 +13189,11 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type for (i: 0..coerce_fields.length) { >field = &coerce_fields[i]; - >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.memory, source, #truncate(i), ""); + >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.memory, source, @truncate(i), ""); >maybe_undef: u1 = 0; if (maybe_undef) { - #trap(); + @trap(); } >load = create_load(module, { @@ -13213,7 +13213,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type { for (i: 0..coerce_fields.length) { - llvm_abi_argument_value_buffer[abi_argument_count] = LLVMBuildExtractValue(module.llvm.builder, source, #truncate(i), ""); + llvm_abi_argument_value_buffer[abi_argument_count] = LLVMBuildExtractValue(module.llvm.builder, source, @truncate(i), ""); abi_argument_count += 1; } } @@ -13237,13 +13237,13 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type for (i: 0..coerce_fields.length) { - >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.abi, global, #truncate(i), ""); + >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.abi, global, @truncate(i), ""); >field = &coerce_fields[i]; >maybe_undef: u1 = 0; if (maybe_undef) { - #trap(); + @trap(); } >load = create_load(module, { @@ -13259,7 +13259,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else { - #trap(); + @trap(); } } .zero => @@ -13274,7 +13274,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type }, else => { - #trap(); + @trap(); }, } } @@ -13324,7 +13324,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else { - #trap(); + @trap(); } assert(pointer_type != zero); @@ -13346,13 +13346,13 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type >is_cmse_ns_call: u1 = 0; if (is_cmse_ns_call) { - #trap(); + @trap(); } >maybe_undef: u1 = 0; if (maybe_undef) { - #trap(); + @trap(); } v = load; @@ -13377,7 +13377,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (evaluation_kind == .aggregate) { >same_address_space: u1 = 1; - >abi_start: u64 = #extend(argument_abi.abi_start); + >abi_start: u64 = @extend(argument_abi.abi_start); assert(abi_start >= raw_function_type.content.function.abi.abi_argument_types.length or same_address_space); // TODO: handmade code, may contain bugs @@ -13388,7 +13388,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (abi_argument_type == semantic_argument_type) { - #trap(); + @trap(); } else if (abi_argument_type.id == .pointer and abi_argument_type.content.pointer.element_type == semantic_argument_type) { @@ -13446,17 +13446,17 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else { - #trap(); + @trap(); } } if (!do_continue) { - #trap(); + @trap(); } }, .ignore => { unreachable; }, - else => { #trap(); }, // TODO + else => { @trap(); }, // TODO } assert(abi_argument_count == argument_abi.abi_start + argument_abi.abi_count); @@ -13466,16 +13466,16 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (raw_function_type.content.function.base.is_variable_argument) { - assert(declaration_abi_argument_types.length <= #extend(abi_argument_count)); + assert(declaration_abi_argument_types.length <= @extend(abi_argument_count)); } else { - assert(declaration_abi_argument_types.length == #extend(abi_argument_count)); + assert(declaration_abi_argument_types.length == @extend(abi_argument_count)); } assert(raw_function_type.llvm.abi != zero); - >llvm_call = LLVMBuildCall2(module.llvm.builder, raw_function_type.llvm.abi, llvm_callable, &llvm_abi_argument_value_buffer[0], #extend(abi_argument_count), ""); + >llvm_call = LLVMBuildCall2(module.llvm.builder, raw_function_type.llvm.abi, llvm_callable, &llvm_abi_argument_value_buffer[0], @extend(abi_argument_count), ""); >llvm_calling_convention: LLVMCallingConvention = undefined; switch (raw_function_type.content.function.base.calling_convention) { @@ -13489,7 +13489,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type emit_attributes(module, llvm_call, &LLVMAddCallSiteAttribute, { .return_abi = return_abi, .argument_abis = argument_abis, - .abi_argument_types = abi_argument_type_buffer[..#extend(abi_argument_count)], + .abi_argument_types = abi_argument_type_buffer[..@extend(abi_argument_count)], .abi_return_type = raw_function_type.content.function.abi.abi_return_type, .attributes = zero, }); @@ -13523,7 +13523,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type >fixed_vector_type: u1 = 0; if (fixed_vector_type) { - #trap(); + @trap(); } >coerce_alloca: &LLVMValue = zero; @@ -13547,7 +13547,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type if (return_abi.attributes.direct.offset != 0) { - #trap(); + @trap(); } >destination_type = return_abi.semantic_type; @@ -13555,7 +13555,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type >source_value = llvm_call; >source_type = raw_function_type.content.function.abi.abi_return_type; >destination_size = get_byte_size(destination_type); - >left_destination_size = destination_size - #extend(return_abi.attributes.direct.offset); + >left_destination_size = destination_size - @extend(return_abi.attributes.direct.offset); >is_destination_volatile: u1 = 0; switch (return_abi.semantic_type.id) @@ -13569,7 +13569,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type } else { - #trap(); + @trap(); } }, .array => @@ -13610,7 +13610,7 @@ emit_call = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_type zero, }); }, - .left => { #trap(); }, + .left => { @trap(); }, } } }, @@ -13661,7 +13661,7 @@ emit_field_access = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, l assert(aggregate_type.id == .pointer); >aggregate_element_type = aggregate_type.content.pointer.element_type; - >real_aggregate_type = #select(aggregate_element_type.id == .pointer, aggregate_element_type.content.pointer.element_type, aggregate_element_type); + >real_aggregate_type = @select(aggregate_element_type.id == .pointer, aggregate_element_type.content.pointer.element_type, aggregate_element_type); >resolved_aggregate_type = resolve_alias(module, real_aggregate_type); resolve_type_in_place(module, resolved_aggregate_type); @@ -13704,7 +13704,7 @@ emit_field_access = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, l } assert(result_field != zero); - >field_index: u32 = #truncate(result_field - fields.pointer); + >field_index: u32 = @truncate(result_field - fields.pointer); field_access = { .type = resolved_aggregate_type.content.struct.fields[field_index].type, @@ -13800,7 +13800,7 @@ emit_field_access = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, l if (left_llvm) { - #trap(); + @trap(); } return trunc; @@ -13972,7 +13972,7 @@ emit_slice_expresion = fn (module: &Module, value: &Value) [2]&LLVMValue >slice_length: &LLVMValue = zero; if (has_start) { - #trap(); + @trap(); } else if (end != zero) { @@ -14014,7 +14014,7 @@ emit_va_arg_from_memory = fn (module: &Module, va_list_pointer: &LLVMValue, va_l if (get_byte_alignment(argument_type) > 8) { - #trap(); + @trap(); } >argument_type_size = get_byte_size(argument_type); @@ -14107,7 +14107,7 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty } else { - #trap(); + @trap(); } >raw_in_regs = 48 - needed_registers.gpr * 8; @@ -14118,11 +14118,11 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty >in_regs: &LLVMValue = zero; if (needed_registers.gpr != 0) { - in_regs = LLVMConstInt(u32_llvm, #extend(raw_in_regs), 0); + in_regs = LLVMConstInt(u32_llvm, @extend(raw_in_regs), 0); } else { - #trap(); + @trap(); } if (needed_registers.gpr != 0) @@ -14131,7 +14131,7 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty } else { - #trap(); + @trap(); } assert(in_regs != zero); @@ -14139,25 +14139,25 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty >fp_offset_pointer: &LLVMValue = zero; if (needed_registers.sse != 0) { - #trap(); + @trap(); } >fp_offset: &LLVMValue = zero; if (needed_registers.sse != 0) { - #trap(); + @trap(); } >raw_fits_in_fp = 176 - needed_registers.sse * 16; >fits_in_fp: &LLVMValue = zero; if (needed_registers.sse != 0) { - #trap(); + @trap(); } if (needed_registers.sse != 0 and needed_registers.gpr != 0) { - #trap(); + @trap(); } >in_reg_block = LLVMAppendBasicBlockInContext(module.llvm.context, llvm_function, "va_arg.in_reg"); @@ -14180,7 +14180,7 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty if (needed_registers.gpr != 0 and needed_registers.sse != 0) { - #trap(); + @trap(); } else if (needed_registers.gpr != 0) { @@ -14196,11 +14196,11 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty } else if (needed_registers.sse == 1) { - #trap(); + @trap(); } else if (needed_registers.sse == 2) { - #trap(); + @trap(); } else { @@ -14210,7 +14210,7 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty if (needed_registers.gpr != 0) { >raw_offset = needed_registers.gpr * 8; - >new_offset = LLVMBuildAdd(module.llvm.builder, gpr_offset, LLVMConstInt(u32_llvm, #extend(raw_offset), 0), ""); + >new_offset = LLVMBuildAdd(module.llvm.builder, gpr_offset, LLVMConstInt(u32_llvm, @extend(raw_offset), 0), ""); create_store(module, { .source = new_offset, .destination = gpr_offset_pointer, @@ -14221,7 +14221,7 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty if (needed_registers.sse != 0) { - #trap(); + @trap(); } LLVMBuildBr(module.llvm.builder, end_block); @@ -14271,10 +14271,10 @@ emit_va_arg = fn (module: &Module, value: &Value, left_llvm: &LLVMValue, left_ty } else { - #trap(); + @trap(); } }, - .complex => { #trap(); }, + .complex => { @trap(); }, } } @@ -14306,12 +14306,12 @@ emit_string_literal = fn (module: &Module, value: &Value) [2]&LLVMValue >pointer = value.content.string_literal.pointer; >length = value.content.string_literal.length; - >constant_string = LLVMConstStringInContext2(module.llvm.context, pointer, length, #extend(!null_terminate)); + >constant_string = LLVMConstStringInContext2(module.llvm.context, pointer, length, @extend(!null_terminate)); >u8_type = uint8(module); resolve_type_in_place(module, u8_type); - >string_type = LLVMArrayType2(u8_type.llvm.abi, length + #extend(null_terminate)); + >string_type = LLVMArrayType2(u8_type.llvm.abi, length + @extend(null_terminate)); >is_constant: u1 = 1; >thread_local_mode: LLVMThreadLocalMode = .none; >externally_initialized: u1 = 0; @@ -14395,7 +14395,7 @@ emit_argument = fn (module: &Module, argument: &Argument) void assert(scope != zero); >always_preserve: u1 = 1; >flags: LLVMDIFlags = zero; - >argument_variable = LLVMDIBuilderCreateParameterVariable(module.llvm.di_builder, scope, argument.variable.name.pointer, argument.variable.name.length, argument.index, module.llvm.file, argument.variable.line, debug_type, #extend(always_preserve), flags); + >argument_variable = LLVMDIBuilderCreateParameterVariable(module.llvm.di_builder, scope, argument.variable.name.pointer, argument.variable.name.length, argument.index, module.llvm.file, argument.variable.line, debug_type, @extend(always_preserve), flags); end_debug_local(module, &argument.variable, argument_variable); } @@ -14488,11 +14488,11 @@ emit_macro_instantiation = fn (module: &Module, value: &Value) void }, .aggregate => { - #trap(); + @trap(); }, .complex => { - #trap(); + @trap(); }, } } @@ -14556,7 +14556,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con .constant_integer => { >llvm_integer_type = get_llvm_type(resolved_value_type, type_kind); - llvm_value = LLVMConstInt(llvm_integer_type, value.content.constant_integer.value, #extend(value.content.constant_integer.signed)); + llvm_value = LLVMConstInt(llvm_integer_type, value.content.constant_integer.value, @extend(value.content.constant_integer.signed)); }, .binary => { @@ -14628,10 +14628,10 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con { right_condition = right_llvm; }, - else => { #trap(); }, + else => { @trap(); }, } }, - else => { #trap(); }, + else => { @trap(); }, } assert(right_condition != zero); @@ -14761,7 +14761,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con }, .left => { - #trap(); + @trap(); } } }, @@ -14846,7 +14846,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con { llvm_value = llvm_unary_value; }, - else => { #trap(); }, + else => { @trap(); }, } }, .variable => @@ -14876,7 +14876,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con report_error(); } - >global: &Global = #field_parent_pointer(variable, "variable"); + >global: &Global = @field_parent_pointer(variable, "variable"); llvm_value = global.initial_value.llvm; } else @@ -14895,12 +14895,12 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con zero, }); }, - .complex => { #trap(); }, + .complex => { @trap(); }, } } else { - #trap(); + @trap(); } } }, @@ -14920,7 +14920,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con .align_of => { assert(resolved_value_type.id == .integer); - llvm_value = LLVMConstInt(llvm_result_type, #extend(get_byte_alignment(unary_type)), 0); + llvm_value = LLVMConstInt(llvm_result_type, @extend(get_byte_alignment(unary_type)), 0); }, .byte_size => { @@ -14933,7 +14933,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con assert(unary_type.id == .integer); >signed = unary_type.content.integer.signed; >max_value = integer_max_value(unary_type.content.integer.bit_count, signed); - llvm_value = LLVMConstInt(llvm_result_type, max_value, #extend(signed)); + llvm_value = LLVMConstInt(llvm_result_type, max_value, @extend(signed)); }, .enum_values => { @@ -14995,7 +14995,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con { .right => { - #trap(); + @trap(); }, .left => { @@ -15175,7 +15175,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con }, else => { - #trap(); + @trap(); }, } }, @@ -15202,7 +15202,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con } >llvm_type = get_llvm_type(resolved_value_type, type_kind); - llvm_value = LLVMConstInt(llvm_type, result_field.value, #extend(type_is_signed(resolved_value_type))); + llvm_value = LLVMConstInt(llvm_type, result_field.value, @extend(type_is_signed(resolved_value_type))); }, .trap => { @@ -15300,7 +15300,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con assert(constant_count == fields.length); - llvm_value = LLVMConstNamedStruct(get_llvm_type(resolved_value_type, type_kind), &constant_buffer[0], #truncate(constant_count)); + llvm_value = LLVMConstNamedStruct(get_llvm_type(resolved_value_type, type_kind), &constant_buffer[0], @truncate(constant_count)); } else { @@ -15310,7 +15310,7 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con }, .union => { - #trap(); + @trap(); }, .bits => { @@ -15452,10 +15452,10 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con >bit_count = condition_type.content.integer.bit_count; if (bit_count != 1) { - #trap(); + @trap(); } }, - else => { #trap(); }, + else => { @trap(); }, } emit_value(module, true_value, type_kind, must_be_constant); @@ -15589,15 +15589,15 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con }, .build_mode => { - llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type.content.enum.backing_type, type_kind), #extend(#int_from_enum(module.build_mode)), 0); + llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type.content.enum.backing_type, type_kind), @extend(@int_from_enum(module.build_mode)), 0); }, .has_debug_info => { - llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type, type_kind), #extend(module.has_debug_info), 0); + llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type, type_kind), @extend(module.has_debug_info), 0); }, else => { - #trap(); + @trap(); }, } @@ -15710,7 +15710,7 @@ emit_assignment = fn (module: &Module, left_llvm: &LLVMValue, left_type: &Type, for (i: 0..string_literal.length) { - >member_pointer = LLVMBuildStructGEP2(module.llvm.builder, slice_type.llvm.abi, left_llvm, #truncate(i), ""); + >member_pointer = LLVMBuildStructGEP2(module.llvm.builder, slice_type.llvm.abi, left_llvm, @truncate(i), ""); >slice_member_type = slice_type.content.struct.fields[i].type; create_store(module, { .source = string_literal[i], @@ -15806,11 +15806,11 @@ emit_assignment = fn (module: &Module, left_llvm: &LLVMValue, left_type: &Type, } field_mask |= 1 << declaration_index; - max_field_index = #max(max_field_index, declaration_index); + max_field_index = @max(max_field_index, declaration_index); >field = &fields[declaration_index]; - >destination_pointer = LLVMBuildStructGEP2(module.llvm.builder, resolved_value_type.llvm.memory, left_llvm, #truncate(declaration_index), ""); + >destination_pointer = LLVMBuildStructGEP2(module.llvm.builder, resolved_value_type.llvm.memory, left_llvm, @truncate(declaration_index), ""); emit_assignment(module, destination_pointer, get_pointer_type(module, field.type), value); } @@ -15859,7 +15859,7 @@ emit_assignment = fn (module: &Module, left_llvm: &LLVMValue, left_type: &Type, }, else => { - #trap(); + @trap(); }, } } @@ -15909,7 +15909,7 @@ emit_assignment = fn (module: &Module, left_llvm: &LLVMValue, left_type: &Type, { .left => { - #trap(); + @trap(); }, .right => { @@ -16004,13 +16004,13 @@ emit_assignment = fn (module: &Module, left_llvm: &LLVMValue, left_type: &Type, }, else => { - #trap(); + @trap(); }, } }, .complex => { - #trap(); + @trap(); }, } } @@ -16118,7 +16118,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v assert(!local.variable.storage); analyze_type(module, local.initial_value, expected_type, zero); - local.variable.type = #select(expected_type != zero, expected_type, local.initial_value.type); + local.variable.type = @select(expected_type != zero, expected_type, local.initial_value.type); assert(local.variable.type != zero); emit_local(module, local); @@ -16224,14 +16224,14 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v LLVMBuildBr(module.llvm.builder, entry_block); - if (!LLVMGetFirstUse(#pointer_cast(body_block))) + if (!LLVMGetFirstUse(@pointer_cast(body_block))) { - #trap(); + @trap(); } - if (!LLVMGetFirstUse(#pointer_cast(exit_block))) + if (!LLVMGetFirstUse(@pointer_cast(exit_block))) { - #trap(); + @trap(); } LLVMPositionBuilderAtEnd(module.llvm.builder, exit_block); @@ -16332,7 +16332,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v for (i: 0..clauses.length) { >clause = &clauses[i]; - clause.basic_block = LLVMAppendBasicBlockInContext(module.llvm.context, llvm_function, #select(clause.values.length == 0, "switch.else_case_block", "switch.case_block")); + clause.basic_block = LLVMAppendBasicBlockInContext(module.llvm.context, llvm_function, @select(clause.values.length == 0, "switch.else_case_block", "switch.case_block")); discriminant_case_count += clause.values.length; if (clause.values.length == 0) @@ -16399,7 +16399,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v else_block = LLVMAppendBasicBlockInContext(module.llvm.context, llvm_function, "switch.else_case_block"); } - >switch_instruction = LLVMBuildSwitch(module.llvm.builder, discriminant.llvm, else_block, #truncate(discriminant_case_count)); + >switch_instruction = LLVMBuildSwitch(module.llvm.builder, discriminant.llvm, else_block, @truncate(discriminant_case_count)); >all_blocks_terminated: u1 = 1; for (&clause: clauses) @@ -16782,7 +16782,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v } else { - #trap(); + @trap(); } }, .left => @@ -16950,7 +16950,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v else { // TODO: case for reverse range - #trap(); + @trap(); } }, } @@ -16983,7 +16983,7 @@ analyze_statement = fn (module: &Module, scope: &Scope, statement: &Statement) v }, else => { - #trap(); + @trap(); }, } } @@ -17039,7 +17039,7 @@ generate_object = fn (module: &LLVMModule, target_machine: &LLVMTargetMachine, o >code_generation_options: LLVMCodeGenerationOptions = { .output_file_path = options.path, .file_type = .object, - .optimize_when_possible = #extend(options.optimization_level > .O0), + .optimize_when_possible = @extend(options.optimization_level > .O0), .verify_module = 1, zero, }; @@ -17132,7 +17132,7 @@ link = fn (module: &Module) void >result = lld_elf_link(linker_arguments.pointer, linker_arguments.length, 1, 0); if (!result.success) { - #trap(); + @trap(); } } @@ -17146,7 +17146,7 @@ emit_debug_argument = fn (module: &Module, argument: &Argument, basic_block: &LL >flags: LLVMDIFlags = zero; >scope = argument.variable.scope.llvm; - >parameter_variable = LLVMDIBuilderCreateParameterVariable(module.llvm.di_builder, scope, argument.variable.name.pointer, argument.variable.name.length, argument.index, module.llvm.file, argument.variable.line, argument.variable.type.llvm.debug, #extend(always_preserve), flags); + >parameter_variable = LLVMDIBuilderCreateParameterVariable(module.llvm.di_builder, scope, argument.variable.name.pointer, argument.variable.name.length, argument.index, module.llvm.file, argument.variable.line, argument.variable.type.llvm.debug, @extend(always_preserve), flags); >inlined_at = module.llvm.inlined_at; >debug_location = LLVMDIBuilderCreateDebugLocation(module.llvm.context, argument.variable.line, argument.variable.column, scope, inlined_at); @@ -17190,7 +17190,7 @@ emit = fn (module: &Module) void >sysroot = ""; >sdk = ""; - module.scope.llvm = LLVMDIBuilderCreateCompileUnit(di_builder, language, di_file, producer_name.pointer, producer_name.length, #extend(is_optimized), flags.pointer, flags.length, runtime_version, split_name.pointer, split_name.length, emission_kind, 0, 0, #extend(is_optimized), sysroot.pointer, sysroot.length, sdk.pointer, sdk.length); + module.scope.llvm = LLVMDIBuilderCreateCompileUnit(di_builder, language, di_file, producer_name.pointer, producer_name.length, @extend(is_optimized), flags.pointer, flags.length, runtime_version, split_name.pointer, split_name.length, emission_kind, 0, 0, @extend(is_optimized), sysroot.pointer, sysroot.length, sdk.pointer, sdk.length); } >target_triple: &u8 = zero; @@ -17214,7 +17214,7 @@ emit = fn (module: &Module) void } else { - #trap(); + @trap(); } >target_machine_options = LLVMCreateTargetMachineOptions(); @@ -17263,8 +17263,8 @@ emit = fn (module: &Module) void for (i: 0..module.llvm.intrinsic_table.length) { - >e: LLVMIntrinsicIndex = #enum_from_int(i); - >name = #enum_name(e); + >e: LLVMIntrinsicIndex = @enum_from_int(i); + >name = @enum_name(e); >intrinsic_id = LLVMLookupIntrinsicID(name.pointer, name.length); assert(intrinsic_id != 0); module.llvm.intrinsic_table[i] = intrinsic_id; @@ -17272,8 +17272,8 @@ emit = fn (module: &Module) void for (i: 0..module.llvm.attribute_table.length) { - >e: LLVMAttributeIndex = #enum_from_int(i); - >name = #enum_name(e); + >e: LLVMAttributeIndex = @enum_from_int(i); + >name = @enum_name(e); >attribute_id = LLVMGetEnumAttributeKindForName(name.pointer, name.length); assert(attribute_id != 0); module.llvm.attribute_table[i] = attribute_id; @@ -17325,8 +17325,8 @@ emit = fn (module: &Module) void function_type.abi.available_registers = { .system_v = { - .gpr = #select(register_call, 11, 6), - .sse = #select(register_call, 16, 8), + .gpr = @select(register_call, 11, 6), + .sse = @select(register_call, 16, 8), }, }; @@ -17395,24 +17395,24 @@ emit = fn (module: &Module) void } - >abi_argument_types = arena_allocate_slice[&Type](module.arena, #extend(abi_argument_type_count)); - memcpy(#pointer_cast(abi_argument_types.pointer), #pointer_cast(&abi_argument_type_buffer), #extend(#byte_size(&Type) * abi_argument_type_count)); + >abi_argument_types = arena_allocate_slice[&Type](module.arena, @extend(abi_argument_type_count)); + memcpy(@pointer_cast(abi_argument_types.pointer), @pointer_cast(&abi_argument_type_buffer), @extend(@byte_size(&Type) * abi_argument_type_count)); function_type.abi.abi_argument_types = abi_argument_types; }, .win64 => { -#trap(); +@trap(); }, } - >llvm_function_type = LLVMFunctionType(function_type.abi.abi_return_type.llvm.abi, &llvm_abi_argument_type_buffer[0], #truncate(function_type.abi.abi_argument_types.length), #extend(function_type.base.is_variable_argument)); + >llvm_function_type = LLVMFunctionType(function_type.abi.abi_return_type.llvm.abi, &llvm_abi_argument_type_buffer[0], @truncate(function_type.abi.abi_argument_types.length), @extend(function_type.base.is_variable_argument)); >subroutine_type: &LLVMMetadata = zero; if (module.has_debug_info) { >debug_argument_type_buffer: [64]&LLVMMetadata = undefined; - >debug_argument_types = debug_argument_type_buffer[..function_type.abi.argument_abis.length + 1 + #extend(function_type.base.is_variable_argument)]; + >debug_argument_types = debug_argument_type_buffer[..function_type.abi.argument_abis.length + 1 + @extend(function_type.base.is_variable_argument)]; debug_argument_types[0] = function_type.abi.return_abi.semantic_type.llvm.debug; assert(debug_argument_types[0] != zero); @@ -17436,7 +17436,7 @@ emit = fn (module: &Module) void } >flags: LLVMDIFlags = zero; - subroutine_type = LLVMDIBuilderCreateSubroutineType(module.llvm.di_builder, module.llvm.file, debug_argument_types.pointer, #truncate(debug_argument_types.length), flags); + subroutine_type = LLVMDIBuilderCreateSubroutineType(module.llvm.di_builder, module.llvm.file, debug_argument_types.pointer, @truncate(debug_argument_types.length), flags); } assert(global.variable.storage.type.id == .pointer); @@ -17491,7 +17491,7 @@ emit = fn (module: &Module) void >scope_line = line + 1; >flags: LLVMDIFlags = zero; >is_optimized = build_mode_is_optimized(module.build_mode); - subprogram = LLVMDIBuilderCreateFunction(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, linkage_name.pointer, linkage_name.length, module.llvm.file, line, subroutine_type, #extend(is_local_to_unit), #extend(is_definition), scope_line, flags, #extend(is_optimized)); + subprogram = LLVMDIBuilderCreateFunction(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, linkage_name.pointer, linkage_name.length, module.llvm.file, line, subroutine_type, @extend(is_local_to_unit), @extend(is_definition), scope_line, flags, @extend(is_optimized)); LLVMSetSubprogram(llvm_function, subprogram); } @@ -17556,7 +17556,7 @@ emit = fn (module: &Module) void >name = global.variable.name; >linkage_name = name; >local_to_unit = global.linkage == .internal; - >global_debug = LLVMDIBuilderCreateGlobalVariableExpression(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, linkage_name.pointer, linkage_name.length, module.llvm.file, global.variable.line, global_type.llvm.debug, #extend(local_to_unit), null_expression(module), zero, alignment * 8); + >global_debug = LLVMDIBuilderCreateGlobalVariableExpression(module.llvm.di_builder, module.scope.llvm, name.pointer, name.length, linkage_name.pointer, linkage_name.length, module.llvm.file, global.variable.line, global_type.llvm.debug, @extend(local_to_unit), null_expression(module), zero, alignment * 8); LLVMGlobalSetMetadata(llvm_global, 0, global_debug); } }, @@ -17621,19 +17621,19 @@ emit = fn (module: &Module) void >indirect_argument_index = function_type.abi.return_abi.flags.sret_after_this; if (function_type.abi.return_abi.flags.sret_after_this) { -#trap(); +@trap(); } global.variable.storage.content.function.llvm.return_alloca = llvm_abi_arguments[indirect_argument_index]; if (!function_type.abi.return_abi.flags.indirect_by_value) { -#trap(); +@trap(); } }, .in_alloca => { -#trap(); +@trap(); }, else => { @@ -17655,8 +17655,8 @@ emit = fn (module: &Module) void >argument = &arguments[i]; >argument_abi = &argument_abis[i]; // TODO: double slice - >argument_abi_arguments = llvm_abi_arguments[#extend(argument_abi.abi_start)..]; - argument_abi_arguments = argument_abi_arguments[..#extend(argument_abi.abi_count)]; + >argument_abi_arguments = llvm_abi_arguments[@extend(argument_abi.abi_start)..]; + argument_abi_arguments = argument_abi_arguments[..@extend(argument_abi.abi_count)]; >semantic_argument_storage: &LLVMValue = zero; @@ -17675,12 +17675,12 @@ emit = fn (module: &Module) void if (coerce_to_type.llvm.abi != LLVMTypeOf(v)) { -#trap(); +@trap(); } if (is_promoted) { -#trap(); +@trap(); } // TODO: this we can get rid of because we handle all of this inside `create_alloca`, load, stores, etc @@ -17712,7 +17712,7 @@ emit = fn (module: &Module) void } else { -#trap(); +@trap(); } create_store(module, { @@ -17747,7 +17747,7 @@ emit = fn (module: &Module) void >is_fixed_vector_type: u1 = 0; if (is_fixed_vector_type) { -#trap(); +@trap(); } if (coerce_to_type.id == .struct and coerce_to_type.content.struct.fields.length > 1 and argument_abi.flags.kind == .direct and !argument_abi.flags.can_be_flattened) @@ -17755,7 +17755,7 @@ emit = fn (module: &Module) void >contains_homogeneous_scalable_vector_types: u1 = 0; if (contains_homogeneous_scalable_vector_types) { -#trap(); +@trap(); } } @@ -17770,7 +17770,7 @@ emit = fn (module: &Module) void if (argument_abi.attributes.direct.offset > 0) { -#trap(); +@trap(); } else { @@ -17786,7 +17786,7 @@ emit = fn (module: &Module) void if (is_scalable) { -#trap(); +@trap(); } else { @@ -17810,14 +17810,14 @@ emit = fn (module: &Module) void } >fields = coerce_to_type.content.struct.fields; - assert(fields.length == #extend(argument_abi.abi_count)); + assert(fields.length == @extend(argument_abi.abi_count)); resolve_type_in_place(module, coerce_to_type); for (i: 0..fields.length) { >field = &fields[i]; - >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.abi, address, #truncate(i), ""); + >gep = LLVMBuildStructGEP2(module.llvm.builder, coerce_to_type.llvm.abi, address, @truncate(i), ""); create_store(module, { .source = argument_abi_arguments[i], .destination = gep, @@ -17840,7 +17840,7 @@ emit = fn (module: &Module) void { assert(argument_abi.abi_count == 1); >abi_argument_type = function_type.abi.abi_argument_types[argument_abi.abi_start]; - >destination_size: u64 = get_byte_size(pointer_type) - #extend(argument_abi.attributes.direct.offset); + >destination_size: u64 = get_byte_size(pointer_type) - @extend(argument_abi.attributes.direct.offset); >is_volatile: u1 = 0; create_coerced_store(module, argument_abi_arguments[0], abi_argument_type, pointer, pointer_type, destination_size, is_volatile); } @@ -17859,13 +17859,13 @@ emit = fn (module: &Module) void { if (argument_abi.flags.indirect_realign or argument_abi.flags.kind == .indirect_aliased) { -#trap(); +@trap(); } >use_indirect_debug_address = !argument_abi.flags.indirect_by_value; if (use_indirect_debug_address) { -#trap(); +@trap(); } >llvm_argument = argument_abi_arguments[0]; @@ -17873,7 +17873,7 @@ emit = fn (module: &Module) void }, .scalar => { -#trap(); +@trap(); }, } }, @@ -17908,9 +17908,9 @@ emit = fn (module: &Module) void if (current_basic_block) { assert(!LLVMGetBasicBlockTerminator(current_basic_block)); - if (!LLVMGetFirstInstruction(current_basic_block) or !LLVMGetFirstUse(#pointer_cast(current_basic_block))) + if (!LLVMGetFirstInstruction(current_basic_block) or !LLVMGetFirstUse(@pointer_cast(current_basic_block))) { - LLVMReplaceAllUsesWith(#pointer_cast(return_block), #pointer_cast(current_basic_block)); + LLVMReplaceAllUsesWith(@pointer_cast(return_block), @pointer_cast(current_basic_block)); LLVMDeleteBasicBlock(return_block); } else @@ -17922,7 +17922,7 @@ emit = fn (module: &Module) void { >has_single_jump_to_return_block: u1 = 0; - >first_use = LLVMGetFirstUse(#pointer_cast(return_block)); + >first_use = LLVMGetFirstUse(@pointer_cast(return_block)); >user: &LLVMValue = zero; if (first_use) @@ -17943,7 +17943,7 @@ emit = fn (module: &Module) void >new_return_block = LLVMGetInstructionParent(user); // Remove unconditional branch instruction to the return block LLVMInstructionEraseFromParent(user); - assert(!LLVMGetFirstUse(#pointer_cast(return_block))); + assert(!LLVMGetFirstUse(@pointer_cast(return_block))); assert(!LLVMGetBasicBlockTerminator(return_block)); assert(LLVMGetBasicBlockParent(return_block) != zero); LLVMPositionBuilderAtEnd(module.llvm.builder, new_return_block); @@ -18010,7 +18010,7 @@ emit = fn (module: &Module) void } else { -#trap(); +@trap(); } assert(source != zero); @@ -18026,9 +18026,9 @@ emit = fn (module: &Module) void >evaluation_kind = get_evaluation_kind(function_type.abi.return_abi.semantic_type); switch (evaluation_kind) { - .scalar => { #trap(); }, + .scalar => { @trap(); }, .aggregate => {}, - .complex => { #trap(); }, + .complex => { @trap(); }, } }, } @@ -18131,10 +18131,10 @@ compile = fn (arena: &Arena, options: CompileOptions) void for (b: 0..64) { >bit_count = b + 1; - >first_digit: u8 = #truncate(#select(bit_count < 10, bit_count % 10 + '0', bit_count / 10 + '0')); - >second_digit: u8 = #truncate(#select(bit_count > 9, bit_count % 10 + '0', 0)); - >name_buffer: [3]u8 = [ #select(sign, 's', 'u'), first_digit, second_digit ]; - >name_length: u64 = 2 + #extend(bit_count > 9); + >first_digit: u8 = @truncate(@select(bit_count < 10, bit_count % 10 + '0', bit_count / 10 + '0')); + >second_digit: u8 = @truncate(@select(bit_count > 9, bit_count % 10 + '0', 0)); + >name_buffer: [3]u8 = [ @select(sign, 's', 'u'), first_digit, second_digit ]; + >name_length: u64 = 2 + @extend(bit_count > 9); >name = arena_duplicate_string(arena, name_buffer[..name_length]); @@ -18164,7 +18164,7 @@ compile = fn (arena: &Arena, options: CompileOptions) void for (sign: signs) { - >name = #select(sign, "s128", "u128"); + >name = @select(sign, "s128", "u128"); type_it.& = { .content = { .integer = { @@ -18296,7 +18296,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 separator_index = 0; } - >base_start = separator_index + #extend(separator_index != 0 or relative_file_path[separator_index] == '/'); + >base_start = separator_index + @extend(separator_index != 0 or relative_file_path[separator_index] == '/'); >base_name = relative_file_path[base_start..extension_start]; >is_compiler = string_equal(relative_file_path, "src/compiler.bbb"); @@ -18306,7 +18306,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >base_dir = arena_join_string(arena, [ base_cache_dir, "/", - #select(compile_options.host_cpu_model, "native", "generic"), + @select(compile_options.host_cpu_model, "native", "generic"), ][..]); os_make_directory(base_dir.pointer); @@ -18314,9 +18314,9 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 base_dir = arena_join_string(arena, [ base_dir, "/", - #enum_name(#build_mode), + @enum_name(@build_mode), "_", - #select(#has_debug_info(), "di", "nodi"), + @select(@has_debug_info(), "di", "nodi"), ][..]); os_make_directory(base_dir.pointer); @@ -18334,9 +18334,9 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >outputh_path_dir = arena_join_string(arena, [ base_dir, "/", - #enum_name(compile_options.build_mode), + @enum_name(compile_options.build_mode), "_", - #select(compile_options.has_debug_info, "di", "nodi"), + @select(compile_options.has_debug_info, "di", "nodi"), ][..]); os_make_directory(outputh_path_dir.pointer); @@ -18517,7 +18517,7 @@ names: [_][]u8 = global_state_initialize(); >arena = global_state.arena; - >arguments = argv[..#extend(argument_count)]; + >arguments = argv[..@extend(argument_count)]; if (arguments.length < 2) { return 1; @@ -18525,7 +18525,7 @@ names: [_][]u8 = >command_string = c_string_to_slice(arguments[1]); - >command_string_to_enum = #string_to_enum(CompilerCommand, command_string); + >command_string_to_enum = @string_to_enum(CompilerCommand, command_string); if (!command_string_to_enum.is_valid) { return 1; @@ -18551,7 +18551,7 @@ names: [_][]u8 = if (argument_count >= 4) { - >build_mode_string_to_enum = #string_to_enum(BuildMode, c_string_to_slice(arguments[3])); + >build_mode_string_to_enum = @string_to_enum(BuildMode, c_string_to_slice(arguments[3])); if (!build_mode_string_to_enum.is_valid) { return 1; @@ -18620,7 +18620,7 @@ names: [_][]u8 = { for (is_host_cpu_model: is_host_cpu_model_array) { - for (build_mode: #enum_values(BuildMode)) + for (build_mode: @enum_values(BuildMode)) { for (has_debug_info: debug_info_array) { @@ -18646,7 +18646,7 @@ names: [_][]u8 = if (!success) { - #trap(); + @trap(); } arena.position = position; @@ -18659,7 +18659,7 @@ names: [_][]u8 = { for (is_host_cpu_model: is_host_cpu_model_array) { - for (build_mode: #enum_values(BuildMode)) + for (build_mode: @enum_values(BuildMode)) { for (has_debug_info: debug_info_array) { @@ -18688,7 +18688,7 @@ names: [_][]u8 = if (!success) { - #trap(); + @trap(); } arena.position = position; diff --git a/src/parser.cpp b/src/parser.cpp index e750513..ceb7a7a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -999,7 +999,7 @@ fn Type* parse_type(Module* module, Scope* scope) } } } - else if (start_character == '#') + else if (start_character == '@') { module->offset += 1; auto identifier = parse_identifier(module); @@ -1167,7 +1167,7 @@ fn Token tokenize(Module* module) .id = id, }; } break; - case '#': + case '@': { module->offset += 1; if (is_identifier_start(module->content[module->offset])) @@ -2631,7 +2631,7 @@ fn Statement* parse_statement(Module* module, Scope* scope) statement->local = local; statement->id = StatementId::local; } break; - case '#': + case '@': { statement->expression = parse_value(module, scope, {}); statement->id = StatementId::expression; diff --git a/tests/tests.bbb b/tests/tests.bbb index 58d8e2a..152b426 100644 --- a/tests/tests.bbb +++ b/tests/tests.bbb @@ -2,7 +2,7 @@ require = fn (ok: u1) void { if (!ok) { - #trap(); + @trap(); } } @@ -113,13 +113,13 @@ stack_sub = fn () s32 extend = fn () s32 { >a: s8 = 0; - return #extend(a); + return @extend(a); } integer_max = fn () s32 { - >a = #integer_max(u64); - return #truncate(a + 1); + >a = @integer_max(u64); + return @truncate(a + 1); } integer_hex = fn () s32 @@ -177,9 +177,9 @@ basic_enum = fn () s32 >a: BasicEnum = .three; >b: BasicEnum = .two; >c: BasicEnum = .one; - >a_int: s32 = #extend(#int_from_enum(a)); - >b_int: s32 = #extend(#int_from_enum(b)); - >c_int: s32 = #extend(#int_from_enum(c)); + >a_int: s32 = @extend(@int_from_enum(a)); + >b_int: s32 = @extend(@int_from_enum(b)); + >c_int: s32 = @extend(@int_from_enum(c)); return a_int - (b_int + c_int); } @@ -210,13 +210,13 @@ basic_varargs_function = fn [cc(c)] (first_arg: u32, ...) void { require(first_arg == 123456789); - >va = #va_start(); + >va = @va_start(); - >a = #va_arg(&va, u32); + >a = @va_arg(&va, u32); require(a == 987654321); - >first_arg_b = #va_arg(&va, u32); + >first_arg_b = @va_arg(&va, u32); require(first_arg == first_arg_b); } @@ -236,7 +236,7 @@ c_string_length = fn (c_string: &u8) u64 it = it + 1; } - return #int_from_pointer(it) - #int_from_pointer(c_string); + return @int_from_pointer(it) - @int_from_pointer(c_string); } basic_while = fn (argc: s32, argv: &&u8) void @@ -261,14 +261,14 @@ pointer = fn () s32 { >value: s32 = 0; pointer_function(&value); - return #extend(value == 0); + return @extend(value == 0); } pointer_cast = fn () s32 { >result: u32 = 0; >p = &result; - >signed_pointer: &s32 = #pointer_cast(p); + >signed_pointer: &s32 = @pointer_cast(p); return signed_pointer.&; } @@ -281,7 +281,7 @@ u1_return_foo = fn () u1 u1_return = fn () s32 { >result = u1_return_foo(); - return #extend(result); + return @extend(result); } local_type_inference_foo = fn () s32 @@ -324,19 +324,19 @@ basic_extern = fn () void basic_byte_size = fn () void { - >sizeofu8: u8 = #byte_size(u8); + >sizeofu8: u8 = @byte_size(u8); require(sizeofu8 == 1); - >sizeofu16: u8 = #byte_size(u16); + >sizeofu16: u8 = @byte_size(u16); require(sizeofu16 == 2); - >sizeofs32: s32 = #byte_size(s32); + >sizeofs32: s32 = @byte_size(s32); require(sizeofs32 == 4); - >sizeofs64: s32 = #byte_size(s64); + >sizeofs64: s32 = @byte_size(s64); require(sizeofs64 == 8); } unsigned_assignment_operators = fn(n: s32) s32 { - >result: u32 = #extend(n); + >result: u32 = @extend(n); result >>= 1; result <<= 1; result ^= 1; @@ -348,7 +348,7 @@ unsigned_assignment_operators = fn(n: s32) s32 result %= 1; result *= 0; - return #extend(result); + return @extend(result); } assignment_operators = fn () s32 @@ -375,7 +375,7 @@ not_pointer = fn () s32 >a: s32 = 0; >ptr = &a; >b = !ptr; - return #extend(b); + return @extend(b); } BasicBitField = bits u8 @@ -514,7 +514,7 @@ if_no_else_void = fn () void >result: s32 = 0; if (result != 0) { - #trap(); + @trap(); } } @@ -573,12 +573,12 @@ indirect_varargs_function = fn [cc(c)] (first_arg: u32, ...) void { if (first_arg != 123456789) { - #trap(); + @trap(); } - >va = #va_start(); + >va = @va_start(); - >s = #va_arg(&va, IndirectVarArgs); + >s = @va_arg(&va, IndirectVarArgs); require(s.a == 9); require(s.b == 8); require(s.c == 7); @@ -611,7 +611,7 @@ indirect_varargs = fn () void return_type_builtin = fn () s32 { - >result: #ReturnType = 0; + >result: @ReturnType = 0; return result; } @@ -629,7 +629,7 @@ return_struct_u64_u64_function = fn [cc(c)] () Struct_u64_u64 return_struct_u64_u64 = fn [cc(c)] () s32 { >r = return_struct_u64_u64_function(); - return #truncate(r.a + r.b - 3); + return @truncate(r.a + r.b - 3); } select = fn () s32 @@ -637,7 +637,7 @@ select = fn () s32 >boolean: u1 = 1; >left: s32 = 0; >right: s32 = 1; - return #select(boolean, left, right); + return @select(boolean, left, right); } slice2 = fn (argc: s32, argv: &&u8) void @@ -752,12 +752,12 @@ S = struct va_arg_function = fn [cc(c)] (first_arg: u32, ...) void { - >va = #va_start(); + >va = @va_start(); - >a = #va_arg(&va, u32); - >b = #va_arg(&va, S); - >c = #va_arg(&va, s64); - >d = #va_arg(&va, s32); + >a = @va_arg(&va, u32); + >b = @va_arg(&va, S); + >c = @va_arg(&va, s64); + >d = @va_arg(&va, s32); require(first_arg == 123456789); require(a == 123); @@ -769,7 +769,7 @@ va_arg_function = fn [cc(c)] (first_arg: u32, ...) void require(b.d == 4); require(b.e == 5); - #va_end(&va); + @va_end(&va); } S2 = struct @@ -780,11 +780,11 @@ S2 = struct va_arg_function2 = fn [cc(c)] (...) void { - >va = #va_start(); - >s2 = #va_arg(&va, S2); + >va = @va_start(); + >s2 = @va_arg(&va, S2); require(s2.a == 8); require(s2.b == 9); - #va_end(&va); + @va_end(&va); } va_args = fn [cc(c)] () void @@ -1004,7 +1004,7 @@ ByVal = struct [export] bb_ptr = fn [cc(c)] (x: &u8) void { - require(#int_from_pointer(x) == 0xdeadbeef); + require(@int_from_pointer(x) == 0xdeadbeef); } [export] bb_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void @@ -1018,7 +1018,7 @@ ByVal = struct [export] bb_bool = fn [cc(c)] (x: u8) void { - require(#truncate(x)); + require(@truncate(x)); } [export] bb_ret_struct_u64_u64 = fn [cc(c)] () Struct_u64_u64 @@ -1361,12 +1361,12 @@ S2Enum = enum string_to_enum = fn () s32 { >e = "dsa"; - >s2e = #string_to_enum(S2Enum, e); + >s2e = @string_to_enum(S2Enum, e); >result: s32 = 1; if (s2e.is_valid) { - result = #extend(s2e.enum_value != .dsa); + result = @extend(s2e.enum_value != .dsa); } return result; @@ -1552,7 +1552,7 @@ string_equal = fn (slice_a: []u8, slice_b: []u8) u1 enum_name = fn () s32 { >some_enum: NameEnum = .my_expected_result; - return #extend(!string_equal(#enum_name(some_enum), "my_expected_result")); + return @extend(!string_equal(@enum_name(some_enum), "my_expected_result")); } join = fn (slice: []u8, parts: [][]u8) void @@ -1618,7 +1618,7 @@ bool_array = fn () s32 for (s: signs) { - accumulator += #extend(s); + accumulator += @extend(s); } return accumulator; @@ -1686,7 +1686,7 @@ is_space = fn (ch: u8) u1 concat_logical_or = fn () s32 { - return #extend(is_space('f')); + return @extend(is_space('f')); } strict_array_type = fn () s32 @@ -1729,7 +1729,7 @@ slice_array_literal_receiver = fn (slices: [][]u8) void slice_array_literal = fn () void { >some_bool: u1 = 0; - slice_array_literal_receiver([ "abc", #select(some_bool, "bcd", "cbd"), "sas", ][..]); + slice_array_literal_receiver([ "abc", @select(some_bool, "bcd", "cbd"), "sas", ][..]); } slice_only_start = fn () void @@ -1761,12 +1761,12 @@ generic_macro = fn () s32 { >a = sub_generic[s32](1, 1); >b = sub_generic[u8](2, 2); - return a + #extend(b); + return a + @extend(b); } pointer_macro = macro [T] (ptr: &u32) &T { - return #pointer_cast(ptr); + return @pointer_cast(ptr); } A = struct @@ -1811,22 +1811,22 @@ noreturn_macro = fn () void if (result != 64) { - #trap(); + @trap(); } } generic_pointer_array_macro = macro[T](addr: &u64, count: u64) []T { - >pointer: &T = #pointer_cast(addr); + >pointer: &T = @pointer_cast(addr); return pointer[..count]; } generic_pointer_array = fn () void { >address_raw: u64 = 0xaaaaaaaaaaaaaaaa; - >some_var: &u64 = #pointer_from_int(address_raw); + >some_var: &u64 = @pointer_from_int(address_raw); >result: []&u8 = generic_pointer_array_macro[&u8](some_var, 1); - require(#int_from_pointer(result.pointer) == address_raw); + require(@int_from_pointer(result.pointer) == address_raw); require(result.length == 1); } @@ -1884,11 +1884,11 @@ basic_opaque = fn () s32 { >destination: s32 = 1; >source: s32 = 0; - >opaque_pointer = memcpy(&destination, &source, #byte_size(s32)); - >pointer: &s32 = #pointer_cast(opaque_pointer); + >opaque_pointer = memcpy(&destination, &source, @byte_size(s32)); + >pointer: &s32 = @pointer_cast(opaque_pointer); if (pointer != &destination) { - #trap(); + @trap(); } return destination; } @@ -1999,8 +1999,8 @@ min_max = fn () void { >a: u32 = 1; >b: u32 = 2; - >min = #min(a, b); - >max = #max(a, b); + >min = @min(a, b); + >max = @max(a, b); require(min == a); require(max == b); } @@ -2021,21 +2021,21 @@ field_parent_pointer = fn () void }; >p_a = &s.a; - >p_a_struct: &FieldParentPointerStruct = #field_parent_pointer(p_a, "a"); + >p_a_struct: &FieldParentPointerStruct = @field_parent_pointer(p_a, "a"); require(p_a_struct == &s); require(p_a_struct.a == s.a); require(p_a_struct.b == s.b); require(p_a_struct.c == s.c); >p_b = &s.b; - >p_b_struct: &FieldParentPointerStruct = #field_parent_pointer(p_b, "b"); + >p_b_struct: &FieldParentPointerStruct = @field_parent_pointer(p_b, "b"); require(p_b_struct == &s); require(p_b_struct.a == s.a); require(p_b_struct.b == s.b); require(p_b_struct.c == s.c); >p_c = &s.c; - >p_c_struct: &FieldParentPointerStruct = #field_parent_pointer(p_c, "c"); + >p_c_struct: &FieldParentPointerStruct = @field_parent_pointer(p_c, "c"); require(p_c_struct == &s); require(p_c_struct.a == s.a); require(p_c_struct.b == s.b); @@ -2045,11 +2045,11 @@ field_parent_pointer = fn () void leading_trailing_zeroes = fn () void { >a: u32 = 0b111; - require(#leading_zeroes(a) == 29); - require(#trailing_zeroes(a) == 0); + require(@leading_zeroes(a) == 29); + require(@trailing_zeroes(a) == 0); >b: u8 = 0b11010; - require(#leading_zeroes(b) == 3); - require(#trailing_zeroes(b) == 1); + require(@leading_zeroes(b) == 3); + require(@trailing_zeroes(b) == 1); } pointer_sub = fn () void @@ -2057,7 +2057,7 @@ pointer_sub = fn () void >a: [_]s32 = [ 3, 1 ]; >p0 = &a[0]; >p1 = p0 + 1; - >sub: u32 = #truncate(p1 - p0); + >sub: u32 = @truncate(p1 - p0); require(sub == 1); } -- 2.43.0 From 9508cd7275dd92ba055b316cbbb19e8212c90933 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 21:56:46 -0600 Subject: [PATCH 09/16] Ability to set CMAKE_PREFIX_PATH from env vars --- src/compiler.bbb | 12 ++++++++++++ src/compiler.cpp | 10 ++++++++++ src/lib.cpp | 6 ++++++ src/lib.hpp | 1 + 4 files changed, 29 insertions(+) diff --git a/src/compiler.bbb b/src/compiler.bbb index a28c1e1..ac95311 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -77,6 +77,8 @@ O = bits u32 [extern] memcpy = fn [cc(c)] (destination: &u8, source: &u8, byte_count: u64) &u8; [extern] exit = fn [cc(c)] (exit_code: int) noreturn; +[extern] getenv = fn [cc(c)] (env: &u8) &u8; + [extern] realpath = fn [cc(c)] (source_path: &u8, resolved_path: &u8) &u8; [extern] mkdir = fn [cc(c)] (path: &u8, mode: mode_t) int; @@ -18356,6 +18358,16 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 .value = CMAKE_PREFIX_PATH, }; + if (is_compiler) + { + >cmake_prefix_path_cstr = getenv("CMAKE_PREFIX_PATH"); + if (cmake_prefix_path_cstr) + { + >cmake_prefix_path_value = c_string_to_slice(cmake_prefix_path_cstr); + cmake_prefix_path_definition.value = cmake_prefix_path_value; + } + } + >objects = [ output_object_path ][..]; >c_abi_library = "build/libc_abi.a"; >llvm_bindings_library = "build/libllvm_bindings.a"; diff --git a/src/compiler.cpp b/src/compiler.cpp index 729b640..94e0624 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -221,6 +221,16 @@ fn String compile_file(Arena* arena, Compile options) .value = cmake_prefix_path, }; + if (is_compiler) + { + auto cmake_prefix_path_cstr = os_get_environment_variable("CMAKE_PREFIX_PATH"); + if (cmake_prefix_path_cstr) + { + auto cmake_prefix_path_string = c_string_to_slice(cmake_prefix_path_cstr); + cmake_prefix_path_definition.value = cmake_prefix_path_string; + } + } + String objects[] = { output_object_path, }; diff --git a/src/lib.cpp b/src/lib.cpp index fba49b4..3fe3b1c 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -225,3 +225,9 @@ Execution os_execute(Arena* arena, Slice arguments, Slice arguments, Slice environment, ExecuteOptions options); +char* os_get_environment_variable(const char* env); -- 2.43.0 From 279036435a17845e017b278303dfab2a3111161b Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 24 Jun 2025 22:11:33 -0600 Subject: [PATCH 10/16] Fix script paths --- ci/release.sh | 1 + ci/release_locally.sh | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ci/release.sh b/ci/release.sh index 8e5ef24..048fa5d 100755 --- a/ci/release.sh +++ b/ci/release.sh @@ -1,4 +1,5 @@ set -eux +mkdir -p $HOME/bloat-buster-artifacts/releases/main/ if [[ -n "${BUILD_DEBUG:-}" ]]; then cp $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug $HOME/bloat-buster-artifacts/releases/main/ fi diff --git a/ci/release_locally.sh b/ci/release_locally.sh index db6a3d8..a3b47d9 100755 --- a/ci/release_locally.sh +++ b/ci/release_locally.sh @@ -2,9 +2,9 @@ set -eux if [[ -n "${BUILD_DEBUG:-}" ]]; then export BUILD_DEBUG - CMAKE_BUILD_TYPE=Debug ./reproduce.sh + CMAKE_BUILD_TYPE=Debug ci/reproduce.sh fi -CMAKE_BUILD_TYPE=Release ./reproduce.sh -CMAKE_BUILD_TYPE=Release-assertions ./reproduce.sh -./install.sh -./release.sh +CMAKE_BUILD_TYPE=Release ci/reproduce.sh +CMAKE_BUILD_TYPE=Release-assertions ci/reproduce.sh +ci/install.sh +ci/release.sh -- 2.43.0 From e9b3dea9429996c7ad492d80a4923e75126ada87 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Wed, 25 Jun 2025 19:07:54 -0600 Subject: [PATCH 11/16] Rewrite LLVM bindings --- CMakeLists.txt | 23 ++++---- src/compiler.bbb | 142 ++++++++++++++++++++++++----------------------- src/compiler.cpp | 17 +++++- src/emitter.cpp | 69 +++++++++++++---------- src/llvm.hpp | 49 +--------------- 5 files changed, 143 insertions(+), 157 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e57d33..a23d9ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,6 @@ add_executable(bb ) add_library(c_abi tests/c_abi.c) -add_library(llvm_bindings src/llvm.cpp) include_directories(src) add_compile_definitions( @@ -29,25 +28,25 @@ add_compile_definitions( $<$>:BB_DEBUG=0> ) +find_library(llvm_bindings NAMES libllvm_bindings.dylib libllvm_bindings.lib libllvm_bindings.a libllvm_bindingsELF.dll.a libllvm_bindingsELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) find_library(LLD_COMMON NAMES liblldCommon.dylib lldCommon.lib lldCommon.a liblldCommon.dll.a liblldCommon.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) find_library(LLD_ELF NAMES liblldELF.dylib lldELF.lib lldELF.a liblldELF.dll.a liblldELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -# find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -# find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -# find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -# find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) +find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) +find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) +find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) +find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -target_link_libraries(llvm_bindings PUBLIC +target_link_libraries(bb PUBLIC ${LLVM_AVAILABLE_LIBS} ${LLD_COMMON} - # ${LLD_COFF} + ${LLD_COFF} ${LLD_ELF} - # ${LLD_MACHO} - # ${LLD_MINGW} - # ${LLD_WASM} + ${LLD_MACHO} + ${LLD_MINGW} + ${LLD_WASM} + ${llvm_bindings} ) -target_link_libraries(bb PUBLIC llvm_bindings) - add_compile_options(-Wall -Wextra -pedantic -Wpedantic -Werror -Wno-c99-extensions -Wno-unused-function -Wno-missing-designated-field-initializers -fno-signed-char -fwrapv -fno-strict-aliasing) add_compile_definitions(CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}") add_compile_definitions(BB_CI=${BB_CI}) diff --git a/src/compiler.bbb b/src/compiler.bbb index ac95311..ebc2abc 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -835,6 +835,8 @@ fail = fn () noreturn exit(1); } +LLVMError = opaque; + LLVMContext = opaque; LLVMModule = opaque; @@ -859,6 +861,8 @@ LLVMTargetDataLayout = opaque; LLVMTargetMachine = opaque; LLVMTargetMachineOptions = opaque; +LLVMPassBuilderOptions = opaque; + LLVMIntrinsicIndex = enum u32 { "llvm.ctlz", @@ -2646,43 +2650,10 @@ LLVMOptimizationLevel = enum u3 Oz = 5, } -LLVMOptimizationOptions = bits u64 -{ - optimization_level: LLVMOptimizationLevel, - debug_info: u1, - loop_unrolling: u1, - loop_interleaving: u1, - loop_vectorization: u1, - slp_vectorization: u1, - merge_functions: u1, - call_graph_profile: u1, - unified_lto: u1, - assignment_tracking: u1, - verify_module: u1, - reserved: u51, -} - -LLVMCodeGenerationFileType = enum u8 +LLVMCodeGenerationFileType = enum u32 { assembly = 0, object = 1, - null = 2, -} - -LLVMCodeGenerationOptions = struct -{ - output_dwarf_file_path: []u8, - output_file_path: []u8, - file_type: LLVMCodeGenerationFileType, - optimize_when_possible: u8, - verify_module: u8, -} - -LLVMCodeGenerationResult = enum u8 -{ - success = 0, - failed_to_create_file = 1, - failed_to_emit_passes = 2, } LLVMICmpPredicate = enum u32 @@ -2931,8 +2902,19 @@ llvm_module_create_function = fn (module: &LLVMModule, function_type: &LLVMType, [extern] LLVMSetFunctionCallConv = fn [cc(c)] (function: &LLVMValue, calling_convention: LLVMCallingConvention) void; [extern] LLVMSetInstructionCallConv = fn [cc(c)] (call: &LLVMValue, calling_convention: LLVMCallingConvention) void; -[extern] llvm_module_run_optimization_pipeline = fn [cc(c)] (module: &LLVMModule, target_machine: &LLVMTargetMachine, options: &LLVMOptimizationOptions) void; -[extern] llvm_module_run_code_generation_pipeline = fn [cc(c)] (module: &LLVMModule, target_machine: &LLVMTargetMachine, options: &LLVMCodeGenerationOptions) LLVMCodeGenerationResult; +[extern] LLVMCreatePassBuilderOptions = fn [cc(c)] () &LLVMPassBuilderOptions; + +[extern] LLVMPassBuilderOptionsSetVerifyEach = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetDebugLogging = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetLoopInterleaving = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetLoopVectorization = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetSLPVectorization = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetLoopUnrolling = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; +[extern] LLVMPassBuilderOptionsSetMergeFunctions = fn [cc(c)] (options: &LLVMPassBuilderOptions, value: s32) void; + +[extern] LLVMRunPasses = fn [cc(c)] (module: &LLVMModule, passes: &u8, target_machine: &LLVMTargetMachine, options: &LLVMPassBuilderOptions) &LLVMError; + +[extern] LLVMTargetMachineEmitToFile = fn [cc(c)] (target_machine: &LLVMTargetMachine, module: &LLVMModule, file_name: &u8, file_type: LLVMCodeGenerationFileType, error_message: &&u8) s32; LLDResult = struct { @@ -17016,38 +16998,52 @@ LLVMObjectGenerate = struct has_debug_info: u1, } -generate_object = fn (module: &LLVMModule, target_machine: &LLVMTargetMachine, options: LLVMObjectGenerate) LLVMCodeGenerationResult +generate_object = fn (module: &LLVMModule, target_machine: &LLVMTargetMachine, options: LLVMObjectGenerate) u1 { if (options.run_optimization_passes) { - >prefer_speed = options.optimization_level == .O2 or options.optimization_level == .O3; - >options: LLVMOptimizationOptions = { - .optimization_level = options.optimization_level, - .debug_info = options.has_debug_info, - .loop_unrolling = prefer_speed, - .loop_interleaving = prefer_speed, - .loop_vectorization = prefer_speed, - .slp_vectorization = prefer_speed, - .merge_functions = prefer_speed, - .call_graph_profile = 0, - .unified_lto = 0, - .assignment_tracking = options.has_debug_info, - .verify_module = 1, - zero, - }; - llvm_module_run_optimization_pipeline(module, target_machine, &options); + >prefer_speed: s32 = @extend(options.optimization_level == .O2 or options.optimization_level == .O3); + >pass_builder_options = LLVMCreatePassBuilderOptions(); + LLVMPassBuilderOptionsSetVerifyEach(pass_builder_options, 1); + LLVMPassBuilderOptionsSetDebugLogging(pass_builder_options, 0); + LLVMPassBuilderOptionsSetLoopInterleaving(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetLoopVectorization(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetSLPVectorization(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetLoopUnrolling(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetMergeFunctions(pass_builder_options, prefer_speed); + + >passes: &u8 = undefined; + switch (options.optimization_level) + { + .O0 => { passes = "default"; }, + .O1 => { passes = "default"; }, + .O2 => { passes = "default"; }, + .O3 => { passes = "default"; }, + .Os => { passes = "default"; }, + .Oz => { passes = "default"; }, + } + + >error = LLVMRunPasses(module, passes, target_machine, pass_builder_options); + if (error) + { + report_error(); + } } - >code_generation_options: LLVMCodeGenerationOptions = { - .output_file_path = options.path, - .file_type = .object, - .optimize_when_possible = @extend(options.optimization_level > .O0), - .verify_module = 1, - zero, - }; + >file_name = options.path.pointer; + >error_message: &u8 = zero; + >result = LLVMTargetMachineEmitToFile(target_machine, module, file_name, .object, &error_message); + if (result != 0) + { + assert(error_message != zero); + @trap(); + } + else + { + assert(!error_message); + } - >result = llvm_module_run_code_generation_pipeline(module, target_machine, &code_generation_options); - return result; + return result == 0; } link = fn (module: &Module) void @@ -18106,10 +18102,7 @@ emit = fn (module: &Module) void .has_debug_info = module.has_debug_info, }); - if (object_generation_result != .success) - { - report_error(); - } + assert(object_generation_result); link(module); } @@ -18370,7 +18363,6 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >objects = [ output_object_path ][..]; >c_abi_library = "build/libc_abi.a"; - >llvm_bindings_library = "build/libllvm_bindings.a"; >library_buffer: [256][]u8 = undefined; >library_directory: []u8 = zero; @@ -18485,11 +18477,25 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 library_buffer[library_count] = "lldCommon"; library_count += 1; + library_buffer[library_count] = "lldCOFF"; + library_count += 1; + library_buffer[library_count] = "lldELF"; library_count += 1; + library_buffer[library_count] = "lldMachO"; + library_count += 1; + + library_buffer[library_count] = "lldMinGW"; + library_count += 1; + + library_buffer[library_count] = "lldWasm"; + library_count += 1; + + library_buffer[library_count] = "llvm_bindings"; + library_count += 1; + library_names = library_buffer[..library_count]; - library_paths = { .pointer = &llvm_bindings_library, .length = 1 }; } else if (string_equal(base_name, "tests")) { diff --git a/src/compiler.cpp b/src/compiler.cpp index 94e0624..3474afe 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -343,11 +343,26 @@ fn String compile_file(Arena* arena, Compile options) library_buffer[library_count] = string_literal("lldCommon"); library_count += 1; + + library_buffer[library_count] = string_literal("lldCOFF"); + library_count += 1; + library_buffer[library_count] = string_literal("lldELF"); library_count += 1; + library_buffer[library_count] = string_literal("lldMachO"); + library_count += 1; + + library_buffer[library_count] = string_literal("lldMinGW"); + library_count += 1; + + library_buffer[library_count] = string_literal("lldWasm"); + library_count += 1; + + library_buffer[library_count] = string_literal("llvm_bindings"); + library_count += 1; + library_names = { library_buffer, library_count }; - library_paths = { &llvm_bindings_library, 1 }; } else if (base_name.equal(string_literal("tests"))) { diff --git a/src/emitter.cpp b/src/emitter.cpp index 42dd043..3bd9e25 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -9176,36 +9176,52 @@ struct ObjectGenerate bool has_debug_info; }; -fn BBLLVMCodeGenerationPipelineResult generate_object(LLVMModuleRef module, LLVMTargetMachineRef target_machine, ObjectGenerate options) +fn bool generate_object(LLVMModuleRef module, LLVMTargetMachineRef target_machine, ObjectGenerate options) { if (options.run_optimization_passes) { - // BBLLVM bool prefer_speed = options.optimization_level == BBLLVMOptimizationLevel::O2 || options.optimization_level == BBLLVMOptimizationLevel::O3; - BBLLVMOptimizationPipelineOptions optimization_options = { - .optimization_level = (u64)options.optimization_level, - .debug_info = options.has_debug_info, - .loop_unrolling = prefer_speed, - .loop_interleaving = prefer_speed, - .loop_vectorization = prefer_speed, - .slp_vectorization = prefer_speed, - .merge_functions = prefer_speed, - .call_graph_profile = false, - .unified_lto = false, - .assignment_tracking = options.has_debug_info, - .verify_module = true, - }; - llvm_module_run_optimization_pipeline(module, target_machine, optimization_options); + auto pass_builder_options = LLVMCreatePassBuilderOptions(); + LLVMPassBuilderOptionsSetVerifyEach(pass_builder_options, 1); + LLVMPassBuilderOptionsSetDebugLogging(pass_builder_options, 0); + LLVMPassBuilderOptionsSetLoopInterleaving(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetLoopVectorization(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetSLPVectorization(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetLoopUnrolling(pass_builder_options, prefer_speed); + LLVMPassBuilderOptionsSetMergeFunctions(pass_builder_options, prefer_speed); + + const char* passes; + switch (options.optimization_level) + { + case BBLLVMOptimizationLevel::O0: passes = "default"; break; + case BBLLVMOptimizationLevel::O1: passes = "default"; break; + case BBLLVMOptimizationLevel::O2: passes = "default"; break; + case BBLLVMOptimizationLevel::O3: passes = "default"; break; + case BBLLVMOptimizationLevel::Os: passes = "default"; break; + case BBLLVMOptimizationLevel::Oz: passes = "default"; break; + } + + auto error = LLVMRunPasses(module, passes, target_machine, pass_builder_options); + if (error) + { + report_error(); + } } - BBLLVMCodeGenerationPipelineOptions code_generation_options = { - .output_file_path = options.path, - .file_type = BBLLVMCodeGenerationFileType::object_file, - .optimize_when_possible = options.optimization_level > BBLLVMOptimizationLevel::O0, - .verify_module = true, - }; - auto result = llvm_module_run_code_generation_pipeline(module, target_machine, &code_generation_options); - return result; + auto file_name = cstr(options.path); + char* error_message = 0; + auto result = LLVMTargetMachineEmitToFile(target_machine, module, file_name, LLVMObjectFile, &error_message); + if (result) + { + assert(error_message); + trap(); + } + else + { + assert(!error_message); + } + + return !result; } fn void link(Module* module) @@ -10057,10 +10073,7 @@ void emit(Module* module) .run_optimization_passes = module->build_mode != BuildMode::debug_none, .has_debug_info = module->has_debug_info, }); - if (object_generation_result != BBLLVMCodeGenerationPipelineResult::success) - { - report_error(); - } + assert(object_generation_result); link(module); } diff --git a/src/llvm.hpp b/src/llvm.hpp index dafd084..eab0a12 100644 --- a/src/llvm.hpp +++ b/src/llvm.hpp @@ -7,6 +7,7 @@ #include #include #include +#include struct LLDResult { @@ -15,31 +16,6 @@ struct LLDResult bool success; }; -enum class BBLLVMCodeGenerationPipelineResult : u8 -{ - success = 0, - failed_to_create_file = 1, - failed_to_add_emit_passes = 2, -}; - -enum class BBLLVMCodeGenerationFileType : u8 -{ - assembly_file = 0, - object_file = 1, - null = 2, -}; - -struct BBLLVMCodeGenerationPipelineOptions -{ - String output_dwarf_file_path; - String output_file_path; - BBLLVMCodeGenerationFileType file_type; - bool optimize_when_possible; - bool verify_module; -}; - -static_assert(sizeof(BBLLVMCodeGenerationPipelineOptions) == 5 * sizeof(u64)); - enum class BBLLVMOptimizationLevel : u8 { O0 = 0, @@ -50,26 +26,6 @@ enum class BBLLVMOptimizationLevel : u8 Oz = 5, }; -#define BB_LLVM_OPTIMIZATION_PIPELINE_OPTIONS_PADDING_BIT_COUNT (51) -struct BBLLVMOptimizationPipelineOptions -{ - u64 optimization_level:3; - u64 debug_info:1; - u64 loop_unrolling:1; - u64 loop_interleaving:1; - u64 loop_vectorization:1; - u64 slp_vectorization:1; - u64 merge_functions:1; - u64 call_graph_profile:1; - u64 unified_lto:1; - u64 assignment_tracking:1; - u64 verify_module:1; - u64 reserved:BB_LLVM_OPTIMIZATION_PIPELINE_OPTIONS_PADDING_BIT_COUNT; -}; - -static_assert(sizeof(BBLLVMOptimizationPipelineOptions) == sizeof(u64)); -static_assert(BB_LLVM_OPTIMIZATION_PIPELINE_OPTIONS_PADDING_BIT_COUNT == 51); - enum class DwarfType { void_type = 0x0, @@ -123,9 +79,6 @@ extern "C" LLVMValueRef llvm_find_return_value_dominating_store(LLVMBuilderRef b extern "C" void llvm_subprogram_replace_type(LLVMMetadataRef subprogram, LLVMMetadataRef subroutine_type); -extern "C" void llvm_module_run_optimization_pipeline(LLVMModuleRef module, LLVMTargetMachineRef target_machine, BBLLVMOptimizationPipelineOptions options); -extern "C" BBLLVMCodeGenerationPipelineResult llvm_module_run_code_generation_pipeline(LLVMModuleRef m, LLVMTargetMachineRef tm, const BBLLVMCodeGenerationPipelineOptions* options); - #define lld_api_args() char* const* argument_pointer, u64 argument_count, bool exit_early, bool disable_output #define lld_api_function_decl(link_name) LLDResult lld_ ## link_name ## _link(lld_api_args()) extern "C" lld_api_function_decl(elf); -- 2.43.0 From 7f404ad003e46f6b2ec28bc23cc55a01c147483c Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 14:59:40 -0600 Subject: [PATCH 12/16] Delete old code --- bootstrap/bloat-buster/base.h | 214 - bootstrap/bloat-buster/bb.c | 5081 ---- bootstrap/bloat-buster/bb_core.c | 276 - bootstrap/bloat-buster/bb_core.h | 7 - bootstrap/bloat-buster/data/instructions.dat | 281 - bootstrap/bloat-buster/data/x86_mnemonic.dat | 226 - bootstrap/bloat-buster/lld_api.cpp | 55 - bootstrap/bloat-buster/lld_api.h | 17 - bootstrap/bloat-buster/lld_driver.c | 244 - bootstrap/bloat-buster/lld_driver.h | 4 - bootstrap/bloat-buster/llvm.cpp | 166 - bootstrap/bloat-buster/llvm.h | 5 - bootstrap/bloat-buster/main.c | 25059 ----------------- bootstrap/bloat-buster/pdb_image.c | 8964 ------ bootstrap/bloat-buster/pdb_image.h | 2 - bootstrap/std/base.c | 463 - bootstrap/std/base.h | 373 - bootstrap/std/cocoa_windowing.c | 65 - bootstrap/std/cocoa_windowing.h | 18 - bootstrap/std/directx12_rendering.c | 1 - bootstrap/std/directx12_rendering.h | 1 - bootstrap/std/entry_point.c | 35 - bootstrap/std/entry_point.h | 11 - bootstrap/std/font_provider.c | 167 - bootstrap/std/font_provider.h | 35 - bootstrap/std/format.c | 1442 - bootstrap/std/format.h | 13 - bootstrap/std/image_loader.c | 26 - bootstrap/std/image_loader.h | 7 - bootstrap/std/md5.c | 178 - bootstrap/std/md5.h | 8 - bootstrap/std/metal_rendering.c | 148 - bootstrap/std/metal_rendering.h | 16 - bootstrap/std/os.c | 1701 -- bootstrap/std/os.h | 195 - bootstrap/std/project.h | 60 - bootstrap/std/rendering.c | 15 - bootstrap/std/rendering.h | 334 - bootstrap/std/sha1.c | 163 - bootstrap/std/sha1.h | 0 bootstrap/std/shaders/rect.frag | 43 - bootstrap/std/shaders/rect.inc | 22 - bootstrap/std/shaders/rect.metal | 122 - bootstrap/std/shaders/rect.vert | 61 - bootstrap/std/string.c | 136 - bootstrap/std/string.h | 10 - bootstrap/std/ui_builder.c | 14 - bootstrap/std/ui_builder.h | 6 - bootstrap/std/ui_core.c | 810 - bootstrap/std/ui_core.h | 223 - bootstrap/std/virtual_buffer.c | 88 - bootstrap/std/virtual_buffer.h | 54 - bootstrap/std/vulkan_rendering.c | 2502 -- bootstrap/std/vulkan_rendering.h | 130 - bootstrap/std/wayland_windowing.c | 1 - bootstrap/std/wayland_windowing.h | 1 - bootstrap/std/win32_windowing.c | 59 - bootstrap/std/win32_windowing.h | 13 - bootstrap/std/windowing.c | 15 - bootstrap/std/windowing.h | 206 - bootstrap/std/x11_windowing.c | 197 - bootstrap/std/x11_windowing.h | 17 - build.c | 2656 -- dependencies/stb/.gitignore | 3 - dependencies/stb/LICENSE | 37 - dependencies/stb/stb_image.h | 7988 ------ dependencies/stb/stb_truetype.h | 5089 ---- licenses/raw_pdb/LICENSE.txt | 27 - licenses/simple/LICENSE.txt | 203 - licenses/tb/LICENSE.txt | 23 - 70 files changed, 66832 deletions(-) delete mode 100644 bootstrap/bloat-buster/base.h delete mode 100644 bootstrap/bloat-buster/bb.c delete mode 100644 bootstrap/bloat-buster/bb_core.c delete mode 100644 bootstrap/bloat-buster/bb_core.h delete mode 100644 bootstrap/bloat-buster/data/instructions.dat delete mode 100644 bootstrap/bloat-buster/data/x86_mnemonic.dat delete mode 100644 bootstrap/bloat-buster/lld_api.cpp delete mode 100644 bootstrap/bloat-buster/lld_api.h delete mode 100644 bootstrap/bloat-buster/lld_driver.c delete mode 100644 bootstrap/bloat-buster/lld_driver.h delete mode 100644 bootstrap/bloat-buster/llvm.cpp delete mode 100644 bootstrap/bloat-buster/llvm.h delete mode 100644 bootstrap/bloat-buster/main.c delete mode 100644 bootstrap/bloat-buster/pdb_image.c delete mode 100644 bootstrap/bloat-buster/pdb_image.h delete mode 100644 bootstrap/std/base.c delete mode 100644 bootstrap/std/base.h delete mode 100644 bootstrap/std/cocoa_windowing.c delete mode 100644 bootstrap/std/cocoa_windowing.h delete mode 100644 bootstrap/std/directx12_rendering.c delete mode 100644 bootstrap/std/directx12_rendering.h delete mode 100644 bootstrap/std/entry_point.c delete mode 100644 bootstrap/std/entry_point.h delete mode 100644 bootstrap/std/font_provider.c delete mode 100644 bootstrap/std/font_provider.h delete mode 100644 bootstrap/std/format.c delete mode 100644 bootstrap/std/format.h delete mode 100644 bootstrap/std/image_loader.c delete mode 100644 bootstrap/std/image_loader.h delete mode 100644 bootstrap/std/md5.c delete mode 100644 bootstrap/std/md5.h delete mode 100644 bootstrap/std/metal_rendering.c delete mode 100644 bootstrap/std/metal_rendering.h delete mode 100644 bootstrap/std/os.c delete mode 100644 bootstrap/std/os.h delete mode 100644 bootstrap/std/project.h delete mode 100644 bootstrap/std/rendering.c delete mode 100644 bootstrap/std/rendering.h delete mode 100644 bootstrap/std/sha1.c delete mode 100644 bootstrap/std/sha1.h delete mode 100644 bootstrap/std/shaders/rect.frag delete mode 100644 bootstrap/std/shaders/rect.inc delete mode 100644 bootstrap/std/shaders/rect.metal delete mode 100644 bootstrap/std/shaders/rect.vert delete mode 100644 bootstrap/std/string.c delete mode 100644 bootstrap/std/string.h delete mode 100644 bootstrap/std/ui_builder.c delete mode 100644 bootstrap/std/ui_builder.h delete mode 100644 bootstrap/std/ui_core.c delete mode 100644 bootstrap/std/ui_core.h delete mode 100644 bootstrap/std/virtual_buffer.c delete mode 100644 bootstrap/std/virtual_buffer.h delete mode 100644 bootstrap/std/vulkan_rendering.c delete mode 100644 bootstrap/std/vulkan_rendering.h delete mode 100644 bootstrap/std/wayland_windowing.c delete mode 100644 bootstrap/std/wayland_windowing.h delete mode 100644 bootstrap/std/win32_windowing.c delete mode 100644 bootstrap/std/win32_windowing.h delete mode 100644 bootstrap/std/windowing.c delete mode 100644 bootstrap/std/windowing.h delete mode 100644 bootstrap/std/x11_windowing.c delete mode 100644 bootstrap/std/x11_windowing.h delete mode 100644 build.c delete mode 100644 dependencies/stb/.gitignore delete mode 100644 dependencies/stb/LICENSE delete mode 100644 dependencies/stb/stb_image.h delete mode 100644 dependencies/stb/stb_truetype.h delete mode 100644 licenses/raw_pdb/LICENSE.txt delete mode 100644 licenses/simple/LICENSE.txt delete mode 100644 licenses/tb/LICENSE.txt diff --git a/bootstrap/bloat-buster/base.h b/bootstrap/bloat-buster/base.h deleted file mode 100644 index f3d53c9..0000000 --- a/bootstrap/bloat-buster/base.h +++ /dev/null @@ -1,214 +0,0 @@ -#pragma once - -#include -#include - -typedef enum CpuArchitecture : u8 -{ - CPU_ARCH_X86_64, - CPU_ARCH_AARCH64, -} CpuArchitecture; - -fn String cpu_to_string(CpuArchitecture cpu) -{ - switch (cpu) - { - case CPU_ARCH_X86_64: - return strlit("x86_64"); - case CPU_ARCH_AARCH64: - return strlit("aarch64"); - } -} - -typedef enum OperatingSystem : u8 -{ - OPERATING_SYSTEM_LINUX, - OPERATING_SYSTEM_MAC, - OPERATING_SYSTEM_WINDOWS, -} OperatingSystem; - -fn String operating_system_to_string(OperatingSystem os) -{ - switch (os) - { - case OPERATING_SYSTEM_LINUX: - return strlit("linux"); - case OPERATING_SYSTEM_MAC: - return strlit("macos"); - case OPERATING_SYSTEM_WINDOWS: - return strlit("windows"); - } -} - -STRUCT(Target) -{ - CpuArchitecture cpu; - OperatingSystem os; -}; - -typedef enum CompilerBackend : u8 -{ - COMPILER_BACKEND_BB, - COMPILER_BACKEND_LLVM, - COMPILER_BACKEND_COUNT, -} CompilerBackend; - -fn String compiler_backend_to_one_char_string(CompilerBackend backend) -{ - switch (backend) - { - case COMPILER_BACKEND_BB: - return strlit("b"); - case COMPILER_BACKEND_LLVM: - return strlit("l"); - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -fn String compiler_backend_to_string(CompilerBackend backend) -{ - switch (backend) - { - case COMPILER_BACKEND_BB: - return strlit("bb"); - case COMPILER_BACKEND_LLVM: - return strlit("llvm"); - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -typedef enum BinaryFileType : u8 -{ - BINARY_FILE_OBJECT, - BINARY_FILE_STATIC_LIBRARY, - BINARY_FILE_DYNAMIC_LIBRARY, - BINARY_FILE_EXECUTABLE, -} BinaryFileType; - -STRUCT(BinaryPathOptions) -{ - String build_directory; - String name; - Target target; - CompilerBackend backend; - BinaryFileType binary_file_type; -}; - -fn String binary_path_from_options(Arena* arena, BinaryPathOptions options) -{ - String object_extension; - switch (options.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - object_extension = strlit(".obj"); - break; - default: - object_extension = strlit(".o"); - break; - } - String executable_extension; - switch (options.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - executable_extension = strlit(".exe"); - break; - default: - executable_extension = strlit(""); - break; - } - - String extension; - switch (options.binary_file_type) - { - case BINARY_FILE_OBJECT: - extension = object_extension; - break; - case BINARY_FILE_STATIC_LIBRARY: - unreachable(); - break; - case BINARY_FILE_DYNAMIC_LIBRARY: - unreachable(); - break; - case BINARY_FILE_EXECUTABLE: - extension = executable_extension; - break; - } - - auto backend_string = compiler_backend_to_string(options.backend); - auto cpu_string = cpu_to_string(options.target.cpu); - auto os_string = operating_system_to_string(options.target.os); - String parts[] = { - options.build_directory, - strlit("/"), - options.name, - // strlit("_"), - // cpu_string, - // strlit("_"), - // os_string, - // strlit("_"), - // backend_string, - extension, - }; - - auto result = arena_join_string(arena, (Slice(String)) array_to_slice(parts)); - return result; -} - -fn CompilerBackend one_char_string_to_compiler_backend(String string) -{ - CompilerBackend result = COMPILER_BACKEND_COUNT; - - for (u32 i = 0; i < COMPILER_BACKEND_COUNT; i += 1) - { - auto candidate = (CompilerBackend)i; - if (s_equal(compiler_backend_to_one_char_string(candidate), string)) - { - result = candidate; - break; - } - } - - return result; -} - -STRUCT(CodegenOptions) -{ - String test_name; - Target target; - CompilerBackend backend; - u8 generate_debug_information; -}; - -fn Target native_target_get() -{ - Target target = { -#ifdef __x86_64__ - .cpu = CPU_ARCH_X86_64, -#else - .cpu = CPU_ARCH_AARCH64, -#endif -#if _WIN32 - .os = OPERATING_SYSTEM_WINDOWS, -#elif defined(__APPLE__) - .os = OPERATING_SYSTEM_MAC, -#elif defined(__linux__) - .os = OPERATING_SYSTEM_LINUX, -#else -#error "Unknown platform" -#endif - }; - - return target; -} - -STRUCT(LinkerArguments) -{ - Target target; - String out_path; - Slice(String) objects; - Slice(String) libraries; - u8 link_libc:1; - u8 link_libcpp:1; -}; diff --git a/bootstrap/bloat-buster/bb.c b/bootstrap/bloat-buster/bb.c deleted file mode 100644 index b1f6977..0000000 --- a/bootstrap/bloat-buster/bb.c +++ /dev/null @@ -1,5081 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -global_variable char** environment_pointer; - -typedef enum GPR_x86_64 -{ - REGISTER_X86_64_AL = 0x0, - REGISTER_X86_64_AH = REGISTER_X86_64_AL | (1 << 2), - REGISTER_X86_64_AX = REGISTER_X86_64_AL, - REGISTER_X86_64_EAX = REGISTER_X86_64_AL, - REGISTER_X86_64_RAX = REGISTER_X86_64_AL, - - REGISTER_X86_64_CL = 0x1, - REGISTER_X86_64_CH = REGISTER_X86_64_CL | (1 << 2), - REGISTER_X86_64_CX = REGISTER_X86_64_CL, - REGISTER_X86_64_ECX = REGISTER_X86_64_CL, - REGISTER_X86_64_RCX = REGISTER_X86_64_CL, - - REGISTER_X86_64_DL = 0x2, - REGISTER_X86_64_DH = REGISTER_X86_64_DL | (1 << 2), - REGISTER_X86_64_DX = REGISTER_X86_64_DL, - REGISTER_X86_64_EDX = REGISTER_X86_64_DL, - REGISTER_X86_64_RDX = REGISTER_X86_64_DL, - - REGISTER_X86_64_BL = 0x3, - REGISTER_X86_64_BH = REGISTER_X86_64_BL | (1 << 2), - REGISTER_X86_64_BX = REGISTER_X86_64_BL, - REGISTER_X86_64_EBX = REGISTER_X86_64_BL, - REGISTER_X86_64_RBX = REGISTER_X86_64_BL, - - REGISTER_X86_64_SPL = 0x4, - REGISTER_X86_64_SP = REGISTER_X86_64_SPL, - REGISTER_X86_64_ESP = REGISTER_X86_64_SPL, - REGISTER_X86_64_RSP = REGISTER_X86_64_SPL, - - REGISTER_X86_64_BPL = 0x5, - REGISTER_X86_64_BP = REGISTER_X86_64_BPL, - REGISTER_X86_64_EBP = REGISTER_X86_64_BPL, - REGISTER_X86_64_RBP = REGISTER_X86_64_BPL, - - REGISTER_X86_64_SIL = 0x6, - REGISTER_X86_64_SI = REGISTER_X86_64_SIL, - REGISTER_X86_64_ESI = REGISTER_X86_64_SIL, - REGISTER_X86_64_RSI = REGISTER_X86_64_SIL, - - REGISTER_X86_64_DIL = 0x7, - REGISTER_X86_64_DI = REGISTER_X86_64_DIL, - REGISTER_X86_64_EDI = REGISTER_X86_64_DIL, - REGISTER_X86_64_RDI = REGISTER_X86_64_DIL, - - REGISTER_X86_64_R8L = 0x8, - REGISTER_X86_64_R8W = REGISTER_X86_64_R8L, - REGISTER_X86_64_R8D = REGISTER_X86_64_R8L, - REGISTER_X86_64_R8 = REGISTER_X86_64_R8L, - - REGISTER_X86_64_R9L = 0x9, - REGISTER_X86_64_R9W = REGISTER_X86_64_R9L, - REGISTER_X86_64_R9D = REGISTER_X86_64_R9L, - REGISTER_X86_64_R9 = REGISTER_X86_64_R9L, - - REGISTER_X86_64_R10L = 0xa, - REGISTER_X86_64_R10W = REGISTER_X86_64_R10L, - REGISTER_X86_64_R10D = REGISTER_X86_64_R10L, - REGISTER_X86_64_R10 = REGISTER_X86_64_R10L, - - REGISTER_X86_64_R11L = 0xb, - REGISTER_X86_64_R11W = REGISTER_X86_64_R11L, - REGISTER_X86_64_R11D = REGISTER_X86_64_R11L, - REGISTER_X86_64_R11 = REGISTER_X86_64_R11L, - - REGISTER_X86_64_R12L = 0xc, - REGISTER_X86_64_R12W = REGISTER_X86_64_R12L, - REGISTER_X86_64_R12D = REGISTER_X86_64_R12L, - REGISTER_X86_64_R12 = REGISTER_X86_64_R12L, - - REGISTER_X86_64_R13L = 0xd, - REGISTER_X86_64_R13W = REGISTER_X86_64_R13L, - REGISTER_X86_64_R13D = REGISTER_X86_64_R13L, - REGISTER_X86_64_R13 = REGISTER_X86_64_R13L, - - REGISTER_X86_64_R14L = 0xe, - REGISTER_X86_64_R14W = REGISTER_X86_64_R14L, - REGISTER_X86_64_R14D = REGISTER_X86_64_R14L, - REGISTER_X86_64_R14 = REGISTER_X86_64_R14L, - - REGISTER_X86_64_R15L = 0xf, - REGISTER_X86_64_R15W = REGISTER_X86_64_R15L, - REGISTER_X86_64_R15D = REGISTER_X86_64_R15L, - REGISTER_X86_64_R15 = REGISTER_X86_64_R15L, -} GPR_x86_64; - -fn u8 gpr_is_extended(GPR_x86_64 gpr) -{ - return (gpr & 0b1000) >> 3; -} - -#define X86_64_GPR_COUNT (16) - -typedef enum OpcodeLength -{ - OPCODE_LENGTH_1 = 0, - OPCODE_LENGTH_2 = 1, // 0f xx - OPCODE_LENGTH_3 = 2, // 0f yy xx -} OpcodeLength; - -STRUCT(Opcode) -{ - u8 plus_register:1; - u8 prefix_0f:1; - u8 extension:3; - u8 reserved:2; - u8 bytes[2]; -}; - -typedef enum LegacyPrefix -{ - LEGACY_PREFIX_F0, - LEGACY_PREFIX_F2, - LEGACY_PREFIX_F3, - LEGACY_PREFIX_2E, - LEGACY_PREFIX_36, - LEGACY_PREFIX_3E, - LEGACY_PREFIX_26, - LEGACY_PREFIX_64, - LEGACY_PREFIX_65, - LEGACY_PREFIX_66, - LEGACY_PREFIX_67, - LEGACY_PREFIX_COUNT, -} LegacyPrefix; - -typedef enum SegmentRegisterOverride -{ - SEGMENT_REGISTER_OVERRIDE_CS, - SEGMENT_REGISTER_OVERRIDE_SS, - SEGMENT_REGISTER_OVERRIDE_DS, - SEGMENT_REGISTER_OVERRIDE_ES, - SEGMENT_REGISTER_OVERRIDE_FS, - SEGMENT_REGISTER_OVERRIDE_GS, - SEGMENT_REGISTER_OVERRIDE_COUNT, -} SegmentRegisterOverride; - -fn String segment_register_override_to_register_string(SegmentRegisterOverride segment_register_override) -{ - switch (segment_register_override) - { - case SEGMENT_REGISTER_OVERRIDE_CS: return strlit("cs"); - case SEGMENT_REGISTER_OVERRIDE_SS: return strlit("ss"); - case SEGMENT_REGISTER_OVERRIDE_DS: return strlit("ds"); - case SEGMENT_REGISTER_OVERRIDE_ES: return strlit("es"); - case SEGMENT_REGISTER_OVERRIDE_FS: return strlit("fs"); - case SEGMENT_REGISTER_OVERRIDE_GS: return strlit("gs"); - case SEGMENT_REGISTER_OVERRIDE_COUNT: unreachable(); - } -} - -global_variable const u8 segment_register_overrides[] = { - [SEGMENT_REGISTER_OVERRIDE_CS] = LEGACY_PREFIX_2E, - [SEGMENT_REGISTER_OVERRIDE_SS] = LEGACY_PREFIX_36, - [SEGMENT_REGISTER_OVERRIDE_DS] = LEGACY_PREFIX_3E, - [SEGMENT_REGISTER_OVERRIDE_ES] = LEGACY_PREFIX_26, - [SEGMENT_REGISTER_OVERRIDE_FS] = LEGACY_PREFIX_64, - [SEGMENT_REGISTER_OVERRIDE_GS] = LEGACY_PREFIX_65, -}; -static_assert(array_length(segment_register_overrides) == SEGMENT_REGISTER_OVERRIDE_COUNT); - -global_variable u8 legacy_prefixes[] = { - 0xf0, - 0xf2, - 0xf3, - 0x2e, - 0x36, - 0x3e, - 0x26, - 0x64, - 0x65, - 0x66, - 0x67, -}; - -static_assert(array_length(legacy_prefixes) == LEGACY_PREFIX_COUNT); - -STRUCT(EncodingScalar) -{ - EncodingInvariantData invariant; - u64 legacy_prefixes:LEGACY_PREFIX_COUNT; - u64 rm_register:4; - u64 reg_register:4; - union - { - u8 bytes[8]; - u64 value; - } immediate; - union - { - s32 value; - s8 bytes[4]; - } displacement; - Opcode opcode; -}; - -#define batch_element_count (64) -#define max_instruction_byte_count (16) - -u32 encode_scalar(u8* restrict output, const EncodingScalar* const restrict encodings, u64 encoding_count) -{ - assert(encoding_count); - u8 buffers[batch_element_count][max_instruction_byte_count]; - u8 instruction_lengths[batch_element_count]; - - for (u32 encoding_index = 0; encoding_index < encoding_count; encoding_index += 1) - { - let(encoding, encodings[encoding_index]); - - const u8* const start = (const u8* const) &buffers[encoding_index]; - u8* restrict local_buffer = (u8* restrict)&buffers[encoding_index]; - u8* restrict it = local_buffer; - - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - let(is_prefix, (encoding.legacy_prefixes & (1 << prefix)) >> prefix); - let(prefix_byte, legacy_prefixes[prefix]); - *it = prefix_byte; - it += is_prefix; - } - - u8 has_base_register = encoding.invariant.is_rm_register | encoding.invariant.is_reg_register | encoding.invariant.implicit_register; - - u8 rex_base = 0x40; - u8 rex_b = 0x01; - u8 rex_x = 0x02; - unused(rex_x); - u8 rex_r = 0x04; - u8 rex_w = 0x08; - u8 is_reg_direct_addressing_mode = !encoding.invariant.is_displacement; - u8 reg_register = encoding.reg_register; - u8 rm_register = encoding.rm_register; - u8 byte_rex_b = rex_b * gpr_is_extended(rm_register); - u8 byte_rex_x = 0; // TODO: rex_x * encoding.scaled_index_register; - u8 byte_rex_r = rex_r * gpr_is_extended(reg_register); - u8 byte_rex_w = rex_w * encoding.invariant.rex_w; - u8 byte_rex = (byte_rex_b | byte_rex_x) | (byte_rex_r | byte_rex_w); - u8 rex = (rex_base | byte_rex); - u8 encode_rex = byte_rex != 0; - *it = rex; - it += encode_rex; - - u8 encode_prefix_0f = encoding.opcode.prefix_0f; - *it = 0x0f * encode_prefix_0f; - it += encode_prefix_0f; - - u8 encode_three_byte_opcode = encoding.opcode.bytes[1] != 0; - *it = encoding.opcode.bytes[1] * encode_three_byte_opcode; - it += encode_three_byte_opcode; - - *it = encoding.opcode.bytes[0] | ((encoding.rm_register & 0b111) * encoding.opcode.plus_register); // *it = encoding.opcode.bytes[0] | - it += 1; - - u8 encode_mod_rm = ((encoding.invariant.is_rm_register | encoding.invariant.is_reg_register) & (!encoding.opcode.plus_register)) | encoding.invariant.is_displacement; - - // Mod: - // 00: No displacement (except when R/M = 101, where a 32-bit displacement follows). - // 01: 8-bit signed displacement follows. - // 10: 32-bit signed displacement follows. - // 11: Register addressing (no memory access). - - u8 mod_is_displacement32 = encoding.invariant.is_displacement & encoding.invariant.displacement_size; - u8 mod_is_displacement8 = (encoding.invariant.is_displacement & !(encoding.invariant.displacement_size)) & ((encoding.displacement.bytes[0] != 0) | (encoding.invariant.is_rm_register & ((encoding.rm_register & 0b111) == REGISTER_X86_64_RBP))); - // TODO: fix if necessary - u8 mod = (((mod_is_displacement32 * has_base_register) << 1) | (mod_is_displacement8 * has_base_register)) | ((is_reg_direct_addressing_mode << 1) | is_reg_direct_addressing_mode); - // A register operand. - // An opcode extension (in some instructions). - u8 reg = (reg_register & 0b111) | encoding.opcode.extension; - // When mod is 00, 01, or 10: Specifies a memory address or a base register. - // When mod is 11: Specifies a register. - u8 rm = (rm_register & 0b111) | (!has_base_register * 0b100); - u8 mod_rm = (mod << 6) | (reg << 3) | rm; - *it = mod_rm; - it += encode_mod_rm; - - // When mod is 00, 01, or 10 and rm = 100, a SIB (Scale-Index-Base) byte follows the ModR/M byte to further specify the addressing mode. - u8 encode_sib = (mod != 0b11) & (rm == 0b100); - u8 sib_scale = 0; - u8 sib_index = 0b100; - u8 sib_base = ((rm_register & 0b111) * encoding.invariant.is_rm_register) | (!encoding.invariant.is_rm_register * 0b101); - u8 sib_byte = sib_scale << 6 | sib_index << 3 | sib_base; - *it = sib_byte; - it += encode_sib; - - *(s8*)it = encoding.displacement.bytes[0]; - it += mod_is_displacement8 * sizeof(s8); - - *(s32*)it = encoding.displacement.value; - it += mod_is_displacement32 * sizeof(s32); - - *(u8*) it = encoding.immediate.bytes[0]; - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 0)) * sizeof(u8); - - *(u16*) it = *(u16*)(&encoding.immediate.bytes[0]); - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 1)) * sizeof(u16); - - *(u32*) it = *(u32*)(&encoding.immediate.bytes[0]); - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 2)) * sizeof(u32); - - *(u64*) it = encoding.immediate.value; - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 3)) * sizeof(u64); - - *(s8*)it = encoding.displacement.bytes[0]; - it += (encoding.invariant.is_relative & !encoding.invariant.displacement_size) * sizeof(s8); - - *(s32*)it = encoding.displacement.value; - it += (encoding.invariant.is_relative & encoding.invariant.displacement_size) * sizeof(s32); - - let_cast(u8, instruction_length, it - start); - instruction_lengths[encoding_index] = instruction_length; - } - - u8* restrict it = output; - - for (u32 encoding_index = 0; encoding_index < MIN(encoding_count, batch_element_count); encoding_index += 1) - { - let(instruction_length, instruction_lengths[encoding_index]); -#if USE_MEMCPY - memcpy(it, &buffers[encoding_index], instruction_length); -#else - for (u8 byte = 0; byte < instruction_length; byte += 1) - { - it[byte] = buffers[encoding_index][byte]; - } -#endif - it += instruction_length; - } - - let(length, (u32)(it - output)); - assert(it - output != 0); - assert(length); - return length; -} - -#define cc_count(x) ((MNEMONIC_x86_64_ ## x ## z - MNEMONIC_x86_64_ ## x ## a) + 1) -// #define cmov_count ((MNEMONIC_x86_64_cmovz - MNEMONIC_x86_64_cmova) + 1) -// #define jcc_count ((MNEMONIC_x86_64_jz - MNEMONIC_x86_64_ja) + 1) -#define cmov_count cc_count(cmov) -#define jcc_count cc_count(j) -#define setcc_count cc_count(set) - -#define cc_index(x) \ -fn u8 x ## _index(Mnemonic_x86_64 mnemonic) \ -{\ - assert(mnemonic >= MNEMONIC_x86_64_ ## x ## a && mnemonic <= MNEMONIC_x86_64_ ## x ## z);\ - return (u8)(mnemonic - MNEMONIC_x86_64_ ## x ## a);\ -} - -cc_index(cmov) -cc_index(j) -cc_index(set) - -global_variable const u8 cc_opcodes_low[] = { - 0x07, - 0x03, - 0x02, - 0x06, - 0x02, - 0x04, - 0x0F, - 0x0D, - 0x0C, - 0x0E, - 0x06, - 0x02, - 0x03, - 0x07, - 0x03, - 0x05, - 0x0E, - 0x0C, - 0x0D, - 0x0F, - 0x01, - 0x0B, - 0x09, - 0x05, - 0x00, - 0x0A, - 0x0A, - 0x0B, - 0x08, - 0x04, -}; -static_assert(array_length(cc_opcodes_low) == cmov_count); -static_assert(array_length(cc_opcodes_low) == jcc_count); -static_assert(array_length(cc_opcodes_low) == setcc_count); - -ENUM(OperandId, u8, - op_none, - op_al, - op_ax, - op_eax, - op_rax, - op_cl, - op_cx, - op_ecx, - op_rcx, - op_dl, - op_dx, - op_edx, - op_rdx, - op_r8, - op_r16, - op_r32, - op_r64, - op_rm8, - op_rm16, - op_rm32, - op_rm64, - op_imm8, - op_imm16, - op_imm32, - op_imm64, - op_rel8, - op_rel32, - op_m8, - op_m16, - op_m32, - op_m64, - op_m128, - - op_ds_rsi_m8, - op_ds_rsi_m16, - op_ds_rsi_m32, - op_ds_rsi_m64, - - op_es_rdi_m8, - op_es_rdi_m16, - op_es_rdi_m32, - op_es_rdi_m64, - - op_one_literal, -); - -#define operand_kind_array_element_count (4) - -fn String operand_to_string(OperandId operand_id) -{ - switch (operand_id) - { - case_to_name(op_, none); - case op_al: return strlit("al"); - case op_ax: return strlit("ax"); - case op_eax: return strlit("eax"); - case op_rax: return strlit("rax"); - case op_cl: return strlit("cl"); - case op_cx: return strlit("cx"); - case op_ecx: return strlit("ecx"); - case op_rcx: return strlit("rcx"); - case op_dl: return strlit("dl"); - case op_dx: return strlit("dx"); - case op_edx: return strlit("edx"); - case op_rdx: return strlit("rdx"); - case_to_name(op_, r8); - case_to_name(op_, r16); - case_to_name(op_, r32); - case_to_name(op_, r64); - case_to_name(op_, rm8); - case_to_name(op_, rm16); - case_to_name(op_, rm32); - case_to_name(op_, rm64); - case_to_name(op_, imm8); - case_to_name(op_, imm16); - case_to_name(op_, imm32); - case_to_name(op_, imm64); - case_to_name(op_, rel8); - case_to_name(op_, rel32); - case_to_name(op_, m8); - case_to_name(op_, m16); - case_to_name(op_, m32); - case_to_name(op_, m64); - case_to_name(op_, m128); - case_to_name(op_, ds_rsi_m8); - case_to_name(op_, ds_rsi_m16); - case_to_name(op_, ds_rsi_m32); - case_to_name(op_, ds_rsi_m64); - - case_to_name(op_, es_rdi_m8); - case_to_name(op_, es_rdi_m16); - case_to_name(op_, es_rdi_m32); - case_to_name(op_, es_rdi_m64); - case op_one_literal: return strlit("1"); - } -} - -STRUCT(Operands) -{ - OperandId values[operand_kind_array_element_count]; - u8 count:7; - u8 implicit_operands:1; -}; - -STRUCT(Encoding) -{ - Operands operands; - Opcode opcode; - u8 rex_w:1; - u8 operand_size_override:1; -}; -decl_vb(Encoding); - -STRUCT(Batch) -{ - Mnemonic_x86_64 mnemonic; - u64 legacy_prefixes:LEGACY_PREFIX_COUNT; - u32 encoding_offset; - u32 encoding_count; -}; -decl_vb(Batch); - -fn u8 op_is_gpra(OperandId operand_kind) -{ - return operand_kind >= op_al && operand_kind <= op_rax; -} - -fn u8 op_gpra_get_index(OperandId operand) -{ - assert(op_is_gpra(operand)); - return operand - op_al; -} - -fn String op_gpra_to_string(OperandId operand) -{ - let(index, op_gpra_get_index(operand)); - String register_a_names[] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }; - - return register_a_names[index]; -} - -fn u8 op_is_gprd(OperandId operand_kind) -{ - return operand_kind >= op_dl && operand_kind <= op_rdx; -} - -fn String op_gprd_to_string(OperandId operand) -{ - assert(op_is_gprd(operand)); - switch (operand) - { - case op_dl: return strlit("dl"); - case op_dx: return strlit("dx"); - case op_edx: return strlit("edx"); - case op_rdx: return strlit("rdx"); - default: unreachable(); - } -} - -fn u8 op_is_imm(OperandId operand_kind) -{ - return operand_kind >= op_imm8 && operand_kind <= op_imm64; -} - -fn u8 op_is_gpr_no_gpra_exclusive(OperandId operand_kind) -{ - return operand_kind >= op_r8 && operand_kind <= op_r64; -} - -fn u8 op_is_rm(OperandId operand_kind) -{ - return operand_kind >= op_rm8 && operand_kind <= op_rm64; -} - -fn u8 op_is_gpr_no_gpra(OperandId operand_kind) -{ - return op_is_gpr_no_gpra_exclusive(operand_kind) | op_is_rm(operand_kind); -} - -fn u8 op_is_relative(OperandId operand_kind) -{ - return operand_kind >= op_rel8 && operand_kind <= op_rel32; -} - -fn u8 op_is_memory(OperandId operand) -{ - return operand >= op_m8 && operand <= op_m128; -} - -fn u8 op_is_es_rdi_memory(OperandId operand) -{ - return operand >= op_es_rdi_m8 && operand <= op_es_rdi_m64; -} - -fn u8 op_is_ds_rsi_memory(OperandId operand) -{ - return operand >= op_ds_rsi_m8 && operand <= op_ds_rsi_m64; -} - -fn u8 op_rm_get_index(OperandId operand_kind) -{ - assert(op_is_rm(operand_kind)); - return operand_kind - op_rm8; -} - -fn u8 op_gprd_get_index(OperandId operand_kind) -{ - assert(op_is_gprd(operand_kind)); - return operand_kind >= op_dl && operand_kind <= op_rdx; -} - -fn u8 op_gpr_exclusive_get_index(OperandId operand_kind) -{ - assert(op_is_gpr_no_gpra_exclusive(operand_kind)); - return operand_kind - op_r8; -} - -fn u8 op_gpr_get_index(OperandId operand_kind) -{ - assert(op_is_gpr_no_gpra(operand_kind)); - return op_is_rm(operand_kind) ? op_rm_get_index(operand_kind) : op_gpr_exclusive_get_index(operand_kind); -} - -fn u8 op_imm_get_index(OperandId operand_kind) -{ - assert(op_is_imm(operand_kind)); - return operand_kind - op_imm8; -} - -fn u8 op_get_size_out_of_index(u8 index) -{ - return 1 << index; -} - -STRUCT(TestDataset) -{ - const Batch* const restrict batches; - u64 batch_count; - const Encoding* const restrict encodings; - u64 encoding_count; -}; - -fn String sample_immediate_strings(u8 index) -{ - global_variable const String strings[] = { - strlit("10"), - strlit("1000"), - strlit("10000000"), - strlit("1000000000000000"), - }; - - return strings[index]; -} - -fn u64 sample_immediate_values(u8 index) -{ - global_variable const u64 immediates[] = { - 10, - 1000, - 10000000, - 1000000000000000, - }; - return immediates[index]; -} - -fn String gpr_to_string(GPR_x86_64 gpr, u8 index, u8 switcher) -{ - assert(switcher == 0 || switcher == 1); - global_variable const String gpr_names[X86_64_GPR_COUNT][4] = { - [REGISTER_X86_64_AX] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }, - [REGISTER_X86_64_CX] = { - strlit("cl"), - strlit("cx"), - strlit("ecx"), - strlit("rcx"), - }, - [REGISTER_X86_64_DX] = { - strlit("dl"), - strlit("dx"), - strlit("edx"), - strlit("rdx"), - }, - [REGISTER_X86_64_BX] = { - strlit("bl"), - strlit("bx"), - strlit("ebx"), - strlit("rbx"), - }, - [REGISTER_X86_64_SP] = { - strlit("ah"), // Check alt names - strlit("sp"), - strlit("esp"), - strlit("rsp"), - }, - [REGISTER_X86_64_BP] = { - strlit("ch"), - strlit("bp"), - strlit("ebp"), - strlit("rbp"), - }, - [REGISTER_X86_64_SI] = { - strlit("dh"), - strlit("si"), - strlit("esi"), - strlit("rsi"), - }, - [REGISTER_X86_64_DI] = { - strlit("bh"), - strlit("di"), - strlit("edi"), - strlit("rdi"), - }, - [REGISTER_X86_64_R8] = { - strlit("r8b"), - strlit("r8w"), - strlit("r8d"), - strlit("r8"), - }, - [REGISTER_X86_64_R9] = { - strlit("r9b"), - strlit("r9w"), - strlit("r9d"), - strlit("r9"), - }, - [REGISTER_X86_64_R10] = { - strlit("r10b"), - strlit("r10w"), - strlit("r10d"), - strlit("r10"), - }, - [REGISTER_X86_64_R11] = { - strlit("r11b"), - strlit("r11w"), - strlit("r11d"), - strlit("r11"), - }, - [REGISTER_X86_64_R12] = { - strlit("r12b"), - strlit("r12w"), - strlit("r12d"), - strlit("r12"), - }, - [REGISTER_X86_64_R13] = { - strlit("r13b"), - strlit("r13w"), - strlit("r13d"), - strlit("r13"), - }, - [REGISTER_X86_64_R14] = { - strlit("r14b"), - strlit("r14w"), - strlit("r14d"), - strlit("r14"), - }, - [REGISTER_X86_64_R15] = { - strlit("r15b"), - strlit("r15w"), - strlit("r15d"), - strlit("r15"), - }, - }; - - global_variable const String alt_register_names[] = { - strlit("spl"), - strlit("bpl"), - strlit("sil"), - strlit("dil"), - }; - - return (unlikely(((gpr & 0b100) >> 2) & ((switcher != 0) & (index == 0)))) ? alt_register_names[gpr & 0b11] : gpr_names[gpr][index]; -} - -fn String format_instruction1(String buffer, String mnemonic, String op) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op.pointer, op.length); - i += op.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_instruction2(String buffer, String mnemonic, String op1, String op2) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op1.pointer, op1.length); - i += op1.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op2.pointer, op2.length); - i += op2.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_instruction3(String buffer, String mnemonic, String op1, String op2, String op3) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op1.pointer, op1.length); - i += op1.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op2.pointer, op2.length); - i += op2.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op3.pointer, op3.length); - i += op3.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_displacement(String buffer, String register_string, String displacement_string, u8 register_index) -{ - u64 length = 0; - String result = { - .pointer = buffer.pointer, - }; - - const String indirect_types[] = { - strlit("byte ptr "), - strlit("word ptr "), - strlit("dword ptr "), - strlit("qword ptr "), - strlit("xmmword ptr "), - }; - - String indirect_type = indirect_types[register_index]; - - memcpy(&buffer.pointer[length], indirect_type.pointer, indirect_type.length); - length += indirect_type.length; - - buffer.pointer[length] = '['; - length += 1; - - memcpy(&buffer.pointer[length], register_string.pointer, register_string.length); - length += register_string.length; - - u8 omit_displacement = displacement_string.pointer[0] == '0' && displacement_string.length == 1; - buffer.pointer[length] = ' '; - length += !omit_displacement; - - buffer.pointer[length] = '+'; - length += !omit_displacement; - - buffer.pointer[length] = ' '; - length += !omit_displacement; - - memcpy(&buffer.pointer[length], displacement_string.pointer, displacement_string.length); - length += displacement_string.length * !omit_displacement; - - buffer.pointer[length] = ']'; - length += 1; - - result.length = length; - - return result; -} - -STRUCT(ClangCompileAssembly) -{ - String instruction; - String clang_path; - VirtualBuffer(u8)* clang_pipe_buffer; -}; - -fn String clang_compile_assembly(Arena* arena, ClangCompileAssembly args) -{ - String my_assembly_path = strlit(BUILD_DIR "/my_assembly_source.S"); - FileWriteOptions options = { - .path = my_assembly_path, - .content = args.instruction, - }; - file_write(options); - - String out_path = strlit(BUILD_DIR "/my_assembly_output"); - - char* arguments[] = { - string_to_c(args.clang_path), - string_to_c(my_assembly_path), - "-o", - string_to_c(out_path), - "-masm=intel", - "-nostdlib", - "-Wl,--oformat=binary", - 0, - }; - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = args.clang_pipe_buffer->pointer, - .length = &args.clang_pipe_buffer->length, - .capacity = args.clang_pipe_buffer->capacity, - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - // .stderr_stream = { - // .policy = CHILD_PROCESS_STREAM_IGNORE, - // }, - }; - RunCommandResult result = run_command(arena, (CStringSlice)array_to_slice(arguments), environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - - String bytes = file_read(arena, out_path); - return bytes; -} - -STRUCT(DisassemblyResult) -{ - String whole; - String instruction; -}; - -STRUCT(DisassemblyArguments) -{ - String binary; - LLVMDisasmContextRef context; - String disassembly_buffer; - u64 gross:1; -}; - -#define llvm_initialize_macro(target, fn_prefix) \ - fn_prefix LLVMInitialize ## target ## Target();\ - fn_prefix LLVMInitialize ## target ## TargetInfo();\ - fn_prefix LLVMInitialize ## target ## TargetMC();\ - fn_prefix LLVMInitialize ## target ## AsmParser();\ - fn_prefix LLVMInitialize ## target ## AsmPrinter();\ - fn_prefix LLVMInitialize ## target ## Disassembler() - -#define _null_prefix_() - -llvm_initialize_macro(X86, extern void); - -fn String disassemble_binary(Arena* arena, DisassemblyArguments arguments) -{ - unused(arena); - unused(arguments); - String result = {}; - let(instruction_bytes, LLVMDisasmInstruction(arguments.context, arguments.binary.pointer, arguments.binary.length, 0, (char*)arguments.disassembly_buffer.pointer, arguments.disassembly_buffer.length)); - - if (instruction_bytes) - { - result = cstr(arguments.disassembly_buffer.pointer); - - assert(result.pointer[0] == '\t'); - result.pointer += 1; - result.length -= 1; - for (u64 i = 0; i < result.length; i += 1) - { - if (result.pointer[i] == '\t') - { - result.pointer[i] = ' '; - } - } - } - - return result; -} - -STRUCT(CheckInstructionArguments) -{ - String clang_path; - String text; - String binary; - String error_buffer; - u64* error_buffer_length; - VirtualBuffer(u8)* clang_pipe_buffer; - LLVMDisasmContextRef disassembler; - u64 reserved:63; -}; - -fn Mnemonic_x86_64 parse_cmov(String instruction) -{ - let(space_index, string_first_ch(instruction, ' ')); - assert(space_index != STRING_NO_MATCH); - String mnemonic_string = s_get_slice(u8, instruction, 0, space_index); - String cmov_prefix = strlit("cmov"); - assert(string_starts_with(mnemonic_string, cmov_prefix)); - String cmov_suffix = s_get_slice(u8, mnemonic_string, cmov_prefix.length, mnemonic_string.length); - String suffixes[] = { - strlit("a"), - strlit("ae"), - strlit("b"), - strlit("be"), - strlit("c"), - strlit("e"), - strlit("g"), - strlit("ge"), - strlit("l"), - strlit("le"), - strlit("na"), - strlit("nae"), - strlit("nb"), - strlit("nbe"), - strlit("nc"), - strlit("ne"), - strlit("ng"), - strlit("nge"), - strlit("nl"), - strlit("nle"), - strlit("no"), - strlit("np"), - strlit("ns"), - strlit("nz"), - strlit("o"), - strlit("p"), - strlit("pe"), - strlit("po"), - strlit("s"), - strlit("z"), - }; - u64 suffix; - for (suffix = 0; suffix < array_length(suffixes); suffix += 1) - { - if (s_equal(cmov_suffix, suffixes[suffix])) - { - break; - } - } - - assert(suffix != array_length(suffixes)); - Mnemonic_x86_64 result = suffix + MNEMONIC_x86_64_cmova; - return result; -} - -fn Mnemonic_x86_64 parse_cc_ext(String instruction, String prefix, Mnemonic_x86_64 base_mnemonic) -{ - let(space_index, string_first_ch(instruction, ' ')); - assert(space_index != STRING_NO_MATCH); - String mnemonic_string = s_get_slice(u8, instruction, 0, space_index); - assert(string_starts_with(mnemonic_string, prefix)); - String suffix = s_get_slice(u8, mnemonic_string, prefix.length, mnemonic_string.length); - String suffixes[] = { - strlit("a"), - strlit("ae"), - strlit("b"), - strlit("be"), - strlit("c"), - strlit("e"), - strlit("g"), - strlit("ge"), - strlit("l"), - strlit("le"), - strlit("na"), - strlit("nae"), - strlit("nb"), - strlit("nbe"), - strlit("nc"), - strlit("ne"), - strlit("ng"), - strlit("nge"), - strlit("nl"), - strlit("nle"), - strlit("no"), - strlit("np"), - strlit("ns"), - strlit("nz"), - strlit("o"), - strlit("p"), - strlit("pe"), - strlit("po"), - strlit("s"), - strlit("z"), - }; - u64 suffix_index; - for (suffix_index = 0; suffix_index < array_length(suffixes); suffix_index += 1) - { - if (s_equal(suffix, suffixes[suffix_index])) - { - break; - } - } - - assert(suffix_index != array_length(suffixes)); - Mnemonic_x86_64 result = base_mnemonic + suffix_index; - return result; -} - -fn String parse_operand(String instruction, u8 operand_index) -{ - String result = {}; - String it = instruction; - u8 index = 0; - - it = s_get_slice(u8, it, string_first_ch(it, ' ') + 1, it.length); - - while (1) - { - if (it.length == 0) - { - break; - } - - if (operand_index == index) - { - let(length, MIN(string_first_ch(it, ','), it.length)); - result = s_get_slice(u8, it, 0, length); - break; - } - - let(next, MIN(string_first_ch(it, ','), it.length)); - it = s_get_slice(u8, it, next + 2, it.length); - index += 1; - } - - return result; -} - -#define parse_cc(i, cc_i_kind) parse_cc_ext(i, strlit(TOSTRING(cc_i_kind)), (MNEMONIC_x86_64_ ## cc_i_kind ## a)) - -fn u64 check_instruction(Arena* arena, CheckInstructionArguments arguments) -{ - StringFormatter error_buffer = { - .buffer = arguments.error_buffer, - }; - u8 disassembly_buffer[256]; - assert(arguments.binary.length); - - u8 result = 1; - - DisassemblyArguments disassemble_arguments = { - .binary = arguments.binary, - .disassembly_buffer = (String)array_to_slice(disassembly_buffer), - .context = arguments.disassembler, - }; - String disassembly_text = disassemble_binary(arena, disassemble_arguments); - - result = disassembly_text.length == arguments.text.length; - if (result) - { - for (u64 i = 0; i < arguments.text.length; i += 1) - { - if (disassembly_text.pointer[i] != arguments.text.pointer[i]) - { - result = 0; - - break; - } - } - } - - if (!result) - { - if (string_starts_with(arguments.text, strlit("ud0"))) - { - // TODO: figure out - // Somehow clang doesn't disassemble this instruction properly - assert(disassembly_text.pointer == 0); - assert(disassembly_text.length == 0); - result = 1; - } - else if (string_starts_with(arguments.text, strlit("xchg "))) - { - if (s_equal(disassembly_text, strlit("nop"))) - { - result = 1; - } - else - { - String my_op0 = parse_operand(arguments.text, 0); - String my_op1 = parse_operand(arguments.text, 1); - - String their_op0 = parse_operand(disassembly_text, 0); - String their_op1 = parse_operand(disassembly_text, 1); - - result = s_equal(my_op0, their_op1) && s_equal(my_op1, their_op0); - } - } - if (string_starts_with(arguments.text, strlit("cmov")) && string_starts_with(disassembly_text, strlit("cmov"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, cmov); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, cmov); - u8 my_opcode = cc_opcodes_low[cmov_index(mine)]; - u8 their_opcode = cc_opcodes_low[cmov_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("j")) && string_starts_with(disassembly_text, strlit("j"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, j); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, j); - u8 my_opcode = cc_opcodes_low[j_index(mine)]; - u8 their_opcode = cc_opcodes_low[j_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("set")) && string_starts_with(disassembly_text, strlit("set"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, set); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, set); - u8 my_opcode = cc_opcodes_low[set_index(mine)]; - u8 their_opcode = cc_opcodes_low[set_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("mov r")) && string_starts_with(disassembly_text, strlit("movabs r"))) - { - result = 1; - } - else if (string_starts_with(arguments.text, strlit("sal ")) && string_starts_with(disassembly_text, strlit("shl "))) - { - result = 1; - } - } - - if (!result) - { - if (disassembly_text.length) - { - formatter_append(&error_buffer, "Disassembly mismatch. Intended to assemble:\n\t{s}\nbut got from LLVM:\n\t{s}\n", arguments.text, disassembly_text); - } - assert(arguments.binary.length); - ClangCompileAssembly args = { - .instruction = arguments.text, - .clang_path = arguments.clang_path, - .clang_pipe_buffer = arguments.clang_pipe_buffer, - }; - String clang_binary = clang_compile_assembly(arena, args); - - if (clang_binary.pointer && s_equal(clang_binary, arguments.binary)) - { - formatter_append_string(&error_buffer, strlit("Clang and this binary generated the same output (earlier string comparison failed):\n\t")); - for (u64 bin_i = 0; bin_i < arguments.binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)arguments.binary.pointer[bin_i]); - } - } - else - { - formatter_append_string(&error_buffer, strlit("Failed to match correct output. Got:\n\t")); - - for (u64 bin_i = 0; bin_i < arguments.binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)arguments.binary.pointer[bin_i]); - } - - formatter_append_character(&error_buffer, '\n'); - - formatter_append_string(&error_buffer, strlit("While clang generated the following:\n\t")); - - for (u64 bin_i = 0; bin_i < clang_binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)clang_binary.pointer[bin_i]); - } - - formatter_append_character(&error_buffer, '\n'); - } - } - - assert(!!error_buffer.index == !result); - - return error_buffer.index; -} - -STRUCT(EncodingTestOptions) -{ - u64 scalar:1; - u64 wide:1; -}; - -#if defined(__x86_64__) -#include -#endif -typedef u64 Bitset; - -STRUCT(GPR) -{ - Bitset mask[4]; -}; - -STRUCT(VectorOpcode) -{ - Bitset prefix_0f; - Bitset plus_register; - u8 values[2][64]; - u8 extension[64]; -}; - -STRUCT(EncodingBatch) -{ - Bitset legacy_prefixes[LEGACY_PREFIX_COUNT]; - Bitset is_rm_register; - Bitset is_reg_register; - GPR rm_register; - GPR reg_register; - Bitset implicit_register; - VectorOpcode opcode; - Bitset is_relative; - Bitset is_displacement; - Bitset displacement_size; - Bitset rex_w; - u8 segment_register_override[64]; - Bitset is_immediate; - Bitset immediate_size[2]; - u8 immediate[8][64]; - u8 displacement[4][64]; -}; - -fn Bitset bitset_from_bit(u8 bit) -{ - return -(u64)(bit != 0); -} - -fn GPR register_mask_batch_from_scalar(u8 scalar_register) -{ - u64 reg = scalar_register & 0b1111; - assert(reg == scalar_register); - u64 value64 = (reg << 60) | (reg << 56) | (reg << 52) | (reg << 48) | (reg << 44) | (reg << 40) | (reg << 36) | (reg << 32) | (reg << 28) | (reg << 24) | (reg << 20) | (reg << 16) | (reg << 12) | (reg << 8) | (reg << 4) | reg; - GPR result = { value64, value64, value64, value64 }; - return result; -} - -fn EncodingBatch encoding_batch_from_scalar(EncodingScalar scalar) -{ - EncodingBatch batch = { - .rm_register = register_mask_batch_from_scalar(scalar.rm_register), - .reg_register = register_mask_batch_from_scalar(scalar.reg_register), - .is_rm_register = bitset_from_bit(scalar.invariant.is_rm_register), - .is_reg_register = bitset_from_bit(scalar.invariant.is_reg_register), - .is_displacement = bitset_from_bit(scalar.invariant.is_displacement), - .is_relative = bitset_from_bit(scalar.invariant.is_relative), - .displacement_size = bitset_from_bit(scalar.invariant.displacement_size), - .rex_w = bitset_from_bit(scalar.invariant.rex_w), - .implicit_register = bitset_from_bit(scalar.invariant.implicit_register), - .is_immediate = bitset_from_bit(scalar.invariant.is_immediate), - .opcode = { - .plus_register = bitset_from_bit(scalar.opcode.plus_register), - .prefix_0f = bitset_from_bit(scalar.opcode.prefix_0f), - }, - }; - - for (u64 i = 0; i < array_length(batch.immediate_size); i += 1) - { - batch.immediate_size[i] = bitset_from_bit(scalar.invariant.immediate_size & (1 << i)); - } - - for (LegacyPrefix legacy_prefix = 0; legacy_prefix < LEGACY_PREFIX_COUNT; legacy_prefix += 1) - { - batch.legacy_prefixes[legacy_prefix] = bitset_from_bit((scalar.legacy_prefixes & (1 << legacy_prefix)) >> legacy_prefix); - } - - for (u64 i = 0; i < batch_element_count; i += 1) - { - batch.opcode.values[0][i] = scalar.opcode.bytes[0]; - batch.opcode.values[1][i] = scalar.opcode.bytes[1]; - batch.opcode.extension[i] = scalar.opcode.extension; - } - - for (u32 immediate_index = 0; immediate_index < array_length(scalar.immediate.bytes); immediate_index += 1) - { - for (u32 batch_index = 0; batch_index < batch_element_count; batch_index += 1) - { - batch.immediate[immediate_index][batch_index] = scalar.immediate.bytes[immediate_index]; - } - } - - for (u32 displacement_index = 0; displacement_index < array_length(scalar.displacement.bytes); displacement_index += 1) - { - for (u32 batch_index = 0; batch_index < batch_element_count; batch_index += 1) - { - batch.displacement[displacement_index][batch_index] = scalar.displacement.bytes[displacement_index]; - } - } - - return batch; -} - -u32 encode_wide(u8* restrict buffer, const EncodingBatch* const restrict batch) -{ - __m512i prefixes[LEGACY_PREFIX_COUNT]; - __mmask64 prefix_masks[LEGACY_PREFIX_COUNT]; - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - prefix_masks[prefix] = _cvtu64_mask64(batch->legacy_prefixes[prefix]); - prefixes[prefix] = _mm512_maskz_set1_epi8(prefix_masks[prefix], legacy_prefixes[prefix]); - } - - __m512i instruction_length; - - u8 prefix_group1_bytes[64]; - u8 prefix_group1_positions[64]; - { - __mmask64 prefix_group1_mask = _kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_F0], prefix_masks[LEGACY_PREFIX_F2]), prefix_masks[LEGACY_PREFIX_F3]); - __m512i prefix_group1 = _mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_F0], prefixes[LEGACY_PREFIX_F2]), prefixes[LEGACY_PREFIX_F3]); - __m512i prefix_group1_position = _mm512_maskz_set1_epi8(_knot_mask64(prefix_group1_mask), 0x0f); - instruction_length = _mm512_maskz_set1_epi8(prefix_group1_mask, 0x01); - - _mm512_storeu_epi8(prefix_group1_bytes, prefix_group1); - _mm512_storeu_epi8(prefix_group1_positions, prefix_group1_position); - } - - u8 prefix_group2_bytes[64]; - u8 prefix_group2_positions[64]; - { - __mmask64 prefix_group2_mask = _kor_mask64(_kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_2E], prefix_masks[LEGACY_PREFIX_36]), _kor_mask64(prefix_masks[LEGACY_PREFIX_3E], prefix_masks[LEGACY_PREFIX_26])), _kor_mask64(prefix_masks[LEGACY_PREFIX_64], prefix_masks[LEGACY_PREFIX_65])); - __m512i prefix_group2 = _mm512_or_epi32(_mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_2E], prefixes[LEGACY_PREFIX_36]), _mm512_or_epi32(prefixes[LEGACY_PREFIX_3E], prefixes[LEGACY_PREFIX_26])), _mm512_or_epi32(prefixes[LEGACY_PREFIX_64], prefixes[LEGACY_PREFIX_65])); - __m512i prefix_group2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group2_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group2_bytes, prefix_group2); - _mm512_storeu_epi8(prefix_group2_positions, prefix_group2_position); - } - - u8 prefix_group3_bytes[64]; - u8 prefix_group3_positions[64]; - { - __mmask64 prefix_group3_mask = prefix_masks[LEGACY_PREFIX_66]; - __m512i prefix_group3 = prefixes[LEGACY_PREFIX_66]; - __m512i prefix_group3_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group3_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group3_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group3_bytes, prefix_group3); - _mm512_storeu_epi8(prefix_group3_positions, prefix_group3_position); - } - - u8 prefix_group4_bytes[64]; - u8 prefix_group4_positions[64]; - { - __mmask64 prefix_group4_mask = prefix_masks[LEGACY_PREFIX_67]; - __m512i prefix_group4 = prefixes[LEGACY_PREFIX_67]; - __m512i prefix_group4_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group4_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group4_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group4_bytes, prefix_group4); - _mm512_storeu_epi8(prefix_group4_positions, prefix_group4_position); - } - - __mmask64 is_plus_register = _cvtu64_mask64(batch->opcode.plus_register); - __mmask64 is_implicit_register = _cvtu64_mask64(batch->implicit_register); - - __mmask64 is_displacement8 = _kand_mask64(_cvtu64_mask64(batch->is_displacement), _knot_mask64(_cvtu64_mask64(batch->displacement_size))); - __mmask64 is_displacement32 = _kand_mask64(_cvtu64_mask64(batch->is_displacement), _cvtu64_mask64(batch->displacement_size)); - - __mmask64 is_relative8 = _kand_mask64(_cvtu64_mask64(batch->is_relative), _knot_mask64(_cvtu64_mask64(batch->displacement_size))); - __mmask64 is_relative32 = _kand_mask64(_cvtu64_mask64(batch->is_relative), _cvtu64_mask64(batch->displacement_size)); - - __mmask64 is_rm_register; - __m512i rm_register; - { - __m256i register_mask_256 = _mm256_loadu_epi8(&batch->rm_register); - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - rm_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - is_rm_register = _cvtu64_mask64(batch->is_rm_register); - } - - __mmask64 is_reg_register; - __m512i reg_register; - { - __m256i register_mask_256 = _mm256_loadu_epi8(&batch->reg_register); - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - reg_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - is_reg_register = _cvtu64_mask64(batch->is_reg_register); - } - - __mmask64 is_reg_direct_addressing_mode = _knot_mask64(_kor_mask64(is_displacement8, is_displacement32)); - __mmask64 has_base_register = _kor_mask64(_kor_mask64(is_rm_register, is_reg_register), is_implicit_register); - - __m512i rex_b = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(rm_register, _mm512_set1_epi8(0b1000)), 1 << 0); - __m512i rex_x = _mm512_set1_epi8(0); // TODO - __m512i rex_r = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(reg_register, _mm512_set1_epi8(0b1000)), 1 << 2); - __m512i rex_w = _mm512_maskz_set1_epi8(_cvtu64_mask64(batch->rex_w), 1 << 3); - __m512i rex_byte = _mm512_or_epi32(_mm512_set1_epi32(0x40), _mm512_or_epi32(_mm512_or_epi32(rex_b, rex_x), _mm512_or_epi32(rex_r, rex_w))); - __mmask64 rex_mask = _mm512_test_epi8_mask(rex_byte, _mm512_set1_epi8(0x0f)); - __m512i rex_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), rex_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(rex_mask, 0x01)); - - u8 rex_bytes[64]; - u8 rex_positions[64]; - _mm512_storeu_epi8(rex_bytes, rex_byte); - _mm512_storeu_epi8(rex_positions, rex_position); - - __m512i plus_register = _mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)); - __m512i opcode_extension = _mm512_loadu_epi8(&batch->opcode.extension[0]); - - __mmask64 prefix_0f_mask = _cvtu64_mask64(batch->opcode.prefix_0f); - __m512i prefix_0f = _mm512_maskz_set1_epi8(prefix_0f_mask, 0x0f); - __m512i prefix_0f_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_0f_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_0f_mask, 0x01)); - - u8 prefix_0f_bytes[64]; - u8 prefix_0f_positions[64]; - _mm512_storeu_epi8(prefix_0f_bytes, prefix_0f); - _mm512_storeu_epi8(prefix_0f_positions, prefix_0f_position); - - __m512i three_byte_opcode = _mm512_loadu_epi8(&batch->opcode.values[1]); - __mmask64 three_byte_opcode_mask = _mm512_test_epi8_mask(three_byte_opcode, _mm512_set1_epi8(0xff)); - __m512i three_byte_opcode_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), three_byte_opcode_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(three_byte_opcode_mask, 0x01)); - - u8 three_byte_opcode_bytes[64]; - u8 three_byte_opcode_positions[64]; - _mm512_storeu_epi8(three_byte_opcode_bytes, three_byte_opcode); - _mm512_storeu_epi8(three_byte_opcode_positions, three_byte_opcode_position); - - __m512i base_opcode = _mm512_or_epi32(_mm512_loadu_epi8(&batch->opcode.values[0]), _mm512_maskz_mov_epi8(is_plus_register, plus_register)); - __m512i base_opcode_position = instruction_length; - instruction_length = _mm512_add_epi8(instruction_length, _mm512_set1_epi8(0x01)); - - u8 base_opcode_bytes[64]; - u8 base_opcode_positions[64]; - _mm512_storeu_epi8(base_opcode_bytes, base_opcode); - _mm512_storeu_epi8(base_opcode_positions, base_opcode_position); - - __m512i displacement8 = _mm512_loadu_epi8(batch->displacement[0]); - __mmask64 mod_is_displacement32 = is_displacement32; - __mmask64 mod_is_displacement8 = _kand_mask64(is_displacement8, _kor_mask64(_mm512_test_epi8_mask(displacement8, displacement8), _kand_mask64(is_rm_register, _mm512_cmpeq_epi8_mask(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_set1_epi8(REGISTER_X86_64_BP))))); - - __mmask64 mod_rm_mask = _kor_mask64(_kand_mask64(_kor_mask64(is_rm_register, is_reg_register), _knot_mask64(is_plus_register)), _kor_mask64(is_displacement8, is_displacement32)); - __m512i register_direct_address_mode = _mm512_maskz_set1_epi8(is_reg_direct_addressing_mode, 1); - __m512i mod = _mm512_or_epi32(_mm512_or_epi32(_mm512_slli_epi32(_mm512_maskz_set1_epi8(_kand_mask64(mod_is_displacement32, has_base_register), 1), 1), _mm512_maskz_set1_epi8(mod_is_displacement8, 1)), _mm512_or_epi32(_mm512_slli_epi32(register_direct_address_mode, 1), register_direct_address_mode)); - __m512i rm = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_maskz_set1_epi8(_knot_mask64(has_base_register), 0b100)); - __m512i reg = _mm512_or_epi32(_mm512_and_si512(reg_register, _mm512_set1_epi8(0b111)), opcode_extension); - __m512i mod_rm = _mm512_or_epi32(_mm512_or_epi32(rm, _mm512_slli_epi32(reg, 3)), _mm512_slli_epi32(mod, 6)); - __m512i mod_rm_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_rm_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_rm_mask, 0x01)); - - u8 mod_rm_bytes[64]; - u8 mod_rm_positions[64]; - _mm512_storeu_epi8(mod_rm_bytes, mod_rm); - _mm512_storeu_epi8(mod_rm_positions, mod_rm_position); - - __mmask64 sib_mask = _kand_mask64(_mm512_cmpneq_epi8_mask(mod, _mm512_set1_epi8(0b11)), _mm512_cmpeq_epi8_mask(rm, _mm512_set1_epi8(0b100))); - __m512i sib_scale = _mm512_set1_epi8(0); - __m512i sib_index = _mm512_maskz_set1_epi8(sib_mask, 0b100 << 3); - __m512i sib_base = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_maskz_set1_epi8(is_rm_register, 0b111)), _mm512_maskz_set1_epi8(_knot_mask64(is_rm_register), 0b101)); - __m512i sib = _mm512_or_epi32(_mm512_or_epi32(sib_index, sib_base), sib_scale); - __m512i sib_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), sib_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(sib_mask, 0x01)); - - u8 sib_bytes[64]; - u8 sib_positions[64]; - _mm512_storeu_epi8(sib_bytes, sib); - _mm512_storeu_epi8(sib_positions, sib_position); - - __m512i displacement8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement8, sizeof(s8))); - u8 displacement8_positions[64]; - _mm512_storeu_epi8(displacement8_positions, displacement8_position); - - __m512i displacement32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement32, sizeof(s32))); - u8 displacement32_positions[64]; - _mm512_storeu_epi8(displacement32_positions, displacement32_position); - - __m512i relative8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative8, sizeof(s8))); - u8 relative8_positions[64]; - _mm512_storeu_epi8(relative8_positions, relative8_position); - - __m512i relative32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative32, sizeof(s32))); - u8 relative32_positions[64]; - _mm512_storeu_epi8(relative32_positions, relative32_position); - - __mmask64 is_immediate_mask = _cvtu64_mask64(batch->is_immediate); - __mmask64 mask0 = _cvtu64_mask64(batch->immediate_size[0]); - __m512i mask_v0 = _mm512_maskz_set1_epi8(_kand_mask64(is_immediate_mask, mask0), 1 << 0); - __mmask64 mask1 = _cvtu64_mask64(batch->immediate_size[1]); - __m512i mask_v1 = _mm512_maskz_set1_epi8(_kand_mask64(is_immediate_mask, mask1), 1 << 1); - __m512i immediate_size = _mm512_or_si512(mask_v0, mask_v1); - __mmask64 is_immediate[4]; - u8 immediate_positions[array_length(is_immediate)][64]; - for (u64 i = 0; i < array_length(is_immediate); i += 1) - { - __mmask64 immediate_mask = _mm512_cmpeq_epi8_mask(immediate_size, _mm512_set1_epi8(i)); - __m512i immediate_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), immediate_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(immediate_mask, 1 << i)); - _mm512_storeu_epi8(immediate_positions[i], immediate_position); - } - - u8 separate_buffers[64][max_instruction_byte_count]; - u8 separate_lengths[64]; - _mm512_storeu_epi8(separate_lengths, instruction_length); - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - separate_buffers[i][prefix_group1_positions[i]] = prefix_group1_bytes[i]; - separate_buffers[i][prefix_group2_positions[i]] = prefix_group2_bytes[i]; - separate_buffers[i][prefix_group3_positions[i]] = prefix_group3_bytes[i]; - separate_buffers[i][prefix_group4_positions[i]] = prefix_group4_bytes[i]; - - separate_buffers[i][rex_positions[i]] = rex_bytes[i]; - - separate_buffers[i][prefix_0f_positions[i]] = prefix_0f_bytes[i]; - separate_buffers[i][three_byte_opcode_positions[i]] = three_byte_opcode_bytes[i]; - separate_buffers[i][base_opcode_positions[i]] = base_opcode_bytes[i]; - - separate_buffers[i][mod_rm_positions[i]] = mod_rm_bytes[i]; - - separate_buffers[i][sib_positions[i]] = sib_bytes[i]; - - for (u32 immediate_position_index = 0; immediate_position_index < array_length(immediate_positions); immediate_position_index += 1) - { - u8 start_position = immediate_positions[immediate_position_index][i]; - for (u32 byte = 0; byte < 1 << immediate_position_index; byte += 1) - { - u8 destination_index = start_position + byte * (start_position != 0xf); - separate_buffers[i][destination_index] = batch->immediate[byte][i]; - } - } - - separate_buffers[i][displacement8_positions[i]] = batch->displacement[0][i]; - - u8 displacement32_start = displacement32_positions[i]; - for (u32 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = displacement32_start + byte * (displacement32_start != 0xf); - separate_buffers[i][destination_index] = batch->displacement[byte][i]; - } - - separate_buffers[i][relative8_positions[i]] = batch->displacement[0][i]; - - u8 relative32_start = relative32_positions[i]; - for (u32 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = relative32_start + byte * (relative32_start != 0xf); - separate_buffers[i][destination_index] = batch->displacement[byte][i]; - } - } - - u32 buffer_i = 0; - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - let(separate_length, separate_lengths[i]); - if (separate_length >= 1 && separate_length <= 15) - { - memcpy(&buffer[buffer_i], &separate_buffers[i], separate_length); - buffer_i += separate_length; - } - else - { - unreachable(); - } - } - - return buffer_i; -} - -STRUCT(TestCounter) -{ - u64 total; - u64 failure; -}; - -typedef enum TestMode -{ - TEST_MODE_SCALAR, - TEST_MODE_WIDE, - TEST_MODE_COUNT, -} TestMode; - -fn String test_mode_to_string(TestMode test_mode) -{ - switch (test_mode) - { - case_to_name(TEST_MODE_, SCALAR); - case_to_name(TEST_MODE_, WIDE); - case TEST_MODE_COUNT: unreachable(); - } -} - -STRUCT(TestSetup) -{ - String instruction_binary_buffer; - String clang_path; - String error_buffer; - VirtualBuffer(u8)* clang_pipe_buffer; - LLVMDisasmContextRef disassembler; - Arena* arena; - TestCounter counters[TEST_MODE_COUNT]; - EncodingTestOptions options; -}; - -STRUCT(TestInstruction) -{ - EncodingScalar encoding; - String text; -}; - -fn void test_instruction(TestSetup* setup, TestInstruction* instruction) -{ - if (setup->options.scalar) - { - let(length, encode_scalar(setup->instruction_binary_buffer.pointer, &instruction->encoding, 1)); - assert(length <= setup->instruction_binary_buffer.length); - String instruction_bytes = { - .pointer = setup->instruction_binary_buffer.pointer, - .length = length, - }; - CheckInstructionArguments check_args = { - .clang_path = setup->clang_path, - .text = instruction->text, - .binary = instruction_bytes, - .error_buffer = setup->error_buffer, - .clang_pipe_buffer = setup->clang_pipe_buffer, - .disassembler = setup->disassembler, - }; - u64 error_buffer_length = check_instruction(setup->arena, check_args); - setup->counters[TEST_MODE_SCALAR].total += 1; - let(first_failure, setup->counters[TEST_MODE_SCALAR].total == 0); - setup->counters[TEST_MODE_SCALAR].failure += error_buffer_length != 0; - String error_string = { .pointer = setup->error_buffer.pointer, .length = error_buffer_length }; - if (error_buffer_length != 0) - { - print("{cstr}{u64}) {s}... [FAILED]\n{s}\n", first_failure ? "\n" : "", setup->counters[TEST_MODE_SCALAR].total, instruction->text, error_string); - os_exit(1); - } - } - - if (setup->options.wide) - { - EncodingBatch batch = encoding_batch_from_scalar(instruction->encoding); - let(wide_length, encode_wide(setup->instruction_binary_buffer.pointer, &batch)); - assert(wide_length % batch_element_count == 0); - let(length, wide_length / batch_element_count); - - String instruction_bytes = { - .pointer = setup->instruction_binary_buffer.pointer, - .length = length, - }; - CheckInstructionArguments check_args = { - .clang_path = setup->clang_path, - .text = instruction->text, - .binary = instruction_bytes, - .error_buffer = setup->error_buffer, - .clang_pipe_buffer = setup->clang_pipe_buffer, - .disassembler = setup->disassembler, - }; - u64 error_buffer_length = check_instruction(setup->arena, check_args); - setup->counters[TEST_MODE_WIDE].total += 1; - let(first_failure, setup->counters[TEST_MODE_WIDE].total == 0); - setup->counters[TEST_MODE_WIDE].failure += error_buffer_length != 0; - String error_string = { .pointer = setup->error_buffer.pointer, .length = error_buffer_length }; - if (error_buffer_length != 0) - { - print("{cstr}{u64}) {s}... [FAILED]\n{s}\n", first_failure ? "\n" : "", setup->counters[TEST_MODE_WIDE].total, instruction->text, error_string); - } - } -} - -fn u8 encoding_test_instruction_batches(Arena* arena, TestDataset dataset, EncodingTestOptions options) -{ - u8 result = 0; - u8 instruction_binary_buffer[256 * batch_element_count]; - u8 instruction_text_buffer[256]; - u8 error_buffer[4096]; - String instruction_text_buffer_slice = array_to_slice(instruction_text_buffer); - VirtualBuffer(u8) clang_pipe_buffer = {}; - vb_ensure_capacity(&clang_pipe_buffer, 1024*1024); - llvm_initialize_macro(X86, _null_prefix_()); - let(disassembler, LLVMCreateDisasmCPU("x86_64-freestanding", "znver4", 0, 0, 0, 0)); - u64 disassembly_options = LLVMDisassembler_Option_AsmPrinterVariant | LLVMDisassembler_Option_PrintImmHex; - if (!LLVMSetDisasmOptions(disassembler, disassembly_options)) - { - failed_execution(); - } - - String clang_path = executable_find_in_path(arena, strlit("clang"), cstr(getenv("PATH"))); - assert(clang_path.pointer); - - global_variable const s32 displacements[] = { - 0, - 10, - 10000000, - }; - - global_variable const String displacement_strings[] = { - strlit("0"), - strlit("10"), - strlit("10000000"), - }; - - TestSetup setup = { - .instruction_binary_buffer = array_to_slice(instruction_binary_buffer), - .clang_path = clang_path, - .error_buffer = array_to_slice(error_buffer), - .clang_pipe_buffer = &clang_pipe_buffer, - .options = options, - .disassembler = disassembler, - .arena = arena, - }; - - for (u64 batch_index = 0; batch_index < dataset.batch_count; batch_index += 1) - { - let(batch, &dataset.batches[batch_index]); - - String mnemonic_string = mnemonic_x86_64_to_string(batch->mnemonic); - print("============================\n~~~~~~~ MNEMONIC {s} ~~~~~~~\n============================\n", mnemonic_string); - - u64 encoding_top = batch->encoding_offset + batch->encoding_count; - - for (u64 encoding_index = batch->encoding_offset; encoding_index < encoding_top; encoding_index += 1) - { - memset(setup.counters, 0, sizeof(setup.counters)); - let(encoding, &dataset.encodings[encoding_index]); - OperandId first_operand = encoding->operands.values[0]; - OperandId second_operand = encoding->operands.values[1]; - u8 operand_count = encoding->operands.count; - - u8 encoding_buffer[256]; - u8 encoding_separator[256]; - u64 encoding_buffer_i = 0; - String encoding_string; - String encoding_separator_string; - { - memcpy(encoding_buffer + encoding_buffer_i, mnemonic_string.pointer, mnemonic_string.length); - encoding_buffer_i += mnemonic_string.length; - - encoding_buffer[encoding_buffer_i] = ' '; - encoding_buffer_i += operand_count != 0; - - for (u8 operand_i = 0; operand_i < operand_count; operand_i += 1) - { - String operand_string = operand_to_string(encoding->operands.values[operand_i]); - memcpy(encoding_buffer + encoding_buffer_i, operand_string.pointer, operand_string.length); - encoding_buffer_i += operand_string.length; - - u8 not_last_operand = operand_i != operand_count - 1; - - encoding_buffer[encoding_buffer_i] = ','; - encoding_buffer_i += not_last_operand; - - encoding_buffer[encoding_buffer_i] = ' '; - encoding_buffer_i += not_last_operand; - } - memcpy(&encoding_buffer[encoding_buffer_i], "... ", 4); - encoding_buffer_i += 4; - - encoding_buffer[encoding_buffer_i] = 0; - - encoding_string = (String) { .pointer = encoding_buffer, .length = encoding_buffer_i }; - - let(failed_string, strlit("FAILED")); - encoding_separator_string = (String) { .pointer = encoding_separator, .length = encoding_buffer_i + 3 + 1 + failed_string.length }; - memset(encoding_separator, '-', encoding_separator_string.length); - print_string(encoding_separator_string); - print_string(strlit("\n")); - print_string(encoding_string); - } - - if (operand_count == 0) - { - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = mnemonic_string, - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_gpra(first_operand)) - { - let(first_operand_index, op_gpra_get_index(first_operand)); - String register_a_names[] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }; - String first_operand_register_name = register_a_names[first_operand_index]; - String first_operand_string = first_operand_register_name; - - switch (operand_count) - { - case 1: - { - if (encoding->operands.implicit_operands) - { - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || (first_operand_index == 3), - .implicit_register = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = mnemonic_string, - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 2: - { - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 second_is_rm = op_is_rm(second_operand); - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (second_is_rm) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - .is_rm_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .rm_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_imm(second_operand)) - { - let(second_operand_index, op_imm_get_index(second_operand)); - // We output the string directly to avoid formatting cost - String second_operand_string = sample_immediate_strings(second_operand_index); - u64 immediate = sample_immediate_values(second_operand_index); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .implicit_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate, }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - test_instruction(&setup, &instruction); - } - else if (op_is_gprd(second_operand)) - { - assert(encoding->operands.implicit_operands); - String second_operand_string = op_gprd_to_string(second_operand); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .implicit_register = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - test_instruction(&setup, &instruction); - } - else if (op_is_ds_rsi_memory(second_operand)) - { - // u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_ds_rsi_m8: second_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: second_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: second_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: second_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_es_rdi_memory(second_operand)) - { - // u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_es_rdi_m8: second_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: second_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: second_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: second_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 3: - { - todo(); - } break; - case 4: - { - todo(); - } break; - default: unreachable(); - } - } - else - { - switch (operand_count) - { - case 1: - { - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .rm_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_relative(first_operand)) - { - String first_operand_string = strlit("-1"); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - .is_relative = 1, - .displacement_size = first_operand == op_rel32, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - .displacement = { .value = 0xffffffff }, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_m8; - String first_operand_indirect_string; - switch (first_operand_index) - { - case 0: first_operand_indirect_string = strlit("byte ptr "); break; - case 1: first_operand_indirect_string = strlit("word ptr "); break; - case 2: first_operand_indirect_string = strlit("dword ptr "); break; - case 3: first_operand_indirect_string = strlit("qword ptr "); break; - case 4: first_operand_indirect_string = strlit("xmmword ptr "); break; - default: unreachable(); - } - - // Segment overrides - { - let_cast(u32, memory_value, sample_immediate_values(2)); - String memory_string = sample_immediate_strings(2); - - for (SegmentRegisterOverride segment_register_override = 0; segment_register_override < SEGMENT_REGISTER_OVERRIDE_COUNT; segment_register_override += 1) - { - String segment_register_string = segment_register_override_to_register_string(segment_register_override); - - String parts[] = { - first_operand_indirect_string, - segment_register_string, - strlit(":["), - memory_string, - strlit("]"), - }; - String first_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | (1 << segment_register_overrides[segment_register_override]) | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - - // No segment override - { - let_cast(u32, memory_value, sample_immediate_values(2)); - String memory_string = sample_immediate_strings(2); - - String parts[] = { - first_operand_indirect_string, - strlit("["), - memory_string, - strlit("]"), - }; - String first_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - String first_operand_rm_name = gpr_to_string(first_gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - u8 first_operand_buffer[256]; - String first_operand_string = format_displacement((String)array_to_slice(first_operand_buffer), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .is_displacement = 1, - .displacement_size = displacement_index == 2, - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - else if (op_is_imm(first_operand)) - { - u8 first_operand_index = op_imm_get_index(first_operand); - String first_operand_string = sample_immediate_strings(first_operand_index); - u64 immediate = sample_immediate_values(first_operand_index); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_immediate = 1, - .immediate_size = first_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 2: - { - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_is_rm = op_is_rm(second_operand); - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - // Only test with rm_r and not r_rm with register direct addressing mode because it makes no sense otherwise - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - }, - .rm_register = first_gpr, - .reg_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, gpr_is_extended(first_gpr)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .rm_register = first_gpr, - .reg_register = second_gpr, - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - - if (second_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, gpr_is_extended(second_gpr)); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .rm_register = second_gpr, - .reg_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - } - else if (op_is_gpra(second_operand)) - { - String second_operand_string = op_gpra_to_string(second_operand); - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (op_is_imm(second_operand)) - { - u8 second_operand_index = op_imm_get_index(second_operand); - String second_operand_string = sample_immediate_strings(second_operand_index); - u64 immediate = sample_immediate_values(second_operand_index); - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .displacement = { .value = displacements[displacement_index] }, - .rm_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_memory(second_operand)) - { - u8 second_operand_index = second_operand - op_m8; - String second_operand_indirect_string; - String memory_string = sample_immediate_strings(2); - switch (second_operand_index) - { - case 0: second_operand_indirect_string = strlit(""); break; - case 1: second_operand_indirect_string = strlit(""); break; - case 2: second_operand_indirect_string = strlit(""); break; - case 3: second_operand_indirect_string = strlit(""); break; - case 4: second_operand_indirect_string = strlit(""); break; - default: unreachable(); - } - String parts[] = { - second_operand_indirect_string, - strlit("["), - memory_string, - strlit("]"), - }; - String second_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - let_cast(u32, memory_value, sample_immediate_values(2)); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3 || second_operand_index == 3, - .is_reg_register = 0, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .reg_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (second_operand == op_one_literal) - { - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (second_operand == op_cl) - { - String second_operand_string = strlit("cl"); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else - { - todo(); - } - } - else if (op_is_ds_rsi_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_ds_rsi_m8; - String first_operand_string; - switch (first_operand) - { - case op_ds_rsi_m8: first_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: first_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: first_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: first_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - - if (op_is_es_rdi_memory(second_operand)) - { - String second_operand_string; - switch (second_operand) - { - case op_es_rdi_m8: second_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: second_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: second_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: second_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (op_is_es_rdi_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_es_rdi_m8; - String first_operand_string; - switch (first_operand) - { - case op_es_rdi_m8: first_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: first_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: first_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: first_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - if (op_is_ds_rsi_memory(second_operand)) - { - u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_ds_rsi_m8: second_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: second_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: second_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: second_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_gpra(second_operand)) - { - u8 second_operand_index = op_gpra_get_index(second_operand); - String second_operand_string = op_gpra_to_string(second_operand); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (second_operand == op_dx) - { - String second_operand_string = strlit("dx"); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (op_is_imm(first_operand)) - { - u8 first_operand_index = op_imm_get_index(first_operand); - u64 first_operand_value = sample_immediate_values(first_operand_index); - String first_operand_string = sample_immediate_strings(first_operand_index); - - if (op_is_gpra(second_operand)) - { - let(second_operand_index, op_gpra_get_index(second_operand)); - String second_operand_string = op_gpra_to_string(second_operand); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - .is_immediate = 1, - .immediate_size = first_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - .immediate = { .value = first_operand_value }, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (first_operand == op_dx) - { - String first_operand_string = strlit("dx"); - - if (op_is_gpra(second_operand)) - { - let(second_operand_index, op_gpra_get_index(second_operand)); - let(second_operand_string, op_gpra_to_string(second_operand)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((encoding->operand_size_override || second_operand_index == 1) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else - { - todo(); - } - } break; - case 3: - { - OperandId third_operand = encoding->operands.values[2]; - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_is_rm = op_is_rm(second_operand); - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - if (op_is_imm(third_operand)) - { - u8 third_operand_index = op_imm_get_index(third_operand); - String third_operand_string = sample_immediate_strings(third_operand_index); - u64 third_operand_value = sample_immediate_values(third_operand_index); - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_immediate = 1, - .immediate_size = third_operand_index, - }, - .rm_register = first_is_rm ? first_gpr : second_gpr, - .reg_register = first_is_rm ? second_gpr : first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = third_operand_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction3(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string, third_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - // String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - // String second_operand_string = gpr_to_string(second_gpr, second_operand_index, gpr_is_extended(first_gpr)); - - todo(); - } - } - } - } - - if (second_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, gpr_is_extended(second_gpr)); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_immediate = 1, - .immediate_size = third_operand_index, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .rm_register = first_is_rm ? first_gpr : second_gpr, - .reg_register = first_is_rm ? second_gpr : first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = third_operand_value, }, - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction3(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string, third_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - } - else - { - todo(); - } - } - } - else - { - todo(); - } - } break; - case 4: - { - todo(); - } break; - } - } - - u64 failure_count = 0; - static_assert(array_length(setup.counters) == TEST_MODE_COUNT); - print_string(strlit("\n")); - for (TestMode test_mode = 0; test_mode < TEST_MODE_COUNT; test_mode += 1) - { - String test_mode_string = test_mode_to_string(test_mode); - TestCounter test_counter = setup.counters[test_mode]; - failure_count += test_counter.failure; - if (test_counter.failure) - { - print("[{s}] {s}... [FAILED] {u64}/{u64} failures\n", test_mode_string, encoding_string, test_counter.failure, test_counter.total); - } - else - { - print("[{s}] [OK] ({u64}/{u64})\n", test_mode_string, test_counter.total, test_counter.total); - } - } - - print_string(strlit("\n")); - print_string(encoding_separator_string); - print_string(strlit("\n")); - - if (failure_count) - { - failed_execution(); - } - } - } - - return result; -} - -#define encode_instruction(_opcode, _operands)\ - do{\ - Encoding encoding = {\ - .opcode = _opcode,\ - .operands = _operands,\ - };\ - *vb_add(&builder->encodings, 1) = encoding;\ - } while (0) - -#define ops(...) ((Operands){ .values = { __VA_ARGS__ }, .count = array_length(((OperandId[]){ __VA_ARGS__ })), }) -#define ops_implicit_operands(...) ((Operands){ .values = { __VA_ARGS__ }, .count = array_length(((OperandId[]){ __VA_ARGS__ })), .implicit_operands = 1 }) -#define extension_and_opcode(_opcode_extension, ...) ((Opcode) { .length = array_length(((u8[]){__VA_ARGS__})), .bytes = { __VA_ARGS__ }, _opcode_extension }) -#define opcode3(y, x, ...) ((Opcode) { .prefix_0f = 1, .bytes = { (x), (y) }, __VA_ARGS__ }) -#define opcode2(b, ...) ((Opcode) { .prefix_0f = 1, .bytes = { (b) }, __VA_ARGS__ }) -#define opcode1(b, ...) ((Opcode) { .bytes = { (b) }, __VA_ARGS__ }) - -#define imm8_l 0x10 -#define imm16_l 0x1000 -#define imm32_l 0x10000000 -#define imm64_l 0x1000000000000000 - -#define imm8_s "0x10" -#define imm16_s "0x1000" -#define imm32_s "0x10000000" -#define imm64_s "0x1000000000000000" - -#define imm8_a 0x10, -#define imm16_a 0x00, 0x10, -#define imm32_a 0x00, 0x00, 0x00, 0x10, -#define imm64_a 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - -STRUCT(TestBuilder) -{ - VirtualBuffer(Batch) batches; - VirtualBuffer(Encoding) encodings; -}; - -STRUCT(ArithmeticOptions) -{ - u8 ra_imm; - u8 rm_imm_extension; - u8 rm_r; - u8 r_rm; -}; - -fn Batch batch_start(TestBuilder* builder, Mnemonic_x86_64 mnemonic) -{ - Batch batch = { - .mnemonic = mnemonic, - .encoding_offset = builder->encodings.length, - }; - - return batch; -} - -fn Batch batch_start_legacy_prefixes(TestBuilder* builder, Mnemonic_x86_64 mnemonic, u64 legacy_prefixes) -{ - Batch batch = { - .mnemonic = mnemonic, - .legacy_prefixes = legacy_prefixes, - .encoding_offset = builder->encodings.length, - }; - - return batch; -} - -fn void batch_end(TestBuilder* builder, Batch batch) -{ - batch.encoding_count = builder->encodings.length - batch.encoding_offset; - *vb_add(&builder->batches, 1) = batch; -} - -fn void encode_arithmetic_ex(TestBuilder* builder, Mnemonic_x86_64 mnemonic, ArithmeticOptions options) -{ - Batch batch = batch_start(builder, mnemonic); - - let(ra_imm, opcode1(options.ra_imm - 1)); - encode_instruction(ra_imm, ops(op_al, op_imm8)); - ra_imm.bytes[0] += 1; - encode_instruction(ra_imm, ops(op_ax, op_imm16)); - encode_instruction(ra_imm, ops(op_eax, op_imm32)); - encode_instruction(ra_imm, ops(op_rax, op_imm32)); - - let(rm_imm, opcode1(0x80, .extension = options.rm_imm_extension)); - encode_instruction(rm_imm, ops(op_rm8, op_imm8)); - rm_imm.bytes[0] += 1; - encode_instruction(rm_imm, ops(op_rm16, op_imm16)); - encode_instruction(rm_imm, ops(op_rm32, op_imm32)); - encode_instruction(rm_imm, ops(op_rm64, op_imm32)); - - let(rm_imm8, opcode1(0x83, .extension = options.rm_imm_extension)); - encode_instruction(rm_imm8, ops(op_rm16, op_imm8)); - encode_instruction(rm_imm8, ops(op_rm32, op_imm8)); - encode_instruction(rm_imm8, ops(op_rm64, op_imm8)); - - let(rm_r, opcode1(options.rm_r - 1)); - encode_instruction(rm_r, ops(op_rm8, op_r8)); - rm_r.bytes[0] += 1; - encode_instruction(rm_r, ops(op_rm16, op_r16)); - encode_instruction(rm_r, ops(op_rm32, op_r32)); - encode_instruction(rm_r, ops(op_rm64, op_r64)); - - let(r_rm, opcode1(options.r_rm - 1)); - encode_instruction(r_rm, ops(op_r8, op_rm8)); - r_rm.bytes[0] += 1; - encode_instruction(r_rm, ops(op_r16, op_rm16)); - encode_instruction(r_rm, ops(op_r32, op_rm32)); - encode_instruction(r_rm, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} -#define encode_arithmetic(_mnemonic, ...) encode_arithmetic_ex(&builder, MNEMONIC_x86_64_ ## _mnemonic, (ArithmeticOptions) { __VA_ARGS__ }) - -fn void encode_unsigned_add_flag(TestBuilder* builder, Mnemonic_x86_64 mnemonic) -{ - let(prefix_66, mnemonic == MNEMONIC_x86_64_adcx); - let(prefix_f3, mnemonic == MNEMONIC_x86_64_adox); - let(legacy_prefixes, (prefix_66 << LEGACY_PREFIX_66) | (prefix_f3 << LEGACY_PREFIX_F3)); - - Batch batch = batch_start_legacy_prefixes(builder, mnemonic, legacy_prefixes); - - let(opcode, opcode3(0x38, 0xf6)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -typedef enum BitScanKind -{ - BIT_SCAN_FORWARD = 0, - BIT_SCAN_REVERSE = 1, -} BitScanKind; - -fn void encode_bit_scan(TestBuilder* builder, BitScanKind bit_scan_kind) -{ - let(mnemonic, MNEMONIC_x86_64_bsf + bit_scan_kind); - let(opcode_byte, 0xbc | bit_scan_kind); - Batch batch = batch_start(builder, mnemonic); - - let(opcode, opcode2(opcode_byte)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -fn void encode_bswap(TestBuilder* builder) -{ - let(mnemonic, MNEMONIC_x86_64_bswap); - Batch batch = batch_start(builder, mnemonic); - - let(opcode, opcode2(0xc8, .plus_register = 1)); - - encode_instruction(opcode, ops(op_r32)); - encode_instruction(opcode, ops(op_r64)); - - batch_end(builder, batch); -} - -fn void encode_bit_test(TestBuilder* builder, Mnemonic_x86_64 mnemonic, u8 opcode_last, u8 opcode_extension) -{ - Batch batch = batch_start(builder, mnemonic); - - { - let(opcode, opcode2(opcode_last)); - - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - { - let(opcode, opcode2(0xba, .extension = opcode_extension)); - - encode_instruction(opcode, ops(op_rm16, op_imm8)); - encode_instruction(opcode, ops(op_rm32, op_imm8)); - encode_instruction(opcode, ops(op_rm64, op_imm8)); - } - - batch_end(builder, batch); -} - -fn void encode_call(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_call); - { - let(opcode, opcode1(0xe8)); - encode_instruction(opcode, ops(op_rel32)); - } - - { - let(opcode, opcode1(0xff, .extension = 2)); - encode_instruction(opcode, ops(op_rm64)); - } - - // TODO: Figure out memory offset - - batch_end(builder, batch); -} - -fn void encode_convert(TestBuilder* builder) -{ - u8 base_opcode = 0x98; - - Mnemonic_x86_64 mnemonics[2][3] = { - { MNEMONIC_x86_64_cbw, MNEMONIC_x86_64_cwde, MNEMONIC_x86_64_cdqe }, - { MNEMONIC_x86_64_cwd, MNEMONIC_x86_64_cdq, MNEMONIC_x86_64_cqo }, - }; - - OperandId operands[] = { op_ax, op_eax, op_rax }; - - for (u32 category = 0; category < array_length(mnemonics); category += 1) - { - for (u32 i = 0; i < array_length(mnemonics[0]); i += 1) - { - Batch batch = batch_start(builder, mnemonics[category][i]); - let(implicit_operand, ops(operands[i])); - implicit_operand.implicit_operands = 1; - let(opcode, opcode1(base_opcode + category)); - encode_instruction(opcode, implicit_operand); - batch_end(builder, batch); - } - } -} - -fn void encode_no_operand_instruction(TestBuilder* builder, Mnemonic_x86_64 mnemonic, Opcode opcode, u64 legacy_prefixes) -{ - Batch batch = batch_start_legacy_prefixes(builder, mnemonic, legacy_prefixes); - Operands operands = {}; - encode_instruction(opcode, operands); - batch_end(builder, batch); -} - -fn void encode_clflush(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_clflush); - let(opcode, opcode2(0xae, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_clflushopt(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_clflushopt, 1 << LEGACY_PREFIX_66); - let(opcode, opcode2(0xae, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_cmov_instructions(TestBuilder* builder) -{ - for (u8 cmov_index = 0; cmov_index < cmov_count; cmov_index += 1) - { - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_cmova + cmov_index; - Batch batch = batch_start(builder, mnemonic); - let(opcode, opcode2(0x40 | cc_opcodes_low[cmov_index])); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - batch_end(builder, batch); - } -} - -fn void encode_cmps(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpsb + i); - Operands operands = { - .values = { op_ds_rsi_m8 + i, op_es_rdi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xa7 - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_cmpxchg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg); - let(opcode, opcode2(0xb0)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - - opcode.bytes[0] += 1; - - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - batch_end(builder, batch); -} - -fn void encode_cmpxchg_bytes(TestBuilder* builder) -{ - let(opcode, opcode2(0xc7, .extension = 1)); - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg8b); - encode_instruction(opcode, ops(op_m64)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg16b); - encode_instruction(opcode, ops(op_m128)); - batch_end(builder, batch); - } -} - -fn void encode_crc32(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_crc32, 1 << LEGACY_PREFIX_F2); - { - let(opcode, opcode3(0x38, 0xf0)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - } - - let(opcode, opcode3(0x38, 0xf1)); - Encoding encoding = { - .opcode = opcode, - .operands = ops(op_r32, op_rm16), - .operand_size_override = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - - { - let(opcode, opcode3(0x38, 0xf1)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - } - { - let(opcode, opcode3(0x38, 0xf0)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - } - { - let(opcode, opcode3(0x38, 0xf1)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - batch_end(builder, batch); - } -} - -typedef enum IncDec -{ - OP_INC = 0, - OP_DEC = 1, -} IncDec; - -fn void encode_dec_inc(TestBuilder* builder, IncDec inc_dec) -{ - Batch batch = batch_start(builder, inc_dec == OP_DEC ? MNEMONIC_x86_64_dec : MNEMONIC_x86_64_inc); - let(opcode, opcode1(0xfe, .extension = inc_dec)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -typedef enum Signedness -{ - SIGNEDNESS_UNSIGNED = 0, - SIGNEDNESS_SIGNED = 1, -} Signedness; - -fn void encode_div(TestBuilder* builder, Signedness signedness) -{ - global_variable const Mnemonic_x86_64 div_mnemonics[] = { MNEMONIC_x86_64_div, MNEMONIC_x86_64_idiv }; - Batch batch = batch_start(builder, div_mnemonics[signedness]); - u8 opcode_extension = 6 | signedness; - let(opcode, opcode1(0xf6, .extension = opcode_extension)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_imul(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_imul); - - { - let(opcode, opcode1(0xf6, .extension = 5)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - } - - { - let(opcode, opcode2(0xaf)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - } - - { - let(opcode, opcode1(0x6b)); - encode_instruction(opcode, ops(op_r16, op_rm16, op_imm8)); - encode_instruction(opcode, ops(op_r32, op_rm32, op_imm8)); - encode_instruction(opcode, ops(op_r64, op_rm64, op_imm8)); - } - - { - let(opcode, opcode1(0x69)); - encode_instruction(opcode, ops(op_r16, op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_r32, op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_r64, op_rm64, op_imm32)); - } - - batch_end(builder, batch); -} - -fn void encode_in(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_in); - - { - let(opcode, opcode1(0xe4)); - encode_instruction(opcode, ops(op_al, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_ax, op_imm8)); - encode_instruction(opcode, ops(op_eax, op_imm8)); - } - - { - let(opcode, opcode1(0xec)); - encode_instruction(opcode, ops_implicit_operands(op_al, op_dx)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops_implicit_operands(op_ax, op_dx)); - encode_instruction(opcode, ops_implicit_operands(op_eax, op_dx)); - } - - batch_end(builder, batch); -} - -fn void encode_ins(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_insb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_dx }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0x6d - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_int(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_int); - let(opcode, opcode1(0xcd)); - encode_instruction(opcode, ops(op_imm8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_int3); - Operands operands = {}; - let(opcode, opcode1(0xcc)); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_invlpg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_invlpg); - let(opcode, opcode2(0x01, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_iret(TestBuilder* builder) -{ - Operands operands = {}; - let(opcode, opcode1(0xcf)); - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iret); - Encoding encoding = { - .opcode = opcode, - .operands = operands, - .operand_size_override = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iretd); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iretq); - Encoding encoding = { - .opcode = opcode, - .operands = operands, - .rex_w = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_jmp(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_jmp); - - { - let(opcode, opcode1(0xeb)); - encode_instruction(opcode, ops(op_rel8)); - } - { - let(opcode, opcode1(0xe9)); - encode_instruction(opcode, ops(op_rel32)); - } - - { - let(opcode, opcode1(0xff, .extension = 4)); - encode_instruction(opcode, ops(op_rm64)); - } - - // TODO: (m16,m32,m64):(16,32,64) - - batch_end(builder, batch); -} - -fn void encode_jcc(TestBuilder* builder) -{ - for (u8 jcc_i = 0; jcc_i < jcc_count; jcc_i += 1) - { - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_ja + jcc_i; - Batch batch = batch_start(builder, mnemonic); - { - let(opcode, opcode1(0x70 | cc_opcodes_low[jcc_i])); - encode_instruction(opcode, ops(op_rel8)); - } - { - let(opcode, opcode2(0x80 | cc_opcodes_low[jcc_i])); - encode_instruction(opcode, ops(op_rel32)); - } - batch_end(builder, batch); - } - - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_jrcxz; - Batch batch = batch_start(builder, mnemonic); - let(opcode, opcode1(0xe3)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); -} - -fn void encode_lea(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_lea); - let(opcode, opcode1(0x8d)); - encode_instruction(opcode, ops(op_r16, op_m16)); - encode_instruction(opcode, ops(op_r32, op_m32)); - encode_instruction(opcode, ops(op_r64, op_m64)); - batch_end(builder, batch); -} - -fn void encode_lods(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_lodsb + i); - Operands operands = { - .values = { op_al + i, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xad - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_loop(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loop); - let(opcode, opcode1(0xe2)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loope); - let(opcode, opcode1(0xe1)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loopne); - let(opcode, opcode1(0xe0)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } -} - -fn void encode_mov(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_mov); - - { - let(opcode, opcode1(0x88)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - { - let(opcode, opcode1(0x8a)); - encode_instruction(opcode, ops(op_r8, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - } - - // TODO: segments - - { - let(opcode, opcode1(0xb0, .plus_register = 1)); - encode_instruction(opcode, ops(op_r8, op_imm8)); - opcode.bytes[0] |= 8; - encode_instruction(opcode, ops(op_r16, op_imm16)); - encode_instruction(opcode, ops(op_r32, op_imm32)); - encode_instruction(opcode, ops(op_r64, op_imm64)); - } - - - { - let(opcode, opcode1(0xc6, .extension = 0)); - encode_instruction(opcode, ops(op_rm8, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_rm64, op_imm32)); - } - - batch_end(builder, batch); -} - -fn void encode_movs(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xa5 - (i == 0))); - Encoding encoding = { - .operands = operands, - .opcode = opcode, - .rex_w = i == 3, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_movsx(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsx); - { - let(opcode, opcode2(0xbe)); - encode_instruction(opcode, ops(op_r16, op_rm8)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r32, op_rm16)); - encode_instruction(opcode, ops(op_r64, op_rm16)); - } - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsxd); - let(opcode, opcode1(0x63)); - encode_instruction(opcode, ops(op_r64, op_rm32)); - batch_end(builder, batch); - } -} - -fn void encode_movzx(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movzx); - let(opcode, opcode2(0xb6)); - encode_instruction(opcode, ops(op_r16, op_rm8)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - - opcode.bytes[0] += 1; - - encode_instruction(opcode, ops(op_r32, op_rm16)); - encode_instruction(opcode, ops(op_r64, op_rm16)); - batch_end(builder, batch); - } -} - -fn void encode_mul(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_mul); - let(opcode, opcode1(0xf6, .extension = 4)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_neg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_neg); - let(opcode, opcode1(0xf6, .extension = 3)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_nop(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_nop); - let(opcode, opcode1(0x90)); - encode_instruction(opcode, (Operands){}); - { - let(opcode, opcode2(0x1f, .extension = 0)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - } - batch_end(builder, batch); -} - -fn void encode_not(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_not); - let(opcode, opcode1(0xf6, .extension = 2)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_out(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_out); - - { - let(opcode, opcode1(0xe6)); - encode_instruction(opcode, ops(op_imm8, op_al)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_imm8, op_ax)); - encode_instruction(opcode, ops(op_imm8, op_eax)); - } - - { - let(opcode, opcode1(0xee)); - encode_instruction(opcode, ops_implicit_operands(op_dx, op_al)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops_implicit_operands(op_dx, op_ax)); - encode_instruction(opcode, ops_implicit_operands(op_dx, op_eax)); - } - - batch_end(builder, batch); -} - -fn void encode_outs(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_outsb + i); - Operands operands = { - .values = { op_dx, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0x6f - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_pop(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_pop); - - { - let(opcode, opcode1(0x8f, .extension = 0)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm64)); - } - - let(opcode, opcode1(0x58, .plus_register = 1)); - encode_instruction(opcode, ops(op_r16)); - encode_instruction(opcode, ops(op_r64)); - - batch_end(builder, batch); -} - -fn void encode_popcnt(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_popcnt, 1 << LEGACY_PREFIX_F3); - - let(opcode, opcode2(0xb8)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -fn void encode_popf(TestBuilder* builder) -{ - Encoding encoding = { - .opcode = opcode1(0x9d), - .operand_size_override = 1, - }; - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_popf); - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_popfq); - encoding.operand_size_override = 0; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_prefetch(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_prefetcht0 + i); - let(opcode, opcode2(0x18, .extension = i + 1)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); - } - - Batch batch = batch_start(builder, MNEMONIC_x86_64_prefetchnta); - let(opcode, opcode2(0x18, .extension = 0)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_push(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_push); - - { - let(opcode, opcode1(0xff, .extension = 6)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm64)); - } - - { - let(opcode, opcode1(0x50, .plus_register = 1)); - encode_instruction(opcode, ops(op_r16)); - encode_instruction(opcode, ops(op_r64)); - } - - let(opcode, opcode1(0x6a)); - encode_instruction(opcode, ops(op_imm8)); - opcode.bytes[0] -= 2; - encode_instruction(opcode, ops(op_imm16)); - encode_instruction(opcode, ops(op_imm32)); - - batch_end(builder, batch); -} - -fn void encode_pushf(TestBuilder* builder) -{ - Encoding encoding = { - .opcode = { - .bytes = { 0x9c }, - }, - .operand_size_override = 1, - }; - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_pushf); - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_pushfq); - encoding.operand_size_override = 0; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_rotate(TestBuilder* builder) -{ - Mnemonic_x86_64 mnemonics[] = { MNEMONIC_x86_64_rol, MNEMONIC_x86_64_ror, MNEMONIC_x86_64_rcl, MNEMONIC_x86_64_rcr }; - for (u8 extension = 0; extension < 4; extension += 1) - { - Batch batch = batch_start(builder, mnemonics[extension]); - - Opcode opcodes[] = { - opcode1(0xd0, .extension = extension), - opcode1(0xd2, .extension = extension), - opcode1(0xc0, .extension = extension), - }; - encode_instruction(opcodes[0], ops(op_rm8, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm8, op_cl)); - encode_instruction(opcodes[2], ops(op_rm8, op_imm8)); - - for (u64 i = 0; i < array_length(opcodes); i += 1) - { - opcodes[i].bytes[0] += 1; - } - - encode_instruction(opcodes[0], ops(op_rm16, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm16, op_cl)); - encode_instruction(opcodes[2], ops(op_rm16, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm32, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm32, op_cl)); - encode_instruction(opcodes[2], ops(op_rm32, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm64, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm64, op_cl)); - encode_instruction(opcodes[2], ops(op_rm64, op_imm8)); - - batch_end(builder, batch); - } -} - -typedef enum ReturnType -{ - RETURN_TYPE_NEAR, - RETURN_TYPE_FAR, -} ReturnType; - -fn void encode_ret(TestBuilder* builder, ReturnType return_type) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_ret + (return_type == RETURN_TYPE_FAR)); - - let(opcode_flag, (u8)safe_flag(0b1000, return_type == RETURN_TYPE_FAR)); - - { - let(opcode, opcode1(0xc3 | opcode_flag)); - Operands ops = {}; - encode_instruction(opcode, ops); - } - { - let(opcode, opcode1(0xc2 | opcode_flag)); - encode_instruction(opcode, ops(op_imm16)); - } - - batch_end(builder, batch); -} - -fn void encode_shift(TestBuilder* builder) -{ - Mnemonic_x86_64 mnemonics[] = { MNEMONIC_x86_64_sal, MNEMONIC_x86_64_sar, MNEMONIC_x86_64_shl, MNEMONIC_x86_64_shr }; - u8 opcode_extensions[] = { 4, 7, 4, 5 }; - - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, mnemonics[i]); - u8 extension = opcode_extensions[i]; - - Opcode opcodes[] = { - opcode1(0xd0, .extension = extension), - opcode1(0xd2, .extension = extension), - opcode1(0xc0, .extension = extension), - }; - - encode_instruction(opcodes[0], ops(op_rm8, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm8, op_cl)); - encode_instruction(opcodes[2], ops(op_rm8, op_imm8)); - - for (u64 i = 0; i < array_length(opcodes); i += 1) - { - opcodes[i].bytes[0] += 1; - } - - encode_instruction(opcodes[0], ops(op_rm16, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm16, op_cl)); - encode_instruction(opcodes[2], ops(op_rm16, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm32, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm32, op_cl)); - encode_instruction(opcodes[2], ops(op_rm32, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm64, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm64, op_cl)); - encode_instruction(opcodes[2], ops(op_rm64, op_imm8)); - - batch_end(builder, batch); - } -} - -fn void encode_scas(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_scasb + i); - Operands operands = { - .values = { op_al + i, op_es_rdi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xaf - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_setcc(TestBuilder* builder) -{ - for (u8 i = 0; i < setcc_count; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_seta + i); - let(opcode, opcode2(0x90 | cc_opcodes_low[i])); - encode_instruction(opcode, ops(op_rm8)); - batch_end(builder, batch); - } -} - -fn void encode_stos(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_stosb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_al + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xab - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_test(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_test); - - { - let(opcode, opcode1(0xa8)); - encode_instruction(opcode, ops(op_al, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_ax, op_imm16)); - encode_instruction(opcode, ops(op_eax, op_imm32)); - encode_instruction(opcode, ops(op_rax, op_imm32)); - } - - { - let(opcode, opcode1(0xf6, .extension = 0)); - encode_instruction(opcode, ops(op_rm8, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_rm64, op_imm32)); - } - - { - let(opcode, opcode1(0x84)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - batch_end(builder, batch); -} - -fn void encode_ud(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud0); - let(opcode, opcode2(0xff)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud1); - let(opcode, opcode2(0xb9)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud2); - Operands operands = {}; - let(opcode, opcode2(0x0b)); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_xadd(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_xadd); - let(opcode, opcode2(0xc0)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - - batch_end(builder, batch); -} - -fn void encode_xchg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_xchg); - - let(opcode, opcode1(0x90, .plus_register = 1)); - - encode_instruction(opcode, ops(op_ax, op_r16)); - encode_instruction(opcode, ops(op_r16, op_ax)); - encode_instruction(opcode, ops(op_eax, op_r32)); - encode_instruction(opcode, ops(op_r32, op_eax)); - encode_instruction(opcode, ops(op_rax, op_r64)); - encode_instruction(opcode, ops(op_r64, op_rax)); - - { - let(opcode, opcode1(0x86)); - encode_instruction(opcode, ops(op_r8, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - opcode.bytes[0] -= 1; - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - batch_end(builder, batch); -} - -fn TestDataset construct_test_cases() -{ - TestBuilder builder = {}; - - encode_arithmetic(adc, .ra_imm = 0x15, .rm_imm_extension = 2, .rm_r = 0x11, .r_rm = 0x13); - encode_unsigned_add_flag(&builder, MNEMONIC_x86_64_adcx); - encode_arithmetic(add, .ra_imm = 0x05, .rm_imm_extension = 0, .rm_r = 0x01, .r_rm = 0x03); - encode_unsigned_add_flag(&builder, MNEMONIC_x86_64_adox); - encode_arithmetic(and, .ra_imm = 0x25, .rm_imm_extension = 4, .rm_r = 0x21, .r_rm = 0x23); - encode_bit_scan(&builder, BIT_SCAN_FORWARD); - encode_bit_scan(&builder, BIT_SCAN_REVERSE); - encode_bswap(&builder); - encode_bit_test(&builder, MNEMONIC_x86_64_bt, 0xa3, 0x04); - encode_bit_test(&builder, MNEMONIC_x86_64_btc, 0xbb, 0x07); - encode_bit_test(&builder, MNEMONIC_x86_64_btr, 0xb3, 0x06); - encode_bit_test(&builder, MNEMONIC_x86_64_bts, 0xab, 0x05); - encode_call(&builder); - encode_convert(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_clc, opcode1(0xf8), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cld, opcode1(0xfc), 0); - encode_clflush(&builder); - encode_clflushopt(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cli, opcode1(0xfa), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_clts, opcode2(0x06), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cmc, opcode1(0xf5), 0); - encode_cmov_instructions(&builder); - encode_arithmetic(cmp, .ra_imm = 0x3d, .rm_imm_extension = 7, .rm_r = 0x39, .r_rm = 0x3b); - encode_cmps(&builder); - encode_cmpxchg(&builder); - encode_cmpxchg_bytes(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cpuid, opcode2(0xa2), 0); - encode_crc32(&builder); - encode_dec_inc(&builder, OP_DEC); - encode_div(&builder, SIGNEDNESS_UNSIGNED); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_hlt, opcode1(0xf4), 0); - encode_div(&builder, SIGNEDNESS_SIGNED); - encode_imul(&builder); - encode_in(&builder); - encode_dec_inc(&builder, OP_INC); - encode_ins(&builder); - encode_int(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_invd, opcode2(0x08), 0); - encode_invlpg(&builder); - encode_iret(&builder); - encode_jmp(&builder); - encode_jcc(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_lahf, opcode1(0x9f), 0); - encode_lea(&builder); - encode_lods(&builder); - encode_loop(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_monitor, opcode3(0x01, 0xc8), 0); - encode_mov(&builder); - encode_movs(&builder); - encode_movsx(&builder); - encode_movzx(&builder); - encode_mul(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_mwait, opcode3(0x01, 0xc9), 0); - encode_neg(&builder); - encode_nop(&builder); - encode_not(&builder); - encode_arithmetic(or, .ra_imm = 0x0d, .rm_imm_extension = 1, .rm_r = 0x09, .r_rm = 0x0b); - encode_out(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_pause, opcode1(0x90), 1 << LEGACY_PREFIX_F3); - encode_pop(&builder); - encode_popcnt(&builder); - encode_popf(&builder); - encode_prefetch(&builder); - encode_push(&builder); - encode_pushf(&builder); - encode_rotate(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdmsr, opcode2(0x32), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdpmc, opcode2(0x33), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdtsc, opcode2(0x31), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdtscp, opcode3(0x01, 0xf9), 0); - encode_ret(&builder, RETURN_TYPE_NEAR); - encode_ret(&builder, RETURN_TYPE_FAR); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rsm, opcode2(0xaa), 0); - encode_shift(&builder); - encode_arithmetic(sbb, .ra_imm = 0x1d, .rm_imm_extension = 3, .rm_r = 0x19, .r_rm = 0x1b); - encode_scas(&builder); - encode_setcc(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_stc, opcode1(0xf9), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_std, opcode1(0xfd), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sti, opcode1(0xfb), 0); - encode_stos(&builder); - encode_arithmetic(sub, .ra_imm = 0x2d, .rm_imm_extension = 5, .rm_r = 0x29, .r_rm = 0x2b); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_syscall, opcode2(0x05), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysenter, opcode2(0x34), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysexit, opcode2(0x35), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysret, opcode2(0x07), 0); - encode_test(&builder); - encode_ud(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_wbinvd, opcode2(0x09), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_wrmsr, opcode2(0x30), 0); - encode_xadd(&builder); - encode_xchg(&builder); - encode_arithmetic(xor, .ra_imm = 0x35, .rm_imm_extension = 6, .rm_r = 0x31, .r_rm = 0x33); - - TestDataset result = { - .batches = builder.batches.pointer, - .batch_count = builder.batches.length, - .encodings = builder.encodings.pointer, - .encoding_count = builder.encodings.length, - }; - - return result; -} - -fn u8 is_asm_space(u8 ch) -{ - return ch == '\t' || ch == ' ' || ch == '\n' || ch == '\r'; -} - -fn u64 find_next_space(String string) -{ - return MIN(MIN(string_first_ch(string, ' '), string_first_ch(string, '\t')), MIN(string_first_ch(string, '\n'), string_first_ch(string, '\r'))); -} - -fn void n_word_mask(CStringSlice words, u8* mask, u8 length) -{ - for (u8 i = 0; i < length; i += 1) - { - mask[i] = 0xff; - } - - for (u8 byte = 0; byte < length; byte += 1) - { - for (u8 bit = 0; bit < 8; bit += 1) - { - u8 old = mask[byte]; - mask[byte] &= ~(u8)(1 << bit); - - u8 map[16*16][16] = {}; - u32 map_item_count = 0; - u8 candidate[16] = {}; - - for (u64 word_index = 0; word_index < words.length; word_index += 1) - { - char* word = words.pointer[word_index]; - for (u8 mask_index = 0; mask_index < length; mask_index += 1) - { - candidate[mask_index] = word[mask_index] & mask[mask_index]; - } - - u8 map_index; - for (map_index = 0; map_index < map_item_count; map_index += 1) - { - if (memcmp(map[map_index], candidate, length) == 0) - { - break; - } - } - - if (map_index != map_item_count) - { - mask[byte] = old; - break; - } - - memcpy(map[map_item_count], candidate, length); - map_item_count += 1; - } - } - } -} - -typedef enum OperandKind : u8 -{ - OPERAND_KIND_REGISTER, - OPERAND_KIND_IMMEDIATE, - OPERAND_KIND_INDIRECT, -} OperandKind; -STRUCT(OperandWork) -{ - OperandKind kind:2; - u8 size:6; -}; -static_assert(sizeof(OperandWork) == 1); - -STRUCT(OperandIndirect) -{ - x86_64_Register base; - s8 displacement8; - s32 displacement32; -}; - -STRUCT(MnemonicEncoding) -{ - OperandId operands[4]; -}; - -String assemble(String text) -{ - u8* buffer = os_reserve(0, align_forward_u64(text.length + 0x4000, 0x1000), (OSReserveProtectionFlags) { .read = 1, .write = 1 }, (OSReserveMapFlags) { .priv = 1, .anon = 1, .populate = 1 }); - u8* source = text.pointer; - - u8* top = source + text.length; - u8* destination = buffer; - - while (source < top) - { - u64 instruction_count = 0; - u8* base = source; - u32 mnemonic_offsets[64]; - u32 mnemonic_lengths[64]; -#define operand_buffer_count (64*4) - u32 operand_offsets[operand_buffer_count]; - u8 operand_lengths[operand_buffer_count]; - u32 instruction_operand_offsets[64]; - u8 instruction_operand_counters[64]; - OperandWork operand_works[operand_buffer_count]; - u64 immediates[operand_buffer_count]; - x86_64_Register registers[operand_buffer_count]; - OperandIndirect indirects[operand_buffer_count]; - u32 operand_count = 0; - - u64 operand_length_error_mask = 0; - u64 operand_count_error_mask = 0; - - while (instruction_count < 64) - { - while (is_asm_space(*source)) - { - source += 1; - } - - if (source == top) - { - break; - } - - let(instruction_length, MIN(string_first_ch((String) { .pointer = source, .length = top - source }, '\n'), (u64)(top - source))); - - String instruction = { .pointer = source, .length = instruction_length }; - let(instruction_top, source + instruction_length + (*(source + instruction_length) == '\n')); - - u32 mnemonic_offset = source - base; - u32 mnemonic_length = find_next_space(instruction); - mnemonic_offsets[instruction_count] = mnemonic_offset; - mnemonic_lengths[instruction_count] = mnemonic_length; - - source += mnemonic_length; - - u32 instruction_operand_offset = operand_count; - instruction_operand_offsets[instruction_count] = instruction_operand_offset; - - while (1) - { - while (is_asm_space(*source)) - { - source += 1; - } - - if (source == instruction_top) - { - break; - } - - String whats_left = { .pointer = source, .length = instruction_top - source }; - u32 operand_offset = source - base; - u32 operand_length = MIN(whats_left.length, MIN(string_first_ch(whats_left, ','), string_first_ch(whats_left, '\n'))); - operand_offsets[operand_count] = operand_offset; - operand_lengths[operand_count] = operand_length; - operand_length_error_mask |= operand_length >= UINT8_MAX; - source += operand_length; - source += *source == ','; - - operand_count += 1; - } - - let_cast(u8, instruction_operand_count, operand_count - instruction_operand_offset); - operand_count_error_mask |= instruction_operand_count > 4; - instruction_operand_counters[instruction_count] = instruction_operand_count; - - instruction_count += 1; - } - - if (unlikely((operand_length_error_mask | operand_count_error_mask | (source == top)) != 0)) - { - if (source == top) - { - break; - } - - todo(); - } - - let(lookup_result, pext_lookup_mnemonic_batch(base, mnemonic_offsets, mnemonic_lengths)); - - __mmask32 lookup_error_m0 = _mm512_cmpeq_epi16_mask(lookup_result.v[0], _mm512_set1_epi16(0xffff)); - __mmask32 lookup_error_m1 = _mm512_cmpeq_epi16_mask(lookup_result.v[1], _mm512_set1_epi16(0xffff)); - __mmask32 lookup_error_mask = _kor_mask32(lookup_error_m0, lookup_error_m1); - u32 lookup_error_mask_int = _cvtmask32_u32(lookup_error_mask); - - // Operand parsing - // GPR - // xmm{0-31} - // ymm{0-31} - // zmm{0-31} - // indirect - // immediate: decimal, hexadecimal, binary - - if (likely(operand_count != 0)) - { - for (u32 operand_index = 0; operand_index < operand_count; operand_index += 1) - { - let(operand_string_pointer, base + operand_offsets[operand_index]); - let(operand_string_length, operand_lengths[operand_index]); - u8 first_ch = operand_string_pointer[0]; - if ((first_ch >= 'a') & (first_ch <= 'z')) - { - let(value, pext_lookup_register_single(operand_string_pointer, operand_string_length)); - if (value == 0xffff) - { - todo(); - } - - registers[operand_index] = value; - operand_works[operand_index].kind = OPERAND_KIND_REGISTER; - } - else if ((first_ch >= '0') & (first_ch <= '9')) - { - switch (operand_string_pointer[1]) - { - case 'x': - { - u8* it = &operand_string_pointer[2]; - - u8* hex_it = it; - while (is_hex_digit(*hex_it)) - { - hex_it += 1; - } - - String operand_string = { .pointer = it, .length = hex_it - it }; - u8 is_error; - u64 result = parse_hexadecimal(operand_string, &is_error); - if (is_error) - { - todo(); - } - immediates[operand_index] = result; - - it = hex_it; - } break; - case 'b': - { - todo(); - } break; - case 'o': - { - todo(); - } break; - default: todo(); - } - - operand_works[operand_index].kind = OPERAND_KIND_IMMEDIATE; - } - else if (first_ch == '[') - { - u8* end = &operand_string_pointer[operand_string_length - 1]; - - while (is_asm_space(*end)) - { - end -= 1; - } - - if (*end != ']') - { - todo(); - } - - u8* it = operand_string_pointer + 1; - s8 bias8 = 1; - s32 bias32 = 1; - s8 displacement8 = 0; - s32 displacement32 = 0; - x86_64_Register base = 0; - - while (1) - { - while (is_asm_space(*it)) - { - it += 1; - } - - if (it == end) - { - break; - } - - u8 first_ch = *it; - if ((first_ch >= 'a') & (first_ch <= 'z')) - { - let(suboperand_it, it); - while (is_alphanumeric(*suboperand_it)) - { - suboperand_it += 1; - } - - u8* operand_string_pointer = it; - u8 operand_string_length = suboperand_it - it; - - let(value, pext_lookup_register_single(operand_string_pointer, operand_string_length)); - if (value == 0xffff) - { - todo(); - } - - base = value; - - it = suboperand_it; - } - else if (first_ch == '0') - { - it += 1; - - switch (*it) - { - case 'x': - { - it += 1; - - u8* hex_it = it; - while (is_hex_digit(*hex_it)) - { - hex_it += 1; - } - - String operand_string = { .pointer = it, .length = hex_it - it }; - u8 is_error; - u64 result = parse_hexadecimal(operand_string, &is_error); - if (is_error) - { - todo(); - } - unused(result); - - it = hex_it; - } break; - case 'b': - { - it += 1; - todo(); - } break; - case 'o': - { - it += 1; - todo(); - } break; - default: todo(); - } - } - else - { - todo(); - } - - while (is_asm_space(*it)) - { - it += 1; - } - - switch (*it) - { - case '+': - { - it += 1; - } break; - case '-': - { - bias8 = -1; - bias32 = -1; - it += 1; - } break; - case ']': - { - } break; - default: todo(); - } - } - - assert(*it == ']'); - it += 1; - - indirects[operand_index].displacement8 = displacement8 * bias8; - indirects[operand_index].displacement32 = displacement32 * bias32; - indirects[operand_index].base = base; - operand_works[operand_index].kind = OPERAND_KIND_INDIRECT; - } - else - { - todo(); - } - } - } - - if (unlikely(lookup_error_mask_int != 0)) - { - todo(); - } - - // for (u64 instruction_index = 0; instruction_index < 64; instruction_index += 1) - // { - // u8 instruction_operand_count = instruction_operand_counters[instruction_index]; - // u32 instruction_operand_offset = instruction_operand_offsets[instruction_index]; - // for (u8 instruction_operand_index = 0; instruction_operand_index < instruction_operand_count; instruction_operand_index += 1) - // { - // // u32 operand_index = instruction_operand_offset + instruction_operand_index; - // // OperandWork work = operand_works[operand_index]; - // // switch (work.kind) - // // { - // // // default: todo(); - // // } - // } - // for (u8 instruction_operand_index = instruction_operand_count; instruction_operand_index < 4; instruction_operand_index += 1) - // { - // // Check encoding operand is zero - // } - // } - -#if 0 - // ================================= - // TODO: START - // ================================= - u8 immediate[8][64] = {}; // TODO - u8 displacement[4][64] = {}; // TODO - u8 relative[4][64] = {}; // TODO - - __mmask64 prefix_masks[LEGACY_PREFIX_COUNT] = {}; // TODO - __mmask64 is_immediate[4] = {}; // TODO - __mmask64 is_plus_register = {}; // TODO - __mmask64 is_rm_register = {}; // TODO - __mmask64 is_reg_register = {}; // TODO - __mmask64 is_implicit_register = {}; // TODO - __mmask64 is_displacement8 = {}; // TODO - __mmask64 is_displacement32 = {}; // TODO - __mmask64 is_relative8 = {}; // TODO - __mmask64 is_relative32 = {}; // TODO - __mmask64 is_rex_w = {}; // TODO - - __m256i rm_register_mask_256 = {}; // TODO - __m256i reg_register_mask_256 = {}; // TODO - __m128i opcode_lengths_128 = {}; // TODO - __m512i opcode_extension = {}; // TODO - __m512i opcode0_pre = {}; // TODO - __m512i opcode1_pre = {}; // TODO - __m512i opcode2_pre = {}; // TODO - __m512i displacement8 = _mm512_loadu_epi8(&displacement[0][0]); - // ================================= - // TODO: END - // ================================= - - __m512i prefixes[LEGACY_PREFIX_COUNT]; - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - prefixes[prefix] = _mm512_maskz_set1_epi8(prefix_masks[prefix], legacy_prefixes[prefix]); - } - - __m512i instruction_length; - - u8 prefix_group1_bytes[64]; - u8 prefix_group1_positions[64]; - { - __mmask64 prefix_group1_mask = _kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_F0], prefix_masks[LEGACY_PREFIX_F2]), prefix_masks[LEGACY_PREFIX_F3]); - __m512i prefix_group1 = _mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_F0], prefixes[LEGACY_PREFIX_F2]), prefixes[LEGACY_PREFIX_F3]); - __m512i prefix_group1_position = _mm512_maskz_set1_epi8(_knot_mask64(prefix_group1_mask), 0x0f); - instruction_length = _mm512_maskz_set1_epi8(prefix_group1_mask, 0x01); - - _mm512_storeu_epi8(prefix_group1_bytes, prefix_group1); - _mm512_storeu_epi8(prefix_group1_positions, prefix_group1_position); - } - - u8 prefix_group2_bytes[64]; - u8 prefix_group2_positions[64]; - { - __mmask64 prefix_group2_mask = _kor_mask64(_kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_2E], prefix_masks[LEGACY_PREFIX_36]), _kor_mask64(prefix_masks[LEGACY_PREFIX_3E], prefix_masks[LEGACY_PREFIX_26])), _kor_mask64(prefix_masks[LEGACY_PREFIX_64], prefix_masks[LEGACY_PREFIX_65])); - __m512i prefix_group2 = _mm512_or_epi32(_mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_2E], prefixes[LEGACY_PREFIX_36]), _mm512_or_epi32(prefixes[LEGACY_PREFIX_3E], prefixes[LEGACY_PREFIX_26])), _mm512_or_epi32(prefixes[LEGACY_PREFIX_64], prefixes[LEGACY_PREFIX_65])); - __m512i prefix_group2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group2_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group2_bytes, prefix_group2); - _mm512_storeu_epi8(prefix_group2_positions, prefix_group2_position); - } - - u8 prefix_group3_bytes[64]; - u8 prefix_group3_positions[64]; - { - __mmask64 prefix_group3_mask = prefix_masks[LEGACY_PREFIX_66]; - __m512i prefix_group3 = prefixes[LEGACY_PREFIX_66]; - __m512i prefix_group3_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group3_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group3_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group3_bytes, prefix_group3); - _mm512_storeu_epi8(prefix_group3_positions, prefix_group3_position); - } - - u8 prefix_group4_bytes[64]; - u8 prefix_group4_positions[64]; - { - __mmask64 prefix_group4_mask = prefix_masks[LEGACY_PREFIX_67]; - __m512i prefix_group4 = prefixes[LEGACY_PREFIX_67]; - __m512i prefix_group4_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group4_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group4_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group4_bytes, prefix_group4); - _mm512_storeu_epi8(prefix_group4_positions, prefix_group4_position); - } - - __m512i rm_register; - { - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(rm_register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(rm_register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - rm_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - } - - __m512i reg_register; - { - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(reg_register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(rm_register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - reg_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - } - - __mmask64 is_reg_direct_addressing_mode = _knot_mask64(_kor_mask64(is_displacement8, is_displacement32)); - __mmask64 has_base_register = _kor_mask64(_kor_mask64(is_rm_register, is_reg_register), is_implicit_register); - - __m512i rex_b = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(rm_register, _mm512_set1_epi8(0b1000)), 1 << 0); - __m512i rex_x = _mm512_set1_epi8(0); // TODO - __m512i rex_r = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(reg_register, _mm512_set1_epi8(0b1000)), 1 << 2); - __m512i rex_w = _mm512_maskz_set1_epi8(is_rex_w, 1 << 3); - __m512i rex_byte = _mm512_or_epi32(_mm512_set1_epi32(0x40), _mm512_or_epi32(_mm512_or_epi32(rex_b, rex_x), _mm512_or_epi32(rex_r, rex_w))); - __mmask64 rex_mask = _mm512_test_epi8_mask(rex_byte, _mm512_set1_epi8(0x0f)); - __m512i rex_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), rex_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(rex_mask, 0x01)); - - u8 rex_bytes[64]; - u8 rex_positions[64]; - _mm512_storeu_epi8(rex_bytes, rex_byte); - _mm512_storeu_epi8(rex_positions, rex_position); - - __m128i selecting_mask = _mm_set1_epi8(0x03); - __m128i opcode_length_nibbles_0 = _mm_and_si128(opcode_lengths_128, selecting_mask); - __m128i opcode_length_nibbles_1 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 1), selecting_mask); - __m128i opcode_length_nibbles_2 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 2), selecting_mask); - __m128i opcode_length_nibbles_3 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 3), selecting_mask); - - __m512i opcode_lengths_512 = _mm512_inserti64x4(_mm512_castsi256_si512(_mm256_inserti32x4(_mm256_castsi128_si256(_mm_unpacklo_epi8(opcode_length_nibbles_0, opcode_length_nibbles_1)), _mm_unpackhi_epi8(opcode_length_nibbles_0, opcode_length_nibbles_1), 1)), _mm256_inserti32x4(_mm256_castsi128_si256(_mm_unpacklo_epi8(opcode_length_nibbles_2, opcode_length_nibbles_3)), _mm_unpackhi_epi8(opcode_length_nibbles_2, opcode_length_nibbles_3), 1), 1); - - __mmask64 opcode_is_length_1 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(1)); - __mmask64 opcode_is_length_2 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(2)); - __mmask64 opcode_is_length_3 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(3)); - - __m512i plus_register = _mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)); - - __m512i opcode0 = _mm512_or_epi32(opcode0_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_1), plus_register)); - __m512i opcode0_position = instruction_length; - instruction_length = _mm512_add_epi8(instruction_length, _mm512_set1_epi8(0x01)); - - u8 opcode0_bytes[64]; - u8 opcode0_positions[64]; - _mm512_storeu_epi8(opcode0_bytes, opcode0); - _mm512_storeu_epi8(opcode0_positions, opcode0_position); - - __m512i opcode1 = _mm512_or_epi32(opcode1_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_2), plus_register)); - __mmask64 opcode1_mask = _mm512_test_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(0b10)); - __m512i opcode1_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), opcode1_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(opcode1_mask, 0x01)); - - u8 opcode1_bytes[64]; - u8 opcode1_positions[64]; - _mm512_storeu_epi8(opcode1_bytes, opcode1); - _mm512_storeu_epi8(opcode1_positions, opcode1_position); - - __m512i opcode2 = _mm512_or_epi32(opcode2_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_3), plus_register)); - __mmask64 opcode2_mask = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(0b11)); - __m512i opcode2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), opcode2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(opcode2_mask, 0x01)); - - u8 opcode2_bytes[64]; - u8 opcode2_positions[64]; - _mm512_storeu_epi8(opcode2_bytes, opcode2); - _mm512_storeu_epi8(opcode2_positions, opcode2_position); - - __mmask64 mod_is_displacement32 = is_displacement32; - __mmask64 mod_is_displacement8 = _kand_mask64(is_displacement8, _kor_mask64(_mm512_test_epi8_mask(displacement8, displacement8), _kand_mask64(is_rm_register, _mm512_cmpeq_epi8_mask(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_set1_epi8(REGISTER_X86_64_BP))))); - - __mmask64 mod_rm_mask = _kor_mask64(_kand_mask64(_kor_mask64(is_rm_register, is_reg_register), _knot_mask64(is_plus_register)), _kor_mask64(is_displacement8, is_displacement32)); - __m512i register_direct_address_mode = _mm512_maskz_set1_epi8(is_reg_direct_addressing_mode, 1); - __m512i mod = _mm512_or_epi32(_mm512_or_epi32(_mm512_slli_epi32(_mm512_maskz_set1_epi8(_kand_mask64(mod_is_displacement32, has_base_register), 1), 1), _mm512_maskz_set1_epi8(mod_is_displacement8, 1)), _mm512_or_epi32(_mm512_slli_epi32(register_direct_address_mode, 1), register_direct_address_mode)); - __m512i rm = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_maskz_set1_epi8(_knot_mask64(has_base_register), 0b100)); - __m512i reg = _mm512_or_epi32(_mm512_and_si512(reg_register, _mm512_set1_epi8(0b111)), opcode_extension); - __m512i mod_rm = _mm512_or_epi32(_mm512_or_epi32(rm, _mm512_slli_epi32(reg, 3)), _mm512_slli_epi32(mod, 6)); - __m512i mod_rm_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_rm_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_rm_mask, 0x01)); - - u8 mod_rm_bytes[64]; - u8 mod_rm_positions[64]; - _mm512_storeu_epi8(mod_rm_bytes, mod_rm); - _mm512_storeu_epi8(mod_rm_positions, mod_rm_position); - - __mmask64 sib_mask = _kand_mask64(_mm512_cmpneq_epi8_mask(mod, _mm512_set1_epi8(0b11)), _mm512_cmpeq_epi8_mask(rm, _mm512_set1_epi8(0b100))); - __m512i sib_scale = _mm512_set1_epi8(0); - __m512i sib_index = _mm512_maskz_set1_epi8(sib_mask, 0b100 << 3); - __m512i sib_base = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_maskz_set1_epi8(is_rm_register, 0b111)), _mm512_maskz_set1_epi8(_knot_mask64(is_rm_register), 0b101)); - __m512i sib = _mm512_or_epi32(_mm512_or_epi32(sib_index, sib_base), sib_scale); - __m512i sib_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), sib_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(sib_mask, 0x01)); - - u8 sib_bytes[64]; - u8 sib_positions[64]; - _mm512_storeu_epi8(sib_bytes, sib); - _mm512_storeu_epi8(sib_positions, sib_position); - - __m512i displacement8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement8, sizeof(s8))); - u8 displacement8_positions[64]; - _mm512_storeu_epi8(displacement8_positions, displacement8_position); - - __m512i displacement32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement32, sizeof(s32))); - u8 displacement32_positions[64]; - _mm512_storeu_epi8(displacement32_positions, displacement32_position); - - __m512i relative8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative8, sizeof(s8))); - u8 relative8_positions[64]; - _mm512_storeu_epi8(relative8_positions, relative8_position); - - __m512i relative32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative32, sizeof(s32))); - u8 relative32_positions[64]; - _mm512_storeu_epi8(relative32_positions, relative32_position); - - u8 immediate_positions[array_length(is_immediate)][64]; - for (u8 i = 0; i < array_length(immediate_positions); i += 1) - { - __mmask64 immediate_mask = is_immediate[i]; - __m512i immediate_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), immediate_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(immediate_mask, 1 << i)); - _mm512_storeu_epi8(immediate_positions[i], immediate_position); - } - - u8 separate_buffers[64][max_instruction_byte_count]; - u8 separate_lengths[64]; - _mm512_storeu_epi8(separate_lengths, instruction_length); - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - separate_buffers[i][prefix_group1_positions[i]] = prefix_group1_bytes[i]; - separate_buffers[i][prefix_group2_positions[i]] = prefix_group2_bytes[i]; - separate_buffers[i][prefix_group3_positions[i]] = prefix_group3_bytes[i]; - separate_buffers[i][prefix_group4_positions[i]] = prefix_group4_bytes[i]; - - separate_buffers[i][rex_positions[i]] = rex_bytes[i]; - - separate_buffers[i][opcode0_positions[i]] = opcode0_bytes[i]; - separate_buffers[i][opcode1_positions[i]] = opcode1_bytes[i]; - separate_buffers[i][opcode2_positions[i]] = opcode2_bytes[i]; - - separate_buffers[i][mod_rm_positions[i]] = mod_rm_bytes[i]; - - separate_buffers[i][sib_positions[i]] = sib_bytes[i]; - - for (u8 immediate_position_index = 0; immediate_position_index < array_length(immediate_positions); immediate_position_index += 1) - { - u8 start_position = immediate_positions[immediate_position_index][i]; - for (u32 byte = 0; byte < 1 << immediate_position_index; byte += 1) - { - u8 destination_index = start_position + byte * (start_position != 0xf); - separate_buffers[i][destination_index] = immediate[byte][i]; - } - } - - separate_buffers[i][displacement8_positions[i]] = displacement[0][i]; - - u8 displacement32_start = displacement32_positions[i]; - for (u8 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = displacement32_start + byte * (displacement32_start != 0xf); - separate_buffers[i][destination_index] = displacement[byte][i]; - } - - separate_buffers[i][relative8_positions[i]] = relative[0][i]; - - u8 relative32_start = relative32_positions[i]; - for (u8 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = relative32_start + byte * (relative32_start != 0xf); - separate_buffers[i][destination_index] = relative[byte][i]; - } - } - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - let(separate_length, separate_lengths[i]); - - if (separate_length == 0) unreachable(); - if (separate_length > 15) unreachable(); - - memcpy(destination, &separate_buffers[i], separate_length); - destination += separate_length; - } -#else - unused(destination); -#endif - } - - String result = {}; - return result; -} - -fn String assemble_file(Arena* arena, String path) -{ - String assembly_file = file_read(arena, path); - String result = assemble(assembly_file); - return result; -} - -int main(int argc, char** argv, char** envp) -{ - unused(argc); - unused(argv); - - environment_pointer = envp; - Arena* arena = arena_initialize_default(MB(2)); - assemble_file(arena, strlit("large_assembly.s")); - - int result = 0; - - if (BB_CI) - { - TestDataset dataset = construct_test_cases(); - EncodingTestOptions options = { - .scalar = 1, - .wide = 1, - }; - result = encoding_test_instruction_batches(arena, dataset, options); - } - - return result; -} diff --git a/bootstrap/bloat-buster/bb_core.c b/bootstrap/bloat-buster/bb_core.c deleted file mode 100644 index ddc00f9..0000000 --- a/bootstrap/bloat-buster/bb_core.c +++ /dev/null @@ -1,276 +0,0 @@ -#if BB_CI == 0 -#include - -#include -#include -#include -#include -#include -#include -#include - -#define default_font_height (24) -auto proportional_font_height = default_font_height; -auto monospace_font_height = default_font_height; - -fn TextureIndex white_texture_create(Arena* arena, Renderer* renderer) -{ - u32 white_texture_width = 1024; - u32 white_texture_height = white_texture_width; - auto* white_texture_buffer = arena_allocate(arena, u32, white_texture_width * white_texture_height); - memset(white_texture_buffer, 0xff, white_texture_width * white_texture_height * sizeof(u32)); - - auto white_texture = renderer_texture_create(renderer, (TextureMemory) { - .pointer = white_texture_buffer, - .width = white_texture_width, - .height = white_texture_height, - .depth = 1, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - }); - - return white_texture; -} - -STRUCT(BBPanel) -{ - BBPanel* first; - BBPanel* last; - BBPanel* next; - BBPanel* previous; - BBPanel* parent; - f32 parent_percentage; - Axis2 split_axis; -}; - -STRUCT(BBWindow) -{ - OSWindow os; - RenderWindow* render; - BBWindow* previous; - BBWindow* next; - BBPanel* root_panel; - UI_State* ui; -}; - -STRUCT(BBGUIState) -{ - Arena* arena; - Timestamp last_frame_timestamp; - BBWindow* first_window; - BBWindow* last_window; - Renderer* renderer; - // TODO: should this not be thread local? - OSEventQueue event_queue; -}; -global_variable BBGUIState state; - -fn void ui_top_bar() -{ - ui_push(pref_height, ui_em(1, 1)); - { - ui_push(child_layout_axis, AXIS2_X); - auto* top_bar = ui_widget_make((UI_WidgetFlags) { - }, strlit("top_bar")); - ui_push(parent, top_bar); - { - ui_button(strlit("Button 1")); - ui_button(strlit("Button 2")); - ui_button(strlit("Button 3")); - } - ui_pop(parent); - ui_pop(child_layout_axis); - } - ui_pop(pref_height); -} - -STRUCT(UI_Node) -{ - String name; - String type; - String value; - String namespace; - String function; -}; - -fn void ui_node(UI_Node node) -{ - auto* node_widget = ui_widget_make_format((UI_WidgetFlags) { - .draw_background = 1, - .draw_text = 1, - }, "{s} : {s} = {s}##{s}{s}", node.name, node.type, node.value, node.function, node.namespace); -} - -fn void app_update() -{ - auto frame_end = os_timestamp(); - os_poll_events(&state.event_queue); - auto frame_ms = os_resolve_timestamps(state.last_frame_timestamp, frame_end, TIME_UNIT_MILLISECONDS); - state.last_frame_timestamp = frame_end; - - Renderer* renderer = state.renderer; - - BBWindow* window = state.first_window; - while (likely(window)) - { - auto* previous = window->previous; - auto* next = window->next; - - auto* render_window = window->render; - renderer_window_frame_begin(renderer, render_window); - - ui_state_select(window->ui); - - if (likely(ui_build_begin(window->os, frame_ms, &state.event_queue))) - { - ui_push(font_size, default_font_height); - - ui_top_bar(); - ui_push(child_layout_axis, AXIS2_X); - auto* workspace_widget = ui_widget_make_format((UI_WidgetFlags) {}, "workspace{u64}", window->os); - ui_push(parent, workspace_widget); - { - // Node visualizer - ui_push(child_layout_axis, AXIS2_Y); - auto* node_visualizer_widget = ui_widget_make_format((UI_WidgetFlags) { - .draw_background = 1, - }, "node_visualizer{u64}", window->os); - - ui_push(parent, node_visualizer_widget); - { - ui_node((UI_Node) { - .name = strlit("a"), - .type = strlit("s32"), - .value = strlit("1"), - .namespace = strlit("foo"), - .function = strlit("main"), - }); - ui_node((UI_Node) { - .name = strlit("b"), - .type = strlit("s32"), - .value = strlit("2"), - .namespace = strlit("foo"), - .function = strlit("main"), - }); - } - ui_pop(parent); - ui_pop(child_layout_axis); - - // Side-panel stub - ui_button(strlit("Options")); - } - ui_pop(parent); - ui_pop(child_layout_axis); - - ui_build_end(); - - ui_draw(); - - ui_pop(font_size); - - renderer_window_frame_end(renderer, render_window); - } - else - { - if (previous) - { - previous->next = next; - } - - if (next) - { - next->previous = previous; - } - - if (state.first_window == window) - { - state.first_window = next; - } - - if (state.last_window == window) - { - state.last_window = previous; - } - } - - window = next; - } -} - -fn void window_refresh_callback(OSWindow window, void* context) -{ - unused(window); - unused(context); - app_update(); -} - -void run_app() -{ - state.arena = arena_init(MB(512), MB(2), MB(2)); - - os_windowing_init((OSWindowingInitializationOptions) { -#ifdef __linux__ - .should_use_x11 = 1, -#else - .should_use_x11 = 0, -#endif - }); - state.renderer = renderer_initialize(state.arena); - - state.first_window = state.last_window = arena_allocate(state.arena, BBWindow, 1); - state.first_window->os = os_window_create((OSWindowCreate) { - .name = strlit("Bloat Buster"), - .size = { - .width = 1600, - .height= 900, - }, - .refresh_callback = &window_refresh_callback, - }); - - if (!state.first_window->os) - { - failed_execution(); - } - - state.first_window->render = renderer_window_initialize(state.renderer, state.first_window->os); - state.first_window->ui = ui_state_allocate(state.renderer, state.first_window->render); - state.first_window->root_panel = arena_allocate(state.arena, BBPanel, 1); - state.first_window->root_panel->parent_percentage = 1.0f; - state.first_window->root_panel->split_axis = AXIS2_X; - - auto font_path = -#ifdef _WIN32 - strlit("C:/Users/David/Downloads/Fira_Sans/FiraSans-Regular.ttf"); -#elif defined(__linux__) - strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf"); -#elif defined(__APPLE__) -strlit("/Users/david/Library/Fonts/FiraSans-Regular.ttf"); -#else - strlit("WRONG_PATH"); -#endif - - window_rect_texture_update_begin(state.first_window->render); - - auto white_texture = white_texture_create(state.arena, state.renderer); - auto monospace_font = font_texture_atlas_create(state.arena, state.renderer, (TextureAtlasCreate) { - .font_path = font_path, - .text_height = monospace_font_height, - }); - auto proportional_font = monospace_font; - - window_queue_rect_texture_update(state.first_window->render, RECT_TEXTURE_SLOT_WHITE, white_texture); - renderer_queue_font_update(state.renderer, state.first_window->render, RENDER_FONT_TYPE_MONOSPACE, monospace_font); - renderer_queue_font_update(state.renderer, state.first_window->render, RENDER_FONT_TYPE_PROPORTIONAL, proportional_font); - - window_rect_texture_update_end(state.renderer, state.first_window->render); - - state.last_frame_timestamp = os_timestamp(); - - while (state.first_window) - { - app_update(); - } - - // TODO: deinitialization -} - -#endif diff --git a/bootstrap/bloat-buster/bb_core.h b/bootstrap/bloat-buster/bb_core.h deleted file mode 100644 index f24381e..0000000 --- a/bootstrap/bloat-buster/bb_core.h +++ /dev/null @@ -1,7 +0,0 @@ -#if BB_CI == 0 -#include -#include - -EXPORT void run_app(); - -#endif diff --git a/bootstrap/bloat-buster/data/instructions.dat b/bootstrap/bloat-buster/data/instructions.dat deleted file mode 100644 index cee89a1..0000000 --- a/bootstrap/bloat-buster/data/instructions.dat +++ /dev/null @@ -1,281 +0,0 @@ -adc: class base_arithmetic(/2, 15, 11, 13) -adcx: class unsigned_add_flag(66) -add: class base_arithmetic(/0, 05, 01, 03) -adox: class unsigned_add_flag(f3) -and: class base_arithmetic(/4, 25, 21, 23) -bsf: - r16, rm16 [rm: rex.r 0f bc /r] - r32, rm32 [rm: 0f bc /r] - r64, rm64 [rm: rex.w 0f bc /r] -bsr: - r16, rm16 [rm: rex.r 0f bd /r] - r32, rm32 [rm: 0f bd /r] - r64, rm64 [rm: rex.w 0f bd /r] -bswap: - r32 [o: 0f c8+r] - r64 [o: rex.w 0f c8+r] -bt: class bittest(/4, a3) -btc: class bittest(/7, bb) -btr: class bittest(/6, b3) -bts: class bittest(/5, ab) -call: - rel [d: e8 rel32] - rm64 [m: ff /2] -cbw: [zo: rex.r 98] -cwde: [zo: 98] -cwqe: [zo: rex.w 98] -clc: [zo: f8] -cld: [zo: fd] -clflush: m8 [m: 0f ae /7] -clflushopt: m8 [m: 66 0f ae /7] -cli: [zo: fa] -clts: [zo: 0f 06] -cmc: [zo: f5] -cmovcc: class cmov -cmp: class base_arithmetic(/7, 3d, 39, 3b) -cmpsb: [zo: a6] -cmpsw: [zo: a7] -cmpsd: [zo: a7] -cmpsq: [zo: a7] -cmpxchg: - rm8, r8 [mr: 0f b0] - rm16, r16 [mr: 0f b1] - rm32, r32 [mr: 0f b1] - rm64, r64 [mr: 0f b1] -cmpxchg8b: m64 [m: 0f c7 /1] -cmpxchg16b: m64 [m: rex.w 0f c7 /1] -cpuid: [zo: 0f a2] -crc32: - r32, rm8 [rm: f2 0f 38 f0] - r32, rm16 [rm: 66 f2 0f 38 f1] - r32, rm32 [rm: f2 0f 38 f1] - r64, rm8 [rm: f2 rex.w 0f 38 f0] - r64, rm64 [rm: f2 rex.w 0f 38 f1] -dec: - rm8 [m: fe /1] - rm16 [m: fe /1] - rm32 [m: fe /1] - rm64 [m: fe /1] -div: - rm8 [m: f6 /6] - rm16 [m: f7 /6] - rm32 [m: f7 /6] - rm64 [m: f7 /6] -hlt: [zo: f4] -idiv: - rm8 [m: f6 /7] - rm16 [m: f7 /7] - rm32 [m: f7 /7] - rm64 [m: f7 /7] -imul: - rm8 [m: f6 /5] - rm16 [m: f7 /5] - rm32 [m: f7 /5] - rm64 [m: f7 /5] - r16, rm16 [rm: 0f af] - r32, rm32 [rm: 0f af] - r64, rm64 [rm: 0f af] - r16, rm16, imm [rmi: 6b ib] - r32, rm32, imm [rmi: 6b ib] - r64, rm64, imm [rmi: 6b ib] - r16, rm16, imm16 [rmi: 69 iw] - r32, rm32, imm32 [rmi: 69 id] - r64, rm64, imm32 [rmi: 69 id] -in: - al, imm8 [-i: e4 ib] - ax, imm8 [-i: e5 ib] - eax, imm8 [-i: e5 ib] - al, dx [--: ec] - ax, dx [--: ed] - eax, dx [--: ed] -inc: - rm8 [m: fe /0] - rm16 [m: fe /0] - rm32 [m: fe /0] - rm64 [m: fe /0] -insb: [zo: 6c] -insw: [zo: 6d] -insd: [zo: 6d] -int: imm [i: cd ib] -int3: [zo: cc] -invd: [zo: 0f 08] -invlpg: m8 [m: 0f 01 /7] -iret: [zo: 66 cf] -iretd: [zo: cf] -iretq: [zo: rex.w cf] -jmp: - rel [d: eb rel8] - rel [d: e9 rel32] - rm64 [m: ff /4] -jcc: class jcc -jrcxz: rel [d: e3 rel8] -lahf: [zo: 9f] -lea: - r16, m16 [rm: 8d /r] - r32, m32 [rm: 8d /r] - r64, m64 [rm: 8d /r] -lodsb: [zo: ac] -lodsw: [zo: ad] -lodsd: [zo: ad] -lodsq: [zo: ad] -loop: rel [d: e2 rel8] -loope: rel [d: e1 rel8] -loopne: rel [d: e0 rel8] -monitor: [zo: 0f 01 c8] -mov: - rm8, r8 [mr: 88 /r] - rm16, r16 [mr: 89 /r] - rm32, r32 [mr: 89 /r] - rm64, r64 [mr: 89 /r] - r8, rm8 [rm: 8a /r] - r16, rm16 [rm: 8b /r] - r32, rm32 [rm: 8b /r] - r64, rm64 [rm: 8b /r] - r8, imm [ri: b0+r ib] - r16, imm [ri: b8+r iw] - r32, imm [ri: b8+r id] - r64, imm [ri: b8+r iq] - r8, imm [ri: c6 /0 ib] - r16, imm [ri: c7 /0 iw] - r32, imm [ri: c7 /0 id] - r64, imm [ri: c7 /0 id] -movsb: [zo: a4] -movsw: [zo: a5] -movsd: [zo: a5] -movsq: [zo: a5] -movsx: - r16, rm8 [rm: 0f be /r] - r32, rm8 [rm: 0f be /r] - r64, rm8 [rm: 0f be /r] - r32, rm16 [rm: 0f bf /r] - r64, rm16 [rm: 0f bf /r] -movsxd: r64, rm32 [rm: rex.w 63 /r] -movzx: - r16, rm8 [rm: 0f b6 /r] - r32, rm8 [rm: 0f b6 /r] - r64, rm8 [rm: 0f b6 /r] - r32, rm16 [rm: 0f b7 /r] - r64, rm16 [rm: 0f b7 /r] -mul: - rm8 [m: f6 /4] - rm16 [m: f7 /4] - rm32 [m: f7 /4] - rm64 [m: f7 /4] -mwait: [zo: 0f 01 c9] -neg: - rm8 [m: f6 /3] - rm16 [m: f7 /3] - rm32 [m: f7 /3] - rm64 [m: f7 /3] -nop: - [zo: 90] - rm16 [m: 0f 1f /0] - rm32 [m: 0f 1f /0] -not: - rm8 [m: f6 /2] - rm16 [m: f7 /2] - rm32 [m: f7 /2] - rm64 [m: f7 /2] -or: class base_arithmetic(/1, 0d, 09, 0b) -out: - imm, al [i-: e6 ib] - imm, ax [i-: e7 ib] - imm, ax [i-: e7 ib] -pause: [zo: f3 90] -pop: - rm16 [m: 8f /0] - rm64 [m: 8f /0] - r16 [o: 58+r] - r64 [o: 58+r] -popcnt: - r16, rm16 [rm: f3 0f b8 /r] - r32, rm32 [rm: f3 0f b8 /r] - r64, rm64 [rm: f3 0f b8 /r] -popf: [zo: 66 9d] -popfq: [zo: 9d] -prefetcht0: m8 [m: 0f 18 /1] -prefetcht1: m8 [m: 0f 18 /2] -prefetcht2: m8 [m: 0f 18 /3] -prefetchnta: m8 [m: 0f 18 /0] -push: - rm16 [m: ff /6] - rm64 [m: ff /6] - r16 [o: 50+r] - r64 [o: 50+r] - imm [i: 6a ib] - imm [i: 68 iw] - imm [i: 68 id] -pushf: [zo: 66 9c] -pushfq: [zo: 9c] -rol: class rotate(/0) -ror: class rotate(/1) -rcl: class rotate(/2) -rcr: class rotate(/3) -rdmsr: [zo: 0f 32] -rdpmc: [zo: 0f 33] -rdtsc: [zo: 0f 31] -rdtscp: [zo: 0f 01 f9] -ret: - [zo: c3] - imm [i: c2 iw] -retf: - [zo: cb] - imm [i: ca iw] -rsm: [zo: 0f aa] -sal: class shift(/4) -sar: class shift(/7) -shl: class shift(/4) -shr: class shift(/5) -scasb: [zo: ae] -scasw: [zo: af] -scasd: [zo: af] -scasq: [zo: af] -setcc: class setcc -stc: [zo: f9] -std: [zo: fd] -sti: [zo: fb] -stosb: [zo: aa] -stosw: [zo: ab] -stosd: [zo: ab] -stosq: [zo: ab] -sub: class base_arithmetic(/5, 2d, 29, 2b) -syscall: [zo: 0f 05] -sysenter: [zo: 0f 34] -sysexit: [zo: 0f 35] -sysret: [zo: 0f 07] -test: - al, imm8 [-i: a8 ib] - ax, imm16 [-i: a9 iw] - eax, imm32 [-i: a9 id] - rax, imm32 [-i: a9 id] - rm8, imm8 [mi: f6 /0 ib] - rm16, imm8 [mi: f7 /0 ib] - rm32, imm8 [mi: f7 /0 ib] - rm64, imm8 [mi: f7 /0 ib] - rm8, r8 [mr: 84 /r] - rm16, r16 [mr: 85 /r] - rm32, r32 [mr: 85 /r] - rm64, r64 [mr: 85 /r] -ud0: r32, rm32 [rm: 0f ff /r] -ud1: r32, rm32 [rm: 0f ff /r] -ud2: [zo: 0f 0b] -xadd: - rm8, r8 [mr: 0f c0 /r] - rm16, r16 [mr: 0f c1 /r] - rm32, r32 [mr: 0f c1 /r] - rm64, r64 [mr: 0f c1 /r] -xchg: - ax, r16 [-o: 90+r] - r16, ax [o-: 90+r] - eax, r32 [-o: 90+r] - r32, eax [o-: 90+r] - rax, r64 [-o: 90+r] - r64, rax [o-: 90+r] - rm8, r8 [mr: 86 /r] - r8, rm8 [rm: 86 /r] - rm16, r16 [mr: 87 /r] - r16, rm16 [rm: 87 /r] - rm32, r32 [mr: 87 /r] - r32, rm32 [rm: 87 /r] - rm64, r64 [mr: 87 /r] - r64, rm64 [rm: 87 /r] diff --git a/bootstrap/bloat-buster/data/x86_mnemonic.dat b/bootstrap/bloat-buster/data/x86_mnemonic.dat deleted file mode 100644 index 7e665e9..0000000 --- a/bootstrap/bloat-buster/data/x86_mnemonic.dat +++ /dev/null @@ -1,226 +0,0 @@ -adc -adcx -add -adox -and -bsf -bsr -bswap -bt -btc -btr -bts -call -cbw -cwde -cdqe -cwd -cdq -cqo -clc -cld -clflush -clflushopt -cli -clts -cmc -cmova -cmovae -cmovb -cmovbe -cmovc -cmove -cmovg -cmovge -cmovl -cmovle -cmovna -cmovnae -cmovnb -cmovnbe -cmovnc -cmovne -cmovng -cmovnge -cmovnl -cmovnle -cmovno -cmovnp -cmovns -cmovnz -cmovo -cmovp -cmovpe -cmovpo -cmovs -cmovz -cmp -cmpsb -cmpsw -cmpsd -cmpsq -cmpxchg -cmpxchg8b -cmpxchg16b -cpuid -crc32 -dec -div -hlt -idiv -imul -in -inc -insb -insw -insd -int -int3 -invd -invlpg -iret -iretd -iretq -jmp -ja -jae -jb -jbe -jc -je -jg -jge -jl -jle -jna -jnae -jnb -jnbe -jnc -jne -jng -jnge -jnl -jnle -jno -jnp -jns -jnz -jo -jp -jpe -jpo -js -jz -jrcxz -lahf -lea -lodsb -lodsw -lodsd -lodsq -loop -loope -loopne -monitor -mov -movsb -movsw -movsd -movsq -movsx -movsxd -movzx -mul -mwait -neg -nop -not -or -out -outsb -outsw -outsd -pause -pop -popcnt -popf -popfq -prefetcht0 -prefetcht1 -prefetcht2 -prefetchnta -push -pushf -pushfq -rcl -rcr -rol -ror -rdmsr -rdpmc -rdtsc -rdtscp -ret -retf -rsm -sal -sar -shl -shr -sbb -scasb -scasw -scasd -scasq -seta -setae -setb -setbe -setc -sete -setg -setge -setl -setle -setna -setnae -setnb -setnbe -setnc -setne -setng -setnge -setnl -setnle -setno -setnp -setns -setnz -seto -setp -setpe -setpo -sets -setz -stc -std -sti -stosb -stosw -stosd -stosq -sub -syscall -sysenter -sysexit -sysret -test -ud0 -ud1 -ud2 -wbinvd -wrmsr -xadd -xchg -xor diff --git a/bootstrap/bloat-buster/lld_api.cpp b/bootstrap/bloat-buster/lld_api.cpp deleted file mode 100644 index 964da71..0000000 --- a/bootstrap/bloat-buster/lld_api.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include - -#include -#include -#include -#include - -#define lld_api_function_signature(name) bool name(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) - -#define lld_link_decl(link_name) \ -namespace link_name \ -{\ - lld_api_function_signature(link);\ -} - -typedef lld_api_function_signature(LinkerFunction); - -namespace lld -{ - lld_link_decl(coff); - lld_link_decl(elf); - lld_link_decl(mingw); - lld_link_decl(macho); - lld_link_decl(wasm); -} - -fn u8 lld_api_generic(LLDArguments args, LinkerFunction linker_function) -{ - auto arguments = llvm::ArrayRef(args.argument_pointer, args.argument_count); - std::string stdout_string; - llvm::raw_string_ostream stdout_stream(stdout_string); - - std::string stderr_string; - llvm::raw_string_ostream stderr_stream(stderr_string); - u8 result = linker_function(arguments, stdout_stream, stderr_stream, args.exit_early, args.disable_output); - // assert(result == (stdout_string.length() == 0)); - // assert(result == (stderr_string.length() == 0)); - - print_string(String{(u8*)stdout_string.data(), stdout_string.length()}); - print_string(String{(u8*)stderr_string.data(), stderr_string.length()}); - - return result; -} - -#define lld_api_function_impl(link_name) \ -lld_api_function_decl(link_name)\ -{\ - return lld_api_generic(args, lld::link_name::link);\ -} - -lld_api_function_impl(coff) -lld_api_function_impl(elf) -lld_api_function_impl(mingw) -lld_api_function_impl(macho) -lld_api_function_impl(wasm) diff --git a/bootstrap/bloat-buster/lld_api.h b/bootstrap/bloat-buster/lld_api.h deleted file mode 100644 index b27f791..0000000 --- a/bootstrap/bloat-buster/lld_api.h +++ /dev/null @@ -1,17 +0,0 @@ -#include - -STRUCT(LLDArguments) -{ - const char** argument_pointer; - u32 argument_count; - u8 exit_early; - u8 disable_output; -}; - -#define lld_api_function_decl(link_name) u8 lld_ ## link_name ## _link(LLDArguments args) - -EXPORT lld_api_function_decl(coff); -EXPORT lld_api_function_decl(elf); -EXPORT lld_api_function_decl(mingw); -EXPORT lld_api_function_decl(macho); -EXPORT lld_api_function_decl(coff); diff --git a/bootstrap/bloat-buster/lld_driver.c b/bootstrap/bloat-buster/lld_driver.c deleted file mode 100644 index 260e374..0000000 --- a/bootstrap/bloat-buster/lld_driver.c +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include -#include - -fn String linux_crt_find_path() -{ - auto flags = (OSFileOpenFlags) { - .read = 1, - }; - auto permissions = (OSFilePermissions) { - .readable = 1, - .writable = 1, - }; - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/crti.o"), flags, permissions))) - { - return strlit("/usr/lib"); - } - - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/x86_64-linux-gnu/crti.o"), flags, permissions))) - { - return strlit("/usr/lib/x86_64-linux-gnu"); - } - - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/aarch64-linux-gnu/crti.o"), flags, permissions))) - { - return strlit("/usr/lib/aarch64-linux-gnu"); - } - - todo(); -} - -fn String windows_msvc_find_path() -{ - auto flags = (OSFileOpenFlags) { - .read = 1, - .directory = 1, - }; - auto permissions = (OSFilePermissions) { - .readable = 1, - }; - String possibilities[] = { - strlit("C:/Program Files/Microsoft Visual Studio/2022/Enterprise"), - strlit("C:/Program Files/Microsoft Visual Studio/2022/Community"), - }; - for (u64 i = 0; i < array_length(possibilities); i += 1) - { - auto possibility = possibilities[i]; - auto fd = os_file_open(possibility, flags, permissions); - - if (os_file_descriptor_is_valid(fd)) - { - return possibility; - } - } - - failed_execution(); -} - -fn void linux_add_crt_item(Arena* arena, VirtualBufferP(char)* args, String crt_path, String item) -{ - String parts[] = { - crt_path, - strlit("/"), - item, - }; - *vb_add(args, 1) = string_to_c(arena_join_string(arena, (Slice(String))array_to_slice(parts))); -} - -SliceP(char) lld_driver(Arena* arena, LinkerArguments arguments) -{ - VirtualBufferP(char) args = {}; - - char* driver; - switch (arguments.target.os) - { - case OPERATING_SYSTEM_LINUX: - driver = "ld.lld"; - break; - case OPERATING_SYSTEM_MAC: - driver = "ld64.lld"; - break; - case OPERATING_SYSTEM_WINDOWS: - driver = "lld-link"; - break; - } - *vb_add(&args, 1) = driver; - - if (arguments.target.os != OPERATING_SYSTEM_WINDOWS) - { - *vb_add(&args, 1) = "--error-limit=0"; - } - - switch (arguments.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - { - String parts[] = { - strlit("-out:"), - arguments.out_path, - }; - auto arg = arena_join_string(arena, (Slice(String))array_to_slice(parts)); - *vb_add(&args, 1) = string_to_c(arg); - } break; - default: - { - *vb_add(&args, 1) = "-o"; - *vb_add(&args, 1) = string_to_c(arguments.out_path); - } break; - } - - if (arguments.target.os != OPERATING_SYSTEM_WINDOWS) - { - for (u64 i = 0; i < arguments.objects.length; i += 1) - { - *vb_add(&args, 1) = string_to_c(arguments.objects.pointer[i]); - } - } - - switch (arguments.target.os) - { - case OPERATING_SYSTEM_LINUX: - { - if (arguments.link_libcpp && !arguments.link_libc) - { - failed_execution(); - } - - if (arguments.link_libc) - { - auto crt_path = linux_crt_find_path(); - - *vb_add(&args, 1) = "-dynamic-linker"; - - String dynamic_linker_filename; - switch (arguments.target.cpu) - { - case CPU_ARCH_X86_64: - dynamic_linker_filename = strlit("ld-linux-x86-64.so.2"); - break; - case CPU_ARCH_AARCH64: - dynamic_linker_filename = strlit("ld-linux-aarch64.so.1"); - break; - } - - linux_add_crt_item(arena, &args, crt_path, dynamic_linker_filename); - linux_add_crt_item(arena, &args, crt_path, strlit("crt1.o")); - - *vb_add(&args, 1) = "-L"; - *vb_add(&args, 1) = string_to_c(crt_path); - - - *vb_add(&args, 1) = "--as-needed"; - *vb_add(&args, 1) = "-lm"; - *vb_add(&args, 1) = "-lpthread"; - *vb_add(&args, 1) = "-lc"; - *vb_add(&args, 1) = "-ldl"; - *vb_add(&args, 1) = "-lrt"; - *vb_add(&args, 1) = "-lutil"; - - linux_add_crt_item(arena, &args, crt_path, strlit("crtn.o")); - - if (arguments.link_libcpp) - { - // TODO: implement better path finding - linux_add_crt_item(arena, &args, crt_path, strlit("libstdc++.so.6")); - } - } - - for (u64 i = 0; i < arguments.libraries.length; i += 1) - { - auto library = arguments.libraries.pointer[i]; - String library_pieces[] = { - strlit("-l"), - library, - }; - auto library_argument = arena_join_string(arena, (Slice(String))array_to_slice(library_pieces)); - *vb_add(&args, 1) = string_to_c(library_argument); - } - } break; - case OPERATING_SYSTEM_MAC: - { - *vb_add(&args, 1) = "-dynamic"; - *vb_add(&args, 1) = "-platform_version"; - *vb_add(&args, 1) = "macos"; - *vb_add(&args, 1) = "15.0.0"; - *vb_add(&args, 1) = "15.0.0"; - *vb_add(&args, 1) = "-arch"; - *vb_add(&args, 1) = "arm64"; - *vb_add(&args, 1) = "-syslibroot"; - *vb_add(&args, 1) = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"; - - if (string_ends_with(arguments.out_path, strlit(".dylib"))) - { - *vb_add(&args, 1) = "-e"; - *vb_add(&args, 1) = "_main"; - } - - *vb_add(&args, 1) = "-lSystem"; - - if (arguments.link_libcpp) - { - *vb_add(&args, 1) = "-lc++"; - } - } break; - case OPERATING_SYSTEM_WINDOWS: - { - if (arguments.link_libcpp && !arguments.link_libc) - { - failed_execution(); - } - - auto msvc_path = windows_msvc_find_path(); - - if (arguments.link_libc) - { - *vb_add(&args, 1) = "-defaultlib:libcmt"; - - { - // String parts[] = { - // strlit("-libpath:"), - // msvc_path, - // strlit("/"), - // strlit("VC/Tools/MSVC/14.41.34120/lib/x64"), - // }; - // auto arg = arena_join_string(arena, (Slice(String)) array_to_slice(parts)); - } - - if (arguments.link_libcpp) - { - todo(); - } - - for (u64 i = 0; i < arguments.objects.length; i += 1) - { - *vb_add(&args, 1) = string_to_c(arguments.objects.pointer[i]); - } - } - // clang -v main.c - // "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\link.exe" -out:a.exe -defaultlib:libcmt -defaultlib:oldnames "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\lib\\x64" "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\atlmfc\\lib\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\ucrt\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\um\\x64" "-libpath:C:\\Users\\David\\scoop\\apps\\llvm\\19.1.3\\lib\\clang\\19\\lib\\windows" -nologo "C:\\Users\\David\\AppData\\Local\\Temp\\main-706820.o" - } break; - } - - return (SliceP(char)){ .pointer = args.pointer, .length = args.length }; -} diff --git a/bootstrap/bloat-buster/lld_driver.h b/bootstrap/bloat-buster/lld_driver.h deleted file mode 100644 index f23c7ec..0000000 --- a/bootstrap/bloat-buster/lld_driver.h +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -EXPORT SliceP(char) lld_driver(Arena* arena, LinkerArguments arguments); diff --git a/bootstrap/bloat-buster/llvm.cpp b/bootstrap/bloat-buster/llvm.cpp deleted file mode 100644 index 6fabeff..0000000 --- a/bootstrap/bloat-buster/llvm.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#define unreachable() __builtin_unreachable() -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include - -#define string_ref(lit) StringRef(lit, strlit_len(lit)) - -namespace llvm -{ -#define llvm_initialize_macro(target) \ - LLVMInitialize ## target ## Target();\ - LLVMInitialize ## target ## TargetInfo();\ - LLVMInitialize ## target ## TargetMC();\ - LLVMInitialize ## target ## AsmParser();\ - LLVMInitialize ## target ## AsmPrinter() - - fn void target_initialize(CpuArchitecture architecture) - { - // These are meant to be called globally, so if this code is ever threaded, we need to call this code only once - switch (architecture) - { - case CPU_ARCH_X86_64: - { - llvm_initialize_macro(X86); - } break; - case CPU_ARCH_AARCH64: - { - llvm_initialize_macro(AArch64); - } break; - } - } - - EXPORT void llvm_codegen(CodegenOptions options, String object_path) - { - target_initialize(options.target.cpu); - - auto context = LLVMContext(); - auto module = Module(string_ref("first"), context); - std::string error_message; - - // TODO: debug builder - // TODO: attributes - - { - u32 return_bit_count = 32; - auto* return_type = IntegerType::get(context, return_bit_count); - ArrayRef parameter_types = {}; - u8 is_var_args = 0; - auto* function_type = FunctionType::get(return_type, parameter_types, is_var_args); - auto function_name = string_ref("main"); - auto linkage = GlobalValue::LinkageTypes::ExternalLinkage; - u32 address_space = 0; - auto* function = Function::Create(function_type, linkage, address_space, function_name, &module); - - auto builder = IRBuilder<>(context); - auto entry_block_name = string_ref("entry"); - auto* basic_block = BasicBlock::Create(context, entry_block_name, function, 0); - builder.SetInsertPoint(basic_block); - u64 return_value_int = 0; - u8 is_signed = 0; - auto* return_value = ConstantInt::get(context, APInt(return_bit_count, return_value_int, is_signed)); - builder.CreateRet(return_value); - - { - raw_string_ostream message_stream(error_message); - - if (verifyModule(module, &message_stream)) - { - // Failure - auto& error_std_string = message_stream.str(); - auto error_string = String{ .pointer = (u8*)error_std_string.data(), .length = error_std_string.length() }; - print("Verification for module failed:\n{s}\n", error_string); - failed_execution(); - } - } - } - - // TODO: make a more correct logic - std::string target_triple_str; - switch (options.target.cpu) - { - case CPU_ARCH_X86_64: - target_triple_str += string_ref("x86_64-"); - break; - case CPU_ARCH_AARCH64: - target_triple_str += string_ref("aarch64-"); - break; - } - - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - target_triple_str += string_ref("unknown-linux-gnu"); - break; - case OPERATING_SYSTEM_MAC: - target_triple_str += string_ref("apple-macosx-none"); - break; - case OPERATING_SYSTEM_WINDOWS: - target_triple_str += string_ref("pc-windows-msvc"); - break; - } - auto target_triple = StringRef(target_triple_str); - - const Target* target = TargetRegistry::lookupTarget(target_triple, error_message); - if (!target) - { - String string = { .pointer = (u8*)error_message.data(), .length = error_message.length() }; - print("Could not find target: {s}\n", string); - failed_execution(); - } - - module.setTargetTriple(target_triple); - - // TODO: - auto cpu_model = string_ref(""); - auto cpu_features = string_ref(""); - - TargetOptions target_options; - std::optional relocation_model = std::nullopt; - std::optional code_model = std::nullopt; - auto codegen_optimization_level = CodeGenOptLevel::None; - u8 jit = 0; - - auto* target_machine = target->createTargetMachine(target_triple, cpu_model, cpu_features, target_options, relocation_model, code_model, codegen_optimization_level, jit); - auto data_layout = target_machine->createDataLayout(); - module.setDataLayout(data_layout); - - // TODO: optimizations - - SmallString<0> object_string; - raw_svector_ostream object_stream(object_string); - auto file_type = CodeGenFileType::ObjectFile; - legacy::PassManager pass; - - assert(target_machine->isCompatibleDataLayout(module.getDataLayout())); - raw_pwrite_stream* dwo_stream = 0; - if (target_machine->addPassesToEmitFile(pass, object_stream, dwo_stream, file_type)) { - failed_execution(); - } - - pass.run(module); - - assert(object_path.pointer); - assert(object_path.length); - - file_write(FileWriteOptions{ - .path = object_path, - .content = { .pointer = (u8*)object_string.str().data(), .length = object_string.str().size() }, - .executable = 1, - }); - } -} diff --git a/bootstrap/bloat-buster/llvm.h b/bootstrap/bloat-buster/llvm.h deleted file mode 100644 index 63b1a26..0000000 --- a/bootstrap/bloat-buster/llvm.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -EXPORT void llvm_codegen(CodegenOptions options, String object_path); diff --git a/bootstrap/bloat-buster/main.c b/bootstrap/bloat-buster/main.c deleted file mode 100644 index aa2acbd..0000000 --- a/bootstrap/bloat-buster/main.c +++ /dev/null @@ -1,25059 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifdef __APPLE__ -#define clang_path "/opt/homebrew/opt/llvm/bin/clang" -#else -#define clang_path "/usr/bin/clang" -#endif - -#define RawIndex(T, i) (T ## Index) { .index = (i) } -#define Index(T, i) RawIndex(T, (i) + 1) -#define geti(i) ((i).index - 1) -#define validi(i) ((i).index != 0) -#define invalidi(T) RawIndex(T, 0) - -#define InternPool(T) InternPool_ ## T -#define GetOrPut(T) T ## GetOrPut -#define declare_ip(T) \ -STRUCT(InternPool(T)) \ -{ \ - T ## Index * pointer; \ - u32 length;\ - u32 capacity;\ -}; \ -STRUCT(GetOrPut(T)) \ -{\ - T ## Index index; \ - u8 existing;\ -} - -auto compiler_name = strlit("bb"); - - -STRUCT(ElfRelocation) -{ - u64 offset; - u64 info; - u64 addend; -}; - -typedef enum ElfDynamicEntryTag : s64 -{ - DT_NULL = 0, - DT_NEEDED = 1, - DT_PLTRELSZ = 2, - DT_PLTGOT = 3, - DT_HASH = 4, - DT_STRTAB = 5, - DT_SYMTAB = 6, - DT_RELA = 7, - DT_RELASZ = 8, - DT_RELAENT = 9, - DT_STRSZ = 10, - DT_SYMENT = 11, - DT_INIT = 12, - DT_FINI = 13, - DT_SONAME = 14, - DT_RPATH = 15, - DT_SYMBOLIC = 16, - DT_REL = 17, - DT_RELSZ = 18, - DT_RELENT = 19, - DT_PLTREL = 20, - DT_DEBUG = 21, - DT_TEXTREL = 22, - DT_JMPREL = 23, - DT_BIND_NOW = 24, - DT_INIT_ARRAY = 25, - DT_FINI_ARRAY = 26, - DT_INIT_ARRAYSZ = 27, - DT_FINI_ARRAYSZ = 28, - DT_RUNPATH = 29, - DT_FLAGS = 30, - DT_ENCODING = 32, - DT_PREINIT_ARRAY = 32, - DT_PREINIT_ARRAYSZ = 33, - DT_SYMTAB_SHNDX = 34, - DT_RELRSZ = 35, - DT_RELR = 36, - DT_RELRENT = 37, - DT_NUM = 38, - DT_LOOS = 0x6000000d, - DT_HIOS = 0x6ffff000, - DT_LOPROC = 0x70000000, - DT_HIPROC = 0x7fffffff, - DT_VALRNGLO = 0x6ffffd00, - DT_GNU_PRELINKED = 0x6ffffdf5, - DT_GNU_CONFLICTSZ = 0x6ffffdf6, - DT_GNU_LIBLISTSZ = 0x6ffffdf7, - DT_CHECKSUM = 0x6ffffdf8, - DT_PLTPADSZ = 0x6ffffdf9, - DT_MOVEENT = 0x6ffffdfa, - DT_MOVESZ = 0x6ffffdfb, - DT_FEATURE_1 = 0x6ffffdfc, - DT_POSFLAG_1 = 0x6ffffdfd, - - DT_SYMINSZ = 0x6ffffdfe, - DT_SYMINENT = 0x6ffffdff, - DT_VALRNGHI = 0x6ffffdff, - DT_VALNUM = 12, - - DT_ADDRRNGLO = 0x6ffffe00, - DT_GNU_HASH = 0x6ffffef5, - DT_TLSDESC_PLT = 0x6ffffef6, - DT_TLSDESC_GOT = 0x6ffffef7, - DT_GNU_CONFLICT = 0x6ffffef8, - DT_GNU_LIBLIST = 0x6ffffef9, - DT_CONFIG = 0x6ffffefa, - DT_DEPAUDIT = 0x6ffffefb, - DT_AUDIT = 0x6ffffefc, - DT_PLTPAD = 0x6ffffefd, - DT_MOVETAB = 0x6ffffefe, - DT_SYMINFO = 0x6ffffeff, - DT_ADDRRNGHI = 0x6ffffeff, - DT_ADDRNUM = 11, - - DT_VERSYM = 0x6ffffff0, - - DT_RELACOUNT = 0x6ffffff9, - DT_RELCOUNT = 0x6ffffffa, - - DT_FLAGS_1 = 0x6ffffffb, - DT_VERDEF = 0x6ffffffc, - - DT_VERDEFNUM = 0x6ffffffd, - DT_VERNEED = 0x6ffffffe, - - DT_VERNEEDNUM = 0x6fffffff, - DT_VERSIONTAGNUM = 16, - - DT_AUXILIARY = 0x7ffffffd, - DT_FILTER = 0x7fffffff, - DT_EXTRANUM = 3, - - DT_SPARC_REGISTER = 0x70000001, - DT_SPARC_NUM = 2, - - DT_MIPS_RLD_VERSION = 0x70000001, - DT_MIPS_TIME_STAMP = 0x70000002, - DT_MIPS_ICHECKSUM = 0x70000003, - DT_MIPS_IVERSION = 0x70000004, - DT_MIPS_FLAGS = 0x70000005, - DT_MIPS_BASE_ADDRESS = 0x70000006, - DT_MIPS_MSYM = 0x70000007, - DT_MIPS_CONFLICT = 0x70000008, - DT_MIPS_LIBLIST = 0x70000009, - DT_MIPS_LOCAL_GOTNO = 0x7000000a, - DT_MIPS_CONFLICTNO = 0x7000000b, - DT_MIPS_LIBLISTNO = 0x70000010, - DT_MIPS_SYMTABNO = 0x70000011, - DT_MIPS_UNREFEXTNO = 0x70000012, - DT_MIPS_GOTSYM = 0x70000013, - DT_MIPS_HIPAGENO = 0x70000014, - DT_MIPS_RLD_MAP = 0x70000016, - DT_MIPS_DELTA_CLASS = 0x70000017, - DT_MIPS_DELTA_CLASS_NO = 0x70000018, - - DT_MIPS_DELTA_INSTANCE = 0x70000019, - DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a, - - DT_MIPS_DELTA_RELOC = 0x7000001b, - DT_MIPS_DELTA_RELOC_NO = 0x7000001c, - - DT_MIPS_DELTA_SYM = 0x7000001d, - - DT_MIPS_DELTA_SYM_NO = 0x7000001e, - - DT_MIPS_DELTA_CLASSSYM = 0x70000020, - - DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021, - - DT_MIPS_CXX_FLAGS = 0x70000022, - DT_MIPS_PIXIE_INIT = 0x70000023, - DT_MIPS_SYMBOL_LIB = 0x70000024, - DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025, - DT_MIPS_LOCAL_GOTIDX = 0x70000026, - DT_MIPS_HIDDEN_GOTIDX = 0x70000027, - DT_MIPS_PROTECTED_GOTIDX = 0x70000028, - DT_MIPS_OPTIONS = 0x70000029, - DT_MIPS_INTERFACE = 0x7000002a, - DT_MIPS_DYNSTR_ALIGN = 0x7000002b, - DT_MIPS_INTERFACE_SIZE = 0x7000002c, - DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d, - - DT_MIPS_PERF_SUFFIX = 0x7000002e, - - DT_MIPS_COMPACT_SIZE = 0x7000002f, - DT_MIPS_GP_VALUE = 0x70000030, - DT_MIPS_AUX_DYNAMIC = 0x70000031, - - DT_MIPS_PLTGOT = 0x70000032, - - DT_MIPS_RWPLT = 0x70000034, - DT_MIPS_RLD_MAP_REL = 0x70000035, - DT_MIPS_NUM = 0x36, - - DT_ALPHA_PLTRO = (DT_LOPROC + 0), - DT_ALPHA_NUM = 1, - - DT_PPC_GOT = (DT_LOPROC + 0), - DT_PPC_OPT = (DT_LOPROC + 1), - DT_PPC_NUM = 2, - - DT_PPC64_GLINK = (DT_LOPROC + 0), - DT_PPC64_OPD = (DT_LOPROC + 1), - DT_PPC64_OPDSZ = (DT_LOPROC + 2), - DT_PPC64_OPT = (DT_LOPROC + 3), - DT_PPC64_NUM = 4, - - DT_IA_64_PLT_RESERVE = (DT_LOPROC + 0), - DT_IA_64_NUM = 1, -} ElfDynamicEntryTag; - -STRUCT(ElfDynamicEntry) -{ - ElfDynamicEntryTag tag; - union - { - u64 address; - s64 value; - }; -}; - -typedef enum ELFSectionType : u32 -{ - ELF_SECTION_NULL = 0X00, - ELF_SECTION_PROGRAM = 0X01, - ELF_SECTION_SYMBOL_TABLE = 0X02, - ELF_SECTION_STRING_TABLE = 0X03, - ELF_SECTION_RELOCATION_WITH_ADDENDS = 0X04, - ELF_SECTION_SYMBOL_HASH_TABLE = 0X05, - ELF_SECTION_DYNAMIC = 0X06, - ELF_SECTION_NOTE = 0X07, - ELF_SECTION_BSS = 0X08, - ELF_SECTION_RELOCATION_NO_ADDENDS = 0X09, - ELF_SECTION_LIB = 0X0A, // RESERVED - ELF_SECTION_DYNAMIC_SYMBOL_TABLE = 0X0B, - ELF_SECTION_INIT_ARRAY = 0X0E, - ELF_SECTION_FINI_ARRAY = 0X0F, - ELF_SECTION_PREINIT_ARRAY = 0X10, - ELF_SECTION_GROUP = 0X11, - ELF_SECTION_SYMBOL_TABLE_SECTION_HEADER_INDEX = 0X12, - ELF_SECTION_GNU_HASH = 0x6ffffff6, - ELF_SECTION_GNU_VERDEF = 0x6ffffffd, - ELF_SECTION_GNU_VERNEED = 0x6ffffffe, - ELF_SECTION_GNU_VERSYM = 0x6fffffff, - -} ELFSectionType; - -// fn String elf_section_type_to_string(ELFSectionType type) -// { -// switch (type) -// { -// case_to_name(ELF_SECTION_, NULL); -// case_to_name(ELF_SECTION_, PROGRAM); -// case_to_name(ELF_SECTION_, SYMBOL_TABLE); -// case_to_name(ELF_SECTION_, STRING_TABLE); -// case_to_name(ELF_SECTION_, RELOCATION_WITH_ADDENDS); -// case_to_name(ELF_SECTION_, SYMBOL_HASH_TABLE); -// case_to_name(ELF_SECTION_, DYNAMIC); -// case_to_name(ELF_SECTION_, NOTE); -// case_to_name(ELF_SECTION_, BSS); -// case_to_name(ELF_SECTION_, RELOCATION_NO_ADDENDS); -// case_to_name(ELF_SECTION_, LIB); -// case_to_name(ELF_SECTION_, DYNAMIC_SYMBOL_TABLE); -// case_to_name(ELF_SECTION_, INIT_ARRAY); -// case_to_name(ELF_SECTION_, FINI_ARRAY); -// case_to_name(ELF_SECTION_, PREINIT_ARRAY); -// case_to_name(ELF_SECTION_, GROUP); -// case_to_name(ELF_SECTION_, SYMBOL_TABLE_SECTION_HEADER_INDEX); -// case_to_name(ELF_SECTION_, GNU_HASH); -// case_to_name(ELF_SECTION_, GNU_VERDEF); -// case_to_name(ELF_SECTION_, GNU_VERNEED); -// case_to_name(ELF_SECTION_, GNU_VERSYM); -// break; -// } -// } - -STRUCT(ELFSectionHeaderFlags) -{ - u64 write:1; - u64 alloc:1; - u64 executable:1; - u64 blank:1; - u64 merge:1; - u64 strings:1; - u64 info_link:1; - u64 link_order:1; - u64 os_non_conforming:1; - u64 group:1; - u64 tls:1; - u64 reserved:53; -}; -static_assert(sizeof(ELFSectionHeaderFlags) == sizeof(u64)); - -STRUCT(ELFSectionHeader) -{ - u32 name_offset; - ELFSectionType type; - ELFSectionHeaderFlags flags; - u64 address; - u64 offset; - u64 size; - u32 link; - u32 info; - u64 alignment; - u64 entry_size; -}; -static_assert(sizeof(ELFSectionHeader) == 64); -decl_vb(ELFSectionHeader); - -typedef enum ElfProgramHeaderType : u32 -{ - PT_NULL = 0, - PT_LOAD = 1, - PT_DYNAMIC = 2, - PT_INTERP = 3, - PT_NOTE = 4, - PT_SHLIB = 5, - PT_PHDR = 6, - PT_TLS = 7, - PT_GNU_EH_FRAME = 0x6474e550, /* GCC .eh_frame_hdr segment */ - PT_GNU_STACK = 0x6474e551, /* Indicates stack executability */ - PT_GNU_RELRO = 0x6474e552, /* Read-only after relocation */ - PT_GNU_PROPERTY = 0x6474e553, /* GNU property */ - PT_GNU_SFRAME = 0x6474e554, /* SFrame segment. */ -} ElfProgramHeaderType; - -STRUCT(ElfProgramHeaderFlags) -{ - u32 executable:1; - u32 writeable:1; - u32 readable:1; - u32 reserved:29; -}; - -STRUCT(ElfProgramHeader) -{ - ElfProgramHeaderType type; - ElfProgramHeaderFlags flags; - u64 offset; - u64 virtual_address; - u64 physical_address; - u64 file_size; - u64 memory_size; - u64 alignment; -}; -static_assert(sizeof(ElfProgramHeader) == 0x38); -declare_slice(ElfProgramHeader); -decl_vb(ElfProgramHeader); - -typedef enum ELFBitCount : u8 -{ - bits32 = 1, - bits64 = 2, -} ELFBitCount; - -typedef enum ELFEndianness : u8 -{ - little = 1, - big = 2, -} ELFEndianness; - -typedef enum ELFAbi : u8 -{ - ELF_ABI_SYSTEM_V = 0, - ELF_ABI_LINUX = 3, -} ELFAbi; - -typedef enum ELFType : u16 -{ - none = 0, - relocatable = 1, - executable = 2, - shared = 3, - core = 4, -} ELFType; - -typedef enum ELFMachine : u16 -{ - x86_64 = 0x3e, - aarch64 = 0xb7, -} ELFMachine; - -typedef enum ELFSectionIndex : u16 -{ - ELF_SECTION_UNDEFINED = 0, - ELF_SECTION_ABSOLUTE = 0xfff1, - ELF_SECTION_COMMON = 0xfff2, -} ELFSectionIndex; - -STRUCT(ELFVersionRequirement) -{ - u16 version; - u16 count; - u32 name_offset; - u32 aux_offset; - u32 next; -}; - -STRUCT(ELFVersionRequirementEntry) -{ - u32 hash; - u16 flags; - u16 index; - u32 name_offset; - u32 next; -}; - -STRUCT(ELFVersionDefinition) -{ - u16 version; - u16 flags; - u16 index; - u16 count; - u32 hash; - u32 aux_offset; - u32 next; -}; -static_assert(sizeof(ELFVersionDefinition) == 20); -STRUCT(ELFVersionDefinitionEntry) -{ - u32 name_offset; - u32 next; -}; - -STRUCT(ELFHeader) -{ - u8 identifier[4]; - ELFBitCount bit_count; - ELFEndianness endianness; - u8 format_version; - ELFAbi abi; - u8 abi_version; - u8 padding[7]; - ELFType type; - ELFMachine machine; - u32 version; - u64 entry_point; - u64 program_header_offset; - u64 section_header_offset; - u32 flags; - u16 elf_header_size; - u16 program_header_size; - u16 program_header_count; - u16 section_header_size; - u16 section_header_count; - u16 section_header_string_table_index; -}; -static_assert(sizeof(ELFHeader) == 0x40); - -typedef enum ELFSymbolBinding : u8 -{ - ELF_SYMBOL_BINDING_LOCAL = 0, - ELF_SYMBOL_BINDING_GLOBAL = 1, - ELF_SYMBOL_BINDING_WEAK = 2, -} ELFSymbolBinding; - -typedef enum ELFSymbolType : u8 -{ - ELF_SYMBOL_TYPE_NONE = 0, - ELF_SYMBOL_TYPE_OBJECT = 1, - ELF_SYMBOL_TYPE_FUNCTION = 2, - ELF_SYMBOL_TYPE_SECTION = 3, - ELF_SYMBOL_TYPE_FILE = 4, - ELF_SYMBOL_TYPE_COMMON = 5, - ELF_SYMBOL_TYPE_TLS = 6, -} ELFSymbolType; - -typedef enum ELFSymbolVisibility : u8 -{ - ELF_SYMBOL_VISIBILITY_DEFAULT = 0, - ELF_SYMBOL_VISIBILITY_INTERNAL = 1, - ELF_SYMBOL_VISIBILITY_HIDDEN = 2, - ELF_SYMBOL_VISIBILITY_PROTECTED = 3, -} ELFSymbolVisibility; - -STRUCT(ELFSymbol) -{ - u32 name_offset; - ELFSymbolType type:4; - ELFSymbolBinding binding:4; - ELFSymbolVisibility visibility; - u16 section_index; // In the section header table - u64 value; - u64 size; -}; -decl_vb(ELFSymbol); -static_assert(sizeof(ELFSymbol) == 24); - -STRUCT(ElfGnuHashHeader) -{ - u32 bucket_count; - u32 symbol_offset; - u32 bloom_size; - u32 bloom_shift; -}; - -typedef enum RelocationType_x86_64 : u32 -{ - R_X86_64_NONE= 0, /* No reloc */ - R_X86_64_64= 1, /* Direct 64 bit */ - R_X86_64_PC32= 2, /* PC relative 32 bit signed */ - R_X86_64_GOT32= 3, /* 32 bit GOT entry */ - R_X86_64_PLT32 = 4, /* 32 bit PLT address */ - R_X86_64_COPY = 5, /* Copy symbol at runtime */ - R_X86_64_GLOB_DAT = 6, /* Create GOT entry */ - R_X86_64_JUMP_SLOT = 7, /* Create PLT entry */ - R_X86_64_RELATIVE = 8, /* Adjust by program base */ - R_X86_64_GOTPCREL = 9, /* 32 bit signed PC relative offset to GOT */ - R_X86_64_32 = 10, /* Direct 32 bit zero extended */ - R_X86_64_32S = 11, /* Direct 32 bit sign extended */ - R_X86_64_16 = 12, /* Direct 16 bit zero extended */ - R_X86_64_PC16 = 13, /* 16 bit sign extended pc relative */ - R_X86_64_8 = 14, /* Direct 8 bit sign extended */ - R_X86_64_PC8 = 15, /* 8 bit sign extended pc relative */ - R_X86_64_DTPMOD64 = 16, /* ID of module containing symbol */ - R_X86_64_DTPOFF64 = 17, /* Offset in module's TLS block */ - R_X86_64_TPOFF64 = 18, /* Offset in initial TLS block */ - R_X86_64_TLSGD = 19, /* 32 bit signed PC relative offset to two GOT entries for GD symbol */ - R_X86_64_TLSLD = 20, /* 32 bit signed PC relative offset to two GOT entries for LD symbol */ - R_X86_64_DTPOFF32 = 21, /* Offset in TLS block */ - R_X86_64_GOTTPOFF = 22, /* 32 bit signed PC relative offset to GOT entry for IE symbol */ - R_X86_64_TPOFF32 = 23, /* Offset in initial TLS block */ - R_X86_64_PC64 = 24, /* PC relative 64 bit */ - R_X86_64_GOTOFF64 = 25, /* 64 bit offset to GOT */ - R_X86_64_GOTPC32 = 26, /* 32 bit signed pc relative offset to GOT */ - R_X86_64_GOT64 = 27, /* 64-bit GOT entry offset */ - R_X86_64_GOTPCREL64 = 28, /* 64-bit PC relative offset to GOT entry */ - R_X86_64_GOTPC64 = 29, /* 64-bit PC relative offset to GOT */ - R_X86_64_GOTPLT64 = 30 , /* like GOT64, says PLT entry needed */ - R_X86_64_PLTOFF64 = 31, /* 64-bit GOT relative offset to PLT entry */ - R_X86_64_SIZE32 = 32, /* Size of symbol plus 32-bit addend */ - R_X86_64_SIZE64 = 33, /* Size of symbol plus 64-bit addend */ - R_X86_64_GOTPC32_TLSDESC = 34, /* GOT offset for TLS descriptor. */ - R_X86_64_TLSDESC_CALL = 35, /* Marker for call through TLS descriptor. */ - R_X86_64_TLSDESC = 36, /* TLS descriptor. */ - R_X86_64_IRELATIVE = 37, /* Adjust indirectly by program base */ - R_X86_64_RELATIVE64 = 38, /* 64-bit adjust by program base */ - /* 39 Reserved was R_X86_64_PC32_BND */ - /* 40 Reserved was R_X86_64_PLT32_BND */ - R_X86_64_GOTPCRELX = 41, /* Load from 32 bit signed pc relative offset to GOT entry without REX prefix, relaxable. */ - R_X86_64_REX_GOTPCRELX = 42, /* Load from 32 bit signed pc relative offset to GOT entry with REX prefix, relaxable. */ - R_X86_64_NUM = 43, -} RelocationType_x86_64; - -typedef enum RelocationType_aarch64 : u32 -{ - // Null relocation codes - R_AARCH64_NONE = 0, // None - R_AARCH64_withdrawn = 256, // Treat as R_AARCH64_NONE - - // Static relocations - R_AARCH64_ABS64 = 257, // S + A - R_AARCH64_ABS32 = 258, // S + A - R_AARCH64_ABS16 = 259, // S + A - R_AARCH64_PREL64 = 260, // S + A - P - R_AARCH64_PREL32 = 261, // S + A - P - R_AARCH64_PREL16 = 262, // S + A - P - R_AARCH64_MOVW_UABS_G0 = 263, // S + A - R_AARCH64_MOVW_UABS_G0_NC = 264, // S + A - R_AARCH64_MOVW_UABS_G1 = 265, // S + A - R_AARCH64_MOVW_UABS_G1_NC = 266, // S + A - R_AARCH64_MOVW_UABS_G2 = 267, // S + A - R_AARCH64_MOVW_UABS_G2_NC = 268, // S + A - R_AARCH64_MOVW_UABS_G3 = 269, // S + A - R_AARCH64_MOVW_SABS_G0 = 270, // S + A - R_AARCH64_MOVW_SABS_G1 = 271, // S + A - R_AARCH64_MOVW_SABS_G2 = 272, // S + A - R_AARCH64_LD_PREL_LO19 = 273, // S + A - P - R_AARCH64_ADR_PREL_LO21 = 274, // S + A - P - R_AARCH64_ADR_PREL_PG_HI21 = 275, // Page(S+A) - Page(P) - R_AARCH64_ADR_PREL_PG_HI21_NC = 276, // Page(S+A) - Page(P) - R_AARCH64_ADD_ABS_LO12_NC = 277, // S + A - R_AARCH64_LDST8_ABS_LO12_NC = 278, // S + A - R_AARCH64_TSTBR14 = 279, // S + A - P - R_AARCH64_CONDBR19 = 280, // S + A - P - R_AARCH64_JUMP26 = 282, // S + A - P - R_AARCH64_CALL26 = 283, // S + A - P - R_AARCH64_LDST16_ABS_LO12_NC = 284, // S + A - R_AARCH64_LDST32_ABS_LO12_NC = 285, // S + A - R_AARCH64_LDST64_ABS_LO12_NC = 286, // S + A - R_AARCH64_MOVW_PREL_G0 = 287, // S + A - P - R_AARCH64_MOVW_PREL_G0_NC = 288, // S + A - P - R_AARCH64_MOVW_PREL_G1 = 289, // S + A - P - R_AARCH64_MOVW_PREL_G1_NC = 290, // S + A - P - R_AARCH64_MOVW_PREL_G2 = 291, // S + A - P - R_AARCH64_MOVW_PREL_G2_NC = 292, // S + A - P - R_AARCH64_MOVW_PREL_G3 = 293, // S + A - P - R_AARCH64_LDST128_ABS_LO12_NC = 299, // S + A - R_AARCH64_MOVW_GOTOFF_G0 = 300, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G0_NC = 301, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G1 = 302, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G1_NC = 303, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G2 = 304, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G2_NC = 305, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G3 = 306, // G(GDAT(S+A))-GOT - R_AARCH64_GOTREL64 = 307, // S + A - GOT - R_AARCH64_GOTREL32 = 308, // S + A - GOT - R_AARCH64_GOT_LD_PREL19 = 309, // G(GDAT(S+A))-P - R_AARCH64_LD64_GOTOFF_LO15 = 310, // G(GDAT(S+A))-GOT - R_AARCH64_ADR_GOT_PAGE = 311, // Page(G(GDAT(S+A)))-Page(P) - R_AARCH64_LD64_GOT_LO12_NC = 312, // G(GDAT(S+A)) - R_AARCH64_LD64_GOTPAGE_LO15 = 313, // G(GDAT(S+A))-Page(GOT) - - // Relocations for thread-local storage - R_AARCH64_TLSGD_ADR_PREL21 = 512, // G(GTLSIDX(S,A)) - P - R_AARCH64_TLSGD_ADR_PAGE21 = 513, // Page(G(GTLSIDX(S,A)))-Page(P) - R_AARCH64_TLSGD_ADD_LO12_NC = 514, // G(GTLSICX(S,A)) - R_AARCH64_TLSGD_MOVW_G1 = 515, // G(GTLSIDX(S,A)) - GOT - R_AARCH64_TLSGD_MOVW_G0_NC = 516, // G(GTLSIDX(S,A)) - GOT - - R_AARCH64_TLSLD_ADR_PREL21 = 517, // G(GLDM(S)) - P - R_AARCH64_TLSLD_ADR_PAGE21 = 518, // Page(G(GLDM(S))) - Page(P) - R_AARCH64_TLSLD_ADD_LO12_NC = 519, // G(GLDM(S)) - R_AARCH64_TLSLD_MOVW_G1 = 520, // G(GLDM(S)) - GOT - R_AARCH64_TLSLD_MOVW_G0_NC = 521, // G(GLDM(S)) - GOT - R_AARCH64_TLSLD_LD_PREL19 = 522, // G(GLDM(S)) - P - R_AARCH64_TLSLD_MOVW_DTPREL_G2 = 523, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G1 = 524, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC = 525, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G0 = 526, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC = 527, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_HI12 = 528, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_LO12 = 529, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC = 530, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST8_DTPREL_LO12 = 531, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC = 532, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST16_DTPREL_LO12 = 533, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 534, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST32_DTPREL_LO12 = 535, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 536, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST64_DTPREL_LO12 = 537, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 538, // DTPREL(S+A) - R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 = 539, // G(GTPREL(S+A)) - GOT - R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC = 540, // G(GTPREL(S+A)) - GOT - R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 541, // Page(G(GTPREL(S+A)))-Page(P) - R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 542, // G(GTPREL(S+A)) - R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 = 543, // G(GTPREL(S+A)) - P - R_AARCH64_TLSLE_MOVW_TPREL_G2 = 544, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G1 = 545, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G1_NC = 546, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G0_NC = 548, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_HI12 = 549, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_LO12 = 550, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_LO12_NC = 551, // TPREL(S+A) - R_AARCH64_TLSLE_LDST8_TPREL_LO12 = 552, // TPREL(S+A) - R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC = 553, // TPREL(S+A) - R_AARCH64_TLSLE_LDST16_TPREL_LO12 = 554, // TPREL(S+A) - R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC = 555, // TPREL(S+A) - R_AARCH64_TLSLE_LDST32_TPREL_LO12 = 556, // TPREL(S+A) - R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC = 557, // TPREL(S+A) - R_AARCH64_TLSLE_LDST64_TPREL_LO12 = 558, // TPREL(S+A) - R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC = 559, // TPREL(S+A) - R_AARCH64_TLSDESC_LD_PREL19 = 560, // G(GTLSDESC(S+A)) - P - R_AARCH64_TLSDESC_ADR_PREL21 = 561, // G(GTLSDESC(S+A)) - P - R_AARCH64_TLSDESC_ADR_PAGE21 = 562, // Page(G(GTLSDESC(S+A)))-Page(P) - R_AARCH64_TLSDESC_LD64_LO12 = 563, // G(GTLSDESC(S+A)) - R_AARCH64_TLSDESC_ADD_LO12 = 564, // G(GTLSDESC(S+A)) - R_AARCH64_TLSDESC_OFF_G1 = 565, // G(GTLSDESC(S+A)) - GOT - R_AARCH64_TLSDESC_OFF_G0_NC = 566, // G(GTLSDESC(S+A)) - GOT - R_AARCH64_TLSDESC_LDR = 567, // None - R_AARCH64_TLSDESC_ADD = 568, // None - R_AARCH64_TLSDESC_CALL = 569, // None - R_AARCH64_TLSLE_LDST128_TPREL_LO12 = 570, // TPREL(S+A) - R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC = 571, // TPREL(S+A) - R_AARCH64_TLSLD_LDST128_DTPREL_LO12 = 572, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC = 573, // DTPREL(S+A) - - // Dynamic relocations - R_AARCH64_COPY = 1024, - R_AARCH64_GLOB_DAT = 1025, // S + A - R_AARCH64_JUMP_SLOT = 1026, // S + A - R_AARCH64_RELATIVE = 1027, // Delta(S) + A - // Note (shenhan): the following 2 relocs are different from elf spec from - // arm. In elf docs, TLS_DTPMOD64 is defined as 1029, TLS_DTPREL64 1028. - // While actually the bfd linker (and the dynamic linker) treates TLS_DTPMOD64 - // as 1028, TLS_DTPREL64 1029. See binutils-gdb/include/elf/aarch64.h. - R_AARCH64_TLS_DTPMOD64 = 1028, // LDM(S) - R_AARCH64_TLS_DTPREL64 = 1029, // DTPREL(S+A) - R_AARCH64_TLS_TPREL64 = 1030, // TPREL(S+A) - R_AARCH64_TLSDESC = 1031, // TLSDESC(S+A) - R_AARCH64_IRELATIVE = 1032, // Indirect(Delta(S) + A) -} RelocationType_aarch64; - -UNION(RelocationType) -{ - RelocationType_x86_64 x86_64; - RelocationType_aarch64 aarch64; -}; - -STRUCT(ElfRelocationWithAddendInfo) -{ - RelocationType type; - u32 symbol; -}; - -STRUCT(ElfRelocationWithAddend) -{ - u64 offset; - ElfRelocationWithAddendInfo info; - u64 addend; -}; - -// Custom ELF structures - -STRUCT(SymbolTable) -{ - VirtualBuffer(ELFSymbol) symbol_table; - VirtualBuffer(u8) string_table; -}; - -// DWARF - -typedef enum DwarfTag : u16 -{ - DW_TAG_array_type = 0x01, - DW_TAG_class_type = 0x02, - DW_TAG_entry_point = 0x03, - DW_TAG_enumeration_type = 0x04, - DW_TAG_formal_parameter = 0x05, - DW_TAG_imported_declaration = 0x08, - DW_TAG_label = 0x0a, - DW_TAG_lexical_block = 0x0b, - DW_TAG_member = 0x0d, - DW_TAG_pointer_type = 0x0f, - DW_TAG_reference_type = 0x10, - DW_TAG_compile_unit = 0x11, - DW_TAG_string_type = 0x12, - DW_TAG_structure_type = 0x13, - DW_TAG_subroutine_type = 0x15, - DW_TAG_typedef = 0x16, - DW_TAG_union_type = 0x17, - DW_TAG_unspecified_parameters = 0x18, - DW_TAG_variant = 0x19, - DW_TAG_common_block = 0x1a, - DW_TAG_common_inclusion = 0x1b, - DW_TAG_inheritance = 0x1c, - DW_TAG_inlined_subroutine = 0x1d, - DW_TAG_module = 0x1e, - DW_TAG_ptr_to_member_type = 0x1f, - DW_TAG_set_type = 0x20, - DW_TAG_subrange_type = 0x21, - DW_TAG_with_stmt = 0x22, - DW_TAG_access_declaration = 0x23, - DW_TAG_base_type = 0x24, - DW_TAG_catch_block = 0x25, - DW_TAG_const_type = 0x26, - DW_TAG_constant = 0x27, - DW_TAG_enumerator = 0x28, - DW_TAG_file_type = 0x29, - DW_TAG_friend = 0x2a, - DW_TAG_namelist = 0x2b, - DW_TAG_namelist_item = 0x2c, - DW_TAG_packed_type = 0x2d, - DW_TAG_subprogram = 0x2e, - DW_TAG_template_type_parameter = 0x2f, - DW_TAG_template_value_parameter = 0x30, - DW_TAG_thrown_type = 0x31, - DW_TAG_try_block = 0x32, - DW_TAG_variant_part = 0x33, - DW_TAG_variable = 0x34, - DW_TAG_volatile_type = 0x35, - DW_TAG_dwarf_procedure = 0x36, - DW_TAG_restrict_type = 0x37, - DW_TAG_interface_type = 0x38, - DW_TAG_namespace = 0x39, - DW_TAG_imported_module = 0x3a, - DW_TAG_unspecified_type = 0x3b, - DW_TAG_partial_unit = 0x3c, - DW_TAG_imported_unit = 0x3d, - DW_TAG_condition = 0x3f, - DW_TAG_shared_type = 0x40, - DW_TAG_type_unit = 0x41, - DW_TAG_rvalue_reference_type = 0x42, - DW_TAG_template_alias = 0x43, - DW_TAG_coarray_type = 0x44, - DW_TAG_generic_subrange = 0x45, - DW_TAG_dynamic_type = 0x46, - DW_TAG_atomic_type = 0x47, - DW_TAG_call_site = 0x48, - DW_TAG_call_site_parameter = 0x49, - DW_TAG_skeleton_unit = 0x4a, - DW_TAG_immutable_type = 0x4b, - DW_TAG_lo_user = 0x4080, - DW_TAG_hi_user = 0xffff, -} DwarfTag; - -typedef enum DwarfOpcode : u8 -{ - DW_LNS_copy = 1, - DW_LNS_advance_pc = 2, - DW_LNS_advance_line = 3, - DW_LNS_set_file = 4, - DW_LNS_set_column = 5, - DW_LNS_negate_stmt = 6, - DW_LNS_set_basic_block = 7, - DW_LNS_const_add_pc = 8, - DW_LNS_fixed_advance_pc = 9, - DW_LNS_set_prologue_end = 10, - DW_LNS_set_epilogue_begin = 11, - DW_LNS_set_isa = 12, -} DwarfOpcode; - -typedef enum DwarfExtendedOpcode : u8 -{ - DW_LNE_end_sequence = 1, - DW_LNE_set_address = 2, - DW_LNE_set_discriminator = 4, -} DwarfExtendedOpcode; - -fn String dwarf_tag_to_string(DwarfTag tag) -{ - switch (tag) - { - case_to_name(DW_TAG_, array_type); - case_to_name(DW_TAG_, class_type); - case_to_name(DW_TAG_, entry_point); - case_to_name(DW_TAG_, enumeration_type); - case_to_name(DW_TAG_, formal_parameter); - case_to_name(DW_TAG_, imported_declaration); - case_to_name(DW_TAG_, label); - case_to_name(DW_TAG_, lexical_block); - case_to_name(DW_TAG_, member); - case_to_name(DW_TAG_, pointer_type); - case_to_name(DW_TAG_, reference_type); - case_to_name(DW_TAG_, compile_unit); - case_to_name(DW_TAG_, string_type); - case_to_name(DW_TAG_, structure_type); - case_to_name(DW_TAG_, subroutine_type); - case_to_name(DW_TAG_, typedef); - case_to_name(DW_TAG_, union_type); - case_to_name(DW_TAG_, unspecified_parameters); - case_to_name(DW_TAG_, variant); - case_to_name(DW_TAG_, common_block); - case_to_name(DW_TAG_, common_inclusion); - case_to_name(DW_TAG_, inheritance); - case_to_name(DW_TAG_, inlined_subroutine); - case_to_name(DW_TAG_, module); - case_to_name(DW_TAG_, ptr_to_member_type); - case_to_name(DW_TAG_, set_type); - case_to_name(DW_TAG_, subrange_type); - case_to_name(DW_TAG_, with_stmt); - case_to_name(DW_TAG_, access_declaration); - case_to_name(DW_TAG_, base_type); - case_to_name(DW_TAG_, catch_block); - case_to_name(DW_TAG_, const_type); - case_to_name(DW_TAG_, constant); - case_to_name(DW_TAG_, enumerator); - case_to_name(DW_TAG_, file_type); - case_to_name(DW_TAG_, friend); - case_to_name(DW_TAG_, namelist); - case_to_name(DW_TAG_, namelist_item); - case_to_name(DW_TAG_, packed_type); - case_to_name(DW_TAG_, subprogram); - case_to_name(DW_TAG_, template_type_parameter); - case_to_name(DW_TAG_, template_value_parameter); - case_to_name(DW_TAG_, thrown_type); - case_to_name(DW_TAG_, try_block); - case_to_name(DW_TAG_, variant_part); - case_to_name(DW_TAG_, variable); - case_to_name(DW_TAG_, volatile_type); - case_to_name(DW_TAG_, dwarf_procedure); - case_to_name(DW_TAG_, restrict_type); - case_to_name(DW_TAG_, interface_type); - case_to_name(DW_TAG_, namespace); - case_to_name(DW_TAG_, imported_module); - case_to_name(DW_TAG_, unspecified_type); - case_to_name(DW_TAG_, partial_unit); - case_to_name(DW_TAG_, imported_unit); - case_to_name(DW_TAG_, condition); - case_to_name(DW_TAG_, shared_type); - case_to_name(DW_TAG_, type_unit); - case_to_name(DW_TAG_, rvalue_reference_type); - case_to_name(DW_TAG_, template_alias); - case_to_name(DW_TAG_, coarray_type); - case_to_name(DW_TAG_, generic_subrange); - case_to_name(DW_TAG_, dynamic_type); - case_to_name(DW_TAG_, atomic_type); - case_to_name(DW_TAG_, call_site); - case_to_name(DW_TAG_, call_site_parameter); - case_to_name(DW_TAG_, skeleton_unit); - case_to_name(DW_TAG_, immutable_type); - case_to_name(DW_TAG_, lo_user); - case_to_name(DW_TAG_, hi_user); - } -} - -typedef enum DwarfAttribute : u16 -{ - DW_AT_sibling = 0x01, // reference - DW_AT_location = 0x02, // exprloc, loclist - DW_AT_name = 0x03, // string - DW_AT_ordering = 0x09, // constant - DW_AT_byte_size = 0x0b, // constant, exprloc, reference - DW_AT_bit_size = 0x0d, // constant, exprloc, reference - DW_AT_stmt_list = 0x10, // lineptr - DW_AT_low_pc = 0x11, // address - DW_AT_high_pc = 0x12, // address, constant - DW_AT_language = 0x13, // constant - DW_AT_discr = 0x15, //reference - DW_AT_discr_value = 0x16, // constant - DW_AT_visibility = 0x17, // constant - DW_AT_import = 0x18, // reference - DW_AT_string_length = 0x19, // exprloc, loclist, reference - DW_AT_common_reference = 0x1a, // reference - DW_AT_comp_dir = 0x1b, // string - DW_AT_const_value = 0x1c, // block, constant, string - DW_AT_containing_type = 0x1d, // reference - DW_AT_default_value = 0x1e, // constant, reference, flag - DW_AT_inline = 0x20, // constant - DW_AT_is_optional = 0x21, // flag - DW_AT_lower_bound = 0x22, // constant, exprloc, reference - DW_AT_producer = 0x25, // string - DW_AT_prototyped = 0x27, // flag - DW_AT_return_addr = 0x2a, // exprloc, loclist - DW_AT_start_scope = 0x2c, // constant, rnglist - DW_AT_bit_stride = 0x2e, // constant, exprloc, reference - DW_AT_upper_bound = 0x2f, // constant, exprloc, reference - DW_AT_abstract_origin = 0x31, // reference - DW_AT_accessibility = 0x32, // constant - DW_AT_address_class = 0x33, // constant - DW_AT_artificial = 0x34, // flag - DW_AT_base_types = 0x35, // reference - DW_AT_calling_convention = 0x36, // constant - DW_AT_count = 0x37, // constant, exprloc, reference - DW_AT_data_member_location = 0x38, // constant, exprloc, loclist - DW_AT_decl_column = 0x39, // constant - DW_AT_decl_file = 0x3a, // constant - DW_AT_decl_line = 0x3b, // constant - DW_AT_declaration = 0x3c, // flag - DW_AT_discr_list = 0x3d, // block - DW_AT_encoding = 0x3e, // constant - DW_AT_external = 0x3f, // flag - DW_AT_frame_base = 0x40, // exprloc, loclist - DW_AT_friend = 0x41, // reference - DW_AT_identifier_case = 0x42, // constant - Reserved = 0x433, // macptr - DW_AT_namelist_item = 0x44, // reference - DW_AT_priority = 0x45, // reference - DW_AT_segment = 0x46, // exprloc, loclist - DW_AT_specification = 0x47, // reference - DW_AT_static_link = 0x48, // exprloc, loclist - DW_AT_type = 0x49, // reference - DW_AT_use_location = 0x4a, // exprloc, loclist - DW_AT_variable_parameter = 0x4b, //flag - DW_AT_virtuality = 0x4c, // constant - DW_AT_vtable_elem_location = 0x4d, // exprloc, loclist - DW_AT_allocated = 0x4e, // constant, exprloc, reference - DW_AT_associated = 0x4f, // constant, exprloc, reference - DW_AT_data_location = 0x50, // exprloc - DW_AT_byte_stride = 0x51, // constant, exprloc, reference - DW_AT_entry_pc = 0x52, // address, constant - DW_AT_use_UTF8 = 0x53, // flag - DW_AT_extension = 0x54, // reference - DW_AT_ranges = 0x55, // rnglist - DW_AT_trampoline = 0x56, // address, flag, reference, string - DW_AT_call_column = 0x57, // constant - DW_AT_call_file = 0x58, // constant - DW_AT_call_line = 0x59, // constant - DW_AT_description = 0x5a, // string - DW_AT_binary_scale = 0x5b, // constant - DW_AT_decimal_scale = 0x5c, // constant - DW_AT_small = 0x5d, // reference - DW_AT_decimal_sign = 0x5e, // constant - DW_AT_digit_count = 0x5f, // constant - DW_AT_picture_string = 0x60, // string - DW_AT_mutable = 0x61, // flag - DW_AT_threads_scaled = 0x62, // flag - DW_AT_explicit = 0x63, // flag - DW_AT_object_pointer = 0x64, // reference - DW_AT_endianity = 0x65, // constant - DW_AT_elemental = 0x66, // flag - DW_AT_pure = 0x67, // flag - DW_AT_recursive = 0x68, // flag - DW_AT_signature = 0x69, // reference - DW_AT_main_subprogram = 0x6a, // flag - DW_AT_data_bit_offset = 0x6b, // constant - DW_AT_const_expr = 0x6c, // flag - DW_AT_enum_class = 0x6d, // flag - DW_AT_linkage_name = 0x6e, // string - DW_AT_string_length_bit_size = 0x6f, //constant - DW_AT_string_length_byte_size = 0x70, //constant - DW_AT_rank = 0x71, //constant, exprloc - DW_AT_str_offsets_base = 0x72, //stroffsetsptr - DW_AT_addr_base = 0x73, //addrptr - DW_AT_rnglists_base = 0x74, //rnglistsptr - DW_AT_dwo_name = 0x76, //string - DW_AT_reference = 0x77, //flag - DW_AT_rvalue_reference = 0x78, //flag - DW_AT_macros = 0x79, //macptr - DW_AT_call_all_calls = 0x7a, //flag - DW_AT_call_all_source_calls = 0x7b, //flag - DW_AT_call_all_tail_calls = 0x7c, //flag - DW_AT_call_return_pc = 0x7d, //address - DW_AT_call_value = 0x7e, //exprloc - DW_AT_call_origin = 0x7f, //exprloc - DW_AT_call_parameter = 0x80, //reference - DW_AT_call_pc = 0x81, //address - DW_AT_call_tail_call = 0x82, //flag - DW_AT_call_target = 0x83, //exprloc - DW_AT_call_target_clobbered = 0x84, //exprloc - DW_AT_call_data_location = 0x85, //exprloc - DW_AT_call_data_value = 0x86, //exprloc - DW_AT_noreturn = 0x87, //flag - DW_AT_alignment = 0x88, //constant - DW_AT_export_symbols = 0x89, //flag - DW_AT_deleted = 0x8a, //flag - DW_AT_defaulted = 0x8b, //constant - DW_AT_loclists_base = 0x8c, //loclistsptr - DW_AT_lo_user = 0x2000, - DW_AT_hi_user = 0x3fff, -} DwarfAttribute; - -String dwarf_attribute_to_string(DwarfAttribute attribute) -{ - switch (attribute) - { - case_to_name(DW_AT_, sibling); - case_to_name(DW_AT_, location); - case_to_name(DW_AT_, name); - case_to_name(DW_AT_, ordering); - case_to_name(DW_AT_, byte_size); - case_to_name(DW_AT_, bit_size); - case_to_name(DW_AT_, stmt_list); - case_to_name(DW_AT_, low_pc); - case_to_name(DW_AT_, high_pc); - case_to_name(DW_AT_, language); - case_to_name(DW_AT_, discr); - case_to_name(DW_AT_, discr_value); - case_to_name(DW_AT_, visibility); - case_to_name(DW_AT_, import); - case_to_name(DW_AT_, string_length); - case_to_name(DW_AT_, common_reference); - case_to_name(DW_AT_, comp_dir); - case_to_name(DW_AT_, const_value); - case_to_name(DW_AT_, containing_type); - case_to_name(DW_AT_, default_value); - case_to_name(DW_AT_, inline); - case_to_name(DW_AT_, is_optional); - case_to_name(DW_AT_, lower_bound); - case_to_name(DW_AT_, producer); - case_to_name(DW_AT_, prototyped); - case_to_name(DW_AT_, return_addr); - case_to_name(DW_AT_, start_scope); - case_to_name(DW_AT_, bit_stride); - case_to_name(DW_AT_, upper_bound); - case_to_name(DW_AT_, abstract_origin); - case_to_name(DW_AT_, accessibility); - case_to_name(DW_AT_, address_class); - case_to_name(DW_AT_, artificial); - case_to_name(DW_AT_, base_types); - case_to_name(DW_AT_, calling_convention); - case_to_name(DW_AT_, count); - case_to_name(DW_AT_, data_member_location); - case_to_name(DW_AT_, decl_column); - case_to_name(DW_AT_, decl_file); - case_to_name(DW_AT_, decl_line); - case_to_name(DW_AT_, declaration); - case_to_name(DW_AT_, discr_list); - case_to_name(DW_AT_, encoding); - case_to_name(DW_AT_, external); - case_to_name(DW_AT_, frame_base); - case_to_name(DW_AT_, friend); - case_to_name(DW_AT_, identifier_case); - case_to_name(Reserv, ed); - case_to_name(DW_AT_, namelist_item); - case_to_name(DW_AT_, priority); - case_to_name(DW_AT_, segment); - case_to_name(DW_AT_, specification); - case_to_name(DW_AT_, static_link); - case_to_name(DW_AT_, type); - case_to_name(DW_AT_, use_location); - case_to_name(DW_AT_, variable_parameter); - case_to_name(DW_AT_, virtuality); - case_to_name(DW_AT_, vtable_elem_location); - case_to_name(DW_AT_, allocated); - case_to_name(DW_AT_, associated); - case_to_name(DW_AT_, data_location); - case_to_name(DW_AT_, byte_stride); - case_to_name(DW_AT_, entry_pc); - case_to_name(DW_AT_, use_UTF8); - case_to_name(DW_AT_, extension); - case_to_name(DW_AT_, ranges); - case_to_name(DW_AT_, trampoline); - case_to_name(DW_AT_, call_column); - case_to_name(DW_AT_, call_file); - case_to_name(DW_AT_, call_line); - case_to_name(DW_AT_, description); - case_to_name(DW_AT_, binary_scale); - case_to_name(DW_AT_, decimal_scale); - case_to_name(DW_AT_, small); - case_to_name(DW_AT_, decimal_sign); - case_to_name(DW_AT_, digit_count); - case_to_name(DW_AT_, picture_string); - case_to_name(DW_AT_, mutable); - case_to_name(DW_AT_, threads_scaled); - case_to_name(DW_AT_, explicit); - case_to_name(DW_AT_, object_pointer); - case_to_name(DW_AT_, endianity); - case_to_name(DW_AT_, elemental); - case_to_name(DW_AT_, pure); - case_to_name(DW_AT_, recursive); - case_to_name(DW_AT_, signature); - case_to_name(DW_AT_, main_subprogram); - case_to_name(DW_AT_, data_bit_offset); - case_to_name(DW_AT_, const_expr); - case_to_name(DW_AT_, enum_class); - case_to_name(DW_AT_, linkage_name); - case_to_name(DW_AT_, string_length_bit_size); - case_to_name(DW_AT_, string_length_byte_size); - case_to_name(DW_AT_, rank); - case_to_name(DW_AT_, str_offsets_base); - case_to_name(DW_AT_, addr_base); - case_to_name(DW_AT_, rnglists_base); - case_to_name(DW_AT_, dwo_name); - case_to_name(DW_AT_, reference); - case_to_name(DW_AT_, rvalue_reference); - case_to_name(DW_AT_, macros); - case_to_name(DW_AT_, call_all_calls); - case_to_name(DW_AT_, call_all_source_calls); - case_to_name(DW_AT_, call_all_tail_calls); - case_to_name(DW_AT_, call_return_pc); - case_to_name(DW_AT_, call_value); - case_to_name(DW_AT_, call_origin); - case_to_name(DW_AT_, call_parameter); - case_to_name(DW_AT_, call_pc); - case_to_name(DW_AT_, call_tail_call); - case_to_name(DW_AT_, call_target); - case_to_name(DW_AT_, call_target_clobbered); - case_to_name(DW_AT_, call_data_location); - case_to_name(DW_AT_, call_data_value); - case_to_name(DW_AT_, noreturn); - case_to_name(DW_AT_, alignment); - case_to_name(DW_AT_, export_symbols); - case_to_name(DW_AT_, deleted); - case_to_name(DW_AT_, defaulted); - case_to_name(DW_AT_, loclists_base); - case_to_name(DW_AT_, lo_user); - case_to_name(DW_AT_, hi_user); - } -} - -typedef enum DwarfForm : u8 -{ - DW_FORM_addr = 0x01, // address - DW_FORM_block2 = 0x03, // block - DW_FORM_block4 = 0x04, // block - DW_FORM_data2 = 0x05, // constant - DW_FORM_data4 = 0x06, // constant - DW_FORM_data8 = 0x07, // constant - DW_FORM_string = 0x08, // string - DW_FORM_block = 0x09, // block - DW_FORM_block1 = 0x0a, // block - DW_FORM_data1 = 0x0b, // constant - DW_FORM_flag = 0x0c, // flag - DW_FORM_sdata = 0x0d, // constant - DW_FORM_strp = 0x0e, // string - DW_FORM_udata = 0x0f, // constant - DW_FORM_ref_addr = 0x10, // reference - DW_FORM_ref1 = 0x11, // reference - DW_FORM_ref2 = 0x12, // reference - DW_FORM_ref4 = 0x13, // reference - DW_FORM_ref8 = 0x14, // reference - DW_FORM_ref_udata = 0x15, // reference - DW_FORM_indirect = 0x16, // (see Section 7.5.3 on page 203) - DW_FORM_sec_offset = 0x17, // addrptr, lineptr, loclist, loclistsptr, macptr, rnglist, rnglistsptr, stroffsetsptr - DW_FORM_exprloc = 0x18, // exprloc - DW_FORM_flag_present = 0x19, // flag - DW_FORM_strx = 0x1a, // string - DW_FORM_addrx = 0x1b, // address - DW_FORM_ref_sup4 = 0x1c, // reference - DW_FORM_strp_sup = 0x1d, // string - DW_FORM_data16 = 0x1e, // constant - DW_FORM_line_strp = 0x1f, // string - DW_FORM_ref_sig8 = 0x20, // reference - DW_FORM_implicit_const = 0x21, // constant - DW_FORM_loclistx = 0x22, // loclist - DW_FORM_rnglistx = 0x23, // rnglist - DW_FORM_ref_sup8 = 0x24, // reference - DW_FORM_strx1 = 0x25, // string - DW_FORM_strx2 = 0x26, // string - DW_FORM_strx3 = 0x27, // string - DW_FORM_strx4 = 0x28, // string - DW_FORM_addrx1 = 0x29, // address - DW_FORM_addrx2 = 0x2a, // address - DW_FORM_addrx3 = 0x2b, // address - DW_FORM_addrx4 = 0x2c, // address -} DwarfForm; - -fn String dwarf_form_to_string(DwarfForm form) -{ - switch (form) - { - case_to_name(DW_FORM_, addr); - case_to_name(DW_FORM_, block2); - case_to_name(DW_FORM_, block4); - case_to_name(DW_FORM_, data2); - case_to_name(DW_FORM_, data4); - case_to_name(DW_FORM_, data8); - case_to_name(DW_FORM_, string); - case_to_name(DW_FORM_, block); - case_to_name(DW_FORM_, block1); - case_to_name(DW_FORM_, data1); - case_to_name(DW_FORM_, flag); - case_to_name(DW_FORM_, sdata); - case_to_name(DW_FORM_, strp); - case_to_name(DW_FORM_, udata); - case_to_name(DW_FORM_, ref_addr); - case_to_name(DW_FORM_, ref1); - case_to_name(DW_FORM_, ref2); - case_to_name(DW_FORM_, ref4); - case_to_name(DW_FORM_, ref8); - case_to_name(DW_FORM_, ref_udata); - case_to_name(DW_FORM_, indirect); - case_to_name(DW_FORM_, sec_offset); - case_to_name(DW_FORM_, exprloc); - case_to_name(DW_FORM_, flag_present); - case_to_name(DW_FORM_, strx); - case_to_name(DW_FORM_, addrx); - case_to_name(DW_FORM_, ref_sup4); - case_to_name(DW_FORM_, strp_sup); - case_to_name(DW_FORM_, data16); - case_to_name(DW_FORM_, line_strp); - case_to_name(DW_FORM_, ref_sig8); - case_to_name(DW_FORM_, implicit_const); - case_to_name(DW_FORM_, loclistx); - case_to_name(DW_FORM_, rnglistx); - case_to_name(DW_FORM_, ref_sup8); - case_to_name(DW_FORM_, strx1); - case_to_name(DW_FORM_, strx2); - case_to_name(DW_FORM_, strx3); - case_to_name(DW_FORM_, strx4); - case_to_name(DW_FORM_, addrx1); - case_to_name(DW_FORM_, addrx2); - case_to_name(DW_FORM_, addrx3); - case_to_name(DW_FORM_, addrx4); - } -} - -typedef enum DwarfUnitType : u8 -{ - DW_UT_compile = 0x01, - DW_UT_type = 0x02, - DW_UT_partial = 0x03, - DW_UT_skeleton = 0x04, - DW_UT_split_compile = 0x05, - DW_UT_split_type = 0x06, - DW_UT_lo_user = 0x80, - DW_UT_hi_user = 0xff, -} DwarfUnitType; - -typedef enum DwarfLanguage : u16 -{ - DW_LANG_C11 = 0x001d, -} DwarfLanguage; - -typedef enum DwarfOperation : u8 -{ - DW_OP_addr = 0x03, // Operands: 1 - DW_OP_deref = 0x06, // Operands: 0 - DW_OP_const1u = 0x08, // Operands: 1 - DW_OP_const1s = 0x09, // Operands: 1 - DW_OP_const2u = 0x0a, // Operands: 1 - DW_OP_const2s = 0x0b, // Operands: 1 - DW_OP_const4u = 0x0c, // Operands: 1 - DW_OP_const4s = 0x0d, // Operands: 1 - DW_OP_const8u = 0x0e, // Operands: 1 - DW_OP_const8s = 0x0f, // Operands: 1 - DW_OP_constu = 0x10, // Operands: 1, uleb128 - DW_OP_consts = 0x11, // Operands: 1 sleb128 - DW_OP_dup = 0x12, // Operands: 0 - DW_OP_drop = 0x13, // Operands: 0 - DW_OP_over = 0x14, // Operands: 0 - DW_OP_pick = 0x15, // Operands: 1, 1-byte stack index - DW_OP_swap = 0x16, // Operands: 0 - DW_OP_rot = 0x17, // Operands: 0 - DW_OP_xderef = 0x18, // Operands: 0 - DW_OP_abs = 0x19, // Operands: 0 - DW_OP_and = 0x1a , // Operands: 0 - DW_OP_div = 0x1b, // Operands: 0 - DW_OP_minus = 0x1c, // Operands: 0 - DW_OP_mod = 0x1d, // Operands: 0 - DW_OP_mul = 0x1e, // Operands: 0 - DW_OP_neg = 0x1f, // Operands: 0 - DW_OP_not = 0x20, // Operands: 0 - DW_OP_or = 0x21, // Operands: 0 - DW_OP_plus = 0x22, // Operands: 0 - DW_OP_plus_uconst = 0x23, // Operands: 1, ULEB128 addend - DW_OP_shl = 0x24, // Operands: 0 - DW_OP_shr = 0x25, // Operands: 0 - DW_OP_shra = 0x26, // Operands: 0 - DW_OP_xor = 0x27, // Operands: 0 - DW_OP_bra = 0x28, // Operands: 1, signed 2-byte constant - DW_OP_eq = 0x29, // Operands: 0 - DW_OP_ge = 0x2a, // Operands: 0 - DW_OP_gt = 0x2b, // Operands: 0 - DW_OP_le = 0x2c, // Operands: 0 - DW_OP_lt = 0x2d, // Operands: 0 - DW_OP_ne = 0x2e, // Operands: 0 - DW_OP_skip = 0x2f, // Operands: 1, signed 2-byte constant - DW_OP_lit0 = 0x30, // Operands: 0 - DW_OP_lit1 = 0x31, // Operands: 0 - DW_OP_lit2 = 0x32, // Operands: 0 - DW_OP_lit3 = 0x33, // Operands: 0 - DW_OP_lit4 = 0x34, // Operands: 0 - DW_OP_lit5 = 0x35, // Operands: 0 - DW_OP_lit6 = 0x36, // Operands: 0 - DW_OP_lit7 = 0x37, // Operands: 0 - DW_OP_lit8 = 0x38, // Operands: 0 - DW_OP_lit9 = 0x39, // Operands: 0 - DW_OP_lit10 = 0x3a, // Operands: 0 - DW_OP_lit11 = 0x3b, // Operands: 0 - DW_OP_lit12 = 0x3c, // Operands: 0 - DW_OP_lit13 = 0x3d, // Operands: 0 - DW_OP_lit14 = 0x3e, // Operands: 0 - DW_OP_lit15 = 0x3f, // Operands: 0 - DW_OP_lit16 = 0x40, // Operands: 0 - DW_OP_lit17 = 0x41, // Operands: 0 - DW_OP_lit18 = 0x42, // Operands: 0 - DW_OP_lit19 = 0x43, // Operands: 0 - DW_OP_lit20 = 0x44, // Operands: 0 - DW_OP_lit21 = 0x45, // Operands: 0 - DW_OP_lit22 = 0x46, // Operands: 0 - DW_OP_lit23 = 0x47, // Operands: 0 - DW_OP_lit24 = 0x48, // Operands: 0 - DW_OP_lit25 = 0x49, // Operands: 0 - DW_OP_lit26 = 0x4a, // Operands: 0 - DW_OP_lit27 = 0x4b, // Operands: 0 - DW_OP_lit28 = 0x4c, // Operands: 0 - DW_OP_lit29 = 0x4d, // Operands: 0 - DW_OP_lit30 = 0x4e, // Operands: 0 - DW_OP_lit31 = 0x4f, // Operands: 0 - DW_OP_reg0 = 0x50, // Operands: 0 - DW_OP_reg1 = 0x51, // Operands: 0 - DW_OP_reg2 = 0x52, // Operands: 0 - DW_OP_reg3 = 0x53, // Operands: 0 - DW_OP_reg4 = 0x54, // Operands: 0 - DW_OP_reg5 = 0x55, // Operands: 0 - DW_OP_reg6 = 0x56, // Operands: 0 - DW_OP_reg7 = 0x57, // Operands: 0 - DW_OP_reg8 = 0x58, // Operands: 0 - DW_OP_reg9 = 0x59, // Operands: 0 - DW_OP_reg10 = 0x5a, // Operands: 0 - DW_OP_reg11 = 0x5b, // Operands: 0 - DW_OP_reg12 = 0x5c, // Operands: 0 - DW_OP_reg13 = 0x5d, // Operands: 0 - DW_OP_reg14 = 0x5e, // Operands: 0 - DW_OP_reg15 = 0x5f, // Operands: 0 - DW_OP_reg16 = 0x60, // Operands: 0 - DW_OP_reg17 = 0x61, // Operands: 0 - DW_OP_reg18 = 0x62, // Operands: 0 - DW_OP_reg19 = 0x63, // Operands: 0 - DW_OP_reg20 = 0x64, // Operands: 0 - DW_OP_reg21 = 0x65, // Operands: 0 - DW_OP_reg22 = 0x66, // Operands: 0 - DW_OP_reg23 = 0x67, // Operands: 0 - DW_OP_reg24 = 0x68, // Operands: 0 - DW_OP_reg25 = 0x69, // Operands: 0 - DW_OP_reg26 = 0x6a, // Operands: 0 - DW_OP_reg27 = 0x6b, // Operands: 0 - DW_OP_reg28 = 0x6c, // Operands: 0 - DW_OP_reg29 = 0x6d, // Operands: 0 - DW_OP_reg30 = 0x6e, // Operands: 0 - DW_OP_reg31 = 0x6f, // Operands: 0 - DW_OP_breg0 = 0x70, // Operands: 1, SLEB128 offset - DW_OP_breg1 = 0x71, // Operands: 1, SLEB128 offset - DW_OP_breg2 = 0x72, // Operands: 1, SLEB128 offset - DW_OP_breg3 = 0x73, // Operands: 1, SLEB128 offset - DW_OP_breg4 = 0x74, // Operands: 1, SLEB128 offset - DW_OP_breg5 = 0x75, // Operands: 1, SLEB128 offset - DW_OP_breg6 = 0x76, // Operands: 1, SLEB128 offset - DW_OP_breg7 = 0x77, // Operands: 1, SLEB128 offset - DW_OP_breg8 = 0x78, // Operands: 1, SLEB128 offset - DW_OP_breg9 = 0x79, // Operands: 1, SLEB128 offset - DW_OP_breg10 = 0x7a, // Operands: 1, SLEB128 offset - DW_OP_breg11 = 0x7b, // Operands: 1, SLEB128 offset - DW_OP_breg12 = 0x7c, // Operands: 1, SLEB128 offset - DW_OP_breg13 = 0x7d, // Operands: 1, SLEB128 offset - DW_OP_breg14 = 0x7e, // Operands: 1, SLEB128 offset - DW_OP_breg15 = 0x7f, // Operands: 1, SLEB128 offset - DW_OP_breg16 = 0x80, // Operands: 1, SLEB128 offset - DW_OP_breg17 = 0x81, // Operands: 1, SLEB128 offset - DW_OP_breg18 = 0x82, // Operands: 1, SLEB128 offset - DW_OP_breg19 = 0x83, // Operands: 1, SLEB128 offset - DW_OP_breg20 = 0x84, // Operands: 1, SLEB128 offset - DW_OP_breg21 = 0x85, // Operands: 1, SLEB128 offset - DW_OP_breg22 = 0x86, // Operands: 1, SLEB128 offset - DW_OP_breg23 = 0x87, // Operands: 1, SLEB128 offset - DW_OP_breg24 = 0x88, // Operands: 1, SLEB128 offset - DW_OP_breg25 = 0x89, // Operands: 1, SLEB128 offset - DW_OP_breg26 = 0x8a, // Operands: 1, SLEB128 offset - DW_OP_breg27 = 0x8b, // Operands: 1, SLEB128 offset - DW_OP_breg28 = 0x8c, // Operands: 1, SLEB128 offset - DW_OP_breg29 = 0x8d, // Operands: 1, SLEB128 offset - DW_OP_breg30 = 0x8e, // Operands: 1, SLEB128 offset - DW_OP_breg31 = 0x8f, // Operands: 1, SLEB128 offset - DW_OP_regx = 0x90, // Operands: 1, ULEB128 register - DW_OP_fbreg = 0x91, // Operands: 1, SLEB128 offset - DW_OP_bregx = 0x92, // Operands: 2 ULEB128 register, SLEB128 offset - DW_OP_piece = 0x93, // Operands: 1, ULEB128 size of piece - DW_OP_deref_size = 0x94, // Operands: 1, 1-byte size of data retrieved - DW_OP_xderef_size = 0x95, // Operands: 1, 1-byte size of data retrieved - DW_OP_nop = 0x96, // Operands: 0 - DW_OP_push_object_address = 0x97, // Operands: 0 - DW_OP_call2 = 0x98, // Operands: 1, 2-byte offset of DIE - DW_OP_call4 = 0x99, // Operands: 1, 4-byte offset of DIE - DW_OP_call_ref = 0x9a, // Operands: 1, 4- or 8-byte offset of DIE - DW_OP_form_tls_address = 0x9b, // Operands: 0 - DW_OP_call_frame_cfa = 0x9c, // Operands: 0 - DW_OP_bit_piece = 0x9d, // Operands: 2, ULEB128 size, ULEB128 offset - DW_OP_implicit_value = 0x9e, // Operands: 2, ULEB128 size, block of that size - DW_OP_stack_value = 0x9f, // Operands: 0 - DW_OP_implicit_pointer = 0xa0, // Operands: 2, 4- or 8-byte offset of DIE, SLEB128 constant offset - DW_OP_addrx = 0xa1, // Operands: 1, ULEB128 indirect address - DW_OP_constx = 0xa2, // Operands: 1, ULEB128 indirect constant - DW_OP_entry_value = 0xa3, // Operands: 2, ULEB128 size, block of that size - DW_OP_const_type = 0xa4, // Operands: 3, ULEB128 type entry offset, 1-byte size, constant value - DW_OP_regval_type = 0xa5, // Operands: 2, ULEB128 register number, ULEB128 constant offset - DW_OP_deref_type = 0xa6, // Operands: 2, 1-byte size, ULEB128 type entry offset - DW_OP_xderef_type = 0xa7, // Operands: 2, 1-byte size, ULEB128 type entry offset - DW_OP_convert = 0xa8, // Operands: 1, ULEB128 type entry offset - DW_OP_reinterpret = 0xa9, // Operands: 1, ULEB128 type entry offset - DW_OP_lo_user = 0xe0, - DW_OP_hi_user = 0xff, -} DwarfOperation; - -typedef enum DwarfCallFrame : u8 -{ - // High 2 Low 6 - // Instruction Bits Bits Operand 1 Operand 2 - // DW_CFA_advance_loc 0x1 delta - // DW_CFA_offset 0x2 register ULEB128 offset - // DW_CFA_restore 0x3 register - DW_CFA_nop = 0x00, - DW_CFA_set_loc = 0x01, // address - DW_CFA_advance_loc1 = 0x02, // 1-byte delta - DW_CFA_advance_loc2 = 0x03, // 2-byte delta - DW_CFA_advance_loc4 = 0x04, // 4-byte delta - DW_CFA_offset_extended = 0x05, // ULEB128 register ULEB128 offset - DW_CFA_restore_extended = 0x06, // ULEB128 register - DW_CFA_undefined = 0x07, // ULEB128 register - DW_CFA_same_value = 0x08, // ULEB128 register - DW_CFA_register = 0x09, // ULEB128 register ULEB128 offset - DW_CFA_remember_state = 0x0a, - DW_CFA_restore_state = 0x0b, - DW_CFA_def_cfa = 0x0c, // ULEB128 register ULEB128 offset - DW_CFA_def_cfa_register = 0x0d, // ULEB128 register - DW_CFA_def_cfa_offset = 0x0e, // ULEB128 offset - DW_CFA_def_cfa_expression = 0x0f, // BLOCK - DW_CFA_expression = 0x10, // ULEB128 register BLOCK - DW_CFA_offset_extended_sf = 0x11, // ULEB128 register SLEB128 offset - DW_CFA_def_cfa_sf = 0x12, // ULEB128 register SLEB128 offset - DW_CFA_def_cfa_offset_sf = 0x13, // SLEB128 offset - DW_CFA_val_offset = 0x14, // ULEB128 ULEB128 - DW_CFA_val_offset_sf = 0x15, // ULEB128 SLEB128 - DW_CFA_val_expression = 0x16, // ULEB128 BLOCK - DW_CFA_lo_user = 0x1c, - DW_CFA_hi_user -} DwarfCallFrame; - -String dwarf_operation_to_string(DwarfOperation operation) -{ - switch (operation) - { - case_to_name(DW_OP_, addr); - case_to_name(DW_OP_, deref); - case_to_name(DW_OP_, const1u); - case_to_name(DW_OP_, const1s); - case_to_name(DW_OP_, const2u); - case_to_name(DW_OP_, const2s); - case_to_name(DW_OP_, const4u); - case_to_name(DW_OP_, const4s); - case_to_name(DW_OP_, const8u); - case_to_name(DW_OP_, const8s); - case_to_name(DW_OP_, constu); - case_to_name(DW_OP_, consts); - case_to_name(DW_OP_, dup); - case_to_name(DW_OP_, drop); - case_to_name(DW_OP_, over); - case_to_name(DW_OP_, pick); - case_to_name(DW_OP_, swap); - case_to_name(DW_OP_, rot); - case_to_name(DW_OP_, xderef); - case_to_name(DW_OP_, abs); - case_to_name(DW_OP_, and); - case_to_name(DW_OP_, div); - case_to_name(DW_OP_, minus); - case_to_name(DW_OP_, mod); - case_to_name(DW_OP_, mul); - case_to_name(DW_OP_, neg); - case_to_name(DW_OP_, not); - case_to_name(DW_OP_, or); - case_to_name(DW_OP_, plus); - case_to_name(DW_OP_, plus_uconst); - case_to_name(DW_OP_, shl); - case_to_name(DW_OP_, shr); - case_to_name(DW_OP_, shra); - case_to_name(DW_OP_, xor); - case_to_name(DW_OP_, bra); - case_to_name(DW_OP_, eq); - case_to_name(DW_OP_, ge); - case_to_name(DW_OP_, gt); - case_to_name(DW_OP_, le); - case_to_name(DW_OP_, lt); - case_to_name(DW_OP_, ne); - case_to_name(DW_OP_, skip); - case_to_name(DW_OP_, lit0); - case_to_name(DW_OP_, lit1); - case_to_name(DW_OP_, lit2); - case_to_name(DW_OP_, lit3); - case_to_name(DW_OP_, lit4); - case_to_name(DW_OP_, lit5); - case_to_name(DW_OP_, lit6); - case_to_name(DW_OP_, lit7); - case_to_name(DW_OP_, lit8); - case_to_name(DW_OP_, lit9); - case_to_name(DW_OP_, lit10); - case_to_name(DW_OP_, lit11); - case_to_name(DW_OP_, lit12); - case_to_name(DW_OP_, lit13); - case_to_name(DW_OP_, lit14); - case_to_name(DW_OP_, lit15); - case_to_name(DW_OP_, lit16); - case_to_name(DW_OP_, lit17); - case_to_name(DW_OP_, lit18); - case_to_name(DW_OP_, lit19); - case_to_name(DW_OP_, lit20); - case_to_name(DW_OP_, lit21); - case_to_name(DW_OP_, lit22); - case_to_name(DW_OP_, lit23); - case_to_name(DW_OP_, lit24); - case_to_name(DW_OP_, lit25); - case_to_name(DW_OP_, lit26); - case_to_name(DW_OP_, lit27); - case_to_name(DW_OP_, lit28); - case_to_name(DW_OP_, lit29); - case_to_name(DW_OP_, lit30); - case_to_name(DW_OP_, lit31); - case_to_name(DW_OP_, reg0); - case_to_name(DW_OP_, reg1); - case_to_name(DW_OP_, reg2); - case_to_name(DW_OP_, reg3); - case_to_name(DW_OP_, reg4); - case_to_name(DW_OP_, reg5); - case_to_name(DW_OP_, reg6); - case_to_name(DW_OP_, reg7); - case_to_name(DW_OP_, reg8); - case_to_name(DW_OP_, reg9); - case_to_name(DW_OP_, reg10); - case_to_name(DW_OP_, reg11); - case_to_name(DW_OP_, reg12); - case_to_name(DW_OP_, reg13); - case_to_name(DW_OP_, reg14); - case_to_name(DW_OP_, reg15); - case_to_name(DW_OP_, reg16); - case_to_name(DW_OP_, reg17); - case_to_name(DW_OP_, reg18); - case_to_name(DW_OP_, reg19); - case_to_name(DW_OP_, reg20); - case_to_name(DW_OP_, reg21); - case_to_name(DW_OP_, reg22); - case_to_name(DW_OP_, reg23); - case_to_name(DW_OP_, reg24); - case_to_name(DW_OP_, reg25); - case_to_name(DW_OP_, reg26); - case_to_name(DW_OP_, reg27); - case_to_name(DW_OP_, reg28); - case_to_name(DW_OP_, reg29); - case_to_name(DW_OP_, reg30); - case_to_name(DW_OP_, reg31); - case_to_name(DW_OP_, breg0); - case_to_name(DW_OP_, breg1); - case_to_name(DW_OP_, breg2); - case_to_name(DW_OP_, breg3); - case_to_name(DW_OP_, breg4); - case_to_name(DW_OP_, breg5); - case_to_name(DW_OP_, breg6); - case_to_name(DW_OP_, breg7); - case_to_name(DW_OP_, breg8); - case_to_name(DW_OP_, breg9); - case_to_name(DW_OP_, breg10); - case_to_name(DW_OP_, breg11); - case_to_name(DW_OP_, breg12); - case_to_name(DW_OP_, breg13); - case_to_name(DW_OP_, breg14); - case_to_name(DW_OP_, breg15); - case_to_name(DW_OP_, breg16); - case_to_name(DW_OP_, breg17); - case_to_name(DW_OP_, breg18); - case_to_name(DW_OP_, breg19); - case_to_name(DW_OP_, breg20); - case_to_name(DW_OP_, breg21); - case_to_name(DW_OP_, breg22); - case_to_name(DW_OP_, breg23); - case_to_name(DW_OP_, breg24); - case_to_name(DW_OP_, breg25); - case_to_name(DW_OP_, breg26); - case_to_name(DW_OP_, breg27); - case_to_name(DW_OP_, breg28); - case_to_name(DW_OP_, breg29); - case_to_name(DW_OP_, breg30); - case_to_name(DW_OP_, breg31); - case_to_name(DW_OP_, regx); - case_to_name(DW_OP_, fbreg); - case_to_name(DW_OP_, bregx); - case_to_name(DW_OP_, piece); - case_to_name(DW_OP_, deref_size); - case_to_name(DW_OP_, xderef_size); - case_to_name(DW_OP_, nop); - case_to_name(DW_OP_, push_object_address); - case_to_name(DW_OP_, call2); - case_to_name(DW_OP_, call4); - case_to_name(DW_OP_, call_ref); - case_to_name(DW_OP_, form_tls_address); - case_to_name(DW_OP_, call_frame_cfa); - case_to_name(DW_OP_, bit_piece); - case_to_name(DW_OP_, implicit_value); - case_to_name(DW_OP_, stack_value); - case_to_name(DW_OP_, implicit_pointer); - case_to_name(DW_OP_, addrx); - case_to_name(DW_OP_, constx); - case_to_name(DW_OP_, entry_value); - case_to_name(DW_OP_, const_type); - case_to_name(DW_OP_, regval_type); - case_to_name(DW_OP_, deref_type); - case_to_name(DW_OP_, xderef_type); - case_to_name(DW_OP_, convert); - case_to_name(DW_OP_, reinterpret); - case_to_name(DW_OP_, lo_user); - case_to_name(DW_OP_, hi_user); - } -} - -// Packing is necessary due to the last fields not completing the alignment of 4 -#pragma pack(push, 1) -STRUCT(DwarfLineHeader) -{ - u32 unit_length; - u16 version; - u8 address_size; - u8 segment_selector_size; - u32 header_length; - u8 minimum_instruction_length; - u8 maximum_operations_per_instruction; - u8 default_is_stmt; - s8 line_base; - u8 line_range; - u8 opcode_base; -}; -#pragma pack(pop) - -STRUCT(DwarfCompilationUnit) -{ - u32 length; - u16 version; - DwarfUnitType type; - u8 address_size; - u32 debug_abbreviation_offset; -}; - -STRUCT(DwarfStringOffsetsTableHeader) -{ - u32 unit_length; - u16 version; - u16 reserved; -}; - -STRUCT(DwarfAddressTableHeader) -{ - u32 unit_length; - u16 version; - u8 address_size; - u8 segment_selector_size; -}; - -typedef enum DwarfType : u8 -{ - DW_ATE_void = 0x00, - DW_ATE_address = 0x01, - DW_ATE_boolean = 0x02, - DW_ATE_complex_float = 0x03, - DW_ATE_float = 0x04, - DW_ATE_signed = 0x05, - DW_ATE_signed_char = 0x06, - DW_ATE_unsigned = 0x07, - DW_ATE_unsigned_char = 0x08, -} DwarfType; - -typedef enum TypeId : u32 -{ - // Simple types - TYPE_BOTTOM = 0, - TYPE_TOP, - TYPE_LIVE_CONTROL, - TYPE_DEAD_CONTROL, - // Not simple types - TYPE_INTEGER, - TYPE_TUPLE, - - TYPE_COUNT, -} TypeId; - -STRUCT(TypeIndex) -{ - u32 index; -}; - -#define index_equal(a, b) (a.index == b.index) -static_assert(sizeof(TypeIndex) == sizeof(u32)); -declare_slice(TypeIndex); - -STRUCT(TypeInteger) -{ - u64 constant; - u8 bit_count; - u8 is_constant; - u8 is_signed; - u8 padding1; - u32 padding; -}; -static_assert(sizeof(TypeInteger) == 16); - -STRUCT(TypeTuple) -{ - Slice(TypeIndex) types; -}; - -STRUCT(Type) -{ - Hash64 hash; - union - { - TypeInteger integer; - TypeTuple tuple; - }; - TypeId id; -}; -static_assert(offsetof(Type, hash) == 0); -decl_vb(Type); - -STRUCT(DebugTypeIndex) -{ - u32 index; -}; - -STRUCT(DebugTypeInteger) -{ - u8 bit_count:7; - u8 signedness:1; -}; - -typedef enum DebugTypeId : u8 -{ - DEBUG_TYPE_VOID = 0, - DEBUG_TYPE_INTEGER, -} DebugTypeId; - -STRUCT(DebugType) -{ - union - { - DebugTypeInteger integer; - }; - DebugTypeId id; -}; -decl_vb(DebugType); -declare_ip(DebugType); - -typedef enum BackendTypeId : u8 -{ - BACKEND_TYPE_VOID = 0x00, - BACKEND_TYPE_INTEGER_8 = 0x01, - BACKEND_TYPE_INTEGER_16 = 0x02, - BACKEND_TYPE_INTEGER_32 = 0x03, - BACKEND_TYPE_INTEGER_64 = 0x03, - BACKEND_TYPE_POINTER = 0x04, - BACKEND_TYPE_SCALAR_LAST = BACKEND_TYPE_POINTER, - BACKEND_TYPE_TUPLE, - BACKEND_TYPE_MEMORY, - BACKEND_TYPE_CONTROL, - BACKEND_TYPE_REGION, -} BackendTypeId; - -STRUCT(TypePair) -{ - u32 raw; -}; -decl_vb(TypePair); -global_variable const TypePair type_pair_invalid; - -global_variable const u32 debug_mask = 0xffffff; - -fn TypePair type_pair_make(DebugTypeIndex debug_type, BackendTypeId backend_type) -{ - u32 value = backend_type; - value <<= 24; - auto debug_raw = *(u32*)&debug_type; - assert(debug_raw <= debug_mask); - value |= debug_raw; - - return (TypePair){ .raw = value }; -} - -// fn DebugTypeIndex type_pair_get_debug(TypePair type_pair) -// { -// return (DebugTypeIndex) { -// .index = type_pair.raw & debug_mask, -// }; -// } - -fn BackendTypeId type_pair_get_backend(TypePair type_pair) -{ - return type_pair.raw >> 24; -} - -STRUCT(NodeIndex) -{ - u32 index; -}; -declare_slice(NodeIndex); -decl_vb(NodeIndex); - -STRUCT(Function) -{ - String name; - NodeIndex root; - TypePair return_type; - u32 line; - u32 column; -}; -decl_vb(Function); - -typedef enum NodeId : u8 -{ - IR_ROOT, - IR_PROJECTION, - IR_RETURN, - IR_REGION, - IR_PHI, - IR_SYMBOL_TABLE, - - // Binary integer - IR_INTEGER_ADD, - IR_INTEGER_SUBSTRACT, - IR_INTEGER_MULTIPLY, - IR_INTEGER_DIVIDE, - IR_INTEGER_REMAINDER, - - IR_INTEGER_SHIFT_LEFT, - IR_INTEGER_SHIFT_RIGHT, - IR_INTEGER_AND, - IR_INTEGER_OR, - IR_INTEGER_XOR, - - IR_INTEGER_COMPARE_EQUAL, - IR_INTEGER_COMPARE_NOT_EQUAL, - - // Unary integer - IR_INTEGER_NEGATION, - - IR_INTEGER_CONSTANT, - - MACHINE_COPY, - MACHINE_MOVE, - MACHINE_JUMP, - - NODE_COUNT, -} NodeId; - -// struct NodeCFG -// { -// s32 immediate_dominator_tree_depth; -// s32 loop_depth; -// s32 anti_dependency; -// }; -// typedef struct NodeCFG NodeCFG; - -// struct NodeConstant -// { -// TypeIndex type; -// }; -// typedef struct NodeConstant NodeConstant; -// -// struct NodeStart -// { -// // NodeCFG cfg; -// TypeIndex arguments; -// Function* function; -// }; -// typedef struct NodeStart NodeStart; -// -// // struct NodeStop -// // { -// // // NodeCFG cfg; -// // }; -// // typedef struct NodeStop NodeStop; -// -// struct ScopePair -// { -// StringMap values; -// StringMap types; -// }; -// typedef struct ScopePair ScopePair; -// -// struct StackScope -// { -// ScopePair* pointer; -// u32 length; -// u32 capacity; -// }; -// typedef struct StackScope StackScope; -// -// struct NodeScope -// { -// StackScope stack; -// }; -// typedef struct NodeScope NodeScope; -// -// -// struct NodeControlProjection -// { -// NodeProjection projection; -// // NodeCFG cfg; -// }; -// typedef struct NodeControlProjection NodeControlProjection; -// -// struct NodeReturn -// { -// // NodeCFG cfg; -// }; -// typedef struct NodeReturn NodeReturn; -// -// struct NodeDeadControl -// { -// // NodeCFG cfg; -// }; -// typedef struct NodeDeadControl NodeDeadControl; -STRUCT(NodeProjection) -{ - u32 index; -}; - -STRUCT(NodeRoot) -{ - u32 function_index; -}; - -STRUCT(NodeRegion) -{ - NodeIndex in_mem; -}; - -UNION(NodeIntegerConstant) -{ - s64 signed_value; - u64 unsigned_value; -}; - -STRUCT(RegisterMaskIndex) -{ - u32 index; -}; -declare_slice(RegisterMaskIndex); - -STRUCT(NodeMachineCopy) -{ - RegisterMaskIndex use_mask; - RegisterMaskIndex def_mask; -}; - -STRUCT(Node) -{ - u32 input_offset; - u32 output_offset; - u16 output_count; - u16 input_count; - u16 input_capacity; - u16 output_capacity; - TypePair type; - NodeId id:8; - u32 interned:1; - u32 reserved:23; - NodeIndex next_free; - - union - { - NodeProjection projection; - NodeRoot root; - NodeRegion region; - NodeIntegerConstant integer_constant; - NodeMachineCopy machine_copy; - }; - // union - // { - // NodeConstant constant; - // NodeStart start; - // NodeStop stop; - // NodeScope scope; - // NodeControlProjection control_projection; - // NodeProjection projection; - // NodeReturn return_node; - // NodeDeadControl dead_control; - // }; -}; -// See above bitset -static_assert(sizeof(NodeId) == 1); - -declare_slice_p(Node); -decl_vb(Node); -decl_vbp(Node); -declare_ip(Node); - -fn u8 node_is_control_projection(Node* restrict node) -{ - return node->id == IR_PROJECTION && type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE; -} - -fn u8 node_is_cfg_fork(Node* restrict node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case MACHINE_JUMP: - case NODE_COUNT: - return 0; - } -} - -STRUCT(ArrayReference) -{ - u32 offset; - u32 length; -}; -decl_vb(ArrayReference); - -STRUCT(File) -{ - String path; - String source; - // StringMap values; - // StringMap types; -}; - -STRUCT(FunctionBuilder) -{ - Function* function; - File* file; - NodeIndex current; -}; - -typedef u64 BitsetElement; -decl_vb(BitsetElement); -declare_slice(BitsetElement); - -STRUCT(Bitset) -{ - VirtualBuffer(BitsetElement) arr; - u32 length; -}; -const u64 element_bitsize = sizeof(u64) * 8; - -fn u8 bitset_get(Bitset* bitset, u64 index) -{ - auto element_index = index / element_bitsize; - if (element_index < bitset->arr.length) - { - auto bit_index = index % element_bitsize; - u8 result = (bitset->arr.pointer[element_index] & (1 << bit_index)) != 0; - return result; - } - - return 0; -} - -fn void bitset_ensure_length(Bitset* bitset, u64 max) -{ - auto length = (max / element_bitsize) + (max % element_bitsize != 0); - auto old_length = bitset->arr.length; - if (old_length < length) - { - auto new_element_count = cast_to(u32, u64, length - old_length); - unused(vb_add(&bitset->arr, new_element_count)); - } -} - -fn void bitset_set_value(Bitset* bitset, u64 index, u8 value) -{ - bitset_ensure_length(bitset, index + 1); - auto element_index = index / element_bitsize; - auto bit_index = index % element_bitsize; - auto mask = ~((u64)1 << bit_index); - bitset->arr.pointer[element_index] = (bitset->arr.pointer[element_index] & mask) | ((u64)(!!value) << bit_index); - - if (value) - { - bitset->length += 1; - } - else - { - bitset->length -= 1; - } - - assert(bitset_get(bitset, index) == value); -} - -fn void bitset_clear(Bitset* bitset) -{ - memset(bitset->arr.pointer, 0, bitset->arr.capacity); - bitset->arr.length = 0; - bitset->length = 0; -} - -STRUCT(WorkList) -{ - VirtualBuffer(NodeIndex) nodes; - Bitset visited; - Bitset bitset; - u32 mid_assert:1; -}; - -enum -{ - REGISTER_CLASS_STACK = 0, -}; - -typedef enum x86_64_RegisterClass : u8 -{ - REGISTER_CLASS_X86_64_GPR = 1, - REGISTER_CLASS_X86_64_XMM, - REGISTER_CLASS_X86_64_COUNT -} x86_64_RegisterClass; - -const global_variable u8 register_count_per_class[] = { - [0] = 0, - [REGISTER_CLASS_X86_64_GPR] = 16, - [REGISTER_CLASS_X86_64_XMM] = 16, -}; -static_assert(array_length(register_count_per_class) == REGISTER_CLASS_X86_64_COUNT); - -typedef enum GPR : u8 -{ - RAX = 0, - RCX = 1, - RDX = 2, - RBX = 3, - RSP = 4, - RBP = 5, - RSI = 6, - RDI = 7, - - R8 = 8 + 0, - R9 = 8 + 1, - R10 = 8 + 2, - R11 = 8 + 3, - R12 = 8 + 4, - R13 = 8 + 5, - R14 = 8 + 6, - R15 = 8 + 7, - - GPR_NONE = -1 -} GPR; - -typedef enum RegisterMask_x86_64: u8 -{ - REGISTER_MASK_EMPTY = 0, - REGISTER_MASK_GPR = 1, -} RegisterMask_x86_64; -const global_variable auto empty_register_mask = Index(RegisterMask, REGISTER_MASK_EMPTY); - -STRUCT(RegisterMask) -{ - u32 mask; - u32 class:3; - u32 may_spill:1; - u32 reserved:28; -}; -decl_vb(RegisterMask); -declare_ip(RegisterMask); - -STRUCT(Thread) -{ - Arena* arena; - struct - { - VirtualBuffer(Type) types; - VirtualBuffer(Node) nodes; - VirtualBuffer(DebugType) debug_types; - VirtualBuffer(NodeIndex) uses; - VirtualBuffer(ArrayReference) use_free_list; - VirtualBuffer(Function) functions; - VirtualBuffer(u8) string; - VirtualBuffer(RegisterMask) register_masks; - } buffer; - struct - { - InternPool(Node) nodes; - InternPool(DebugType) debug_types; - InternPool(RegisterMask) register_masks; - } interned; - struct - { - NodeIndex nodes; - } free_list; - struct - { - TypeIndex bottom; - TypeIndex top; - TypeIndex live_control; - TypeIndex dead_control; - struct - { - TypeIndex top; - TypeIndex bottom; - TypeIndex zero; - TypeIndex u8; - TypeIndex u16; - TypeIndex u32; - TypeIndex u64; - TypeIndex s8; - TypeIndex s16; - TypeIndex s32; - TypeIndex s64; - } integer; - struct - { - union - { - struct - { - DebugTypeIndex u8; - DebugTypeIndex u16; - DebugTypeIndex u32; - DebugTypeIndex u64; - DebugTypeIndex s8; - DebugTypeIndex s16; - DebugTypeIndex s32; - DebugTypeIndex s64; - }; - DebugTypeIndex array[8]; - } integer; - } debug; - } types; - s64 main_function; - WorkList worklists[8]; - u64 worklist_bitset:3; - u64 reserved:61; -}; - -STRUCT(WorkListHandle) -{ - u8 index:3; - u8 is_valid:1; - u8 reserved:4; -}; - -fn WorkListHandle thread_worklist_acquire(Thread* thread) -{ - u8 bitset = thread->worklist_bitset; - if (bitset) - { - auto index = cast_to(u8, s32, __builtin_ctz(~thread->worklist_bitset)); - thread->worklist_bitset |= (1 << index); - return (WorkListHandle) - { - .index = index, - .is_valid = 1, - }; - } - else - { - thread->worklist_bitset |= (1 << 0); - return (WorkListHandle) - { - .index = 0, - .is_valid = 1, - }; - } -} - -fn u32 thread_worklist_length(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - return thread->worklists[handle.index].nodes.length; -} - -fn NodeIndex thread_worklist_get(Thread* thread, WorkListHandle handle, u32 index) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto* worklist = &thread->worklists[handle.index]; - assert(index < worklist->nodes.length); - return worklist->nodes.pointer[index]; -} - -fn u8 thread_worklist_test(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - - u8 result = 0; - if (validi(node_index)) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - result = bitset_get(&worklist->bitset, geti(node_index)); - } - - return result; -} - -fn u8 thread_worklist_test_and_set(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - auto result = thread_worklist_test(thread, handle, node_index); - if (!result) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - bitset_set_value(&worklist->bitset, geti(node_index), 1); - } - - return result; -} - -fn Node* thread_node_get(Thread* thread, NodeIndex node_index) -{ - assert(validi(node_index)); - auto* node = &thread->buffer.nodes.pointer[geti(node_index)]; - return node; -} - -fn String node_id_to_string(NodeId node_id) -{ - switch (node_id) - { - case_to_name(IR_, ROOT); - case_to_name(IR_, PROJECTION); - case_to_name(IR_, RETURN); - case_to_name(IR_, REGION); - case_to_name(IR_, PHI); - case_to_name(IR_, SYMBOL_TABLE); - case_to_name(IR_, INTEGER_ADD); - case_to_name(IR_, INTEGER_SUBSTRACT); - case_to_name(IR_, INTEGER_MULTIPLY); - case_to_name(IR_, INTEGER_DIVIDE); - case_to_name(IR_, INTEGER_REMAINDER); - case_to_name(IR_, INTEGER_SHIFT_LEFT); - case_to_name(IR_, INTEGER_SHIFT_RIGHT); - case_to_name(IR_, INTEGER_AND); - case_to_name(IR_, INTEGER_OR); - case_to_name(IR_, INTEGER_XOR); - case_to_name(IR_, INTEGER_COMPARE_EQUAL); - case_to_name(IR_, INTEGER_COMPARE_NOT_EQUAL); - case_to_name(IR_, INTEGER_NEGATION); - case_to_name(IR_, INTEGER_CONSTANT); - case_to_name(MACHINE_, COPY); - case_to_name(MACHINE_, MOVE); - case_to_name(MACHINE_, JUMP); - case NODE_COUNT: unreachable(); - break; - } -} - -fn void thread_worklist_push(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - // print("Pushing node #{u32} ({s})\n", geti(node_index), node_id_to_string(thread_node_get(thread, node_index)->id)); - if (!thread_worklist_test_and_set(thread, handle, node_index)) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - *vb_add(&worklist->nodes, 1) = node_index; - } -} - -fn void thread_worklist_push_array(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - assert(handle.is_valid); - - auto* worklist = &thread->worklists[handle.index]; - *vb_add(&worklist->nodes, 1) = node_index; -} - -fn NodeIndex thread_worklist_pop_array(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto result = invalidi(Node); - - assert(handle.is_valid); - auto* worklist = &thread->worklists[handle.index]; - auto len = worklist->nodes.length; - if (len) - { - auto index = len - 1; - result = worklist->nodes.pointer[index]; - worklist->nodes.length = index; - } - - return result; -} - -fn NodeIndex thread_worklist_pop(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto result = invalidi(Node); - - assert(handle.is_valid); - auto* worklist = &thread->worklists[handle.index]; - auto len = worklist->nodes.length; - if (len) - { - auto index = len - 1; - auto node_index = worklist->nodes.pointer[index]; - worklist->nodes.length = index; - bitset_set_value(&worklist->bitset, index, 0); - result = node_index; - } - - return result; -} - -fn void thread_worklist_clear(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto* restrict worklist = &thread->worklists[handle.index]; - - bitset_clear(&worklist->visited); - bitset_clear(&worklist->bitset); - worklist->nodes.length = 0; -} - -// fn void thread_worklist_release(Thread* thread, WorkListHandle* handle) -// { -// thread_worklist_clear(thread, *handle); -// handle->is_valid = 0; -// } - -fn Type* thread_type_get(Thread* thread, TypeIndex type_index) -{ - assert(validi(type_index)); - auto* type = &thread->buffer.types.pointer[geti(type_index)]; - return type; -} - -fn DebugType* thread_debug_type_get(Thread* thread, DebugTypeIndex debug_type_index) -{ - assert(validi(debug_type_index)); - auto* type = &thread->buffer.debug_types.pointer[geti(debug_type_index)]; - return type; -} - -fn RegisterMask* thread_register_mask_get(Thread* thread, RegisterMaskIndex register_mask_index) -{ - assert(validi(register_mask_index)); - auto* register_mask = &thread->buffer.register_masks.pointer[geti(register_mask_index)]; - return register_mask; -} - -fn void thread_node_set_use(Thread* thread, u32 offset, u16 index, NodeIndex new_use) -{ - thread->buffer.uses.pointer[offset + index] = new_use; -} - -// fn NodeIndex thread_node_get_use(Thread* thread, u32 offset, u16 index) -// { -// NodeIndex i = thread->buffer.uses.pointer[offset + index]; -// return i; -// } - -// fn NodeIndex node_input_get(Thread* thread, Node* node, u16 index) -// { -// assert(index < node->input_count); -// NodeIndex result = thread_node_get_use(thread, node->input_offset, index); -// return result; -// } -// -// fn NodeIndex node_output_get(Thread* thread, Node* node, u16 index) -// { -// assert(index < node->output_count); -// NodeIndex result = thread_node_get_use(thread, node->output_offset, index); -// return result; -// } - -// fn NodeIndex scope_get_control(Thread* thread, Node* node) -// { -// assert(node->id == NODE_SCOPE); -// auto control = node_input_get(thread, node, 0); -// return control; -// } - -// fn NodeIndex builder_get_control_node_index(Thread* thread, FunctionBuilder* builder) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto result = scope_get_control(thread, scope_node); -// return result; -// } - -STRUCT(UseReference) -{ - NodeIndex* pointer; - u32 index; -}; - -fn UseReference thread_get_node_reference_array(Thread* thread, u16 count) -{ - u32 free_list_count = thread->buffer.use_free_list.length; - for (u32 i = 0; i < free_list_count; i += 1) - { - if (thread->buffer.use_free_list.pointer[i].length >= count) - { - todo(); - } - } - - u32 index = thread->buffer.uses.length; - auto* node_indices = vb_add(&thread->buffer.uses, count); - return (UseReference) - { - .pointer = node_indices, - .index = index, - }; -} - -fn void node_ensure_capacity(Thread* thread, u32* offset, u16* capacity, u16 current_length, u16 additional) -{ - auto current_offset = *offset; - auto current_capacity = *capacity; - auto desired_capacity = cast_to(u16, u32, current_length + additional); - - if (desired_capacity > current_capacity) - { - auto* ptr = vb_add(&thread->buffer.uses, desired_capacity); - u32 new_offset = cast_to(u32, s64, ptr - thread->buffer.uses.pointer); - memcpy(ptr, &thread->buffer.uses.pointer[current_offset], current_length * sizeof(NodeIndex)); - memset(ptr + current_length, 0, (desired_capacity - current_length) * sizeof(NodeIndex)); - *offset = new_offset; - *capacity = desired_capacity; - } -} - -fn void node_add_one_assume_capacity(Thread* thread, NodeIndex node, u32 offset, u16 capacity, u16* length) -{ - auto index = *length; - assert(index < capacity); - thread->buffer.uses.pointer[offset + index] = node; - *length = index + 1; -} - -fn void node_add_one(Thread* thread, u32* offset, u16* capacity, u16* count, NodeIndex node_index) -{ - node_ensure_capacity(thread, offset, capacity, *count, 1); - node_add_one_assume_capacity(thread, node_index, *offset, *capacity, count); -} - -fn NodeIndex node_add_output(Thread* thread, NodeIndex node_index, NodeIndex output_index) -{ - auto* this_node = thread_node_get(thread, node_index); - node_add_one(thread, &this_node->output_offset, &this_node->output_capacity, &this_node->output_count, output_index); - - return node_index; -} - -// fn NodeIndex intern_pool_remove_node(Thread* thread, NodeIndex node_index); - -fn Slice(NodeIndex) node_get_inputs(Thread* thread, const Node * restrict const node) -{ - auto result = (Slice(NodeIndex)) { - .pointer = &thread->buffer.uses.pointer[node->input_offset], - .length = node->input_count, - }; - return result; -} - -fn Slice(NodeIndex) node_get_outputs(Thread* thread, Node* node) -{ - auto result = (Slice(NodeIndex)) { - .pointer = &thread->buffer.uses.pointer[node->output_offset], - .length = node->output_count, - }; - return result; -} - -fn u8 node_is_constant(const Node* const restrict node) -{ - switch (node->id) - { - case IR_INTEGER_CONSTANT: - return 1; - default: - return 0; - } -} - -fn Hash32 node_hash(Thread* thread, const Node* restrict const node) -{ - Hash32 hash = 0; - hash += node->id; - hash += sizeof(u8); - - auto inputs = node_get_inputs(thread, node); - - // Constants are allowed to live across functions - if (!node_is_constant(node)) - { - u32 valid_input_count = 0; - - for (u16 i = 0; i < inputs.length; i += 1) - { - auto input = inputs.pointer[i]; - if (validi(input)) - { - valid_input_count += 1; - hash += geti(input); - hash += sizeof(input); - } - } - - hash += valid_input_count; - hash += sizeof(u16); - } - - auto* union_start = (u8*)&node->projection; - auto* union_end = union_start + size_until_end(Node, projection); - for (auto* it = union_start; it < union_end; it += 1) - { - hash += *it; - } - hash += union_end - union_start; - - auto result = hash32_fib_end(hash); - return result; -} - -fn Hash32 node_hash_index(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto hash = node_hash(thread, node); - return hash; -} - -fn Hash32 register_mask_hash(Thread* thread, const RegisterMask* const restrict mask) -{ - unused(thread); - static_assert(sizeof(RegisterMask) == sizeof(u64)); - auto hash = *(Hash64*)mask; - - auto result = hash64_fib_end(hash); - return result; -} - -fn Hash32 register_mask_hash_index(Thread* thread, RegisterMaskIndex register_mask_index) -{ - auto* mask = thread_register_mask_get(thread, register_mask_index); - auto hash = register_mask_hash(thread, mask); - return hash; -} - -fn void node_gvn_remove(Thread* thread, NodeIndex node_index); - -fn void node_unlock(Thread* thread, NodeIndex node_index) -{ - unused(thread); - unused(node_index); - // auto* node = thread_node_get(thread, node_index); - // if (node->interned) - // { - // auto r = node_gvn_remove(thread, node_index); - // assert(index_equal(r, node_index)); - // } -} - -fn s64 node_find(Slice(NodeIndex) nodes, NodeIndex node_index) -{ - s64 result = -1; - - for (u64 i = 0; i < nodes.length; i += 1) - { - if (index_equal(nodes.pointer[i], node_index)) - { - result = cast_to(s64, u64, i); - break; - } - } - - return result; -} - -fn void thread_node_remove_use(Thread* thread, u32 offset, u16* length, u16 index) -{ - auto current_length = *length; - assert(index < current_length); - auto item_to_remove = &thread->buffer.uses.pointer[offset + index]; - auto substitute = &thread->buffer.uses.pointer[offset + current_length - 1]; - *item_to_remove = *substitute; - *length = current_length - 1; -} - -fn u8 node_remove_output(Thread* thread, NodeIndex node_index, NodeIndex use_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - auto maybe_index = node_find(outputs, use_index); - assert(maybe_index != -1); - auto index = cast_to(u16, s64, maybe_index); - thread_node_remove_use(thread, node->output_offset, &node->output_count, index); - return node->output_count == 0; -} - -// fn void move_dependencies_to_worklist(Thread* thread, Node* node) -// { -// assert(node->dependency_count == 0); -// for (u32 i = 0; i < node->dependency_count; i += 1) -// { -// unused(thread); -// todo(); -// } -// } - -// fn u8 node_is_unused(Node* node) -// { -// return node->output_count == 0; -// } - -// fn u8 node_is_dead(Node* node) -// { -// return node_is_unused(node) & ((node->input_count == 0) & (!validi(node->type))); -// } - -// fn void node_kill(Thread* thread, NodeIndex node_index) -// { -// node_unlock(thread, node_index); -// auto* node = thread_node_get(thread, node_index); -// // print("[NODE KILLING] (#{u32}, {s}) START\n", node_index.index, node_id_to_string(node)); -// assert(node_is_unused(node)); -// todo(); -// // node->type = invalidi(TypePair); -// -// auto inputs = node_get_inputs(thread, node); -// while (node->input_count > 0) -// { -// auto input_index = cast_to(u16, u32, node->input_count - 1); -// node->input_count = input_index; -// auto old_input_index = inputs.pointer[input_index]; -// -// // print("[NODE KILLING] (#{u32}, {s}) Removing input #{u32} at slot {u32}\n", node_index.index, node_id_to_string(node), old_input_index.index, input_index); -// if (validi(old_input_index)) -// { -// thread_worklist_push(thread, old_input_index); -// u8 no_more_outputs = node_remove_output(thread, old_input_index, node_index); -// if (no_more_outputs) -// { -// // print("[NODE KILLING] (#{u32}, {s}) (NO MORE OUTPUTS - KILLING) Input #{u32}\n", node_index.index, node_id_to_string(node), old_input_index.index); -// node_kill(thread, old_input_index); -// } -// } -// } -// -// assert(node_is_dead(node)); -// // print("[NODE KILLING] (#{u32}, {s}) END\n", node_index.index, node_id_to_string(node)); -// } - -fn NodeIndex node_set_input(Thread* thread, NodeIndex node_index, u16 index, NodeIndex new_input) -{ - auto* node = thread_node_get(thread, node_index); - assert(index < node->input_count); - node_unlock(thread, node_index); - auto inputs = node_get_inputs(thread, node); - auto old_input = inputs.pointer[index]; - - if (!index_equal(old_input, new_input)) - { - if (validi(new_input)) - { - node_add_output(thread, new_input, node_index); - } - - thread_node_set_use(thread, node->input_offset, index, new_input); - - if (validi(old_input)) - { - if (node_remove_output(thread, old_input, node_index)) - { - // todo(); - // node_kill(thread, old_input); - } - } - - // move_dependencies_to_worklist(thread, node); - } - - return new_input; -} - -// fn NodeIndex builder_set_control(Thread* thread, FunctionBuilder* builder, NodeIndex node_index) -// { -// return node_set_input(thread, builder->scope, 0, node_index); -// } - -fn NodeIndex node_add_input(Thread* thread, NodeIndex node_index, NodeIndex input_index) -{ - node_unlock(thread, node_index); - Node* this_node = thread_node_get(thread, node_index); - node_add_one(thread, &this_node->input_offset, &this_node->input_capacity, &this_node->input_count, input_index); - if (validi(input_index)) - { - node_add_output(thread, input_index, node_index); - } - - return input_index; -} - -STRUCT(NodeCreate) -{ - Slice(NodeIndex) inputs; - TypePair type_pair; - NodeId id; -}; - -fn NodeIndex thread_node_add(Thread* thread, NodeCreate data) -{ - auto input_count = cast_to(u16, u64, data.inputs.length); - auto input_result = thread_get_node_reference_array(thread, input_count); - memcpy(input_result.pointer, data.inputs.pointer, sizeof(NodeIndex) * input_count); - - auto* node = vb_add(&thread->buffer.nodes, 1); - auto node_index = Index(Node, cast_to(u32, s64, node - thread->buffer.nodes.pointer)); - memset(node, 0, sizeof(Node)); - node->id = data.id; - node->input_offset = input_result.index; - node->input_count = input_count; - node->input_capacity = input_count; - node->type = type_pair_invalid; - // node->type = invalidi(TypePair); - node->type = data.type_pair; - - // print("[NODE CREATION] #{u32} {s} | INPUTS: { ", node_index.index, node_id_to_string(node)); - - for (u16 i = 0; i < input_count; i += 1) - { - NodeIndex input = data.inputs.pointer[i]; - // print("{u32} ", input.index); - if (validi(input)) - { - node_add_output(thread, input, node_index); - } - } - - // print("}\n"); - - return node_index; -} - -// fn void node_pop_inputs(Thread* thread, NodeIndex node_index, u16 input_count) -// { -// node_unlock(thread, node_index); -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// for (u16 i = 0; i < input_count; i += 1) -// { -// auto old_input = inputs.pointer[node->input_count - 1]; -// node->input_count -= 1; -// if (validi(old_input)) -// { -// if (node_remove_output(thread, old_input, node_index)) -// { -// todo(); -// } -// } -// } -// } - -// fn void scope_push(Thread* thread, FunctionBuilder* builder) -// { -// auto* scope = thread_node_get(thread, builder->scope); -// auto current_length = scope->scope.stack.length; -// auto desired_length = current_length + 1; -// auto current_capacity = scope->scope.stack.capacity; -// -// if (current_capacity < desired_length) -// { -// auto optimal_capacity = MAX(round_up_to_next_power_of_2(desired_length), 8); -// auto* new_pointer = arena_allocate(thread->arena, ScopePair, optimal_capacity); -// memcpy(new_pointer, scope->scope.stack.pointer, current_length * sizeof(ScopePair)); -// scope->scope.stack.capacity = optimal_capacity; -// scope->scope.stack.pointer = new_pointer; -// } -// -// memset(&scope->scope.stack.pointer[current_length], 0, sizeof(ScopePair)); -// scope->scope.stack.length = current_length + 1; -// } - -// fn void scope_pop(Thread* thread, FunctionBuilder* builder) -// { -// auto scope_index = builder->scope; -// auto* scope = thread_node_get(thread, scope_index); -// auto index = scope->scope.stack.length - 1; -// auto popped_scope = scope->scope.stack.pointer[index]; -// scope->scope.stack.length = index; -// auto input_count = popped_scope.values.length; -// node_pop_inputs(thread, scope_index, input_count); -// } - -// fn ScopePair* scope_get_last(Node* node) -// { -// assert(node->id == NODE_SCOPE); -// return &node->scope.stack.pointer[node->scope.stack.length - 1]; -// } - -// fn NodeIndex scope_define(Thread* thread, FunctionBuilder* builder, String name, TypeIndex type_index, NodeIndex node_index) -// { -// auto scope_node_index = builder->scope; -// auto* scope_node = thread_node_get(thread, scope_node_index); -// auto* last = scope_get_last(scope_node); -// string_map_put(&last->types, thread->arena, name, geti(type_index)); -// -// auto existing = string_map_put(&last->values, thread->arena, name, scope_node->input_count).existing; -// NodeIndex result; -// -// if (existing) -// { -// result = invalidi(Node); -// } -// else -// { -// result = node_add_input(thread, scope_node_index, node_index); -// } -// -// return result; -// } - -// fn NodeIndex scope_update_extended(Thread* thread, FunctionBuilder* builder, String name, NodeIndex node_index, s32 nesting_level) -// { -// NodeIndex result = invalidi(Node); -// -// if (nesting_level >= 0) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto* string_map = &scope_node->scope.stack.pointer[nesting_level].values; -// auto lookup_result = string_map_get(string_map, name); -// if (lookup_result.existing) -// { -// auto index = lookup_result.value; -// auto old_index = node_input_get(thread, scope_node, index); -// auto* old_node = thread_node_get(thread, old_index); -// -// // if (old_node->id == NODE_SCOPE) -// // { -// // todo(); -// // } -// -// if (validi(node_index)) -// { -// auto result = node_set_input(thread, builder->scope, index, node_index); -// return result; -// } -// else -// { -// return old_index; -// } -// } -// else -// { -// return scope_update_extended(thread, builder, name, node_index, nesting_level - 1); -// } -// } -// -// return result; -// } - -// fn NodeIndex scope_lookup(Thread* thread, FunctionBuilder* builder, String name) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// return scope_update_extended(thread, builder, name, invalidi(Node), scope_node->scope.stack.length - 1); -// } - -// fn NodeIndex scope_update(Thread* thread, FunctionBuilder* builder, String name, NodeIndex value_node_index) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto result = scope_update_extended(thread, builder, name, value_node_index, scope_node->scope.stack.length - 1); -// return result; -// } - -// fn u8 type_equal(Type* a, Type* b) -// { -// u8 result = 0; -// if (a == b) -// { -// result = 1; -// } -// else -// { -// assert(a->hash); -// assert(b->hash); -// if ((a->hash == b->hash) & (a->id == b->id)) -// { -// switch (a->id) -// { -// case TYPE_INTEGER: -// { -// result = -// ((a->integer.constant == b->integer.constant) & (a->integer.bit_count == b->integer.bit_count)) -// & -// ((a->integer.is_signed == b->integer.is_signed) & (a->integer.is_constant == b->integer.is_constant)); -// } break; -// case TYPE_TUPLE: -// { -// result = a->tuple.types.length == b->tuple.types.length; -// -// if (result) -// { -// for (u32 i = 0; i < a->tuple.types.length; i += 1) -// { -// if (!index_equal(a->tuple.types.pointer[i], b->tuple.types.pointer[i])) -// { -// todo(); -// } -// } -// } -// } break; -// default: -// todo(); -// } -// } -// } -// -// return result; -// } - -fn Hash64 node_get_hash_default(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -{ - unused(thread); - unused(node); - unused(node_index); - return hash; -} - -// fn Hash64 node_get_hash_projection(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node_index); -// auto projection_index = node->projection.index; -// auto proj_index_bytes = scalar_to_bytes(projection_index); -// for (u32 i = 0; i < proj_index_bytes.length; i += 1) -// { -// hash = hash_byte(hash, proj_index_bytes.pointer[i]); -// } -// -// return hash; -// } - -// fn Hash64 node_get_hash_control_projection(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node_index); -// auto projection_index = node->control_projection.projection.index; -// auto proj_index_bytes = scalar_to_bytes(projection_index); -// for (u32 i = 0; i < proj_index_bytes.length; i += 1) -// { -// hash = hash_byte(hash, proj_index_bytes.pointer[i]); -// } -// -// return hash; -// } - -// fn Hash64 node_get_hash_constant(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(node_index); -// unused(thread); -// unused(node); -// assert(hash == fnv_offset); -// todo(); -// // auto type_index = node->type; -// // auto* type = thread_type_get(thread, node->type); -// // auto type_hash = hash_type(thread, type); -// // print("Hashing node #{u32} (constant) (type: #{u32}) (hash: {u64:x})\n", node_index.index, type_index.index, type_hash); -// // return type_hash; -// } - -// fn Hash64 node_get_hash_scope(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node); -// unused(node_index); -// return hash; -// } - -// fn NodeIndex node_idealize_substract(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto left_node_index = inputs.pointer[1]; -// auto right_node_index = inputs.pointer[2]; -// auto* left = thread_node_get(thread, left_node_index); -// auto* right = thread_node_get(thread, right_node_index); -// if (index_equal(left_node_index, right_node_index)) -// { -// todo(); -// } -// else if (right->id == IR_INTEGER_NEGATION) -// { -// todo(); -// } -// else if (left->id == IR_INTEGER_NEGATION) -// { -// todo(); -// } -// else -// { -// return invalidi(Node); -// } -// } - -// fn NodeIndex node_idealize_compare(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto left_node_index = inputs.pointer[1]; -// auto right_node_index = inputs.pointer[2]; -// auto* left = thread_node_get(thread, left_node_index); -// auto* right = thread_node_get(thread, right_node_index); -// if (index_equal(left_node_index, right_node_index)) -// { -// todo(); -// } -// -// if (node->id == IR_INTEGER_COMPARE_EQUAL) -// { -// if (right->id != IR_CONSTANT) -// { -// if (left->id == IR_CONSTANT) -// { -// todo(); -// } -// else if (left_node_index.index > right_node_index.index) -// { -// todo(); -// } -// } -// -// // TODO: null pointer -// if (index_equal(right->type, thread->types.integer.zero)) -// { -// todo(); -// } -// } -// -// // TODO: phi constant -// -// return invalidi(Node); -// } - -fn Hash32 debug_type_hash(Thread* thread, const DebugType* const restrict type) -{ - unused(thread); - auto* start = (const u8*) type; - Hash32 hash = 0; - for (auto* it = start; it < start + sizeof(*type); it += 1) - { - hash += *it; - } - auto result = hash32_fib_end(hash); - return result; -} - -fn Hash32 debug_type_hash_index(Thread* thread, DebugTypeIndex type_index) -{ - auto* type = thread_debug_type_get(thread, type_index); - return debug_type_hash(thread, type); -} - -global_variable const u64 intern_pool_min_capacity = 64; -STRUCT(GenericInternPool) -{ - u32* pointer; - u32 length; - u32 capacity; -}; - -STRUCT(GenericInternPoolBufferResult) -{ - void* pointer; - u32 index; -}; - -STRUCT(GenericGetOrPut) -{ - u32 index; - u8 existing; -}; - -typedef s64 FindSlotCallback(GenericInternPool* pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead); -typedef GenericInternPoolBufferResult AddToBufferCallback(Thread* thread); -// typedef s64 Find - -STRUCT(InternPoolInterface) -{ - FindSlotCallback * const find_slot; - AddToBufferCallback* const add_to_buffer; -}; - -fn s64 ip_find_slot_debug_type(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - assert(hash != 0); - auto* pool = (InternPool(DebugType)*)generic_pool; - assert(pool == &thread->interned.debug_types); - auto* ptr = pool->pointer; - - s64 result = -1; - - unused(raw_item_index); - print("[IP FIND SLOT DEBUG TYPE] Finding slot for debug type: { hash: 0x{u32:x}, raw: {u32}, saved: {u32}, slots_ahead: {u32}\n"); - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - auto debug_type = thread_debug_type_get(thread, typed_index); - auto existing_hash = debug_type_hash(thread, debug_type); - print("Comparing with existing hash 0x{u32:x}\n", existing_hash); - if (existing_hash == hash) - { - todo(); - } - } - - return result; -} - -fn s64 ip_generic_find_slot(GenericInternPool* pool, Thread* thread, u32 item_index, Hash32 hash, const InternPoolInterface* restrict const interface) -{ - auto* pointer = pool->pointer; - auto existing_capacity = pool->capacity; - auto original_index = hash & (existing_capacity - 1); - auto it_index = original_index; - s64 result = -1; - - while (1) - { - auto index = it_index & (existing_capacity - 1); - auto* ptr = &pointer[index]; - if (!*ptr) - { - result = index; - break; - } - -#if (__AVX2__) -#if (__AVX512F__) - auto chunk = _mm512_loadu_epi32(ptr); - auto is_zero = _mm512_cmpeq_epi32_mask(chunk, _mm512_setzero_epi32()); -#elif (__AVX2__) - auto chunk = _mm256_loadu_si256((const __m256i_u*) ptr); - auto is_zero = _mm256_movemask_ps(_mm256_castsi256_ps(_mm256_cmpeq_epi32(chunk, _mm256_setzero_si256()))); -#endif - auto occupied_slots_ahead = cast_to(u32, s32, __builtin_ctz((u32)is_zero)); -#else - u32 occupied_slots_ahead = 0; - for (u32 fake_i = it_index; fake_i < it_index + existing_capacity; fake_i += 1) - { - auto i = fake_i & (existing_capacity - 1); - auto item = pointer[i]; - if (item == 0) - { - break; - } - occupied_slots_ahead += 1; - } -#endif - - auto cap_ahead = existing_capacity - index; - auto slots_ahead = MIN(occupied_slots_ahead, cap_ahead); - auto slot = interface->find_slot(pool, thread, hash, item_index, index, slots_ahead); - - if (slot != -1) - { - assert(pointer[slot] != 0); - result = slot; - break; - } - - if (occupied_slots_ahead < cap_ahead) - { - result = index + occupied_slots_ahead; - break; - } - - it_index += slots_ahead; - } - - return result; -} - -fn GenericInternPoolBufferResult ip_DebugType_add_to_buffer(Thread* thread) -{ - auto* result = vb_add(&thread->buffer.debug_types, 1); - auto buffer_index = cast_to(u32, s64, result - thread->buffer.debug_types.pointer); - auto type_index = Index(DebugType, buffer_index); - static_assert(sizeof(type_index) == sizeof(u32)); - return (GenericInternPoolBufferResult) { - .pointer = result, - .index = *(u32*)&type_index, - }; -} - -fn u32 ip_generic_put_new_at_assume_not_existent_assume_capacity(GenericInternPool* pool, Thread* thread, u32 item_index, const void* restrict const item_pointer, u32 item_size, u32 pool_index, const InternPoolInterface* restrict const interface) -{ - if (!item_index) - { - auto buffer_result = interface->add_to_buffer(thread); - assert(buffer_result.index); - memcpy(buffer_result.pointer, item_pointer, item_size); - item_index = buffer_result.index; - } - auto* ptr = &pool->pointer[pool_index]; - *ptr = item_index; - pool->length += 1; - return item_index; -} - -fn u32 intern_pool_put_new_assume_not_existent_assume_capacity(GenericInternPool* pool, Thread* thread, u32 item_index, const void* restrict const item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* restrict const interface) -{ - auto capacity = pool->capacity; - assert(pool->length < capacity); - assert(hash); - auto pool_index = hash & (capacity - 1); - auto result = ip_generic_put_new_at_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, pool_index, interface); - return result; -} - -fn void ip_generic_ensure_capacity(GenericInternPool* pool, Thread* thread, u32 additional) -{ - auto current_length = pool->length; - auto current_capacity = pool->capacity; - auto half_capacity = current_capacity >> 1; - auto destination_length = current_length + additional; - - if (destination_length > half_capacity) - { - auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), intern_pool_min_capacity)); - auto* new_array = arena_allocate(thread->arena, u32, new_capacity); - memset(new_array, 0, sizeof(u32) * new_capacity); - - auto old_capacity = current_capacity; - - pool->pointer = new_array; - pool->length = 0; - pool->capacity = new_capacity; - - if (old_capacity) - { - todo(); - } - } -} - -fn u32 ip_generic_put_new_assume_not_existent(GenericInternPool* pool, Thread* thread, u32 item_index, const void* item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* const restrict interface) -{ - ip_generic_ensure_capacity(pool, thread, 1); - auto result = intern_pool_put_new_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, hash, interface); - return result; -} - -fn GenericGetOrPut ip_generic_get_or_put(GenericInternPool* pool, Thread* thread, u32 item_index, const void* const restrict item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* const restrict interface) -{ - assert(hash); - auto length = pool->length; - auto capacity = pool->capacity; - - if (capacity) - { - auto maybe_slot = ip_generic_find_slot(pool, thread, item_index, hash, interface); - if (maybe_slot != -1) - { - auto index = cast_to(u32, s64, maybe_slot); - auto element = pool->pointer[index]; - u8 is_valid_or_existing = element != 0; - if (!is_valid_or_existing) - { - element = ip_generic_put_new_at_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, index, interface); - assert(element != 0); - } - - return (GenericGetOrPut) { - .index = element, - .existing = is_valid_or_existing, - }; - } - } - - if (length < capacity) - { - todo(); - } - else if (length == capacity) - { - auto index = ip_generic_put_new_assume_not_existent(pool, thread, item_index, item_pointer, item_size, hash, interface); - return (GenericGetOrPut) - { - .index = index, - .existing = 0, - }; - } - else - { - unreachable(); - } -} - -// This assumes the indices are not equal -fn u8 node_equal(Thread* thread, NodeIndex a_index, NodeIndex b_index) -{ - u8 result = 0; - auto a_hash = node_hash_index(thread, a_index); - auto b_hash = node_hash_index(thread, b_index); - auto* a = thread_node_get(thread, a_index); - auto* b = thread_node_get(thread, b_index); - assert(!index_equal(a_index, b_index)); - assert(a != b); - - if (((a->id == b->id) & (a_hash == b_hash)) & (a->input_count == b->input_count)) - { - auto inputs_a = node_get_inputs(thread, a); - auto inputs_b = node_get_inputs(thread, b); - result = 1; - - for (u16 i = 0; i < a->input_count; i += 1) - { - if (!index_equal(inputs_a.pointer[i], inputs_b.pointer[i])) - { - result = 0; - break; - } - } - - if (result) - { - todo(); - // switch (a->id) - // { - // case IR_CONSTANT: - // todo(); - // // result = index_equal(a->constant.type, b->constant.type); - // break; - // case IR_START: - // todo(); - // // result = a->start.function == b->start.function; - // break; - // default: - // todo(); - // } - } - } - - return result; -} - -fn u8 node_index_equal(Thread* thread, NodeIndex a, NodeIndex b) -{ - u8 result = 0; - result = index_equal(a, b) || node_equal(thread, a, b); - - return result; -} - -fn s64 ip_find_slot_node(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - auto* pool = (InternPool(Node)*)generic_pool; - assert(pool == &thread->interned.nodes); - auto* ptr = pool->pointer; - auto item_index = *(NodeIndex*)&raw_item_index; - unused(hash); - - s64 result = -1; - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - if (node_index_equal(thread, item_index, typed_index)) - { - result = index; - break; - } - } - - return result; -} - -fn s64 ip_find_slot_register_mask(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - auto* pool = (InternPool(RegisterMask)*)generic_pool; - assert(pool == &thread->interned.register_masks); - auto* ptr = pool->pointer; - auto item_index = *(RegisterMaskIndex*)&raw_item_index; - unused(hash); - - s64 result = -1; - - RegisterMask rm = *thread_register_mask_get(thread, item_index); - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - static_assert(sizeof(RegisterMaskIndex) == sizeof(u32)); - if (index_equal(item_index, typed_index)) - { - result = index; - break; - } - - auto register_mask = thread_register_mask_get(thread, typed_index); - static_assert(sizeof(RegisterMask) == sizeof(u64)); - if (*(u64*)register_mask == *(u64*)&rm) - { - result = index; - break; - } - } - - return result; -} - -global_variable const auto ip_interface_debug_type = (InternPoolInterface) { - .add_to_buffer = &ip_DebugType_add_to_buffer, - .find_slot = &ip_find_slot_debug_type, -}; - -global_variable const auto ip_interface_node = (InternPoolInterface) { - .find_slot = &ip_find_slot_node, -}; - -global_variable const auto ip_interface_register_mask = (InternPoolInterface) { - .find_slot = &ip_find_slot_register_mask, -}; - -#define declare_ip_functions(T, lower) \ -fn Hash32 lower ## _hash_index(Thread* thread, T ## Index item_index); \ -fn Hash32 lower ## _hash(Thread* thread, const T * const restrict item); \ -\ -fn T ## GetOrPut ip_ ## T ## _get_or_put(InternPool(T)* pool, Thread* thread, T ## Index item_index) \ -{ \ - auto hash = lower ## _hash_index(thread, item_index); \ - auto* item = thread_ ## lower ## _get(thread, item_index); \ - static_assert(sizeof(item_index) == sizeof(u32));\ - auto raw_item_index = *(u32*)&item_index;\ - auto result = ip_generic_get_or_put((GenericInternPool*)pool, thread, raw_item_index, (void*)item, sizeof(T), hash, &ip_interface_ ## lower); \ - return (T ## GetOrPut)\ - {\ - .index = *(T ## Index*)&result.index,\ - .existing = result.existing,\ - };\ -}\ -fn T ## GetOrPut ip_ ## T ## _get_or_put_new(InternPool(T)* pool, Thread* thread, const T* item) \ -{ \ - auto hash = lower ## _hash(thread, item); \ - auto result = ip_generic_get_or_put((GenericInternPool*)pool, thread, 0, (void*)item, sizeof(T), hash, &ip_interface_ ## lower); \ - return (T ## GetOrPut)\ - {\ - .index = *(T ## Index*)&result.index,\ - .existing = result.existing,\ - };\ -}\ -fn T ## Index ip_ ## T ## _remove(InternPool(T)* pool, Thread* thread, T ## Index item_index)\ -{\ - auto existing_capacity = pool->capacity;\ - auto* item = thread_ ## lower ## _get(thread, item_index);\ - auto hash = lower ## _hash(thread, item);\ - static_assert(sizeof(item_index) == sizeof(u32));\ - auto raw_item_index = *(u32*)&item_index;\ - auto maybe_slot = ip_generic_find_slot((GenericInternPool*)pool, thread, raw_item_index, hash, &ip_interface_ ## lower);\ - \ - if (maybe_slot != -1)\ - {\ - auto i = cast_to(u32, s64, maybe_slot);\ - auto* slot_pointer = &pool->pointer[i];\ - auto old_item_index = *slot_pointer;\ - assert(validi(old_item_index));\ - pool->length -= 1;\ - *slot_pointer = invalidi(T);\ - auto j = i;\ - \ - while (1)\ - {\ - j = (j + 1) & (existing_capacity - 1);\ -\ - auto existing = pool->pointer[j];\ - if (!validi(existing))\ - {\ - break;\ - }\ -\ - auto existing_item_index = *(T ## Index*)&existing;\ - auto* existing_item = thread_ ## lower ## _get(thread, existing_item_index);\ - auto existing_item_hash = lower ## _hash(thread, existing_item);\ - auto k = existing_item_hash & (existing_capacity - 1);\ -\ - if (i <= j)\ - {\ - if ((i < k) & (k <= j))\ - {\ - continue;\ - }\ - }\ - else\ - {\ - if ((k <= j) | (i < k))\ - {\ - continue;\ - }\ - }\ -\ - pool->pointer[i] = pool->pointer[j];\ - pool->pointer[j] = invalidi(T);\ -\ - i = j;\ - }\ -\ - \ - return old_item_index;\ - }\ - else\ - {\ - todo();\ - }\ -} - -STRUCT(TypeGetOrPut) -{ - TypeIndex index; - u8 existing; -}; - -// fn TypeGetOrPut intern_pool_get_or_put_new_type(Thread* thread, Type* type); - -typedef NodeIndex NodeIdealize(Thread* thread, NodeIndex node_index); -typedef TypeIndex NodeComputeType(Thread* thread, NodeIndex node_index); -typedef Hash64 TypeGetHash(Thread* thread, Type* type); -typedef Hash64 NodeGetHash(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash); - -// fn TypeIndex thread_get_integer_type(Thread* thread, TypeInteger type_integer) -// { -// Type type; -// memset(&type, 0, sizeof(Type)); -// type.integer = type_integer; -// type.id = TYPE_INTEGER; -// -// auto result = intern_pool_get_or_put_new_type(thread, &type); -// return result.index; -// } - -fn NodeIndex peephole(Thread* thread, Function* function, NodeIndex node_index); -// fn NodeIndex constant_int_create_with_type(Thread* thread, Function* function, TypeIndex type_index) -// { -// auto node_index = thread_node_add(thread, (NodeCreate){ -// .id = IR_CONSTANT, -// .inputs = array_to_slice(((NodeIndex []) { -// // function->start, -// })) -// }); -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// unused(type_index); -// -// todo(); -// -// // node->constant = (NodeConstant) { -// // .type = type_index, -// // }; -// // -// // // print("Creating constant integer node #{u32} with value: {u64:x}\n", node_index.index, thread_type_get(thread, type_index)->integer.constant); -// // -// // auto result = peephole(thread, function, node_index); -// // return result; -// } - -// fn NodeIndex constant_int_create(Thread* thread, Function* function, u64 value) -// { -// auto type_index = thread_get_integer_type(thread, (TypeInteger){ -// .constant = value, -// .bit_count = 0, -// .is_constant = 1, -// .is_signed = 0, -// }); -// -// auto constant_int = constant_int_create_with_type(thread, function, type_index); -// return constant_int; -// } - -STRUCT(NodeVirtualTable) -{ - NodeComputeType* const compute_type; - NodeIdealize* const idealize; - NodeGetHash* const get_hash; -}; - -STRUCT(TypeVirtualTable) -{ - TypeGetHash* const get_hash; -}; -fn Hash64 hash_type(Thread* thread, Type* type); - -// fn NodeIndex idealize_null(Thread* thread, NodeIndex node_index) -// { -// unused(thread); -// unused(node_index); -// return invalidi(Node); -// } - -// fn TypeIndex compute_type_constant(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node->id == IR_CONSTANT); -// todo(); -// // return node->constant.type; -// } - -fn Hash64 type_get_hash_default(Thread* thread, Type* type) -{ - unused(thread); - assert(!type->hash); - Hash64 hash = fnv_offset; - - // u32 i = 0; - for (auto* it = (u8*)type; it < (u8*)(type + 1); it += 1) - { - hash = hash_byte(hash, *it); - if (type->id == TYPE_INTEGER) - { - // print("Byte [{u32}] = 0x{u32:x}\n", i, (u32)*it); - // i += 1; - } - } - - return hash; -} - -fn Hash64 type_get_hash_tuple(Thread* thread, Type* type) -{ - Hash64 hash = fnv_offset; - for (u64 i = 0; i < type->tuple.types.length; i += 1) - { - auto* tuple_type = thread_type_get(thread,type->tuple.types.pointer[i]); - auto type_hash = hash_type(thread, tuple_type); - for (u8* it = (u8*)&type_hash; it < (u8*)(&type_hash + 1); it += 1) - { - hash = hash_byte(hash, *it); - } - } - - return hash; -} - -// fn void intern_pool_ensure_capacity(InternPool(T)* pool, Thread* thread, u32 additional) \ -// {\ -// auto current_capacity = pool->capacity; \ -// auto current_length = pool->length; \ -// assert(current_capacity % 2 == 0); \ -// auto half_capacity = current_capacity >> 1; \ -// auto destination_length = current_length + additional; \ -// \ -// if (destination_length > half_capacity) \ -// {\ -// auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), 32)); \ -// auto* new_array = arena_allocate(thread->arena, u32, new_capacity); \ -// memset(new_array, 0, sizeof(u32) * new_capacity); \ -// \ -// auto* old_pointer = pool->pointer;\ -// auto old_capacity = current_capacity;\ -// auto old_length = current_length;\ -// \ -// pool->length = 0; -// pool->pointer = new_array; -// pool->capacity = new_capacity; -// -// u8* buffer; -// u64 stride; -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// buffer = (u8*)thread->buffer.types.pointer; -// stride = sizeof(Type); -// assert(pool == &thread->interned.types); -// break; -// case INTERN_POOL_KIND_NODE: -// buffer = (u8*)thread->buffer.nodes.pointer; -// stride = sizeof(Node); -// assert(pool == &thread->interned.nodes); -// break; -// } -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// auto* type = thread_type_get(thread, type_index); -// assert(type->hash == hash); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node_index); -// } break; -// } -// -// } -// } -// -// assert(old_length == pool->length); -// assert(pool->capacity == new_capacity); -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// unused(type_index); -// todo(); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // auto result = intern_pool_get_node(thread, node_index, hash); -// // assert(validi(node_index)); -// // assert(index_equal(node_index, result)); -// } break; -// } -// } -// } -// } -// } -// fn u8 node_is_projection(Node* n) -// { -// return (n->id == IR_CONTROL_PROJECTION) | (n->id == IR_PROJECTION); -// } - -// fn NodeIndex projection_get_control(Thread* thread, Node* node) -// { -// assert(node_is_projection(node)); -// auto node_index = node_input_get(thread, node, 0); -// return node_index; -// } - -// fn s32 projection_get_index(Node* node) -// { -// assert(node_is_projection(node)); -// -// switch (node->id) -// { -// case IR_CONTROL_PROJECTION: -// return node->control_projection.projection.index; -// case IR_PROJECTION: -// return node->projection.index; -// default: -// todo(); -// } -// } - -// fn TypeIndex compute_type_projection(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node_is_projection(node)); -// auto control_node_index = projection_get_control(thread, node); -// auto* control_node = thread_node_get(thread, control_node_index); -// auto* control_type = thread_type_get(thread, control_node->type); -// -// if (control_type->id == TYPE_TUPLE) -// { -// auto index = projection_get_index(node); -// auto type_index = control_type->tuple.types.pointer[index]; -// return type_index; -// } -// else -// { -// return thread->types.bottom; -// } -// } - -// fn NodeIndex idealize_control_projection(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node->id == IR_CONTROL_PROJECTION); -// auto control_node_index = projection_get_control(thread, node); -// auto* control_node = thread_node_get(thread, control_node_index); -// auto* control_type = thread_type_get(thread, control_node->type); -// auto index = node->control_projection.projection.index; -// -// if (control_type->id == TYPE_TUPLE) -// { -// if (index_equal(control_type->tuple.types.pointer[index], thread->types.dead_control)) -// { -// todo(); -// } -// if (control_node->id == IR_IF) -// { -// todo(); -// } -// } -// -// if (control_node->id == IR_IF) -// { -// todo(); -// } -// -// return invalidi(Node); -// } - -fn NodeIndex return_get_control(Thread* thread, Node* node) -{ - return node_get_inputs(thread, node).pointer[0]; -} - -fn NodeIndex return_get_value(Thread* thread, Node* node) -{ - return node_get_inputs(thread, node).pointer[1]; -} - -// fn TypeIndex intern_pool_put_new_type_at_assume_not_existent_assume_capacity(Thread* thread, Type* type, u32 index) -// { -// auto* result = vb_add(&thread->buffer.types, 1); -// auto buffer_index = cast_to(u32, s64, result - thread->buffer.types.pointer); -// auto type_index = Index(Type, buffer_index); -// *result = *type; -// -// u32 raw_type = *(u32*)&type_index; -// thread->interned.types.pointer[index] = raw_type; -// assert(raw_type); -// thread->interned.types.length += 1; -// -// return type_index; -// } - -// fn TypeIndex intern_pool_put_new_type_assume_not_existent_assume_capacity(Thread* thread, Type* type) -// { -// assert(thread->interned.types.length < thread->interned.types.capacity); -// Hash64 hash = type->hash; -// assert(hash); -// auto index = cast_to(u32, u64, hash & (thread->interned.types.capacity - 1)); -// -// return intern_pool_put_new_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// typedef enum InternPoolKind -// { -// INTERN_POOL_KIND_TYPE, -// INTERN_POOL_KIND_NODE, -// } InternPoolKind; - -// [[gnu::hot]] fn s64 intern_pool_find_node_slot(Thread* thread, u32 original_index, NodeIndex node_index) -// { -// assert(validi(node_index)); -// auto it_index = original_index; -// auto existing_capacity = thread->interned.nodes.capacity; -// s64 result = -1; -// // auto* node = thread_node_get(thread, node_index); -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.nodes.pointer[index]; -// -// if (key == 0) -// { -// assert(thread->interned.nodes.length < thread->interned.nodes.capacity); -// result = index; -// break; -// } -// else -// { -// NodeIndex existing_node_index = *(NodeIndex*)&key; -// // Exhaustive comparation, shortcircuit when possible -// if (node_index_equal(thread, existing_node_index, node_index)) -// { -// result = index; -// break; -// } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn NodeIndex intern_pool_get_node(Thread* thread, NodeIndex key, Hash64 hash) -// { -// auto original_index = cast_to(u32, u64, hash & (thread->interned.nodes.capacity - 1)); -// auto maybe_slot = intern_pool_find_node_slot(thread, original_index, key); -// auto node_index = invalidi(Node); -// -// if (maybe_slot != -1) -// { -// auto slot = cast_to(u32, s64, maybe_slot); -// auto* pointer_to_slot = &thread->interned.nodes.pointer[slot]; -// node_index = *(NodeIndex*)pointer_to_slot; -// } -// -// return node_index; -// } - -// fn NodeIndex intern_pool_put_node_at_assume_not_existent_assume_capacity(Thread* thread, NodeIndex node, u32 index) -// { -// u32 raw_node = *(u32*)&node; -// assert(raw_node); -// thread->interned.nodes.pointer[index] = raw_node; -// thread->interned.nodes.length += 1; -// -// return node; -// } - -// fn NodeIndex intern_pool_put_node_assume_not_existent_assume_capacity(Thread* thread, Hash64 hash, NodeIndex node) -// { -// auto capacity = thread->interned.nodes.capacity; -// assert(thread->interned.nodes.length < capacity); -// auto original_index = cast_to(u32, u64, hash & (capacity - 1)); -// -// auto slot = intern_pool_find_node_slot(thread, original_index, node); -// if (slot == -1) -// { -// failed_execution(); -// } -// auto index = (u32)slot; -// -// return intern_pool_put_node_at_assume_not_existent_assume_capacity(thread, node, index); -// } - -// fn void intern_pool_ensure_capacity(InternPool* pool, Thread* thread, u32 additional, InternPoolKind kind) -// { -// auto current_capacity = pool->capacity; -// auto current_length = pool->length; -// auto half_capacity = current_capacity >> 1; -// auto destination_length = current_length + additional; -// -// if (destination_length > half_capacity) -// { -// auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), 32)); -// auto* new_array = arena_allocate(thread->arena, u32, new_capacity); -// memset(new_array, 0, sizeof(u32) * new_capacity); -// -// auto* old_pointer = pool->pointer; -// auto old_capacity = current_capacity; -// auto old_length = current_length; -// -// pool->length = 0; -// pool->pointer = new_array; -// pool->capacity = new_capacity; -// -// u8* buffer; -// u64 stride; -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// buffer = (u8*)thread->buffer.types.pointer; -// stride = sizeof(Type); -// assert(pool == &thread->interned.types); -// break; -// case INTERN_POOL_KIND_NODE: -// buffer = (u8*)thread->buffer.nodes.pointer; -// stride = sizeof(Node); -// assert(pool == &thread->interned.nodes); -// break; -// } -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// auto* type = thread_type_get(thread, type_index); -// assert(type->hash == hash); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node_index); -// } break; -// } -// -// } -// } -// -// assert(old_length == pool->length); -// assert(pool->capacity == new_capacity); -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// unused(type_index); -// todo(); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // auto result = intern_pool_get_node(thread, node_index, hash); -// // assert(validi(node_index)); -// // assert(index_equal(node_index, result)); -// } break; -// } -// } -// } -// } -// } -// -// fn TypeIndex intern_pool_put_new_type_assume_not_existent(Thread* thread, Type* type) -// { -// intern_pool_ensure_capacity(&thread->interned.types, thread, 1, INTERN_POOL_KIND_TYPE); -// return intern_pool_put_new_type_assume_not_existent_assume_capacity(thread, type); -// } -// -// fn s64 intern_pool_find_type_slot(Thread* thread, u32 original_index, Type* type) -// { -// auto it_index = original_index; -// auto existing_capacity = thread->interned.types.capacity; -// s64 result = -1; -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.types.pointer[index]; -// -// // Not set -// if (key == 0) -// { -// result = index; -// break; -// } -// else -// { -// TypeIndex existing_type_index = *(TypeIndex*)&key; -// Type* existing_type = thread_type_get(thread, existing_type_index); -// if (type_equal(existing_type, type)) -// { -// result = index; -// break; -// } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn s64 intern_pool_find_debug_type_slot(Thread* thread, const DebugType* type, Hash32 hash) -// { -// auto it_index = original_index; -// auto existing_capacity = thread->interned.types.capacity; -// s64 result = -1; -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.types.pointer[index]; -// -// // Not set -// if (key == 0) -// { -// result = index; -// break; -// } -// else -// { -// auto existing_type_index = *(DebugTypeIndex*)&key; -// DebugType* existing_type = thread_debug_type_get(thread, existing_type_index); -// auto existing_hash = hash_debug_type(existing_type); -// todo(); -// // if (type_equal(existing_type, type)) -// // { -// // result = index; -// // break; -// // } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(Thread* thread, const DebugType* type, u32 index) -// { -// auto* result = vb_add(&thread->buffer.debug_types, 1); -// auto buffer_index = cast_to(u32, s64, result - thread->buffer.debug_types.pointer); -// auto type_index = Index(DebugType, buffer_index); -// *result = *type; -// -// u32 raw_type = *(u32*)&type_index; -// thread->interned.types.pointer[index] = raw_type; -// assert(raw_type); -// thread->interned.types.length += 1; -// -// return type_index; -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_assume_not_existent_assume_capacity(Thread* thread, const DebugType* type, Hash32 hash) -// { -// assert(thread->interned.types.length < thread->interned.types.capacity); -// assert(hash); -// auto index = hash & (thread->interned.types.capacity - 1); -// -// return intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_assume_not_existent(Thread* thread, const DebugType* type, Hash32 hash) -// { -// intern_pool_ensure_capacity(&thread->interned.types, thread, 1, INTERN_POOL_KIND_TYPE); -// return intern_pool_put_new_debug_type_assume_not_existent_assume_capacity(thread, type, hash); -// } - -// fn DebugTypeGetOrPut intern_pool_get_or_put_new_debug_type(Thread* thread, const DebugType* type) -// { -// auto existing_capacity = thread->interned.types.capacity; -// auto hash = hash_debug_type(type); -// auto original_index = cast_to(u32, u64, hash & (existing_capacity - 1)); -// -// auto maybe_slot = intern_pool_find_debug_type_slot(thread, original_index, type); -// if (maybe_slot != -1) -// { -// auto index = cast_to(u32, s64, maybe_slot); -// auto type_index = *(DebugTypeIndex*)&thread->interned.types.pointer[index]; -// u8 existing = validi(type_index); -// if (!existing) -// { -// type_index = intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// return (DebugTypeGetOrPut) { -// .index = type_index, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.types.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.types.length == existing_capacity) -// { -// auto result = intern_pool_put_new_debug_type_assume_not_existent(thread, type, hash); -// return (DebugTypeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn TypeGetOrPut intern_pool_get_or_put_new_type(Thread* thread, Type* type) -// { -// auto existing_capacity = thread->interned.types.capacity; -// auto hash = hash_type(thread, type); -// auto original_index = cast_to(u32, u64, hash & (existing_capacity - 1)); -// -// auto maybe_slot = intern_pool_find_type_slot(thread, original_index, type); -// if (maybe_slot != -1) -// { -// auto index = cast_to(u32, s64, maybe_slot); -// TypeIndex type_index = *(TypeIndex*)&thread->interned.types.pointer[index]; -// u8 existing = validi(type_index); -// if (!existing) -// { -// type_index = intern_pool_put_new_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// return (TypeGetOrPut) { -// .index = type_index, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.types.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.types.length == existing_capacity) -// { -// auto result = intern_pool_put_new_type_assume_not_existent(thread, type); -// return (TypeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn TypeGetOrPut type_make_tuple(Thread* thread, Slice(TypeIndex) types) -// { -// Type type; -// memset(&type, 0, sizeof(Type)); -// type.tuple = (TypeTuple){ -// .types = types, -// }; -// type.id = TYPE_TUPLE; -// auto result = intern_pool_get_or_put_new_type(thread, &type); -// return result; -// } - -// fn TypeIndex type_make_tuple_allocate(Thread* thread, Slice(TypeIndex) types) -// { -// auto gop = type_make_tuple(thread, types); -// // Need to reallocate the type array -// if (!gop.existing) -// { -// auto* type = thread_type_get(thread, gop.index); -// assert(type->tuple.types.pointer == types.pointer); -// assert(type->tuple.types.length == types.length); -// type->tuple.types = arena_allocate_slice(thread->arena, TypeIndex, types.length); -// memcpy(type->tuple.types.pointer, types.pointer, sizeof(TypeIndex) * types.length); -// } -// -// return gop.index; -// } - -fn TypeIndex compute_type_return(Thread* thread, NodeIndex node_index) -{ - Node* node = thread_node_get(thread, node_index); - auto control_type = thread_node_get(thread, return_get_control(thread, node))->type; - unused(control_type); - auto return_type = thread_node_get(thread, return_get_value(thread, node))->type; - unused(return_type); - todo(); - // Slice(TypeIndex) types = array_to_slice(((TypeIndex[]) { - // control_type, - // return_type, - // })); - // auto result = type_make_tuple_allocate(thread, types); - // return result; -} - -fn NodeIndex idealize_return(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto control_node_index = return_get_control(thread, node); - auto* control_node = thread_node_get(thread, control_node_index); - unused(control_node); - // if (index_equal(control_node->type, thread->types.dead_control)) - // { - // return control_node_index; - // } - // else - // { - // return invalidi(Node); - // } - - todo(); -} - -// fn TypeIndex compute_type_dead_control(Thread* thread, NodeIndex node_index) -// { -// unused(node_index); -// return thread->types.dead_control; -// } - -// fn TypeIndex compute_type_bottom(Thread* thread, NodeIndex node_index) -// { -// unused(node_index); -// return thread->types.bottom; -// } - -// fn NodeIndex idealize_stop(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto original_input_count = node->input_count; -// for (u16 i = 0; i < node->input_count; i += 1) -// { -// auto input_node_index = node_input_get(thread, node, i); -// auto* input_node = thread_node_get(thread, input_node_index); -// if (index_equal(input_node->type, thread->types.dead_control)) -// { -// todo(); -// } -// } -// -// if (node->input_count != original_input_count) -// { -// return node_index; -// } -// else -// { -// return invalidi(Node); -// } -// } - -// fn TypeIndex compute_type_start(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// todo(); -// // return node->start.arguments; -// } - -// fn u8 type_is_constant(Type* type) -// { -// switch (type->id) -// { -// case TYPE_INTEGER: -// return type->integer.is_constant; -// default: -// return 0; -// } -// } - -// fn u8 type_is_simple(Type* type) -// { -// return type->id <= TYPE_DEAD_CONTROL; -// } - -// fn TypeIndex type_meet(Thread* thread, TypeIndex a, TypeIndex b) -// { -// TypeIndex result = invalidi(Type); -// if (index_equal(a, b)) -// { -// result = a; -// } -// else -// { -// Type* a_type = thread_type_get(thread, a); -// Type* b_type = thread_type_get(thread, b); -// TypeIndex left = invalidi(Type); -// TypeIndex right = invalidi(Type); -// -// assert(a_type != b_type); -// if (a_type->id == b_type->id) -// { -// left = a; -// right = b; -// } -// else if (type_is_simple(a_type)) -// { -// left = a; -// right = b; -// } -// else if (type_is_simple(b_type)) -// { -// todo(); -// } -// else -// { -// result = thread->types.bottom; -// } -// -// assert(!!validi(left) == !!validi(right)); -// assert((validi(left) & validi(right)) | (validi(result))); -// -// if (validi(left)) -// { -// assert(!validi(result)); -// auto* left_type = thread_type_get(thread, left); -// auto* right_type = thread_type_get(thread, right); -// -// switch (left_type->id) -// { -// case TYPE_INTEGER: -// { -// // auto integer_bot = thread->types.integer.bottom; -// // auto integer_top = thread->types.integer.top; -// // if (index_equal(left, integer_bot)) -// // { -// // result = left; -// // } -// // else if (index_equal(right, integer_bot)) -// // { -// // result = right; -// // } -// // else if (index_equal(right, integer_top)) -// // { -// // result = left; -// // } -// // else if (index_equal(left, integer_top)) -// // { -// // result = right; -// // } -// // else -// // { -// // result = integer_bot; -// // } -// if (left_type->integer.bit_count == right_type->integer.bit_count) -// { -// todo(); -// } -// else -// { -// if ((!left_type->integer.is_constant & !!left_type->integer.bit_count) & (right_type->integer.is_constant & !right_type->integer.bit_count)) -// { -// result = left; -// } -// else if ((left_type->integer.is_constant & !left_type->integer.bit_count) & (!right_type->integer.is_constant & !!right_type->integer.bit_count)) -// { -// todo(); -// } -// } -// } break; -// case TYPE_BOTTOM: -// { -// assert(type_is_simple(left_type)); -// if ((left_type->id == TYPE_BOTTOM) | (right_type->id == TYPE_TOP)) -// { -// result = left; -// } -// else if ((left_type->id == TYPE_TOP) | (right_type->id == TYPE_BOTTOM)) -// { -// result = right; -// } -// else if (!type_is_simple(right_type)) -// { -// result = thread->types.bottom; -// } -// else if (left_type->id == TYPE_LIVE_CONTROL) -// { -// result = thread->types.live_control; -// } -// else -// { -// result = thread->types.dead_control; -// } -// } break; -// default: -// todo(); -// } -// } -// } -// -// assert(validi(result)); -// -// return result; -// } - -// fn u8 type_is_a(Thread* thread, TypeIndex a, TypeIndex b) -// { -// auto m = type_meet(thread, a, b); -// return index_equal(m, b); -// } - -// fn TypeIndex compute_type_integer_binary(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto* left = thread_node_get(thread, inputs.pointer[1]); -// auto* right = thread_node_get(thread, inputs.pointer[2]); -// assert(!node_is_dead(left)); -// assert(!node_is_dead(right)); -// auto* left_type = thread_type_get(thread, left->type); -// auto* right_type = thread_type_get(thread, right->type); -// -// if (((left_type->id == TYPE_INTEGER) & (right_type->id == TYPE_INTEGER)) & (type_is_constant(left_type) & type_is_constant(right_type))) -// { -// auto left_value = left_type->integer.constant; -// auto right_value = right_type->integer.constant; -// assert(left_type->integer.bit_count == 0); -// assert(right_type->integer.bit_count == 0); -// assert(!left_type->integer.is_signed); -// assert(!right_type->integer.is_signed); -// -// u64 result; -// TypeInteger type_integer = left_type->integer; -// -// switch (node->id) -// { -// case IR_INTEGER_ADD: -// result = left_value + right_value; -// break; -// case IR_INTEGER_SUBSTRACT: -// result = left_value - right_value; -// break; -// case IR_INTEGER_MULTIPLY: -// result = left_value * right_value; -// break; -// case IR_INTEGER_SIGNED_DIVIDE: -// result = left_value * right_value; -// break; -// case IR_INTEGER_AND: -// result = left_value & right_value; -// break; -// case IR_INTEGER_OR: -// result = left_value | right_value; -// break; -// case IR_INTEGER_XOR: -// result = left_value ^ right_value; -// break; -// case IR_INTEGER_SIGNED_SHIFT_LEFT: -// result = left_value << right_value; -// break; -// case IR_INTEGER_SIGNED_SHIFT_RIGHT: -// result = left_value >> right_value; -// break; -// default: -// todo(); -// } -// -// type_integer.constant = result; -// -// auto new_type = thread_get_integer_type(thread, type_integer); -// return new_type; -// } -// else -// { -// auto result = type_meet(thread, left->type, right->type); -// return result; -// } -// } - -global_variable const TypeVirtualTable type_functions[TYPE_COUNT] = { - [TYPE_BOTTOM] = { .get_hash = &type_get_hash_default }, - [TYPE_TOP] = { .get_hash = &type_get_hash_default }, - [TYPE_LIVE_CONTROL] = { .get_hash = &type_get_hash_default }, - [TYPE_DEAD_CONTROL] = { .get_hash = &type_get_hash_default }, - [TYPE_INTEGER] = { .get_hash = &type_get_hash_default }, - [TYPE_TUPLE] = { .get_hash = &type_get_hash_tuple }, -}; - -global_variable const NodeVirtualTable node_functions[NODE_COUNT] = { - // [NODE_START] = { - // .compute_type = &compute_type_start, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_STOP] = { - // .compute_type = &compute_type_bottom, - // .idealize = &idealize_stop, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_CONTROL_PROJECTION] = { - // .compute_type = &compute_type_projection, - // .idealize = &idealize_control_projection, - // .get_hash = &node_get_hash_control_projection, - // }, - // [NODE_DEAD_CONTROL] = { - // .compute_type = &compute_type_dead_control, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_default, - // }, - [IR_RETURN] = { - .compute_type = &compute_type_return, - .idealize = &idealize_return, - .get_hash = &node_get_hash_default, - }, - // [NODE_PROJECTION] = { - // .compute_type = &compute_type_projection, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_projection, - // }, - // [NODE_SCOPE] = { - // .compute_type = &compute_type_bottom, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_scope, - // }, - - // Integer operations - // [NODE_INTEGER_ADD] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SUBSTRACT] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_substract, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_INTEGER_SIGNED_DIVIDE] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_MULTIPLY] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_AND] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_OR] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_XOR] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SIGNED_SHIFT_LEFT] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SIGNED_SHIFT_RIGHT] = { - // .compute_type = &compute_type_integer_binary, - // }, - // - // [NODE_INTEGER_COMPARE_EQUAL] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_compare, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_INTEGER_COMPARE_NOT_EQUAL] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_compare, - // .get_hash = &node_get_hash_default, - // }, - // - // // Constant - // [NODE_CONSTANT] = { - // .compute_type = &compute_type_constant, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_constant, - // }, -}; - -fn String type_id_to_string(Type* type) -{ - switch (type->id) - { - case_to_name(TYPE_, BOTTOM); - case_to_name(TYPE_, TOP); - case_to_name(TYPE_, LIVE_CONTROL); - case_to_name(TYPE_, DEAD_CONTROL); - case_to_name(TYPE_, INTEGER); - case_to_name(TYPE_, TUPLE); - case_to_name(TYPE_, COUNT); - } -} - -fn Hash64 hash_type(Thread* thread, Type* type) -{ - Hash64 hash = type->hash; - - if (!hash) - { - hash = type_functions[type->id].get_hash(thread, type); - // print("Hashing type id {s}: {u64:x}\n", type_id_to_string(type), hash); - } - - assert(hash != 0); - type->hash = hash; - - return hash; -} - -// fn NodeIndex intern_pool_put_node_assume_not_existent(Thread* thread, Hash64 hash, NodeIndex node) -// { -// intern_pool_ensure_capacity(&thread->interned.nodes, thread, 1, INTERN_POOL_KIND_NODE); -// return intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node); -// } - -// fn Hash64 hash_node(Thread* thread, Node* node, NodeIndex node_index) -// { -// auto hash = node->hash; -// if (!hash) -// { -// hash = fnv_offset; -// hash = node_functions[node->id].get_hash(thread, node, node_index, hash); -// // print("[HASH #{u32}] Received hash from callback: {u64:x}\n", node_index.index, hash); -// -// hash = hash_byte(hash, node->id); -// -// auto inputs = node_get_inputs(thread, node); -// for (u32 i = 0; i < inputs.length; i += 1) -// { -// auto input_index = inputs.pointer[i]; -// if (validi(input_index)) -// { -// for (u8* it = (u8*)&input_index; it < (u8*)(&input_index + 1); it += 1) -// { -// hash = hash_byte(hash, *it); -// } -// } -// } -// -// // print("[HASH] Node #{u32}, {s}: {u64:x}\n", node_index.index, node_id_to_string(node), hash); -// -// node->hash = hash; -// } -// -// assert(hash); -// -// return hash; -// } - -// fn NodeGetOrPut intern_pool_get_or_put_node(Thread* thread, NodeIndex node_index) -// { -// assert(thread->interned.nodes.length <= thread->interned.nodes.capacity); -// auto existing_capacity = thread->interned.nodes.capacity; -// auto* node = &thread->buffer.nodes.pointer[geti(node_index)]; -// auto hash = hash_node(thread, node, node_index); -// auto original_index = hash & (existing_capacity - 1); -// -// auto slot = intern_pool_find_node_slot(thread, original_index, node_index); -// if (slot != -1) -// { -// u32 index = slot; -// auto* existing_ptr = &thread->interned.nodes.pointer[index]; -// NodeIndex existing_value = *(NodeIndex*)existing_ptr; -// u8 existing = validi(existing_value); -// NodeIndex new_value = existing_value; -// if (!existing) -// { -// assert(thread->interned.nodes.length < thread->interned.nodes.capacity); -// new_value = intern_pool_put_node_at_assume_not_existent_assume_capacity(thread, node_index, index); -// assert(!index_equal(new_value, existing_value)); -// assert(index_equal(new_value, node_index)); -// } -// return (NodeGetOrPut) { -// .index = new_value, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.nodes.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.nodes.length == existing_capacity) -// { -// auto result = intern_pool_put_node_assume_not_existent(thread, hash, node_index); -// return (NodeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn NodeIndex intern_pool_remove_node(Thread* thread, NodeIndex node_index) -// { -// auto existing_capacity = thread->interned.nodes.capacity; -// auto* node = thread_node_get(thread, node_index); -// auto hash = hash_node(thread, node, node_index); -// -// auto original_index = hash & (existing_capacity - 1); -// auto slot = intern_pool_find_node_slot(thread, cast_to(u32, u64, original_index), node_index); -// -// if (slot != -1) -// { -// auto i = (u32)slot; -// auto* slot_pointer = &thread->interned.nodes.pointer[i]; -// auto old_node_index = *(NodeIndex*)slot_pointer; -// assert(validi(old_node_index)); -// thread->interned.nodes.length -= 1; -// *slot_pointer = 0; -// -// auto j = i; -// -// while (1) -// { -// j = (j + 1) & (existing_capacity - 1); -// -// auto existing = thread->interned.nodes.pointer[j]; -// if (existing == 0) -// { -// break; -// } -// -// auto existing_node_index = *(NodeIndex*)&existing; -// auto* existing_node = thread_node_get(thread, existing_node_index); -// auto existing_node_hash = hash_node(thread, existing_node, existing_node_index); -// auto k = existing_node_hash & (existing_capacity - 1); -// -// if (i <= j) -// { -// if ((i < k) & (k <= j)) -// { -// continue; -// } -// } -// else -// { -// if ((k <= j) | (i < k)) -// { -// continue; -// } -// } -// -// thread->interned.nodes.pointer[i] = thread->interned.nodes.pointer[j]; -// thread->interned.nodes.pointer[j] = 0; -// -// i = j; -// } -// -// return old_node_index; -// } -// else -// { -// todo(); -// } -// } - -STRUCT(Parser) -{ - u64 i; - u32 line; - u32 column; -}; - -[[gnu::hot]] fn void skip_space(Parser* parser, String src) -{ - u64 original_i = parser->i; - - if (original_i != src.length) - { - if (is_space(src.pointer[original_i], get_next_ch_safe(src, original_i))) - { - while (parser->i < src.length) - { - u64 index = parser->i; - u8 ch = src.pointer[index]; - u64 new_line = ch == '\n'; - parser->line += new_line; - - if (new_line) - { - // TODO: is this a bug? - parser->column = cast_to(u32, u64, index + 1); - } - - if (!is_space(ch, get_next_ch_safe(src, parser->i))) - { - break; - } - - u32 is_comment = src.pointer[index] == '/'; - parser->i += is_comment + is_comment; - if (is_comment) - { - while (parser->i < src.length) - { - if (src.pointer[parser->i] == '\n') - { - break; - } - - parser->i += 1; - } - - continue; - } - - parser->i += 1; - } - } - } -} - -[[gnu::hot]] fn void expect_character(Parser* parser, String src, u8 expected_ch) -{ - u64 index = parser->i; - if (likely(index < src.length)) - { - u8 ch = src.pointer[index]; - auto matches = cast_to(u64, s64, likely(ch == expected_ch)); - parser->i += matches; - if (!matches) - { - print_string(strlit("expected character '")); - print_string(ch_to_str(expected_ch)); - print_string(strlit("', but found '")); - print_string(ch_to_str(ch)); - print_string(strlit("'\n")); - failed_execution(); - } - } - else - { - print_string(strlit("expected character '")); - print_string(ch_to_str(expected_ch)); - print_string(strlit("', but found end of file\n")); - failed_execution(); - } -} - -[[gnu::hot]] fn String parse_identifier(Parser* parser, String src) -{ - u64 identifier_start_index = parser->i; - u64 is_string_literal = src.pointer[identifier_start_index] == '"'; - parser->i += is_string_literal; - u8 identifier_start_ch = src.pointer[parser->i]; - u64 is_valid_identifier_start = is_identifier_start(identifier_start_ch); - parser->i += is_valid_identifier_start; - - if (likely(is_valid_identifier_start)) - { - while (parser->i < src.length) - { - u8 ch = src.pointer[parser->i]; - auto is_identifier = cast_to(u64, s64, likely(is_identifier_ch(ch))); - parser->i += is_identifier; - - if (!is_identifier) - { - if (unlikely(is_string_literal)) - { - expect_character(parser, src, '"'); - } - - String result = s_get_slice(u8, src, identifier_start_index, parser->i - is_string_literal); - return result; - } - } - - failed_execution(); - } - else - { - failed_execution(); - } -} - -#define array_start '[' -#define array_end ']' - -#define argument_start '(' -#define argument_end ')' - -#define block_start '{' -#define block_end '}' - -#define pointer_sign '*' - -// fn void thread_add_job(Thread* thread, NodeIndex node_index) -// { -// unused(thread); -// unused(node_index); -// todo(); -// } - -// fn void thread_add_jobs(Thread* thread, Slice(NodeIndex) nodes) -// { -// for (u32 i = 0; i < nodes.length; i += 1) -// { -// NodeIndex node_index = nodes.pointer[i]; -// thread_add_job(thread, node_index); -// } -// } - -union NodePair -{ - struct - { - NodeIndex old; - NodeIndex new; - }; - NodeIndex nodes[2]; -}; -typedef union NodePair NodePair; - -// fn NodeIndex node_keep(Thread* thread, NodeIndex node_index) -// { -// return node_add_output(thread, node_index, invalidi(Node)); -// } - -// fn NodeIndex node_unkeep(Thread* thread, NodeIndex node_index) -// { -// node_remove_output(thread, node_index, invalidi(Node)); -// return node_index; -// } - -fn NodeIndex dead_code_elimination(Thread* thread, NodePair nodes) -{ - NodeIndex old = nodes.old; - NodeIndex new = nodes.new; - - if (!index_equal(old, new)) - { - // print("[DCE] old: #{u32} != new: #{u32}. Proceeding to eliminate\n", old.index, new.index); - auto* old_node = thread_node_get(thread, old); - unused(old_node); - todo(); - // if (node_is_unused(old_node) & !node_is_dead(old_node)) - // { - // node_keep(thread, new); - // todo(); - // // node_kill(thread, old); - // // node_unkeep(thread, new); - // } - } - - return new; -} - -// fn u8 type_is_high_or_const(Thread* thread, TypeIndex type_index) -// { -// u8 result = index_equal(type_index, thread->types.top) | index_equal(type_index, thread->types.dead_control); -// if (!result) -// { -// Type* type = thread_type_get(thread, type_index); -// switch (type->id) -// { -// case TYPE_INTEGER: -// result = type->integer.is_constant | ((type->integer.constant == 0) & (type->integer.bit_count == 0)); -// break; -// default: -// break; -// } -// } -// -// return result; -// } - -// fn TypeIndex type_join(Thread* thread, TypeIndex a, TypeIndex b) -// { -// TypeIndex result; -// if (index_equal(a, b)) -// { -// result = a; -// } -// else -// { -// unused(thread); -// todo(); -// } -// -// return result; -// } - -// fn void node_set_type(Thread* thread, Node* node, TypeIndex new_type) -// { -// todo(); -// // auto old_type = node->type; -// // assert(!validi(old_type) || type_is_a(thread, new_type, old_type)); -// // if (!index_equal(old_type, new_type)) -// // { -// // node->type = new_type; -// // auto outputs = node_get_outputs(thread, node); -// // thread_add_jobs(thread, outputs); -// // // move_dependencies_to_worklist(thread, node); -// // } -// } - -global_variable auto enable_peephole = 1; - -fn NodeIndex peephole_optimize(Thread* thread, Function* function, NodeIndex node_index) -{ - assert(enable_peephole); - auto result = node_index; - auto* node = thread_node_get(thread, node_index); - // print("Peepholing node #{u32} ({s})\n", node_index.index, node_id_to_string(node)); - auto old_type = node->type; - auto new_type = node_functions[node->id].compute_type(thread, node_index); - unused(new_type); - unused(old_type); - - if (enable_peephole) - { - unused(function); - // thread->iteration.total += 1; - // node_set_type(thread, node, new_type); - // - // if (node->id != NODE_CONSTANT && node->id != NODE_DEAD_CONTROL && type_is_high_or_const(thread, node->type)) - // { - // if (index_equal(node->type, thread->types.dead_control)) - // { - // todo(); - // } - // else - // { - // auto constant_node = constant_int_create_with_type(thread, function, node->type); - // return constant_node; - // } - // } - // - // auto idealize = 1; - // if (!node->hash) - // { - // auto gop = intern_pool_get_or_put_node(thread, node_index); - // idealize = !gop.existing; - // - // if (gop.existing) - // { - // auto interned_node_index = gop.index; - // auto* interned_node = thread_node_get(thread, interned_node_index); - // auto new_type = type_join(thread, interned_node->type, node->type); - // node_set_type(thread, interned_node, new_type); - // node->hash = 0; - // // print("[peephole_optimize] Eliminating #{u32} because an existing node was found: #{u32}\n", node_index.index, interned_node_index.index); - // auto dce_node = dead_code_elimination(thread, (NodePair) { - // .old = node_index, - // .new = interned_node_index, - // }); - // - // result = dce_node; - // } - // } - // - // if (idealize) - // { - // auto idealized_node = node_functions[node->id].idealize(thread, node_index); - // if (validi(idealized_node)) - // { - // result = idealized_node; - // } - // else - // { - // u64 are_types_equal = index_equal(new_type, old_type); - // thread->iteration.nop += are_types_equal; - // - // result = are_types_equal ? invalidi(Node) : node_index; - // } - // } - todo(); - } - else - { - todo(); - // node->type = new_type; - } - - return result; -} - -fn NodeIndex peephole(Thread* thread, Function* function, NodeIndex node_index) -{ - NodeIndex result; - if (enable_peephole) - { - NodeIndex new_node = peephole_optimize(thread, function, node_index); - if (validi(new_node)) - { - NodeIndex peephole_new_node = peephole(thread, function, new_node); - // print("[peephole] Eliminating #{u32} because a better node was found: #{u32}\n", node_index.index, new_node.index); - auto dce_node = dead_code_elimination(thread, (NodePair) - { - .old = node_index, - .new = peephole_new_node, - }); - - result = dce_node; - } - else - { - result = node_index; - } - } - else - { - auto* node = thread_node_get(thread, node_index); - auto new_type = node_functions[node->id].compute_type(thread, node_index); - unused(new_type); - todo(); - // node->type = new_type; - // result = node_index; - } - - return result; -} - -fn NodeIndex node_project(Thread* thread, NodeIndex node_index, TypePair type, u32 index) -{ - auto* node = thread_node_get(thread, node_index); - assert(type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE); - auto projection_node_index = thread_node_add(thread, (NodeCreate) - { - .id = IR_PROJECTION, - .inputs = array_to_slice(((NodeIndex[]) { node_index })), - .type_pair = type, - }); - auto* projection = thread_node_get(thread, projection_node_index); - projection->projection = (NodeProjection) - { - .index = index, - }; - return projection_node_index; -} - -fn TypePair analyze_type(Thread* thread, Parser* parser, String src) -{ - u64 start_index = parser->i; - u8 start_ch = src.pointer[start_index]; - u32 is_array_start = start_ch == array_start; - u32 u_start = start_ch == 'u'; - u32 s_start = start_ch == 's'; - u32 float_start = start_ch == 'f'; - u32 void_start = start_ch == 'v'; - u32 pointer_start = start_ch == pointer_sign; - u32 integer_start = u_start | s_start; - u32 number_start = integer_start | float_start; - - if (void_start) - { - todo(); - } - else if (is_array_start) - { - todo(); - } - else if (pointer_start) - { - todo(); - } - else if (number_start) - { - u64 expected_digit_start = start_index + 1; - u64 i = expected_digit_start; - u32 decimal_digit_count = 0; - u64 top = i + 5; - - while (i < top) - { - u8 ch = src.pointer[i]; - auto is_digit = is_decimal_digit(ch); - decimal_digit_count += is_digit; - if (!is_digit) - { - auto is_alpha = is_alphabetic(ch); - if (is_alpha) - { - decimal_digit_count = 0; - } - break; - } - - i += 1; - } - - if (decimal_digit_count) - { - parser->i += 1; - - if (integer_start) - { - auto signedness = cast_to(u8, u64, s_start); - u64 bit_size; - u64 current_i = parser->i; - assert(src.pointer[current_i] >= '0' & src.pointer[current_i] <= '9'); - switch (decimal_digit_count) { - case 0: - failed_execution(); - case 1: - bit_size = src.pointer[current_i] - '0'; - break; - case 2: - bit_size = (src.pointer[current_i] - '0') * 10 + (src.pointer[current_i + 1] - '0'); - break; - default: - failed_execution(); - } - parser->i += decimal_digit_count; - - assert(!is_decimal_digit(src.pointer[parser->i])); - - if (bit_size) - { - auto bit_count = cast_to(u8, u64, bit_size); - auto valid = MIN(MAX(8, round_up_to_next_power_of_2(MAX(bit_count, 1))), 64); - if (bit_count != valid) - { - failed_execution(); - } - auto bit_index = cast_to(u32, s32, __builtin_ctz(bit_count >> 3)); - static_assert(array_length(thread->types.debug.integer.array) == 8); - auto index = signedness * 4 + bit_index; - auto debug_type_index = thread->types.debug.integer.array[index]; - BackendTypeId backend_type = cast_to(u8, u32, bit_index + 1); - auto type_pair = type_pair_make(debug_type_index, backend_type); - return type_pair; - } - else - { - failed_execution(); - } - } - else if (float_start) - { - todo(); - } - else - { - todo(); - } - } - else - { - failed_execution(); - } - } - - todo(); -} - -declare_ip_functions(Node, node) - -// TODO: -fn NodeIndex node_gvn_intern(Thread* thread, NodeIndex node_index) -{ - auto result = ip_Node_get_or_put(&thread->interned.nodes, thread, node_index); - if (result.existing) - { - assert(thread_node_get(thread, result.index)->interned); - } - else - { - thread_node_get(thread, node_index)->interned = 1; - } - return result.index; -} - -fn void node_gvn_remove(Thread* thread, NodeIndex node_index) -{ - auto result = ip_Node_remove(&thread->interned.nodes, thread, node_index); - assert(index_equal(result, node_index)); - thread_node_get(thread, node_index)->interned = 0; -} - -fn NodeIndex analyze_primary_expression(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - u8 starting_ch = src.pointer[parser->i]; - u64 is_digit = is_decimal_digit(starting_ch); - u64 is_identifier = is_identifier_start(starting_ch); - - if (is_identifier) - { - String identifier = parse_identifier(parser, src); - unused(identifier); - todo(); - // auto node_index = scope_lookup(thread, builder, identifier); - // if (validi(node_index)) - // { - // return node_index; - // } - // else - // { - // failed_execution(); - // } - } - else if (is_digit) - { - typedef enum IntegerPrefix { - INTEGER_PREFIX_HEXADECIMAL, - INTEGER_PREFIX_DECIMAL, - INTEGER_PREFIX_OCTAL, - INTEGER_PREFIX_BINARY, - } IntegerPrefix; - IntegerPrefix prefix = INTEGER_PREFIX_DECIMAL; - u64 value = 0; - - if (starting_ch == '0') - { - auto follow_up_character = src.pointer[parser->i + 1]; - auto is_hex_start = follow_up_character == 'x'; - auto is_octal_start = follow_up_character == 'o'; - auto is_bin_start = follow_up_character == 'b'; - auto is_prefixed_start = is_hex_start | is_octal_start | is_bin_start; - auto follow_up_alpha = is_alphabetic(follow_up_character); - auto follow_up_digit = is_decimal_digit(follow_up_character); - auto is_valid_after_zero = is_space(follow_up_character, get_next_ch_safe(src, follow_up_character)) | (!follow_up_digit & !follow_up_alpha); - - if (is_prefixed_start) { - switch (follow_up_character) { - case 'x': prefix = INTEGER_PREFIX_HEXADECIMAL; break; - case 'o': prefix = INTEGER_PREFIX_OCTAL; break; - case 'd': prefix = INTEGER_PREFIX_DECIMAL; break; - case 'b': prefix = INTEGER_PREFIX_BINARY; break; - default: failed_execution(); - }; - - parser->i += 2; - - } else if (!is_valid_after_zero) { - failed_execution(); - } - } - - auto start = parser->i; - - switch (prefix) - { - case INTEGER_PREFIX_HEXADECIMAL: - { - // while (is_hex_digit(src[parser->i])) { - // parser->i += 1; - // } - - todo(); - // auto slice = src.slice(start, parser->i); - // value = parse_hex(slice); - } break; - case INTEGER_PREFIX_DECIMAL: - { - while (is_decimal_digit(src.pointer[parser->i])) - { - parser->i += 1; - } - - value = parse_decimal(s_get_slice(u8, src, start, parser->i)); - } break; - case INTEGER_PREFIX_OCTAL: - { - todo(); - } break; - case INTEGER_PREFIX_BINARY: - { - todo(); - } break; - } - - auto node_index = thread_node_add(thread, (NodeCreate){ - .inputs = array_to_slice(((NodeIndex []) { - builder->function->root, - })), - .type_pair = type_pair_make(thread->types.debug.integer.u64, BACKEND_TYPE_INTEGER_64), - .id = IR_INTEGER_CONSTANT, - }); - - auto* node = thread_node_get(thread, node_index); - node->integer_constant = (NodeIntegerConstant) { - .unsigned_value = value, - }; - - auto new_node_index = node_gvn_intern(thread, node_index); - - return new_node_index; - } - else - { - todo(); - } -} - -fn NodeIndex analyze_unary(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - typedef enum PrefixOperator - { - PREFIX_OPERATOR_NONE = 0, - PREFIX_OPERATOR_NEGATION, - PREFIX_OPERATOR_LOGICAL_NOT, - PREFIX_OPERATOR_BITWISE_NOT, - PREFIX_OPERATOR_ADDRESS_OF, - } PrefixOperator; - - PrefixOperator prefix_operator; - NodeIndex node_index; - - switch (src.pointer[parser->i]) - { - case '-': - todo(); - case '!': - todo(); - case '~': - todo(); - case '&': - todo(); - default: - { - node_index = analyze_primary_expression(thread, parser, builder, src); - prefix_operator = PREFIX_OPERATOR_NONE; - } break; - } - - // typedef enum SuffixOperator - // { - // SUFFIX_OPERATOR_NONE = 0, - // SUFFIX_OPERATOR_CALL, - // SUFFIX_OPERATOR_ARRAY, - // SUFFIX_OPERATOR_FIELD, - // SUFFIX_OPERATOR_POINTER_DEREFERENCE, - // } SuffixOperator; - // - // SuffixOperator suffix_operator; - - skip_space(parser, src); - - switch (src.pointer[parser->i]) - { - case argument_start: - todo(); - case array_start: - todo(); - case '.': - todo(); - default: - break; - } - - if (prefix_operator != PREFIX_OPERATOR_NONE) - { - todo(); - } - - return node_index; -} - -fn NodeIndex analyze_multiplication(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_unary(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '*': - node_id = IR_INTEGER_MULTIPLY; - break; - case '/': - node_id = IR_INTEGER_DIVIDE; - break; - case '%': - todo(); - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_multiplication(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - todo(); - // node_set_input(thread, new_node_index, 2, right); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - // print("Analyze addition returned node #{u32}\n", left.index); - - return left; -} - -fn NodeIndex analyze_addition(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_multiplication(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - - switch (src.pointer[parser->i]) - { - case '+': - node_id = IR_INTEGER_ADD; - break; - case '-': - node_id = IR_INTEGER_SUBSTRACT; - break; - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += 1; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_multiplication(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - // print("Analyze addition returned node #{u32}\n", left.index); - - return left; -} - -fn NodeIndex analyze_shift(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_addition(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - - if ((src.pointer[parser->i] == '<') & (src.pointer[parser->i + 1] == '<')) - { - node_id = IR_INTEGER_SHIFT_LEFT; - } - else if ((src.pointer[parser->i] == '>') & (src.pointer[parser->i + 1] == '>')) - { - node_id = IR_INTEGER_SHIFT_RIGHT; - } - else - { - break; - } - - parser->i += 2; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_addition(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_bitwise_binary(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_shift(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '&': - node_id = IR_INTEGER_AND; - break; - case '|': - node_id = IR_INTEGER_OR; - break; - case '^': - node_id = IR_INTEGER_XOR; - break; - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_shift(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_comparison(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_bitwise_binary(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '=': - todo(); - case '!': - if (src.pointer[parser->i + 1] == '=') - { - skip_count = 2; - node_id = IR_INTEGER_COMPARE_NOT_EQUAL; - } - else - { - failed_execution(); - } - break; - case '<': - todo(); - case '>': - todo(); - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_bitwise_binary(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_expression(Thread* thread, Parser* parser, FunctionBuilder* builder, String src, TypePair result_type) -{ - NodeIndex result = analyze_comparison(thread, parser, builder, src); - // TODO: typecheck - unused(result_type); - return result; -} - -fn void analyze_block(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - expect_character(parser, src, block_start); - - // TODO - // scope_push(thread, builder); - - Function* function = builder->function; - - while (1) - { - skip_space(parser, src); - - if (s_get(src, parser->i) == block_end) - { - break; - } - - u8 statement_start_ch = src.pointer[parser->i]; - - if (is_identifier_start(statement_start_ch)) - { - String statement_start_identifier = parse_identifier(parser, src); - if (s_equal(statement_start_identifier, (strlit("return")))) - { - skip_space(parser, src); - NodeIndex return_value = analyze_expression(thread, parser, builder, src, function->return_type); - skip_space(parser, src); - expect_character(parser, src, ';'); - - auto* current_node = thread_node_get(thread, builder->current); - auto current_inputs = node_get_inputs(thread, current_node); - auto mem_state = current_inputs.pointer[2]; - - auto return_node_index = node_get_inputs(thread, thread_node_get(thread, builder->function->root)).pointer[1]; - auto* return_node = thread_node_get(thread, return_node_index); - assert(return_node->input_count >= 4); - auto return_inputs = node_get_inputs(thread, return_node); - - node_add_input(thread, return_inputs.pointer[1], mem_state); - - node_add_input(thread, return_inputs.pointer[3], return_value); - - auto control = return_inputs.pointer[0]; - assert(thread_node_get(thread, control)->id == IR_REGION); - - assert(validi(current_inputs.pointer[0])); - node_add_input(thread, control, current_inputs.pointer[0]); - - builder->current = invalidi(Node); - continue; - } - - String left_name = statement_start_identifier; - unused(left_name); - - skip_space(parser, src); - - typedef enum AssignmentOperator - { - ASSIGNMENT_OPERATOR_NONE, - } AssignmentOperator; - - AssignmentOperator assignment_operator; - switch (src.pointer[parser->i]) - { - case '=': - assignment_operator = ASSIGNMENT_OPERATOR_NONE; - parser->i += 1; - break; - default: - todo(); - } - unused(assignment_operator); - - skip_space(parser, src); - - NodeIndex initial_right = analyze_expression(thread, parser, builder, src, type_pair_invalid); - unused(initial_right); - - expect_character(parser, src, ';'); - - todo(); - - // auto left = scope_lookup(thread, builder, left_name); - // if (!validi(left)) - // { - // failed_execution(); - // } - // - // NodeIndex right; - // switch (assignment_operator) - // { - // case ASSIGNMENT_OPERATOR_NONE: - // right = initial_right; - // break; - // } - // - // scope_update(thread, builder, left_name, right); - } - else - { - switch (statement_start_ch) - { - case '>': - { - parser->i += 1; - skip_space(parser, src); - - String local_name = parse_identifier(parser, src); - unused(local_name); - - skip_space(parser, src); - - auto type = type_pair_invalid; - - u8 has_type_declaration = src.pointer[parser->i] == ':'; - if (has_type_declaration) - { - parser->i += 1; - - skip_space(parser, src); - - type = analyze_type(thread, parser, src); - - skip_space(parser, src); - } - - expect_character(parser, src, '='); - - skip_space(parser, src); - - auto initial_value_node_index = analyze_expression(thread, parser, builder, src, type); - skip_space(parser, src); - expect_character(parser, src, ';'); - - auto* initial_value_node = thread_node_get(thread, initial_value_node_index); - unused(initial_value_node); - - // TODO: typecheck - todo(); - - // auto result = scope_define(thread, builder, local_name, initial_value_node->type, initial_value_node_index); - // if (!validi(result)) - // { - // failed_execution(); - // } - } break; - case block_start: - analyze_block(thread, parser, builder, src); - break; - default: - todo(); - break; - } - } - } - - expect_character(parser, src, block_end); - - // scope_pop(thread, builder); -} - -fn void analyze_file(Thread* thread, File* file) -{ - Parser p = {}; - Parser* restrict parser = &p; - String src = file->source; - - while (1) - { - skip_space(parser, src); - - if (parser->i == src.length) - { - break; - } - - // Parse top level declaration - u64 start_ch_index = parser->i; - auto start_line = parser->line; - auto start_column = parser->column; - u8 start_ch = s_get(src, start_ch_index); - - u64 is_identifier = is_identifier_start(start_ch); - - if (is_identifier) - { - u8 next_ch = get_next_ch_safe(src, start_ch_index); - u64 is_fn = (start_ch == 'f') & (next_ch == 'n'); - - if (is_fn) - { - parser->i += 2; - - FunctionBuilder function_builder = {}; - FunctionBuilder* builder = &function_builder; - builder->file = file; - - skip_space(parser, src); - - Function* restrict function = vb_add(&thread->buffer.functions, 1); - auto function_index = cast_to(u32, s64, function - thread->buffer.functions.pointer); - memset(function, 0, sizeof(Function)); - builder->function = function; - function->line = start_line; - function->column = start_column; - function->name = parse_identifier(parser, src); - if (s_equal(function->name, strlit("main"))) - { - thread->main_function = function_index; - } - - skip_space(parser, src); - - // Parse arguments - expect_character(parser, src, argument_start); - - u32 argument_i = 0; - String argument_names[255]; - - while (1) - { - skip_space(parser, src); - if (src.pointer[parser->i] == argument_end) - { - break; - } - - if (argument_i == 255) - { - // Maximum arguments reached - failed_execution(); - } - - auto argument_name = parse_identifier(parser, src); - argument_names[argument_i] = argument_name; - - skip_space(parser, src); - expect_character(parser, src, ':'); - skip_space(parser, src); - - auto type_index = analyze_type(thread, parser, src); - unused(type_index); - // start_argument_type_buffer[argument_i] = type_index; - argument_i += 1; - - skip_space(parser, src); - - switch (src.pointer[parser->i]) - { - case argument_end: - break; - default: - todo(); - } - } - - expect_character(parser, src, argument_end); - skip_space(parser, src); - - function->return_type = analyze_type(thread, parser, src); - - function->root = thread_node_add(thread, (NodeCreate) - { - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_TUPLE), - .id = IR_ROOT, - .inputs = array_to_slice(((NodeIndex[]){ - invalidi(Node), // TODO: add callgraph node - invalidi(Node), // return node - })), - }); - - auto* root_node = thread_node_get(thread, function->root); - root_node->root = (NodeRoot) - { - .function_index = function_index, - }; - - auto control = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), 0); - auto memory = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_MEMORY), 1); - auto pointer = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_POINTER), 2); - - if (argument_i > 0) - { - // TODO: project arguments - todo(); - } - - NodeIndex fake[256] = {}; - auto slice = (Slice(NodeIndex)) array_to_slice(fake); - slice.length = 4; - auto return_node_index = thread_node_add(thread, (NodeCreate) - { - .id = IR_RETURN, - .inputs = slice, - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - - node_set_input(thread, function->root, 1, return_node_index); - - auto region = thread_node_add(thread, (NodeCreate) - { - .id = IR_REGION, - .inputs = {}, - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - - auto memory_phi = thread_node_add(thread, (NodeCreate) - { - .id = IR_PHI, - .inputs = array_to_slice(((NodeIndex[]) { - region, - })), - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_MEMORY), - }); - - node_set_input(thread, return_node_index, 0, region); - node_set_input(thread, return_node_index, 1, memory_phi); - node_set_input(thread, return_node_index, 2, pointer); - - auto ret_phi = thread_node_add(thread, (NodeCreate) - { - .id = IR_PHI, - .inputs = array_to_slice(((NodeIndex[]) { - region, - })), - .type_pair = function->return_type, - }); - node_set_input(thread, ret_phi, 0, region); - node_set_input(thread, return_node_index, 3, ret_phi); - - thread_node_get(thread, region)->region = (NodeRegion) - { - .in_mem = memory_phi, - }; - - node_gvn_intern(thread, function->root); - node_gvn_intern(thread, control); - node_gvn_intern(thread, memory); - node_gvn_intern(thread, pointer); - - skip_space(parser, src); - - auto symbol_table = thread_node_add(thread, (NodeCreate) - { - .id = IR_SYMBOL_TABLE, - .inputs = array_to_slice(((NodeIndex[]) - { - control, - control, - memory, - pointer, - })), - }); - builder->current = symbol_table; - - analyze_block(thread, parser, builder, src); - - node_gvn_intern(thread, return_node_index); - node_gvn_intern(thread, region); - node_gvn_intern(thread, memory_phi); - node_gvn_intern(thread, ret_phi); - node_gvn_intern(thread, symbol_table); - } - else - { - todo(); - } - } - else - { - todo(); - } - } -} - -// typedef NodeIndex NodeCallback(Thread* thread, Function* function, NodeIndex node_index); -// -// fn NodeIndex node_walk_internal(Thread* thread, Function* function, NodeIndex node_index, NodeCallback* callback) -// { -// if (bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// return invalidi(Node); -// } -// else -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// auto callback_result = callback(thread, function, node_index); -// if (validi(callback_result)) -// { -// return callback_result; -// } -// -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto outputs = node_get_outputs(thread, node); -// -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto n = inputs.pointer[i]; -// if (validi(n)) -// { -// auto n_result = node_walk_internal(thread, function, n, callback); -// if (validi(n_result)) -// { -// return n_result; -// } -// } -// } -// -// for (u64 i = 0; i < outputs.length; i += 1) -// { -// auto n = outputs.pointer[i]; -// if (validi(n)) -// { -// auto n_result = node_walk_internal(thread, function, n, callback); -// if (validi(n_result)) -// { -// return n_result; -// } -// } -// } -// -// return invalidi(Node); -// } -// } -// -// fn NodeIndex node_walk(Thread* thread, Function* function, NodeIndex node_index, NodeCallback* callback) -// { -// assert(thread->worklist.visited.length == 0); -// NodeIndex result = node_walk_internal(thread, function, node_index, callback); -// bitset_clear(&thread->worklist.visited); -// return result; -// } -// -// fn NodeIndex progress_on_list_callback(Thread* thread, Function* function, NodeIndex node_index) -// { -// if (bitset_get(&thread->worklist.bitset, geti(node_index))) -// { -// return invalidi(Node); -// } -// else -// { -// NodeIndex new_node = peephole_optimize(thread, function, node_index); -// return new_node; -// } -// } -// -// fn u8 progress_on_list(Thread* thread, Function* function, NodeIndex stop_node_index) -// { -// thread->worklist.mid_assert = 1; -// -// NodeIndex changed = node_walk(thread, function, stop_node_index, &progress_on_list_callback); -// -// thread->worklist.mid_assert = 0; -// -// return !validi(changed); -// } -// -// fn void iterate_peepholes(Thread* thread, Function* function, NodeIndex stop_node_index) -// { -// assert(progress_on_list(thread, function, stop_node_index)); -// if (thread->worklist.nodes.length > 0) -// { -// while (1) -// { -// auto node_index = thread_worklist_pop(thread); -// if (!validi(node_index)) -// { -// break; -// } -// -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // if (!node_is_dead(node)) -// // { -// // auto new_node_index = peephole_optimize(thread, function, node_index); -// // if (validi(new_node_index)) -// // { -// // todo(); -// // } -// // } -// } -// } -// -// thread_worklist_clear(thread); -// } - -// fn u8 node_is_cfg(Node* node) -// { -// switch (node->id) -// { -// case IR_START: -// case IR_DEAD_CONTROL: -// case IR_CONTROL_PROJECTION: -// case IR_RETURN: -// case IR_STOP: -// return 1; -// case IR_SCOPE: -// case IR_CONSTANT: -// case IR_PROJECTION: -// return 0; -// default: -// todo(); -// } -// } - -// fn void rpo_cfg(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// if (node_is_cfg(node) && !bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// auto outputs = node_get_outputs(thread, node); -// for (u64 i = 0; i < outputs.length; i += 1) -// { -// auto output = outputs.pointer[i]; -// if (validi(output)) -// { -// rpo_cfg(thread, output); -// } -// } -// -// *vb_add(&thread->worklist.nodes, 1) = node_index; -// } -// } - -// fn s32 node_loop_depth(Thread* thread, Node* node) -// { -// assert(node_is_cfg(node)); -// s32 loop_depth; -// -// switch (node->id) -// { -// case IR_START: -// { -// loop_depth = node->start.cfg.loop_depth; -// if (!loop_depth) -// { -// loop_depth = node->start.cfg.loop_depth = 1; -// } -// } break; -// case IR_STOP: -// { -// loop_depth = node->stop.cfg.loop_depth; -// if (!loop_depth) -// { -// loop_depth = node->stop.cfg.loop_depth = 1; -// } -// } break; -// case IR_RETURN: -// { -// loop_depth = node->return_node.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->return_node.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// case IR_CONTROL_PROJECTION: -// { -// loop_depth = node->control_projection.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->control_projection.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// case IR_DEAD_CONTROL: -// { -// loop_depth = node->dead_control.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->dead_control.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// default: -// todo(); -// } -// -// return loop_depth; -// } - -// fn u8 node_is_region(Node* node) -// { -// return (node->id == IR_REGION) | (node->id == IR_REGION_LOOP); -// } -// -// fn u8 node_is_pinned(Node* node) -// { -// switch (node->id) -// { -// case IR_PROJECTION: -// case IR_START: -// return 1; -// case IR_CONSTANT: -// case IR_INTEGER_SUBSTRACT: -// case IR_INTEGER_COMPARE_EQUAL: -// case IR_INTEGER_COMPARE_NOT_EQUAL: -// return 0; -// default: -// todo(); -// } -// } - -// fn s32 node_cfg_get_immediate_dominator_tree_depth(Node* node) -// { -// assert(node_is_cfg(node)); -// switch (node->id) -// { -// case IR_START: -// return 0; -// case IR_DEAD_CONTROL: -// todo(); -// case IR_CONTROL_PROJECTION: -// todo(); -// case IR_RETURN: -// todo(); -// case IR_STOP: -// todo(); -// default: -// todo(); -// } -// } - -// fn void schedule_early(Thread* thread, NodeIndex node_index, NodeIndex start_node) -// { -// if (validi(node_index) && !bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto input = inputs.pointer[i]; -// -// if (validi(input)) -// { -// auto* input_node = thread_node_get(thread, input); -// if (!node_is_pinned(input_node)) -// { -// schedule_early(thread, node_index, start_node); -// } -// } -// } -// -// if (!node_is_pinned(node)) -// { -// auto early = start_node; -// -// for (u64 i = 1; i < inputs.length; i += 1) -// { -// auto input_index = inputs.pointer[i]; -// auto input_node = thread_node_get(thread, input_index); -// auto control_input_index = node_input_get(thread, input_node, 0); -// auto* control_input_node = thread_node_get(thread, control_input_index); -// auto* early_node = thread_node_get(thread, early); -// auto input_depth = node_cfg_get_immediate_dominator_tree_depth(control_input_node); -// auto early_depth = node_cfg_get_immediate_dominator_tree_depth(early_node); -// if (input_depth > early_depth) -// { -// early = control_input_index; -// todo(); -// } -// } -// -// node_set_input(thread, node_index, 0, early); -// } -// } -// } -// -// fn u8 node_cfg_block_head(Node* node) -// { -// assert(node_is_cfg(node)); -// switch (node->id) -// { -// case IR_START: -// return 1; -// default: -// todo(); -// } -// } -// -// fn u8 is_forwards_edge(Thread* thread, NodeIndex output_index, NodeIndex input_index) -// { -// u8 result = validi(output_index) & validi(input_index); -// if (result) -// { -// auto* output = thread_node_get(thread, output_index); -// result = output->input_count > 2; -// if (result) -// { -// auto input_index2 = node_input_get(thread, output, 2); -// -// result = index_equal(input_index2, input_index); -// -// if (result) -// { -// todo(); -// } -// } -// } -// -// return result; -// } -// -// fn void schedule_late(Thread* thread, NodeIndex node_index, Slice(NodeIndex) nodes, Slice(NodeIndex) late) -// { -// if (!validi(late.pointer[geti(node_index)])) -// { -// auto* node = thread_node_get(thread, node_index); -// -// if (node_is_cfg(node)) -// { -// late.pointer[geti(node_index)] = node_cfg_block_head(node) ? node_index : node_input_get(thread, node, 0); -// } -// -// if (node->id == IR_PHI) -// { -// todo(); -// } -// -// auto outputs = node_get_outputs(thread, node); -// -// for (u32 i = 0; i < outputs.length; i += 1) -// { -// NodeIndex output = outputs.pointer[i]; -// if (is_forwards_edge(thread, output, node_index)) -// { -// todo(); -// } -// } -// -// for (u32 i = 0; i < outputs.length; i += 1) -// { -// NodeIndex output = outputs.pointer[i]; -// if (is_forwards_edge(thread, output, node_index)) -// { -// todo(); -// } -// } -// -// if (!node_is_pinned(node)) -// { -// unused(nodes); -// todo(); -// } -// } -// } - -// fn void gcm_build_cfg(Thread* thread, NodeIndex start_node_index, NodeIndex stop_node_index) -// { -// unused(stop_node_index); -// // Fix loops -// { -// // TODO: -// } -// -// // Schedule early -// rpo_cfg(thread, start_node_index); -// -// u32 i = thread->worklist.nodes.length; -// while (i > 0) -// { -// i -= 1; -// auto node_index = thread->worklist.nodes.pointer[i]; -// auto* node = thread_node_get(thread, node_index); -// node_loop_depth(thread, node); -// auto inputs = node_get_inputs(thread, node); -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto input = inputs.pointer[i]; -// schedule_early(thread, input, start_node_index); -// } -// -// if (node_is_region(node)) -// { -// todo(); -// } -// } -// -// // Schedule late -// -// auto max_node_count = thread->buffer.nodes.length; -// auto* alloc = arena_allocate(thread->arena, NodeIndex, max_node_count * 2); -// auto late = (Slice(NodeIndex)) { -// .pointer = alloc, -// .length = max_node_count, -// }; -// auto nodes = (Slice(NodeIndex)) { -// .pointer = alloc + max_node_count, -// .length = max_node_count, -// }; -// -// schedule_late(thread, start_node_index, nodes, late); -// -// for (u32 i = 0; i < late.length; i += 1) -// { -// auto node_index = nodes.pointer[i]; -// if (validi(node_index)) -// { -// todo(); -// auto late_node_index = late.pointer[i]; -// node_set_input(thread, node_index, 0, late_node_index); -// } -// } -// } - -// fn void print_function(Thread* thread, Function* function) -// { -// print("fn {s}\n====\n", function->name); -// VirtualBuffer(NodeIndex) nodes = {}; -// *vb_add(&nodes, 1) = function->stop; -// -// while (1) -// { -// auto node_index = nodes.pointer[nodes.length - 1]; -// auto* node = thread_node_get(thread, node_index); -// -// if (node->input_count) -// { -// for (u32 i = 1; i < node->input_count; i += 1) -// { -// *vb_add(&nodes, 1) = node_input_get(thread, node, 1); -// } -// *vb_add(&nodes, 1) = node_input_get(thread, node, 0); -// } -// else -// { -// break; -// } -// } -// -// u32 i = nodes.length; -// while (i > 0) -// { -// i -= 1; -// -// auto node_index = nodes.pointer[i]; -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// todo(); -// // auto* type = thread_type_get(thread, node->type); -// // print("%{u32} - {s} - {s} ", geti(node_index), type_id_to_string(type), node_id_to_string(node)); -// // auto inputs = node_get_inputs(thread, node); -// // auto outputs = node_get_outputs(thread, node); -// // -// // print("(INPUTS: { "); -// // for (u32 i = 0; i < inputs.length; i += 1) -// // { -// // auto input_index = inputs.pointer[i]; -// // print("%{u32} ", geti(input_index)); -// // } -// // print("} OUTPUTS: { "); -// // for (u32 i = 0; i < outputs.length; i += 1) -// // { -// // auto output_index = outputs.pointer[i]; -// // print("%{u32} ", geti(output_index)); -// // } -// // print_string(strlit("})\n")); -// } -// -// -// print("====\n", function->name); -// } - -// struct CBackend -// { -// VirtualBuffer(u8) buffer; -// Function* function; -// }; -// -// typedef struct CBackend CBackend; -// -// fn void c_lower_append_string(CBackend* backend, String string) -// { -// vb_append_bytes(&backend->buffer, string); -// } -// -// fn void c_lower_append_ch(CBackend* backend, u8 ch) -// { -// *vb_add(&backend->buffer, 1) = ch; -// } -// -// fn void c_lower_append_ch_repeated(CBackend* backend, u8 ch, u32 times) -// { -// u8* pointer = vb_add(&backend->buffer, times); -// memset(pointer, ch, times); -// } -// -// fn void c_lower_append_space(CBackend* backend) -// { -// c_lower_append_ch(backend, ' '); -// } -// -// fn void c_lower_append_space_margin(CBackend* backend, u32 times) -// { -// c_lower_append_ch_repeated(backend, ' ', times * 4); -// } - -// fn void c_lower_type(CBackend* backend, Thread* thread, TypeIndex type_index) -// { -// Type* type = thread_type_get(thread, type_index); -// switch (type->id) -// { -// case TYPE_INTEGER: -// { -// u8 ch[] = { 'u', 's' }; -// auto integer = &type->integer; -// u8 signedness_ch = ch[type->integer.is_signed]; -// c_lower_append_ch(backend, signedness_ch); -// u8 upper_digit = integer->bit_count / 10; -// u8 lower_digit = integer->bit_count % 10; -// if (upper_digit) -// { -// c_lower_append_ch(backend, upper_digit + '0'); -// } -// c_lower_append_ch(backend, lower_digit + '0'); -// } break; -// default: -// todo(); -// } -// } - -// fn void c_lower_node(CBackend* backend, Thread* thread, NodeIndex node_index) -// { -// unused(backend); -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// // auto* type = thread_type_get(thread, node->type); -// // auto inputs = node_get_inputs(thread, node); -// // -// // switch (node->id) -// // { -// // case IR_CONSTANT: -// // { -// // switch (type->id) -// // { -// // case TYPE_INTEGER: -// // { -// // assert(type->integer.bit_count == 0); -// // assert(type->integer.is_constant); -// // assert(!type->integer.is_signed); -// // vb_generic_ensure_capacity(&backend->buffer, 1, 64); -// // auto current_length = backend->buffer.length; -// // auto buffer_slice = (String){ .pointer = backend->buffer.pointer + current_length, .length = backend->buffer.capacity - current_length, }; -// // auto written_characters = format_hexadecimal(buffer_slice, type->integer.constant); -// // backend->buffer.length = current_length + written_characters; -// // } break; -// // todo(); -// // default: -// // todo(); -// // } -// // } break; -// // case IR_INTEGER_SUBSTRACT: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" - ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // case IR_INTEGER_COMPARE_EQUAL: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" == ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // case IR_INTEGER_COMPARE_NOT_EQUAL: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" != ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // // case IR_PROJECTION: -// // // { -// // // auto projected_node_index = inputs.pointer[0]; -// // // auto projection_index = node->projection.index; -// // // -// // // if (index_equal(projected_node_index, backend->function->start)) -// // // { -// // // if (projection_index == 0) -// // // { -// // // failed_execution(); -// // // } -// // // // if (projection_index > interpreter->arguments.length + 1) -// // // // { -// // // // failed_execution(); -// // // // } -// // // -// // // switch (projection_index) -// // // { -// // // case 1: -// // // c_lower_append_string(backend, strlit("argc")); -// // // break; -// // // // return interpreter->arguments.length; -// // // case 2: -// // // todo(); -// // // default: -// // // todo(); -// // // } -// // // } -// // // else -// // // { -// // // todo(); -// // // } -// // // } break; -// // default: -// // todo(); -// // } -// todo(); -// } - -// fn String c_lower(Thread* thread) -// { -// CBackend backend_stack = {}; -// CBackend* backend = &backend_stack; -// auto program_epilogue = strlit("#include \n" -// "typedef uint8_t u8;\n" -// "typedef uint16_t u16;\n" -// "typedef uint32_t u32;\n" -// "typedef uint64_t u64;\n" -// "typedef int8_t s8;\n" -// "typedef int16_t s16;\n" -// "typedef int32_t s32;\n" -// "typedef int64_t s64;\n" -// ); -// c_lower_append_string(backend, program_epilogue); -// -// for (u32 function_i = 0; function_i < thread->buffer.functions.length; function_i += 1) -// { -// auto* function = &thread->buffer.functions.pointer[function_i]; -// backend->function = function; -// c_lower_type(backend, thread, function->return_type); -// c_lower_append_space(backend); -// -// c_lower_append_string(backend, function->name); -// c_lower_append_ch(backend, argument_start); -// if (s_equal(function->name, strlit("main"))) -// { -// c_lower_append_string(backend, strlit("int argc, char* argv[]")); -// } -// -// c_lower_append_ch(backend, argument_end); -// c_lower_append_ch(backend, '\n'); -// c_lower_append_ch(backend, block_start); -// c_lower_append_ch(backend, '\n'); -// -// auto start_node_index = function->start; -// auto* start_node = thread_node_get(thread, start_node_index); -// assert(start_node->output_count > 0); -// auto stop_node_index = function->stop; -// -// auto proj_node_index = node_output_get(thread, start_node, 1); -// auto it_node_index = proj_node_index; -// u32 current_statement_margin = 1; -// -// while (!index_equal(it_node_index, stop_node_index)) -// { -// auto* it_node = thread_node_get(thread, it_node_index); -// auto outputs = node_get_outputs(thread, it_node); -// auto inputs = node_get_inputs(thread, it_node); -// -// switch (it_node->id) -// { -// // case IR_CONTROL_PROJECTION: -// // break; -// case IR_RETURN: -// { -// c_lower_append_space_margin(backend, current_statement_margin); -// c_lower_append_string(backend, strlit("return ")); -// assert(inputs.length > 1); -// assert(inputs.length == 2); -// auto input = inputs.pointer[1]; -// c_lower_node(backend, thread, input); -// c_lower_append_ch(backend, ';'); -// c_lower_append_ch(backend, '\n'); -// } break; -// // case IR_STOP: -// // break; -// default: -// todo(); -// } -// -// assert(outputs.length == 1); -// it_node_index = outputs.pointer[0]; -// } -// -// c_lower_append_ch(backend, block_end); -// } -// -// return (String) { .pointer = backend->buffer.pointer, .length = backend->buffer.length }; -// } - -declare_ip_functions(DebugType, debug_type) - -fn void thread_init(Thread* thread) -{ - memset(thread, 0, sizeof(Thread)); - thread->arena = arena_init_default(KB(64)); - thread->main_function = -1; - - // This assertion is here to make the pertinent changes in the reserve syscall - - // UINT32_MAX so they can be indexed via an unsigned integer of 32 bits - const u64 offsets[] = { - align_forward(sizeof(Type) * UINT32_MAX, page_size), - align_forward(sizeof(Node) * UINT32_MAX, page_size), - align_forward(sizeof(DebugType) * UINT32_MAX, page_size), - align_forward(sizeof(NodeIndex) * UINT32_MAX, page_size), - align_forward(sizeof(ArrayReference) * UINT32_MAX, page_size), - align_forward(sizeof(Function) * UINT32_MAX, page_size), - align_forward(sizeof(u8) * UINT32_MAX, page_size), - align_forward(sizeof(RegisterMask) * UINT32_MAX, page_size), - }; - static_assert(sizeof(thread->buffer) / sizeof(VirtualBuffer(u8)) == array_length(offsets)); - - // Compute the total size (this is optimized out into a constant - u64 total_size = 0; - for (u32 i = 0; i < array_length(offsets); i += 1) - { - total_size += offsets[i]; - } - - // Actually make the syscall - auto* ptr = os_reserve(0, total_size, (OSReserveProtectionFlags) {}, (OSReserveMapFlags) { .priv = 1, .anon = 1, .noreserve = 1 }); - assert(ptr); - - auto* buffer_it = (VirtualBuffer(u8)*)&thread->buffer; - for (u32 i = 0; i < array_length(offsets); i += 1) - { - buffer_it->pointer = ptr; - ptr += offsets[i]; - } - - DebugType integer_type; - memset(&integer_type, 0, sizeof(integer_type)); - auto* it = &thread->types.debug.integer.array[0]; - - for (u8 signedness = 0; signedness <= 1; signedness += 1) - { - integer_type.integer.signedness = signedness; - - for (u8 bit_count = 8; bit_count <= 64; bit_count *= 2, it += 1) - { - integer_type.integer.bit_count = bit_count; - auto put_result = ip_DebugType_get_or_put_new(&thread->interned.debug_types, thread, &integer_type); - assert(!put_result.existing); - assert(validi(put_result.index)); - *it = put_result.index; - } - } - - // Type top, bot, live_control, dead_control; - // memset(&top, 0, sizeof(Type)); - // top.id = TYPE_TOP; - // memset(&bot, 0, sizeof(Type)); - // bot.id = TYPE_BOTTOM; - // memset(&live_control, 0, sizeof(Type)); - // live_control.id = TYPE_LIVE_CONTROL; - // memset(&dead_control, 0, sizeof(Type)); - // dead_control.id = TYPE_DEAD_CONTROL; - // - // thread->types.top = intern_pool_get_or_put_new_type(thread, &top).index; - // thread->types.bottom = intern_pool_get_or_put_new_type(thread, &bot).index; - // thread->types.live_control = intern_pool_get_or_put_new_type(thread, &live_control).index; - // thread->types.dead_control = intern_pool_get_or_put_new_type(thread, &dead_control).index; - // - // thread->types.integer.top = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.bottom = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 1, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.zero = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 1, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.u8 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 8, - // }); - // thread->types.integer.u16 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 16, - // }); - // thread->types.integer.u32 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 32, - // }); - // thread->types.integer.u64 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 64, - // }); - // thread->types.integer.s8 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 8, - // }); - // thread->types.integer.s16 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 16, - // }); - // thread->types.integer.s32 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 32, - // }); - // thread->types.integer.s64 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 64, - // }); - - *vb_add(&thread->buffer.register_masks, 1) = (RegisterMask) { - .class = 1, - .may_spill = 0, - .mask = 0, - }; - *vb_add(&thread->buffer.register_masks, 1) = (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .may_spill = 0, - .mask = ((u16)0xffff & ~((u16)1 << RSP)), // & ~((u16)1 << RBP), - }; - -// global_variable RegisterMask register_masks[] = { -// { -// }, -// { -// }, -// }; - -} - -fn void thread_clear(Thread* thread) -{ - arena_reset(thread->arena); -} - -#define DO_UNIT_TESTS 1 -#if DO_UNIT_TESTS -fn void unit_tests() -{ - for (u64 power = 1, log2_i = 0; log2_i < 64; power <<= 1, log2_i += 1) - { - assert(log2_alignment(power) == log2_i); - } -} -#endif - -Slice(String) arguments; - -STRUCT(ObjectOptions) -{ - String object_path; - String exe_path; - Slice(u8) code; - u64 dynamic:1; - u64 reserved:63; -}; - -STRUCT(ELFBuilder) -{ - VirtualBuffer(u8) file; - VirtualBuffer(ELFSectionHeader) section_headers; - VirtualBuffer(u8) section_string_table; - VirtualBuffer(ElfProgramHeader) program_headers; - SymbolTable static_st; - SymbolTable dynamic_st; -}; - -// fn void elf_ph_init(ELFBuilder* restrict builder) -// { -// builder->program_headers.length = 6; -// auto program_header_size = sizeof(ElfProgramHeader) * builder->program_headers.length; -// builder->program_headers.pointer = (ElfProgramHeader*)vb_add(&builder->file, program_header_size); -// builder->program_header_i = 0; -// } -// -// fn void elf_ph_end(ELFBuilder* restrict builder) -// { -// assert(builder->program_header_i == builder->program_headers.length); -// } - -STRUCT(ELFSectionCreate) -{ - String name; - ELFSectionType type; - ELFSectionHeaderFlags flags; - u32 link; - u32 info; - u64 size; - u64 alignment; - u64 entry_size; -}; - -fn void vb_align(VirtualBuffer(u8)* buffer, u64 alignment) -{ - auto current_length = buffer->length; - auto target_len = align_forward(current_length, alignment); - auto count = cast_to(u32, u64, target_len - current_length); - auto* pointer = vb_add(buffer, count); - memset(pointer, 0, count); -} - -STRUCT(ELFSegmentCreate) -{ - ElfProgramHeaderType type; - ElfProgramHeaderFlags flags; - u64 size; - u64 alignment; - u64 offset; -}; - -STRUCT(ELFSegmentSectionCreate) -{ - ELFSectionCreate section; - ElfProgramHeaderType ph_type; - ElfProgramHeaderFlags ph_flags; - String content; -}; - -typedef enum SymbolKind : u8 -{ - SYMBOL_TABLE_STATIC, - SYMBOL_TABLE_DYNAMIC, -} SymbolKind; - -fn void st_init(SymbolTable* restrict section) -{ - *vb_add(§ion->string_table, 1) = 0; - *vb_add(§ion->symbol_table, 1) = (ELFSymbol) {}; -} - -typedef enum SymbolTableKind -{ - SYMBOL_TABLE_KIND_STATIC, - SYMBOL_TABLE_KIND_DYNAMIC, -} SymbolTableKind; - -STRUCT(SymbolTableOutput) -{ - u64 symbol_table_offset; - u64 string_table_offset; -}; - -fn u32 elf_get_string(VirtualBuffer(u8)* restrict buffer, String string) -{ - assert(buffer->length > 0); - - if (string.length == 0) - { - return 0; - } - - u32 i = 0; - - while (i < buffer->length) - { - auto* ptr = &buffer->pointer[i]; - auto length = strlen((char*)ptr); - auto existing = (String) { - .pointer = ptr, - .length = length, - }; - - while (existing.length) - { - if (s_equal(existing, string)) - { - return cast_to(u32, s64, existing.pointer - buffer->pointer); - } - - existing.pointer += 1; - existing.length -= 1; - } - - i += length + 1; - } - - auto length = buffer->length; - auto* ptr = vb_add(buffer, cast_to(u32, u64, string.length + 1)); - memcpy(ptr, string.pointer, string.length); - *(ptr + string.length) = 0; - - return length; -} - -fn u32 st_get_string(SymbolTable* restrict section, String string) -{ - return elf_get_string(§ion->string_table, string); -} - -STRUCT(StringOffsetAndHash) -{ - u32 hash; - u32 offset; -}; - -fn u32 string_sysv_hash(String string) -{ - u32 hash = 0; - for (u32 i = 0; i < string.length; i += 1) - { - hash *= 16; - auto ch = string.pointer[i]; - hash += ch; - hash ^= (hash >> 24) & 0xf0; - } - - hash &= 0x0fffffff; - - return hash; -} - -fn StringOffsetAndHash st_get_string_and_hash(SymbolTable* restrict section, String string) -{ - auto offset = st_get_string(section, string); - auto hash = string_sysv_hash(string); - - return (StringOffsetAndHash){ - .offset = offset, - .hash = hash, - }; -} - -fn u32 elf_get_section_name(ELFBuilder* builder, String name) -{ - return elf_get_string(&builder->section_string_table, name); -} - -typedef enum ELFNoteType : u32 -{ - NT_GNU_ABI_TAG = 1, - NT_GNU_HWCAP = 2, - NT_GNU_BUILD_ID = 3, - NT_GNU_GOLD_VERSION = 4, - NT_GNU_PROPERTY_TYPE_0 = 5, -} ELFNoteType; - -STRUCT(ELFNoteHeader) -{ - u32 name_size; - u32 descriptor_size; - ELFNoteType type; -}; -static_assert(sizeof(ELFNoteHeader) == 12); - -#define elf_eh_frame_absptr 0x00 -#define elf_eh_frame_udata4 0x03 -#define elf_eh_frame_sdata4 0x0b -#define elf_eh_frame_pcrel 0x10 -#define elf_eh_frame_datarel 0x30 - -STRUCT(EhFrameHeader) -{ - u8 version; - u8 pointer_encoding; - u8 count_encoding; - u8 table_encoding; - u32 frame_start; - u32 entry_count; -}; - -STRUCT(EhFrameHeaderEntry) -{ - s32 pc; - u32 fde; -}; - -STRUCT(Uleb128) -{ - u64 number; - u64 i; -}; - -fn Uleb128 uleb128_decode(String input) -{ - assert(input.length); - Uleb128 result = {}; - u16 shift = 0; - - while (result.i < input.length) - { - auto byte = input.pointer[result.i]; - assert(shift < 64); - result.number |= (u64)(byte & 0b01111111) << shift; - shift += 7; - result.i += 1; - - if ((byte & 0b10000000) == 0) - { - break; - } - } - - return result; -} - -fn void sleb128_encode(VirtualBuffer(u8)* buffer, s32 value) -{ - auto extra_bits = (u32)(value ^ (value >> 31)) >> 6; - u8 out = value & 0b01111111; - while (extra_bits) - { - *vb_add(buffer, 1) = out | 0x80; - value >>= 7; - out = value & 0b01111111; - extra_bits >>= 7; - } - *vb_add(buffer, 1) = out; -} - -fn void uleb128_encode(VirtualBuffer(u8)* buffer, u32 value) -{ - u8 out = value & 0b01111111; - value >>= 7; - while (value) - { - *vb_add(buffer, 1) = out | 0x80; - out = value & 0b01111111; - value >>= 7; - } - *vb_add(buffer, 1) = out; -} - -fn void dwarf_playground(Thread* thread) -{ - auto file = file_read(thread->arena, -#ifdef __APPLE__ - strlit("/Users/david/minimal/main") -#else - strlit("/home/david/minimal/main") -#endif - ); - auto* elf_header = (ELFHeader*)file.pointer; - auto section_count = elf_header->section_header_count; - auto section_header_offset = elf_header->section_header_offset; - auto string_table_section_index = elf_header->section_header_string_table_index; - - auto debug_abbrev_section_index = -1; - auto debug_info_section_index = -1; - auto debug_addr_section_index = -1; - auto debug_str_section_index = -1; - auto debug_str_offsets_section_index = -1; - auto rela_debug_str_offsets_section_index = -1; - auto rela_debug_addr_section_index = -1; - - auto section_headers = (ELFSectionHeader*)(file.pointer + section_header_offset); - auto* string_table_section_header = (ELFSectionHeader*)(file.pointer + section_header_offset) + string_table_section_index; - auto string_table_offset = string_table_section_header->offset; - - for (u16 i = 0; i < section_count; i += 1) - { - auto* section_header = section_headers + i; - auto name_offset = string_table_offset + section_header->name_offset; - auto* name = (char*)(file.pointer + name_offset); - - if (strcmp(".debug_abbrev", name) == 0) - { - debug_abbrev_section_index = i; - } - else if (strcmp(".debug_info", name) == 0) - { - debug_info_section_index = i; - } - else if (strcmp(".debug_addr", name) == 0) - { - debug_addr_section_index = i; - } - else if (strcmp(".debug_str", name) == 0) - { - debug_str_section_index = i; - } - else if (strcmp(".debug_str_offsets", name) == 0) - { - debug_str_offsets_section_index = i; - } - else if (strcmp(".rela.debug_addr", name) == 0) - { - rela_debug_addr_section_index = i; - } - else if (strcmp(".rela.debug_str_offsets", name) == 0) - { - rela_debug_str_offsets_section_index = i; - } - } - - assert(debug_info_section_index != -1); - assert(debug_abbrev_section_index != -1); - assert(debug_addr_section_index != -1); - assert(debug_str_section_index != -1); - assert(debug_str_offsets_section_index != -1); - - auto* debug_abbrev_section_header = section_headers + debug_abbrev_section_index; - auto* debug_info_section_header = section_headers + debug_info_section_index; - auto* debug_addr_section_header = section_headers + debug_addr_section_index; - auto* debug_str_section_header = section_headers + debug_str_section_index; - auto* debug_str_offsets_section_header = section_headers + debug_str_offsets_section_index; - auto* rela_debug_str_offsets_section_header = section_headers + rela_debug_str_offsets_section_index; - auto* rela_debug_addr_section_header = section_headers + rela_debug_addr_section_index; - - auto* rela_debug_str_offsets = (ElfRelocation*)(file.pointer + rela_debug_str_offsets_section_header->offset); - auto* rela_debug_addresses = (ElfRelocation*)(file.pointer + rela_debug_addr_section_header->offset); - - auto original_debug_info_bytes = (String) { - .pointer = file.pointer + debug_info_section_header->offset, - .length = debug_info_section_header->size, - }; - auto debug_info_bytes = original_debug_info_bytes; - - // auto* compile_unit_header = (DwarfCompilationUnit*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(DwarfCompilationUnit); - debug_info_bytes.length -= sizeof(DwarfCompilationUnit); - - auto debug_abbrev_bytes = (String) { - .pointer = file.pointer + debug_abbrev_section_header->offset, - .length = debug_abbrev_section_header->size, - }; - auto* debug_addr_header = (DwarfAddressTableHeader*)(file.pointer + debug_addr_section_header->offset); - assert(debug_addr_header->unit_length == debug_addr_section_header->size - sizeof(debug_addr_header->unit_length)); - assert(debug_addr_header->version == 5); - assert(debug_addr_header->address_size == 8); - auto* debug_addresses = (u64*)debug_addr_header + 1; - auto* debug_str_offsets_header = (DwarfStringOffsetsTableHeader*)(file.pointer + debug_str_offsets_section_header->offset); - assert(debug_str_offsets_header->unit_length == debug_str_offsets_section_header->size - sizeof(debug_str_offsets_header->unit_length)); - // auto string_count = (debug_str_offsets_section_header->size - sizeof(DwarfStringOffsetsTableHeader)) / sizeof(u32); - // auto* string_index_offset_map = (u32*)(debug_str_offsets_header + 1); - auto* string_table = file.pointer + debug_str_section_header->offset; - - // auto debug_str_offset_base_guess = 8; - - while (debug_abbrev_bytes.length > 0) - { - auto first = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += first.i; - debug_abbrev_bytes.length -= first.i; - - if (first.number != 0) - { - auto second = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += second.i; - debug_abbrev_bytes.length -= second.i; - // auto children = debug_abbrev_bytes.pointer[0]; - debug_abbrev_bytes.pointer += 1; - debug_abbrev_bytes.length -= 1; - - auto di_abbrev_code = uleb128_decode(debug_info_bytes); - debug_info_bytes.pointer += di_abbrev_code.i; - debug_info_bytes.length -= di_abbrev_code.i; - assert(di_abbrev_code.number == first.number); - - print("======\nAbbreviation entry #{u64}: \"{s}\", (0x{u64:x})\n======\n", first.number, dwarf_tag_to_string((DwarfTag)second.number), second.number); - - while (1) - { - auto first = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += first.i; - debug_abbrev_bytes.length -= first.i; - - auto second = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += second.i; - debug_abbrev_bytes.length -= second.i; - - if (first.number == 0 && second.number == 0) - { - break; - } - - auto attribute = (DwarfAttribute)first.number; - auto form = (DwarfForm)second.number; - print("{u32}: Attribute: \"{s}\" (0x{u64:x}). Form: \"{s}\" (0x{u64:x})\n", (u32)(debug_info_bytes.pointer - original_debug_info_bytes.pointer), dwarf_attribute_to_string(attribute), (u64)attribute, dwarf_form_to_string(form), (u64)form); - - switch (form) - { - // .debug_str_offsets - case DW_FORM_strx1: - { - auto index = debug_info_bytes.pointer[0]; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - - if (rela_debug_str_offsets_section_index != -1) - { - auto* relocation = &rela_debug_str_offsets[index]; - auto offset = relocation->addend; - auto* c_string = &string_table[offset]; - print("Index: {u32}. Offset: {u32}. String: \"{cstr}\"\n", (u32)index, offset, c_string); - } - } break; - case DW_FORM_data1: - { - auto data = *debug_info_bytes.pointer; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - print("Data1: 0x{u32:x}\n", (u32)data); - } break; - case DW_FORM_data2: - { - auto data = *(u16*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u16); - debug_info_bytes.length -= sizeof(u16); - print("Data2: 0x{u32:x}\n", (u32)data); - } break; - case DW_FORM_data4: - { - auto data = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Data4: 0x{u32:x}\n", data); - } break; - case DW_FORM_sec_offset: - { - auto sec_offset = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Sec offset: 0x{u32:x}\n", sec_offset); - } break; - case DW_FORM_addrx: - { - auto addrx = uleb128_decode(debug_info_bytes); - debug_info_bytes.pointer += addrx.i; - debug_info_bytes.length -= addrx.i; - auto relocation_index = addrx.number; - - if (rela_debug_addr_section_index != -1) - { - auto* relocation = &rela_debug_addresses[relocation_index]; - auto index = relocation->addend; - - switch (attribute) - { - case DW_AT_low_pc: - { - auto address = debug_addresses[index]; - print("Address: 0x{u64:x}\n", address); - } break; - default: - todo(); - } - } - } break; - case DW_FORM_exprloc: - { - auto length = uleb128_decode(debug_info_bytes); - print("Length: {u64}\n", length.number); - debug_info_bytes.pointer += length.i; - debug_info_bytes.length -= length.i; - - switch (length.number) - { - case 1: - { - switch (attribute) - { - case DW_AT_frame_base: - { - auto b = *debug_info_bytes.pointer; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - auto operation = (DwarfOperation)b; - - print("Operation: {s}\n", dwarf_operation_to_string(operation)); - } break; - default: - todo(); - } - } break; - default: - todo(); - } - } break; - case DW_FORM_flag_present: - { - print("Flag present\n"); - } break; - case DW_FORM_ref4: - { - auto ref4 = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Ref4: {u32:x}\n", ref4); - } break; - default: - todo(); - } - } - } - } - - assert(debug_abbrev_bytes.length == 0); - assert(debug_info_bytes.length == 1); - assert(*debug_info_bytes.pointer == 0); -} - -STRUCT(DwarfAttributeFormPair) -{ - DwarfAttribute attribute; - DwarfForm form; -}; -declare_slice(DwarfAttributeFormPair); - -fn void encode_attribute_abbreviations(ELFBuilder* restrict builder, Slice(DwarfAttributeFormPair) attributes) -{ - auto* restrict buffer = &builder->file; - - for (u64 i = 0; i < attributes.length; i += 1) - { - auto pair = attributes.pointer[i]; - uleb128_encode(buffer, pair.attribute); - uleb128_encode(buffer, pair.form); - } - - uleb128_encode(buffer, 0); - uleb128_encode(buffer, 0); -} - -STRUCT(SymbolRelocation) -{ - String name; - u32 offset; - u8 extra_bytes; -}; -decl_vb(SymbolRelocation); - -STRUCT(FileBuffer) -{ - VirtualBuffer(u8) buffer; -}; - -fn String write_elf(Thread* thread, ObjectOptions options) -{ - ELFBuilder builder_stack = {}; - ELFBuilder* restrict builder = &builder_stack; - // Initialization - { - if (options.dynamic) - { - st_init(&builder->dynamic_st); - } - - st_init(&builder->static_st); - // Init section table - *vb_add(&builder->section_string_table, 1) = 0; - *vb_add(&builder->section_headers, 1) = (ELFSectionHeader){}; - } - - auto symtab_section_name = elf_get_section_name(builder, strlit(".symtab")); - auto strtab_section_name = elf_get_section_name(builder, strlit(".strtab")); - auto shstrtab_section_name = elf_get_section_name(builder, strlit(".shstrtab")); - unused(symtab_section_name); - unused(strtab_section_name); - unused(shstrtab_section_name); - - auto* elf_header = vb_add_scalar(&builder->file, ELFHeader); - - // TODO: precompute properly how many program segments we are going to need - u16 program_header_count = 13; - auto* program_headers = vb_add(&builder->file, sizeof(ElfProgramHeader) * program_header_count); - - { - // Add program header segment - auto offset = sizeof(ELFHeader); - auto size = sizeof(ElfProgramHeader) * program_header_count; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_PHDR, - .flags = { .readable = 1 }, - .offset = offset, - .virtual_address = offset, - .physical_address = offset, - .file_size = size, - .memory_size = size, - .alignment = alignof(ElfProgramHeader), - }; - } - - { - // .interp - // Section #1 - auto* section_header = vb_add(&builder->section_headers, 1); - auto interp_section_name = elf_get_section_name(builder, strlit(".interp")); - - u64 alignment = 1; - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto interpreter_path = -#ifdef __x86_64__ - strlit("/lib64/ld-linux-x86-64.so.2"); -#else - strlit("/lib/ld-linux-aarch64.so.1"); -#endif - auto size = vb_copy_string_zero_terminated(&builder->file, interpreter_path); - - *section_header = (ELFSectionHeader) - { - .name_offset = interp_section_name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_INTERP, - .flags = {.readable = 1,}, - .offset = offset, - .virtual_address = offset, - .physical_address = offset, - .file_size = size, - .memory_size = size, - .alignment = alignment, - }; - } - - u32 gnu_property_offset = 0; - u32 gnu_property_size = 0; - u32 gnu_property_alignment = 0; - auto gnu_string = strlit("GNU"); - { - // .note.gnu.property - // Section #2 - // This note tells the dynamic linker to use baseline CPU features - auto* gnu_property_section_header = vb_add(&builder->section_headers, 1); - u32 alignment = 8; - gnu_property_alignment = alignment; - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_property_offset = offset; - auto gnu_property_section_name = elf_get_section_name(builder, strlit(".note.gnu.property")); - - auto* ptr = vb_add_scalar(&builder->file, ELFNoteHeader); - *ptr = (ELFNoteHeader) - { - .name_size = cast_to(u32, u64, vb_copy_string_zero_terminated(&builder->file, gnu_string)), - .descriptor_size = 16, - .type = NT_GNU_PROPERTY_TYPE_0, - }; - u8 gnu_property_blob[] = { 0x02, 0x80, 0x00, 0xC0, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - static_assert(array_length(gnu_property_blob) == 16); - - vb_copy_any_array(&builder->file, gnu_property_blob); - - gnu_property_size = builder->file.length - offset; - - *gnu_property_section_header = (ELFSectionHeader) - { - .name_offset = gnu_property_section_name, - .type = ELF_SECTION_NOTE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = gnu_property_size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // u32 gnu_build_id_offset = 0; - // u32 gnu_build_id_alignment = 0; - // ELFNoteHeader* gnu_build_id_header = 0; - // u8* gnu_build_id_string = 0; - // u8* gnu_build_id_blob = 0; - // u32 gnu_build_id_blob_size = 20; - // { - // // .note.gnu.build-id - // // Section #3 - // auto* section_header = vb_add(&builder->section_headers, 1); - // u64 alignment = 4; - // gnu_build_id_alignment = alignment; - // auto name = elf_get_section_name(builder, strlit(".note.gnu.build-id")); - // vb_align(&builder->file, alignment); - // auto offset = builder->file.length; - // gnu_build_id_offset = offset; - // - // gnu_build_id_header = vb_add_scalar(&builder->file, ELFNoteHeader); - // gnu_build_id_string = vb_add(&builder->file, gnu_string_size); - // gnu_build_id_blob = vb_add(&builder->file, gnu_build_id_blob_size); - // - // auto size = builder->file.length - offset; - // memset(builder->file.pointer + offset, 0, size); - // - // *section_header = (ELFSectionHeader) - // { - // .name_offset = name, - // .type = ELF_SECTION_NOTE, - // .flags = { - // .alloc = 1, - // }, - // .address = offset, - // .offset = offset, - // .size = size, - // .link = 0, - // .info = 0, - // .alignment = alignment, - // .entry_size = 0, - // }; - // } - - u32 gnu_build_id_abi_note_offset = 0; - u32 gnu_build_id_abi_alignment = 0; - { - // .note.ABI-tag - // Section #4 - auto* section_header = vb_add(&builder->section_headers, 1); - u32 alignment = 4; - gnu_build_id_abi_alignment = alignment; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_build_id_abi_note_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".note.ABI-tag")); - - auto* note_header = vb_add_scalar(&builder->file, ELFNoteHeader); - *note_header = (ELFNoteHeader) { - .name_size = cast_to(u32, u64, vb_copy_string_zero_terminated(&builder->file, gnu_string)), - .descriptor_size = 16, - .type = NT_GNU_ABI_TAG, - }; - - u32 abi = ELF_ABI_SYSTEM_V; - u32 major = 4; - u32 minor = 4; - u32 patch = 0; - u32 abi_content[] = { abi, major, minor, patch }; - - vb_copy_any_array(&builder->file, abi_content); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) - { - .name_offset = name, - .type = ELF_SECTION_NOTE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - auto gnu_build_id_abi_note_size = builder->file.length - gnu_build_id_abi_note_offset; - - auto preliminar_section_count = cast_to(u16, u32, builder->section_headers.length + 1); - auto dynamic_symbol_table_index = preliminar_section_count; - auto dynamic_string_table_index = cast_to(u16, u32, dynamic_symbol_table_index + 1); - - u32 gnu_hash_offset = 0; - { - // .gnu.hash - // Section #5 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_hash_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.hash")); - - *vb_add_scalar(&builder->file, ElfGnuHashHeader) = (ElfGnuHashHeader) { - .bucket_count = 1, - .symbol_offset = 1, - .bloom_size = 1, - .bloom_shift = 0, - }; - - u64 bloom_filters[] = {0}; - vb_copy_any_array(&builder->file, bloom_filters); - - u32 buckets[] = {0}; - vb_copy_any_array(&builder->file, buckets); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_HASH, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - auto libc_start_main = st_get_string(&builder->dynamic_st, strlit("__libc_start_main")); - auto cxa_finalize = st_get_string(&builder->dynamic_st, strlit("__cxa_finalize")); - auto libcso6 = st_get_string(&builder->dynamic_st, strlit("libc.so.6")); -#ifdef __x86_64 -#define glibc_min_version_string "GLIBC_2.2.5" -#else -#define glibc_min_version_string "GLIBC_2.17" -#endif -#define glibc_max_version_string "GLIBC_2.34" - auto glibc_min = st_get_string_and_hash(&builder->dynamic_st, strlit(glibc_min_version_string)); - auto glibc_max = st_get_string_and_hash(&builder->dynamic_st, strlit(glibc_max_version_string)); - auto itm_deregister = st_get_string(&builder->dynamic_st, strlit("_ITM_deregisterTMCloneTable")); - auto gmon_start = st_get_string(&builder->dynamic_st, strlit("__gmon_start__")); - auto itm_register = st_get_string(&builder->dynamic_st, strlit("_ITM_registerTMCloneTable")); - - u32 dynsym_offset = 0; - // u32 dynsym_size; - { - // .dynsym - // Section #6 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ELFSymbol); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - dynsym_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".dynsym")); - - ELFSymbol expected_symbols[] = { - // 1 - { - .name_offset = libc_start_main, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 2 - { - .name_offset = itm_deregister, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 3 - { - .name_offset = gmon_start, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 4 - { - .name_offset = itm_register, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 5 - { - .name_offset = cxa_finalize, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - }; - vb_copy_array(&builder->dynamic_st.symbol_table, expected_symbols); - u32 size = builder->dynamic_st.symbol_table.length * sizeof(ELFSymbol); - vb_copy_any_slice(&builder->file, builder->dynamic_st.symbol_table); - - u64 entry_size = sizeof(ELFSymbol); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_DYNAMIC_SYMBOL_TABLE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = 1, // TODO: figure out - .alignment = alignment, - .entry_size = entry_size, - }; - } - - u32 dynstr_offset = 0; - u32 dynstr_size = 0; - { - // .dynstr - // Section #7 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - dynstr_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".dynstr")); - - auto size = builder->dynamic_st.string_table.length; - dynstr_size = size; - vb_copy_string(&builder->file, (String) { builder->dynamic_st.string_table.pointer, builder->dynamic_st.string_table.length }); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 gnu_version_offset = 0; - { - // .gnu.version - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u16); - assert(alignment == 2); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_version_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.version")); - - // 0: means local symbol (not versioned) - // 1: indicates base version (nothing specific) - // >1: refers to an index into the .gnu.version_r - u16 symbol_versions[] = { - 0, - 2, // .gnu.version_r - 1, - 1, - 1, - 3 // .gnu.version_r - }; - - u32 size = sizeof(symbol_versions); - vb_copy_any_array(&builder->file, symbol_versions); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_VERSYM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(u16), - }; - } - - u32 gnu_version_r_offset = 0; - { - // .gnu.version_r - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_version_r_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.version_r")); - - STRUCT(Requirement) - { - ELFVersionRequirement req; - ELFVersionRequirementEntry* entry_pointer; - u16 entry_count; - }; - - ELFVersionRequirementEntry entries[] = { - { - .hash = glibc_min.hash, - .flags = 0, - .index = 3, - .name_offset = glibc_min.offset, - .next = sizeof(ELFVersionRequirementEntry), - }, - { - .hash = glibc_max.hash, - .flags = 0, - .index = 2, - .name_offset = glibc_max.offset, - .next = 0, - }, - }; - - Requirement requirements[] = { - { - .req = { - .version = 1, - .name_offset = libcso6, - .aux_offset = sizeof(ELFVersionRequirement), - .next = 0, - }, - .entry_pointer = entries, - .entry_count = array_length(entries), - } - }; - - for (u32 i = 0; i < array_length(requirements); i += 1) - { - auto req = &requirements[i]; - auto requirement = req->req; - requirement.count = req->entry_count; - *vb_add_scalar(&builder->file, ELFVersionRequirement) = requirement; - - u32 entry_size = req->entry_count * sizeof(*req->entry_pointer); - memcpy(vb_add(&builder->file, entry_size), req->entry_pointer, entry_size); - } - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_VERNEED, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = array_length(requirements), - .alignment = alignment, - .entry_size = 0, - }; - } - - ElfRelocationWithAddend* dynamic_relocations = {}; - u32 dynamic_relocation_count = 0; - // * The symbol indices make mention to the .dynsym table (where 0 means a special case: none) - // * The addend is related to the (virtual) address - // ElfRelocationWithAddend expected_relocations[] = { - // { .offset = 15888, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 4368 }, // .fini_array content in .text - // { .offset = 15896, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 4288 }, // .init_array content in .text - // { .offset = 16392, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 16392 }, // something in .data - // - // { .offset = 16320, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 1}, .addend = 0 }, // libc_start_main - // { .offset = 16328, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 2}, .addend = 0 }, // itm_deregister - // { .offset = 16336, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 3}, .addend = 0 }, // gmon_start - // { .offset = 16344, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 4}, .addend = 0 }, // itm_register - // { .offset = 16352, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 5}, .addend = 0 }, // cxa_finalize - // }; - - u32 expected_dynamic_relocation_count = 8; - u32 rela_count = 3; - u32 rela_dyn_offset = 0; - u32 rela_dyn_size = 0; - { - // .rela.dyn - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ElfRelocationWithAddend); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - rela_dyn_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".rela.dyn")); - - u32 size = sizeof(ElfRelocationWithAddend) * expected_dynamic_relocation_count; - rela_dyn_size = size; - dynamic_relocations = (ElfRelocationWithAddend*)vb_add(&builder->file, size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_RELOCATION_WITH_ADDENDS, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(ElfRelocationWithAddend), - }; - } - - // Add read-only program segment - { - auto offset = builder->file.length; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) - { - .type = PT_LOAD, - .flags = {.readable = 1}, - .offset = 0, - .virtual_address = 0, - .physical_address = 0, - .file_size = offset, - .memory_size = offset, - .alignment = 0x1000, - }; - } - - vb_align(&builder->file, 0x1000); - - auto code_offset = builder->file.length; - auto init_offset = code_offset; - auto init_section_index = cast_to(u16, u32, builder->section_headers.length); - VirtualBuffer(SymbolRelocation) symbol_relocations = {}; - String init_section_content = {}; - { - // .init - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".init")); - - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x48, 0x83, 0xEC, 0x08, - 0x48, 0x8B, 0x05, 0xC1, 0x2F, 0x00, 0x00, - 0x48, 0x85, 0xC0, - 0x74, 0x02, - 0xFF, 0xD0, - 0x48, 0x83, 0xC4, 0x08, - 0xC3, - }; - // 1000: f3 0f 1e fa endbr64 - // 1004: 48 83 ec 08 sub rsp,0x8 - // 1008: 48 8b 05 c1 2f 00 00 mov rax,QWORD PTR [rip+0x2fc1] # 3fd0 <__gmon_start__@Base> - // 100f: 48 85 c0 test rax,rax - // 1012: 74 02 je 1016 <_init+0x16> - // 1014: ff d0 call rax - // 1016: 48 83 c4 08 add rsp,0x8 - // 101a: c3 ret - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation){ - .name = strlit("__gmon_start__"), - .offset = offset + 11, - }; - - init_section_content.length = sizeof(data); - init_section_content.pointer = vb_add(&builder->file, cast_to(u32, u64, init_section_content.length)); - - memcpy(init_section_content.pointer, data, init_section_content.length); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = init_section_content.length, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 text_init_array_offset = 0; - u32 text_fini_array_offset = 0; - u32 _start_offset = 0; - u32 _start_size = 0; - u32 main_offset = 0; - u32 main_size; - - auto text_section_index = cast_to(u16, u32, builder->section_headers.length); - { - //.text - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 16; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".text")); - - _start_offset = builder->file.length; - { - { - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x31, 0xED, - 0x49, 0x89, 0xD1, - 0x5E, - 0x48, 0x89, 0xE2, - 0x48, 0x83, 0xE4, 0xF0, - 0x50, - 0x54, - 0x45, 0x31, 0xC0, - 0x31, 0xC9, - 0x48, 0x8D, 0x3D, 0xDD, 0x00, 0x00, 0x00, - 0xFF, 0x15, 0x7B, 0x2F, 0x00, 0x00, - 0xF4, - }; - - // 0x1020 - 0x1000 = 0x20 - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("main"), - .offset = offset + 0x18 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__libc_start_main@" glibc_max_version_string), - .offset = offset + 0x1f + 2, - }; - - // 1020: f3 0f 1e fa endbr64 - // 1024: 31 ed xor ebp,ebp - // 1026: 49 89 d1 mov r9,rdx - // 1029: 5e pop rsi - // 102a: 48 89 e2 mov rdx,rsp - // 102d: 48 83 e4 f0 and rsp,0xfffffffffffffff0 - // 1031: 50 push rax - // 1032: 54 push rsp - // 1033: 45 31 c0 xor r8d,r8d - // 1036: 31 c9 xor ecx,ecx - // 1038: 48 8d 3d dd 00 00 00 lea rdi,[rip+0xdd] # 111c
- // 103f: ff 15 7b 2f 00 00 call QWORD PTR [rip+0x2f7b] # 3fc0 <__libc_start_main@GLIBC_2.34> - // 1045: f4 hlt - - _start_size = sizeof(data); - vb_copy_array(&builder->file, data); - } - // padding after _start (not counting for _start size) - { - u8 data[] = { - 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_array(&builder->file, data); - } - } - } - - { - u8 data[] = { - 0x48, 0x8D, 0x3D, 0xB9, 0x2F, 0x00, 0x00, - 0x48, 0x8D, 0x05, 0xB2, 0x2F, 0x00, 0x00, - 0x48, 0x39, 0xF8, - 0x74, 0x15, - 0x48, 0x8B, 0x05, 0x5E, 0x2F, 0x00, 0x00, - 0x48, 0x85, 0xC0, - 0x74, 0x09, - 0xFF, 0xE0, - 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - 0xC3, - 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x50 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x57 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("_ITM_deregisterTMCloneTable"), - .offset = offset + 0x63 - 0x20 + 3, - }; - - // 1050: 48 8d 3d b9 2f 00 00 lea rdi,[rip+0x2fb9] # 4010 <__TMC_END__> - // 1057: 48 8d 05 b2 2f 00 00 lea rax,[rip+0x2fb2] # 4010 <__TMC_END__> - // 105e: 48 39 f8 cmp rax,rdi - // 1061: 74 15 je 1078 <_start+0x58> - // 1063: 48 8b 05 5e 2f 00 00 mov rax,QWORD PTR [rip+0x2f5e] # 3fc8 <_ITM_deregisterTMCloneTable@Base> - // 106a: 48 85 c0 test rax,rax - // 106d: 74 09 je 1078 <_start+0x58> - // 106f: ff e0 jmp rax - // 1071: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - // 1078: c3 ret - // 1079: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - { - u8 data[] = { - 0x48, 0x8D, 0x3D, 0x89, 0x2F, 0x00, 0x00, 0x48, 0x8D, 0x35, 0x82, 0x2F, 0x00, 0x00, 0x48, 0x29, - 0xFE, 0x48, 0x89, 0xF0, 0x48, 0xC1, 0xEE, 0x3F, 0x48, 0xC1, 0xF8, 0x03, 0x48, 0x01, 0xC6, 0x48, - 0xD1, 0xFE, 0x74, 0x14, 0x48, 0x8B, 0x05, 0x2D, 0x2F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x08, - 0xFF, 0xE0, 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x80 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x87 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("_ITM_registerTMCloneTable"), - .offset = offset + 0xa4 - 0x20 + 3, - }; - - // 1080: 48 8d 3d 89 2f 00 00 lea rdi,[rip+0x2f89] # 4010 <__TMC_END__> - // 1087: 48 8d 35 82 2f 00 00 lea rsi,[rip+0x2f82] # 4010 <__TMC_END__> - // 108e: 48 29 fe sub rsi,rdi - // 1091: 48 89 f0 mov rax,rsi - // 1094: 48 c1 ee 3f shr rsi,0x3f - // 1098: 48 c1 f8 03 sar rax,0x3 - // 109c: 48 01 c6 add rsi,rax - // 109f: 48 d1 fe sar rsi,1 - // 10a2: 74 14 je 10b8 <_start+0x98> - // 10a4: 48 8b 05 2d 2f 00 00 mov rax,QWORD PTR [rip+0x2f2d] # 3fd8 <_ITM_registerTMCloneTable@Base> - // 10ab: 48 85 c0 test rax,rax - // 10ae: 74 08 je 10b8 <_start+0x98> - // 10b0: ff e0 jmp rax - // 10b2: 66 0f 1f 44 00 00 nop WORD PTR [rax+rax*1+0x0] - // 10b8: c3 ret - // 10b9: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - text_fini_array_offset = builder->file.length; - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x80, 0x3D, 0x45, 0x2F, 0x00, 0x00, 0x00, - 0x75, 0x33, - 0x55, - 0x48, 0x83, 0x3D, 0x0A, 0x2F, 0x00, 0x00, 0x00, - 0x48, 0x89, 0xE5, - 0x74, 0x0D, - 0x48, 0x8B, 0x3D, 0x26, 0x2F, 0x00, 0x00, - 0xFF, 0x15, 0xF8, 0x2E, 0x00, 0x00, - 0xE8, 0x63, 0xFF, 0xFF, 0xFF, - 0xC6, 0x05, 0x1C, 0x2F, 0x00, 0x00, 0x01, - 0x5D, - 0xC3, - 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC3, - 0x66, 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x1F, 0x40, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0xc4 - 0x20 + 2, - .extra_bytes = 1, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__cxa_finalize@" glibc_min_version_string), - .offset = offset + 0xce - 0x20 + 3, - .extra_bytes = 1, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__dso_handle"), - .offset = offset + 0xdb - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__cxa_finalize@" glibc_min_version_string), - .offset = offset + 0xe2 - 0x20 + 2, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0xed - 0x20 + 2, - .extra_bytes = 1, - }; - - // 10c0: f3 0f 1e fa endbr64 - // 10c4: 80 3d 45 2f 00 00 00 cmp BYTE PTR [rip+0x2f45],0x0 # 4010 <__TMC_END__> - // 10cb: 75 33 jne 1100 <_start+0xe0> - // 10cd: 55 push rbp - // 10ce: 48 83 3d 0a 2f 00 00 cmp QWORD PTR [rip+0x2f0a],0x0 # 3fe0 <__cxa_finalize@GLIBC_2.2.5> - // 10d5: 00 - // 10d6: 48 89 e5 mov rbp,rsp - // 10d9: 74 0d je 10e8 <_start+0xc8> - // 10db: 48 8b 3d 26 2f 00 00 mov rdi,QWORD PTR [rip+0x2f26] # 4008 <__dso_handle> - // 10e2: ff 15 f8 2e 00 00 call QWORD PTR [rip+0x2ef8] # 3fe0 <__cxa_finalize@GLIBC_2.2.5> - // 10e8: e8 63 ff ff ff call 1050 <_start+0x30> - // 10ed: c6 05 1c 2f 00 00 01 mov BYTE PTR [rip+0x2f1c],0x1 # 4010 <__TMC_END__> - // 10f4: 5d pop rbp - // 10f5: c3 ret - // 10f6: 66 2e 0f 1f 84 00 00 cs nop WORD PTR [rax+rax*1+0x0] - // 10fd: 00 00 00 - // 1100: c3 ret - // 1101: 66 66 2e 0f 1f 84 00 data16 cs nop WORD PTR [rax+rax*1+0x0] - // 1108: 00 00 00 00 - // 110c: 0f 1f 40 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - text_init_array_offset = builder->file.length; - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0xE9, 0x67, 0xFF, 0xFF, 0xFF, - 0x0F, 0x1F, 0x00, - }; - - // 1110: f3 0f 1e fa endbr64 - // 1114: e9 67 ff ff ff jmp 1080 <_start+0x60> - // 1119: 0f 1f 00 nop DWORD PTR [rax] - - vb_copy_array(&builder->file, data); - } - - // TODO: fix this - main_offset = builder->file.length; - main_size = cast_to(u32, u64, options.code.length); - - vb_copy_string(&builder->file, options.code); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 fini_offset = 0; - auto fini_section_index = cast_to(u16, u32, builder->section_headers.length); - { - // .fini - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - fini_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".fini")); - - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x48, 0x83, 0xEC, 0x08, - 0x48, 0x83, 0xC4, 0x08, - 0xC3, - }; - - // 1120: f3 0f 1e fa endbr64 - // 1124: 48 83 ec 08 sub rsp,0x8 - // 1128: 48 83 c4 08 add rsp,0x8 - // 112c: c3 ret - - u32 size = sizeof(data); - vb_copy_any_array(&builder->file, data); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // Add code segment (read, execute) - { - auto current_offset = builder->file.length; - auto length = current_offset - code_offset; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) - { - .type = PT_LOAD, - .flags = { .executable = 1, .readable = 1}, - .offset = code_offset, - .virtual_address = code_offset, - .physical_address = code_offset, - .file_size = length, - .memory_size = length, - .alignment = 0x1000, - }; - } - - vb_align(&builder->file, 0x1000); - - auto read_only_offset = builder->file.length; - - auto rodata_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 _IO_stdin_used_size = 0; - u32 rodata_va = 0; - { - // .rodata - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - rodata_va = offset; - - auto name = elf_get_section_name(builder, strlit(".rodata")); - - u32 _IO_stdin_used = 0x20001; - u32 data[] = {_IO_stdin_used}; - _IO_stdin_used_size = sizeof(_IO_stdin_used); - - u32 size = sizeof(data); - vb_copy_any_array(&builder->file, data); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .merge = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(data[0]), - }; - } - - u32 eh_frame_offset = 0; - u32 eh_frame_size = 0; - u64 eh_frame_alignment = 0; - auto eh_frame_hdr_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 eh_frame_header_entries = 0; - EhFrameHeader* eh_frame_header = 0; - { - // .eh_frame_hdr - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - eh_frame_alignment = alignment; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - eh_frame_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".eh_frame_hdr")); - - // TODO: figure out a link between this and the code - EhFrameHeaderEntry entries[] = { - { .pc = cast_to(s32, s64, (s64)_start_offset - (s64)offset), .fde = 0x34 }, - { .pc = cast_to(s32, s64, (s64)main_offset - (s64)offset), .fde = 0x4c }, - }; - - eh_frame_header_entries = array_length(entries); - - u32 size = sizeof(EhFrameHeader) + sizeof(entries); - eh_frame_size = size; - auto* dst = vb_add(&builder->file, size); - eh_frame_header = (EhFrameHeader*)dst; - - memcpy(dst + sizeof(EhFrameHeader), entries, sizeof(entries)); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .eh_frame - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - *eh_frame_header = (EhFrameHeader){ - .version = 1, - .pointer_encoding = elf_eh_frame_sdata4 | elf_eh_frame_pcrel, - .count_encoding = elf_eh_frame_udata4 | elf_eh_frame_absptr, - .table_encoding = elf_eh_frame_sdata4 | elf_eh_frame_datarel, - .frame_start = cast_to(u32, u64, offset - (cast_to(u64, s64, ((u8*)eh_frame_header - builder->file.pointer)) + offsetof(EhFrameHeader, frame_start))), - .entry_count = eh_frame_header_entries, - }; - - auto name = elf_get_section_name(builder, strlit(".eh_frame")); - - // Start of CIE - u32 length = 0x14; - *(u32*)vb_add(&builder->file, sizeof(u32)) = length; - u32 id = 0; - *(u32*)vb_add(&builder->file, sizeof(u32)) = id; - u8 version = 1; - *vb_add(&builder->file, 1) = version; - - auto augmentation = strlit("zR"); - vb_copy_string_zero_terminated(&builder->file, augmentation); - - u32 code_alignment_factor = 1; - uleb128_encode(&builder->file, code_alignment_factor); - - s32 data_alignment_factor = -8; - sleb128_encode(&builder->file, data_alignment_factor); - - u32 return_address_coumn = 0x10; - uleb128_encode(&builder->file, return_address_coumn); - - *vb_add(&builder->file, 1) = 0x01; // TODO: figure out what this is - - u8 augmentation_data = 0x1b; - *vb_add(&builder->file, 1) = augmentation_data; - - { - *vb_add(&builder->file, 1) = DW_CFA_def_cfa; - *vb_add(&builder->file, 1) = 7; // RSP - *vb_add(&builder->file, 1) = 8; - - // figure out DW_CFA_offset: RIP -8 - *vb_add(&builder->file, 1) = (0x02 << 6) | 0x10; // -8 in 6-bit => 0b010000 ?? - *vb_add(&builder->file, 1) = 0x01; - - *vb_add(&builder->file, 1) = DW_CFA_nop; - - *vb_add(&builder->file, 1) = DW_CFA_nop; - } - // End of CIE - - STRUCT(FrameDescriptorEntryHeader) - { - u32 length; - u32 pointer; - }; - - // Start of FDE - { - *vb_add_scalar(&builder->file, FrameDescriptorEntryHeader) = (FrameDescriptorEntryHeader) { - .length = 0x14, - .pointer = 0x1c, - }; - - // _start - s32 initial_location = cast_to(s32, s64, (s64)_start_offset - (s64)builder->file.length); - *(s32*)(vb_add(&builder->file, sizeof(s32))) = initial_location; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = _start_size; - - *vb_add(&builder->file, 1) = 0; // TODO: ??? - - *vb_add(&builder->file, 1) = (0x01 << 6) | 0x04; // DW_CFA_advance_loc (4) - - *vb_add(&builder->file, 1) = DW_CFA_undefined; - *vb_add(&builder->file, 1) = 0x10; // RIP - - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0; - // End of FDE - } - - // Start of FDE - { - *vb_add_scalar(&builder->file, FrameDescriptorEntryHeader) = (FrameDescriptorEntryHeader) { - .length = 0x10, - .pointer = 0x34, - }; - s32 initial_location = cast_to(s32, s64, (s64)main_offset - (s64)builder->file.length); - *(s32*)(vb_add(&builder->file, sizeof(s32))) = initial_location; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = main_size; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = 0; // TODO: ??? - *(u32*)(vb_add(&builder->file, sizeof(u32))) = 0; // TODO: ??? - // End of FDE - } - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - auto current_offset = builder->file.length; - auto size = current_offset - read_only_offset; - // Add ro program header - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_LOAD, - .flags = {.readable = 1}, - .offset = read_only_offset, - .virtual_address = read_only_offset, - .physical_address = read_only_offset, - .file_size = size, - .memory_size = size, - .alignment = 0x1000, - }; - } - - // TODO: do a more thorough precomputation - u64 init_array_size = 8; - u64 fini_array_size = 8; - u64 dynamic_size = 416; - u64 got_size = 40; - u64 got_plt_size = 24; - - auto total_size = init_array_size + fini_array_size + dynamic_size + got_size + got_plt_size; - - auto old_length = builder->file.length; - vb_align(&builder->file, 0x1000); - builder->file.length -= total_size; - assert(old_length < builder->file.length); - - // TODO: figure out why a virtual address offset is needed here - u32 virtual_address_offset = 0x1000; - - auto* data_program_header = vb_add(&builder->program_headers, 1); - auto data_offset = builder->file.length; - - u32 init_array_va = 0; - { - // .init_array - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto virtual_address = offset + virtual_address_offset; - init_array_va = virtual_address; - - assert((virtual_address - offset) % 0x1000 == 0); - - auto name = elf_get_section_name(builder, strlit(".init_array")); - - u64 content[] = { text_init_array_offset }; - - u32 size = sizeof(content); - assert(init_array_size == size); - - vb_copy_any_array(&builder->file, content); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_INIT_ARRAY, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(content[0]), - }; - - dynamic_relocations[dynamic_relocation_count] = (ElfRelocationWithAddend) { - .offset = virtual_address, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .x86_64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0, - }, - .addend = text_init_array_offset, - }; - dynamic_relocation_count += 1; - } - - u32 fini_array_va = 0; - { - // .fini_array - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - fini_array_va = virtual_address; - - assert((virtual_address - offset) % 0x1000 == 0); - - auto name = elf_get_section_name(builder, strlit(".fini_array")); - - u64 content[] = { text_fini_array_offset }; - u32 size = sizeof(content); - assert(size == fini_array_size); - vb_copy_any_array(&builder->file, content); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_FINI_ARRAY, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(content[0]), - }; - - dynamic_relocations[dynamic_relocation_count] = (ElfRelocationWithAddend) { - .offset = virtual_address, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .aarch64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0, - }, - .addend = text_fini_array_offset, - }; - dynamic_relocation_count += 1; - } - - auto* __dso_handle_relocation = &dynamic_relocations[dynamic_relocation_count]; - dynamic_relocation_count += 1; - - auto dynamic_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 dynamic_va = 0; - { - // .dynamic - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ElfDynamicEntry); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - dynamic_va = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".dynamic")); - - ElfDynamicEntry dynamic_entries[] = { - { .tag = DT_NEEDED, { .address = libcso6 }}, - { .tag = DT_INIT, { .address = init_offset }}, - { .tag = DT_FINI, { .address = fini_offset }}, - { .tag = DT_INIT_ARRAY, { .address = init_array_va }}, - { .tag = DT_INIT_ARRAYSZ, { .address = init_array_size }}, - { .tag = DT_FINI_ARRAY, { .address = fini_array_va }}, - { .tag = DT_FINI_ARRAYSZ, { .address = fini_array_size }}, - { .tag = DT_GNU_HASH, { .address = gnu_hash_offset }}, - { .tag = DT_STRTAB, { .address = dynstr_offset }}, - { .tag = DT_SYMTAB, { .address = dynsym_offset }}, - { .tag = DT_STRSZ, { .address = dynstr_size }}, - { .tag = DT_SYMENT, { .address = sizeof(ELFSymbol) }}, - // TODO - { .tag = DT_DEBUG, { .address = 0}}, - { .tag = DT_RELA, { .address = rela_dyn_offset }}, - { .tag = DT_RELASZ, { .address = rela_dyn_size }}, - { .tag = DT_RELAENT, { .address = sizeof(ElfRelocationWithAddend) }}, - // TODO - { .tag = DT_FLAGS_1, { .address = 134217728}}, - { .tag = DT_VERNEED, { .address = gnu_version_r_offset }}, - // TODO: - { .tag = DT_VERNEEDNUM, { .address = 1 }}, - { .tag = DT_VERSYM, { .address = gnu_version_offset }}, - { .tag = DT_RELACOUNT, { .address = rela_count }}, - // TODO: figure out if these are needed - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - }; - - u32 size = sizeof(dynamic_entries); - - vb_copy_any_array(&builder->file, dynamic_entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_DYNAMIC, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(ElfDynamicEntry), - }; - - // Add dynamic program header - { - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_DYNAMIC, - .flags = {.writeable = 1, .readable = 1}, - .offset = offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = size, - .memory_size = size, - .alignment = alignof(ElfDynamicEntry), - }; - } - } - - auto dynamic_relocation_offset = dynamic_relocation_count; - { - // .got - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - - auto name = elf_get_section_name(builder, strlit(".got")); - - // { .offset = 16320, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 1}, .addend = 0 }, // libc_start_main - // { .offset = 16328, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 2}, .addend = 0 }, // itm_deregister - // { .offset = 16336, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 3}, .addend = 0 }, // gmon_start - // { .offset = 16344, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 4}, .addend = 0 }, // itm_register - // { .offset = 16352, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 5}, .addend = 0 }, // cxa_finalize - - // TODO: unify these entries with code before - u64 entries[] = { 0, 0, 0, 0, 0 }; - assert(builder->dynamic_st.symbol_table.length - 1 == array_length(entries)); - - for (u32 i = 0; i < array_length(entries); i += 1) - { - auto* relocation = &dynamic_relocations[dynamic_relocation_count]; - dynamic_relocation_count += 1; - auto offset = virtual_address + (i * sizeof(u64)); - *relocation = (ElfRelocationWithAddend) { - .offset = offset, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_GLOB_DAT -#else - .aarch64 = R_AARCH64_GLOB_DAT -#endif - }, - .symbol = i + 1, - }, - .addend = 0, - }; - } - - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = alignof(u64), - }; - } - - auto got_plt_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 got_plt_va = 0; - { - // .got.plt - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - got_plt_va = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".got.plt")); - - // TODO: figure out why there are three entries here - u64 entries[] = { dynamic_va, 0, 0 }; - - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 8, - }; - } - - // Add several program headers - { - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_NOTE, - .flags = {.readable = 1}, - .offset = gnu_property_offset, - .virtual_address = gnu_property_offset, - .physical_address = gnu_property_offset, - .file_size = gnu_property_size, - .memory_size = gnu_property_size, - .alignment = gnu_property_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_NOTE, - .flags = {.readable = 1}, - .offset = gnu_build_id_abi_note_offset, - .virtual_address = gnu_build_id_abi_note_offset, - .physical_address = gnu_build_id_abi_note_offset, - .file_size = gnu_build_id_abi_note_size, - .memory_size = gnu_build_id_abi_note_size, - .alignment = gnu_build_id_abi_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_PROPERTY, - .flags = {.readable = 1}, - .offset = gnu_property_offset, - .virtual_address = gnu_property_offset, - .physical_address = gnu_property_offset, - .file_size = gnu_property_size, - .memory_size = gnu_property_size, - .alignment = gnu_property_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_EH_FRAME, - .flags = {.readable = 1}, - .offset = eh_frame_offset, - .virtual_address = eh_frame_offset, - .physical_address = eh_frame_offset, - .file_size = eh_frame_size, - .memory_size = eh_frame_size, - .alignment = eh_frame_alignment, - }; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_STACK, - .flags = { .writeable = 1, .readable = 1}, - .offset = 0, - .virtual_address = 0, - .physical_address = 0, - .file_size = 0, - .memory_size = 0, - .alignment = 16, - }; - - auto relro_end = builder->file.length; - auto size = relro_end - data_offset; - auto virtual_address = data_offset + virtual_address_offset; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_RELRO, - .flags = { .readable = 1}, - .offset = data_offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = size, - .memory_size = size, - .alignment = 1 - }; - } - - vb_align(&builder->file, 0x1000); - - u32 data_va_start = 0; - u32 data_va_end = 0; - auto data_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 __dso_handle_va; - { - // .data - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - data_va_start = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".data")); - - // TODO: figure out what's this - __dso_handle_va = virtual_address + sizeof(u64); - u64 entries[] = { 0, __dso_handle_va }; - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - data_va_end = cast_to(u32, u64, data_va_start + size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - - *__dso_handle_relocation = (ElfRelocationWithAddend) { - .offset = __dso_handle_va, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .aarch64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0 - }, - .addend = __dso_handle_va, - }; - } - - u32 bss_size; - auto bss_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 bss_end; - u32 bss_start; - { - // .bss - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - bss_start = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".bss")); - - bss_size = 8; - bss_end = virtual_address + bss_size; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_BSS, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = bss_size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // Fill data program header (writeable, readable) - { - auto current_offset = builder->file.length; - auto file_size = current_offset - data_offset; - auto virtual_address = data_offset + virtual_address_offset; - *data_program_header = (ElfProgramHeader) { - .type = PT_LOAD, - .flags = {.writeable = 1, .readable = 1}, - .offset = data_offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = file_size, - .memory_size = file_size + bss_size, - .alignment = 0x1000, - }; - } - - const u64 virtual_address = 0; - - // { - // // .comment - // auto* section_header = vb_add(&builder->section_headers, 1); - // u64 alignment = 1; - // - // vb_align(&builder->file, alignment); - // auto offset = builder->file.length; - // - // auto name = elf_get_section_name(builder, strlit(".comment")); - // - // String strings[] = { - // strlit("GCC: (GNU) 14.2.1 20240805"), - // strlit("GCC: (GNU) 14.2.1 20240910"), - // strlit("clang version 18.1.8"), - // }; - // - // for (u32 i = 0; i < array_length(strings); i += 1) - // { - // String string = strings[i]; - // vb_copy_string_zero_terminated(&builder->file, string); - // } - // - // auto size = builder->file.length - offset; - // - // *section_header = (ELFSectionHeader) { - // .name_offset = name, - // .type = ELF_SECTION_PROGRAM, - // .flags = { - // .merge = 1, - // .strings = 1, - // }, - // .address = virtual_address, - // .offset = offset, - // .size = size, - // .link = 0, - // .info = 0, - // .alignment = alignment, - // .entry_size = 1, - // }; - // } - - for (u32 i = 0, dynamic_relocation_i = dynamic_relocation_offset; dynamic_relocation_i < dynamic_relocation_count; dynamic_relocation_i += 1, i += 1) - { - auto* dynamic_relocation = &dynamic_relocations[dynamic_relocation_i]; - - auto* symbol = &builder->dynamic_st.symbol_table.pointer[i + 1]; - auto* c_string = &builder->dynamic_st.string_table.pointer[symbol->name_offset]; - auto c_length = strlen((char*)c_string); - auto name = (String) { c_string, c_length }; - auto target_symbol_address = dynamic_relocation->offset; - - for (u32 i = 0; i < symbol_relocations.length; i += 1) - { - auto* symbol_relocation = &symbol_relocations.pointer[i]; - if (s_equal(symbol_relocation->name, name)) - { - auto source_instruction_end = symbol_relocation->offset + sizeof(s32) + symbol_relocation->extra_bytes; - auto result = (s32)((s64)target_symbol_address - (s64)source_instruction_end); - *(s32*)&builder->file.pointer[symbol_relocation->offset] = result; - } - } - } - - VirtualBuffer(u8) debug_str = {}; - VirtualBuffer(u32) debug_str_offsets = {}; - { - // .debug_info - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_info")); - - auto* compilation_unit = vb_add_scalar(&builder->file, typeof(DwarfCompilationUnit)); - - // COMPILATION UNIT - { - u32 abbrev_code = 1; - uleb128_encode(&builder->file, abbrev_code); - - { - // producer: strx1 - auto string = compiler_name; - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // language: data2 - *(u16*)vb_add(&builder->file, sizeof(u16)) = DW_LANG_C11; - - { - // file: strx1 - auto string = strlit("first.nat"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // str_offsets_base: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 8; // TODO: figure out what this number means - - // stmt_list: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0; // TODO: figure out what this number means - - // comp_dir: strx1 - { - auto string = strlit("/home/david/dev/bb/tests"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // low_pc: addrx - uleb128_encode(&builder->file, 0); - - // high_pc: data4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 3; - - // addr_base: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 8; - } - - // SUBPROGRAM (main) - { - u32 abbrev_code = 2; - uleb128_encode(&builder->file, abbrev_code); - - // low_pc: addrx - uleb128_encode(&builder->file, 0); - - // high_pc: data4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 3; - - // frame_base: exprloc - uleb128_encode(&builder->file, 1); - *vb_add(&builder->file, 1) = DW_OP_reg7; - - // call_all_calls: flag_present - // not present in the debug_info section - - { - // name: strx1 - auto string = strlit("main"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&builder->file, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // file: data1 - *vb_add(&builder->file, 1) = 0; - - // line: data1 - *vb_add(&builder->file, 1) = 1; - - // type: ref4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0x32; - - // external: flag_present - // not present in the debug_info section - } - - // base_type (s32) - { - u32 abbrev_code = 3; - uleb128_encode(&builder->file, abbrev_code); - - { - // name: strx1 - auto string = strlit("s32"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&builder->file, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // encoding: data1 - *vb_add(&builder->file, 1) = DW_ATE_signed; - - // byte_size: data1 - *vb_add(&builder->file, 1) = sizeof(s32); // sizeof(int); - } - - *vb_add(&builder->file, 1) = 0; - - auto size = builder->file.length - offset; - - auto length_size = sizeof(compilation_unit->length); - *compilation_unit = (DwarfCompilationUnit) { - .length = cast_to(u32, u64, size - length_size), - .version = 5, - .type = DW_UT_compile, - .address_size = 8, - .debug_abbreviation_offset = 0, - }; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_abbrev - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_abbrev")); - - // Abbreviation entry - uleb128_encode(&builder->file, 1); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_compile_unit); - // Has children - *vb_add(&builder->file, 1) = 1; - - DwarfAttributeFormPair compile_unit[] = { - { DW_AT_producer, DW_FORM_strx1, }, - { DW_AT_language, DW_FORM_data2, }, - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_str_offsets_base, DW_FORM_sec_offset, }, - { DW_AT_stmt_list, DW_FORM_sec_offset, }, - { DW_AT_comp_dir, DW_FORM_strx1, }, - { DW_AT_low_pc, DW_FORM_addrx, }, - { DW_AT_high_pc, DW_FORM_data4, }, - { DW_AT_addr_base, DW_FORM_sec_offset, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(compile_unit)); - - // Abbreviation entry - uleb128_encode(&builder->file, 2); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_subprogram); - // Has children - *vb_add(&builder->file, 1) = 0; - - DwarfAttributeFormPair subprogram[] = { - { DW_AT_low_pc, DW_FORM_addrx, }, - { DW_AT_high_pc, DW_FORM_data4, }, - { DW_AT_frame_base, DW_FORM_exprloc, }, - { DW_AT_call_all_calls, DW_FORM_flag_present, }, - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_decl_file, DW_FORM_data1, }, - { DW_AT_decl_line, DW_FORM_data1, }, - { DW_AT_type, DW_FORM_ref4, }, - { DW_AT_external, DW_FORM_flag_present, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(subprogram)); - - // Abbreviation entry - uleb128_encode(&builder->file, 3); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_base_type); - // Has children - *vb_add(&builder->file, 1) = 0; // has children - - DwarfAttributeFormPair base_type[] = { - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_encoding, DW_FORM_data1, }, - { DW_AT_byte_size, DW_FORM_data1, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(base_type)); - - // End with a null entry - *vb_add(&builder->file, 1) = 0; - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - VirtualBuffer(u8) debug_line_str = {}; - { - // .debug_line - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_line")); - - auto* header = vb_add_scalar(&builder->file, DwarfLineHeader); - auto after_header_length = offset + offsetof(DwarfLineHeader, header_length) + sizeof(header->header_length); - - // standard opcode lengths - u8 opcode_length_lookup[] = { - [DW_LNS_copy - 1] = 0, - [DW_LNS_advance_pc - 1] = 1, - [DW_LNS_advance_line - 1] = 1, - [DW_LNS_set_file - 1] = 1, - [DW_LNS_set_column - 1] = 1, - [DW_LNS_set_basic_block - 1] = 0, - [DW_LNS_negate_stmt - 1] = 0, - [DW_LNS_const_add_pc - 1] = 0, - [DW_LNS_fixed_advance_pc - 1] = 1, - [DW_LNS_set_prologue_end - 1] = 0, - [DW_LNS_set_epilogue_begin - 1] = 0, - [DW_LNS_set_isa - 1] = 1, - }; - - // TODO: this is just one-byte binary integers. Turn into memcpy? - for (u32 i = 0; i < array_length(opcode_length_lookup); i += 1) - { - uleb128_encode(&builder->file, opcode_length_lookup[i]); - } - - { - typedef enum LineNumberHeaderEntryFormat : u8 - { - DW_LCNT_path = 0x01, - DW_LCNT_directory_index = 0x02, - DW_LCNT_timestamp = 0x03, - DW_LCNT_size = 0x04, - DW_LCNT_MD5 = 0x05, - } LineNumberHeaderEntryFormat; - - STRUCT(FormatDescriptor) - { - LineNumberHeaderEntryFormat format; - DwarfForm form; - }; - - FormatDescriptor directory_entry_formats[] = { - { DW_LCNT_path, DW_FORM_line_strp }, - }; - - auto directory_entry_format_count = cast_to(u8, u32, array_length(directory_entry_formats)); - *vb_add(&builder->file, 1) = directory_entry_format_count; - - for (u8 i = 0; i < array_length(directory_entry_formats); i += 1) - { - FormatDescriptor descriptor = directory_entry_formats[i]; - uleb128_encode(&builder->file, descriptor.format); - uleb128_encode(&builder->file, descriptor.form); - } - - // TODO: - u8 directory_index = 0; - auto directory_string_offset = debug_line_str.length; - { - auto string = strlit("/home/david/dev/bloat-buster/tests"); - vb_copy_string_zero_terminated(&debug_line_str, string); - } - u32 paths[] = { directory_string_offset }; - - u32 directory_count = array_length(paths); - uleb128_encode(&builder->file, directory_count); - - for (u32 i = 0; i < directory_count; i += 1) - { - auto directory_offset = paths[i]; - vb_copy_scalar(&builder->file, directory_offset); - } - - FormatDescriptor filename_entry_formats[] = { - { DW_LCNT_path, DW_FORM_line_strp }, - { DW_LCNT_directory_index, DW_FORM_udata }, - { DW_LCNT_MD5, DW_FORM_data16 }, - }; - - auto filename_entry_format_count = cast_to(u8, u32, array_length(filename_entry_formats)); - *vb_add(&builder->file, 1) = filename_entry_format_count; - - for (u8 i = 0; i < filename_entry_format_count; i += 1) - { - FormatDescriptor descriptor = filename_entry_formats[i]; - uleb128_encode(&builder->file, descriptor.format); - uleb128_encode(&builder->file, descriptor.form); - } - - STRUCT(FilenameEntry) - { - u32 filename; - u8 directory_index; - MD5Result hash; - }; - // MD5Result md5_hash = { { 0x05, 0xAB, 0x89, 0xF5, 0x48, 0x1B, 0xC9, 0xF2, 0xD0, 0x37, 0xE7, 0x88, 0x66, 0x41, 0xE9, 0x19 } }; - String dummy_file = file_read(thread->arena, strlit("/home/david/dev/bloat-buster/tests/first.nat")); - auto md5_hash = md5_string(dummy_file); - - auto filename_string_offset = debug_line_str.length; - { - auto string = strlit("first.nat"); - vb_copy_string_zero_terminated(&debug_line_str, string); - } - - FilenameEntry filenames[] = { - { - filename_string_offset, - directory_index, - md5_hash, - }, - }; - u32 filename_count = array_length(filenames); - uleb128_encode(&builder->file, filename_count); - - for (typeof(filename_count) i = 0; i < filename_count; i += 1) - { - auto filename = filenames[i]; - *(u32*)vb_add(&builder->file, sizeof(u32)) = filename.filename; - uleb128_encode(&builder->file, filename.directory_index); - vb_copy_array(&builder->file, filename.hash.hash); - } - } - - auto line_program_start_offset = builder->file.length; - { - *vb_add(&builder->file, 1) = DW_LNS_set_file; - *vb_add(&builder->file, 1) = 0; - - *vb_add(&builder->file, 1) = DW_LNS_set_column; - *vb_add(&builder->file, 1) = 5; - - *vb_add(&builder->file, 1) = DW_LNS_set_prologue_end; - - { - // TODO: confirm this is the encoding of special opcodes? - *vb_add(&builder->file, 1) = 0; // Special opcode - *vb_add(&builder->file, 1) = 9; // Bytes ahead - *vb_add(&builder->file, 1) = DW_LNE_set_address; // Bytes ahead - *(u64*)vb_add(&builder->file, sizeof(u64)) = main_offset; - } - - // TODO: does this have to do with "main.c"? - *vb_add(&builder->file, 1) = 0x14; // 14, address += 0, line += 2, op-index += 0 - - // Advance PC by 3 - *vb_add(&builder->file, 1) = DW_LNS_advance_pc; - *vb_add(&builder->file, 1) = cast_to(u8, u32, main_size); - - { - // TODO: confirm this is the encoding of special opcodes? - *vb_add(&builder->file, 1) = 0; // Special opcode - *vb_add(&builder->file, 1) = 1; // Bytes ahead - *vb_add(&builder->file, 1) = DW_LNE_end_sequence; - } - } - - auto size = builder->file.length - offset; - - *header = (DwarfLineHeader) { - .unit_length = size - sizeof(header->unit_length), - .version = 5, - .address_size = 8, - .segment_selector_size = 0, - .header_length = cast_to(u32, u64, line_program_start_offset - after_header_length), - .minimum_instruction_length = 1, - .maximum_operations_per_instruction = 1, - .default_is_stmt = 1, - .line_base = -5, - .line_range = 14, - .opcode_base = 13, - }; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_str - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_str")); - - vb_copy_string(&builder->file, (String) { debug_str.pointer, debug_str.length }); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .merge = 1, - .strings = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 1, - }; - } - - { - // .debug_addr - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_addr")); - auto length_size = offsetof(DwarfAddressTableHeader, version) - offsetof(DwarfAddressTableHeader, unit_length); - u64 addresses[] = { main_offset }; - - auto header = (DwarfAddressTableHeader) { - .unit_length = cast_to(u32, u64, sizeof(DwarfAddressTableHeader) - length_size + sizeof(addresses)), - .version = 5, - .address_size = 8, - .segment_selector_size = 0, - }; - *vb_add_scalar(&builder->file, typeof(header)) = header; - - vb_copy_any_array(&builder->file, addresses); - - auto size = builder->file.length - offset; - assert(size == header.unit_length + length_size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_line_str - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_line_str")); - - auto size = debug_line_str.length; - vb_copy_string(&builder->file, (String) { debug_line_str.pointer, debug_line_str.length }); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .merge = 1, - .strings = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 1, - }; - } - - { - // .debug_str_offsets - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_str_offsets")); - - STRUCT(DwarfDebugStrOffsetsHeader) - { - u32 length; - u16 version; - u8 padding[2]; - }; - static_assert(alignof(DwarfDebugStrOffsetsHeader) == 4); - - auto length_size = offsetof(DwarfDebugStrOffsetsHeader, version) - offsetof(DwarfDebugStrOffsetsHeader, length); - u32 offset_array_size = debug_str_offsets.length * sizeof(*debug_str_offsets.pointer); - auto header = (DwarfDebugStrOffsetsHeader) { - - .length = cast_to(u32, u64, sizeof(DwarfDebugStrOffsetsHeader) - length_size + offset_array_size), - .version = 5, - }; - *vb_add_scalar(&builder->file, DwarfDebugStrOffsetsHeader) = header; - - memcpy(vb_add(&builder->file, offset_array_size), debug_str_offsets.pointer, offset_array_size); - - auto size = builder->file.length - offset; - assert(header.length == (size - length_size)); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .symtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ELFSymbol); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".symtab")); - - auto main_c_string = st_get_string(&builder->static_st, strlit("first.nat")); - auto _dynamic_string = st_get_string(&builder->static_st, strlit("_DYNAMIC")); - auto eh_frame_hdr_string = st_get_string(&builder->static_st, strlit("__GNU_EH_FRAME_HDR")); - auto got_string = st_get_string(&builder->static_st, strlit("_GLOBAL_OFFSET_TABLE_")); - auto libc_start_main_string = st_get_string(&builder->static_st, strlit("__libc_start_main@" glibc_max_version_string)); - auto deregister_string = st_get_string(&builder->static_st, strlit("_ITM_deregisterTMCloneTable")); - auto edata_string = st_get_string(&builder->static_st, strlit("_edata")); - auto fini_string = st_get_string(&builder->static_st, strlit("_fini")); - auto __data_start_string = st_get_string(&builder->static_st, strlit("__data_start")); - auto data_start_string = st_get_string(&builder->static_st, strlit("data_start")); - - ELFSymbol symbols[] = { - { - .name_offset = main_c_string, - .type = ELF_SYMBOL_TYPE_FILE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_ABSOLUTE, - .value = 0, - .size = 0, - }, - { - .name_offset = 0, - .type = ELF_SYMBOL_TYPE_FILE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_ABSOLUTE, - .value = 0, - .size = 0 - }, - { - .name_offset = _dynamic_string, - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = dynamic_section_index, - .value = dynamic_va, - .size = 0, - }, - { - .name_offset = eh_frame_hdr_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = eh_frame_hdr_section_index, - .value = eh_frame_offset, - .size = 0, - }, - { - .name_offset = got_string, - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = got_plt_section_index, - .value = got_plt_va, - .size = 0, - }, - { - .name_offset = libc_start_main_string, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = deregister_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = data_start_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_start, - .size = 0, - }, - { - .name_offset = edata_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_end, - .size = 0, - }, - { - .name_offset = fini_string, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = fini_section_index, - .value = fini_offset, - .size = 0, - }, - { - .name_offset = __data_start_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_start, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__gmon_start__")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__dso_handle")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = data_section_index, - .value = __dso_handle_va, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_IO_stdin_used")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = rodata_section_index, - .value = rodata_va, - .size = _IO_stdin_used_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_end")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = bss_section_index, - .value = bss_end, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_start")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = text_section_index, - .value = _start_offset, - .size = _start_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__bss_start")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = bss_section_index, - .value = bss_start, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("main")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = text_section_index, - .value = main_offset, - .size = main_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__TMC_END__")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = data_section_index, - .value = data_va_end, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_ITM_registerTMCloneTable")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__cxa_finalize@" glibc_min_version_string)), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_init")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = init_section_index, - .value = init_offset, - .size = 0, - } - }; - - for (u32 i = 0; i < array_length(symbols); i += 1) - { - ELFSymbol* symbol = &symbols[i]; - auto target_symbol_address = symbol->value; - - if (target_symbol_address) - { - auto* c_str = &builder->static_st.string_table.pointer[symbol->name_offset]; - auto c_str_len = strlen((char*)c_str); - String symbol_name = { .pointer = c_str, .length = c_str_len }; - - for (u32 i = 0; i < symbol_relocations.length; i += 1) - { - SymbolRelocation* relocation = &symbol_relocations.pointer[i]; - if (s_equal(relocation->name, symbol_name)) - { - auto source_instruction_end = relocation->offset + sizeof(s32) + relocation->extra_bytes; - auto result = (s32)((s64)target_symbol_address - (s64)source_instruction_end); - *(s32*)&builder->file.pointer[relocation->offset] = result; - } - } - } - } - - vb_copy_array(&builder->static_st.symbol_table, symbols); - - memcpy(vb_add(&builder->file, builder->static_st.symbol_table.length * sizeof(ELFSymbol)), builder->static_st.symbol_table.pointer, builder->static_st.symbol_table.length * sizeof(ELFSymbol)); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_SYMBOL_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = builder->section_headers.length, // Symtab is already added, so the length is actually the index of the .strtab section - .info = 6, // TODO: figure out - .alignment = alignment, - .entry_size = sizeof(ELFSymbol), - }; - } - - { - // .strtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".strtab")); - - memcpy(vb_add(&builder->file, builder->static_st.string_table.length), builder->static_st.string_table.pointer, builder->static_st.string_table.length); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .shstrtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".shstrtab")); - - memcpy(vb_add(&builder->file, builder->section_string_table.length), builder->section_string_table.pointer, builder->section_string_table.length); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - vb_align(&builder->file, alignof(ELFSectionHeader)); - auto section_header_offset = builder->file.length; - auto section_header_count = cast_to(u16, u32, builder->section_headers.length); - memcpy(vb_add(&builder->file, sizeof(ELFSectionHeader) * section_header_count), builder->section_headers.pointer, builder->section_headers.length * sizeof(ELFSectionHeader)); - - *elf_header = (ELFHeader) - { - .identifier = { 0x7f, 'E', 'L', 'F' }, - .bit_count = bits64, - .endianness = little, - .format_version = 1, - .abi = ELF_ABI_SYSTEM_V, - .abi_version = 0, - .padding = {}, - .type = shared, -#ifdef __x86_64__ - .machine = x86_64, -#else - .machine = aarch64, -#endif - .version = 1, - .entry_point = _start_offset, - .program_header_offset = sizeof(ELFHeader), - .section_header_offset = section_header_offset, - .flags = 0, - .elf_header_size = sizeof(ELFHeader), - .program_header_size = sizeof(ElfProgramHeader), - .program_header_count = program_header_count, - .section_header_size = sizeof(ELFSectionHeader), - .section_header_count = section_header_count, - .section_header_string_table_index = section_header_count - 1, - }; - - assert(builder->program_headers.length == program_header_count); - memcpy(program_headers, builder->program_headers.pointer, sizeof(ElfProgramHeader) * builder->program_headers.length); - - assert(dynamic_relocation_count == expected_dynamic_relocation_count); - - return (String) { builder->file.pointer, builder->file.length }; -} - -STRUCT(DOSHeader) -{ - u8 signature[2]; - u16 extra_page_size; - u16 page_count; - u16 relocations; - u16 header_size_in_paragraphs; - u16 minimum_allocated_paragraphs; - u16 maximum_allocated_paragraphs; - u16 initial_ss_value; - u16 initial_relative_sp_value; - u16 checksum; - u16 initial_relative_ip_value; - u16 initial_cs_value; - u16 relocation_table_pointer; - u16 overlay_number; - u16 reserved_words[4]; - u16 oem_identifier; - u16 oem_information; - u16 other_reserved_words[10]; - u32 coff_header_pointer; -}; - -static_assert(sizeof(DOSHeader) == 0x40); - -typedef enum COFFArchitecture : u16 -{ - COFF_ARCH_UNKNOWN = 0x0000, - COFF_ARCH_AMD64 = 0x8664, - COFF_ARCH_ARM64 = 0xAA64, -} COFFArchitecture; - -STRUCT(COFFCharacteristics) -{ - u16 base_relocations_stripped:1; - u16 executable_image:1; - u16 line_numbers_stripped:1; - u16 symbols_stripped:1; - u16 aggressively_trim_working_set:1; - u16 large_address_aware:1; - u16 padding:1; - u16 bytes_reversed_low:1; - u16 machine_32_bit:1; - u16 debug_info_stripped:1; - u16 removable_run_from_swap:1; - u16 net_run_from_swap:1; - u16 system_file:1; - u16 dll:1; - u16 uniprocessor_machine_only:1; - u16 bytes_reversed_high:1; -}; - -static_assert(sizeof(COFFCharacteristics) == sizeof(u16)); - -typedef enum COFFOptionalHeaderFormat : u16 -{ - COFF_FORMAT_ROM = 0x107, - COFF_FORMAT_PE32 = 0x10b, - COFF_FORMAT_PE32_PLUS = 0x20b, -} COFFOptionalHeaderFormat; - -typedef enum COFFSubsystem : u16 -{ - COFF_SUBSYSTEM_UNKNOWN = 0x0000, - COFF_SUBSYSTEM_NATIVE = 0x0001, - COFF_SUBSYSTEM_WINDOWS_GUI = 0x0002, - COFF_SUBSYSTEM_WINDOWS_CUI = 0x0003, - COFF_SUBSYSTEM_OS_2_CUI = 0x0005, - COFF_SUBSYSTEM_POSIX_CUI = 0x0007, - COFF_SUBSYSTEM_WINDOWS_9X_NATIVE = 0x0008, - COFF_SUBSYSTEM_WINDOWS_CE_GUI = 0x0009, - COFF_SUBSYSTEM_EFI_APPLICATION = 0x000a, - COFF_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 0x000b, - COFF_SUBSYSTEM_EFI_RUNTIME_DRIVER = 0x000c, - COFF_SUBSYSTEM_EFI_ROM = 0x000d, - COFF_SUBSYSTEM_XBOX = 0x000e, - COFF_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 0x0010, -} COFFSubsystem; - -STRUCT(COFFDllCharacteristics) -{ - u16 call_when_loaded:1; - u16 call_when_thread_terminates:1; - u16 call_when_thread_starts:1; - u16 call_when_exiting:1; - u16 padding:1; - u16 high_entropy_va:1; - u16 dynamic_base:1; - u16 force_integrity:1; - u16 nx_compatible:1; - u16 no_isolation:1; - u16 no_seh:1; - u16 do_not_bind:1; - u16 app_container:1; - u16 is_wdm_driver:1; - u16 supports_control_flow_guard:1; - u16 terminal_server_aware:1; -}; - -static_assert(sizeof(COFFDllCharacteristics) == sizeof(u16)); - -STRUCT(COFFLoaderFlags) -{ - u32 prestart_breakpoint:1; - u32 postloading_debugger:1; - u32 padding:30; -}; - -static_assert(sizeof(COFFLoaderFlags) == sizeof(u32)); - -STRUCT(COFFHeader) -{ - u8 signature[4]; - COFFArchitecture architecture; - u16 section_count; - u32 time_date_stamp; - u32 symbol_table_pointer; - u32 symbol_count; - u16 optional_header_size; - COFFCharacteristics characteristics; -}; - -static_assert(sizeof(COFFHeader) == 24); - -typedef enum COFFDataDirectoryIndex { - COFF_EXPORT_DIRECTORY_INDEX, - COFF_IMPORT_DIRECTORY_INDEX, - COFF_RESOURCE_DIRECTORY_INDEX, - COFF_EXCEPTION_DIRECTORY_INDEX, - COFF_SECURITY_DIRECTORY_INDEX, - COFF_RELOCATION_DIRECTORY_INDEX, - COFF_DEBUG_DIRECTORY_INDEX, - COFF_ARCHITECTURE_DIRECTORY_INDEX, - COFF_GLOBAL_PTR_DIRECTORY_INDEX, - COFF_TLS_DIRECTORY_INDEX, - COFF_LOAD_CONFIG_DIRECTORY_INDEX, - COFF_BOUND_IMPORT_DIRECTORY_INDEX, - COFF_IAT_DIRECTORY_INDEX, - COFF_DELAY_IMPORT_DIRECTORY_INDEX, - COFF_CLR_DIRECTORY_INDEX, - COFF_DATA_DIRECTORY_LAST, // TODO: ?? - COFF_DATA_DIRECTORY_COUNT -} COFFDataDirectoryIndex; - -static_assert(COFF_DATA_DIRECTORY_COUNT == 16); - -STRUCT(COFFDataDirectory) -{ - u32 rva; - u32 size; -}; - -STRUCT(COFFOptionalHeader) -{ - COFFOptionalHeaderFormat format; - u8 major_linker_version; - u8 minor_linker_version; - u32 code_size; - u32 initialized_data_size; - u32 uninitialized_data_size; - u32 entry_point_address; - u32 code_offset; - u64 image_offset; - u32 virtual_section_alignment; - u32 file_section_alignment; - u16 major_operating_system_version; - u16 minor_operating_system_version; - u16 major_image_version; - u16 minor_image_version; - u16 major_subsystem_version; - u16 minor_subsystem_version; - u32 win32_version_value; - u32 image_size; - u32 headers_size; - u32 checksum; - COFFSubsystem subsystem; - COFFDllCharacteristics dll_characteristics; - u64 stack_reserve_size; - u64 stack_commit_size; - u64 heap_reserve_size; - u64 heap_commit_size; - COFFLoaderFlags loader_flags; - u32 directory_count; - COFFDataDirectory directories[COFF_DATA_DIRECTORY_COUNT]; -}; - -STRUCT(COFFSectionFlags) -{ - u32 padding:3; - u32 do_not_pad:1; - u32 padding1:1; - u32 contains_code:1; - u32 contains_initialized_data:1; - u32 contains_uninitialized_data:1; - u32 link_other:1; - u32 link_has_information:1; - u32 padding2:1; - u32 link_remove:1; - u32 link_has_comdat:1; - u32 padding3:1; - u32 reset_speculative_exceptions:1; - u32 global_pointer_relocations:1; - u32 purgeable:1; - u32 is_16_bit:1; - u32 locked:1; - u32 preloaded:1; - u32 data_alignment:4; - u32 link_extended_relocations:1; - u32 discardable:1; - u32 not_cached:1; - u32 not_pageable:1; - u32 shared:1; - u32 execute:1; - u32 read:1; - u32 writte:1; -}; - -static_assert(sizeof(COFFSectionFlags) == sizeof(u32)); - -STRUCT(COFFSectionName) -{ - u8 name[8]; -}; - -STRUCT(COFFSectionHeader) -{ - COFFSectionName name; - u32 virtual_size; - u32 rva; - u32 file_size; - u32 file_offset; - u32 relocation_offset; - u32 line_number_offset; - u16 relocation_count; - u16 line_number_count; - COFFSectionFlags flags; -}; - -static_assert(sizeof(COFFSectionHeader) == 40); - -fn COFFSectionName coff_section_name(String name) -{ - COFFSectionName result = {}; - assert(name.length <= array_length(result.name)); - memcpy(result.name, name.pointer, name.length); - - return result; -} - -STRUCT(COFFExceptionTableEntry_x86_64) -{ - u32 start_rva; - u32 end_rva; - u32 unwind_information_rva; -}; - -typedef enum COFFDebugType : u32 -{ - COFF_DEBUG_UNKNOWN = 0, - COFF_DEBUG_COFF = 1, - COFF_DEBUG_CODEVIEW = 2, - COFF_DEBUG_FPO = 3, - COFF_DEBUG_MISC = 4, - COFF_DEBUG_EXCEPTION = 5, - COFF_DEBUG_FIXUP = 6, - COFF_DEBUG_OMAP_TO_SRC = 7, - COFF_DEBUG_OMAP_FROM_SRC = 8, - COFF_DEBUG_BORLAND = 9, - COFF_DEBUG_RESERVED10 = 10, - COFF_DEBUG_BBT = 10, - COFF_DEBUG_CLSID = 11, - COFF_DEBUG_VC_FEATURE = 12, - COFF_DEBUG_POGO = 13, - COFF_DEBUG_ILTCG = 14, - COFF_DEBUG_MPX = 15, - COFF_DEBUG_REPRO = 16, - COFF_DEBUG_SPGO = 18, - COFF_DEBUG_EXTENDED_DLL_CHARACTERISTICS = 20, -} COFFDebugType; - -STRUCT(COFFDebugDirectory) -{ - u32 characteristics; - u32 timestamp; - u16 major_version; - u16 minor_version; - COFFDebugType type; - u32 size; - u32 rva; - u32 file_offset; -}; - -static_assert(sizeof(COFFDebugDirectory) == 28); - -STRUCT(COFFGUID) -{ - u8 data[16]; -}; - -STRUCT(COFFRSDS) -{ - u8 signature[4]; - COFFGUID guid; - u32 age; - u8 path[]; -}; - -static_assert(sizeof(COFFRSDS) == 4 + 16 + 4); - -fn void file_write_coff_rsds(VirtualBuffer(u8)* file, String guid, u32 age, String path) -{ - assert(guid.length == 16); - assert(path.pointer[path.length] == 0); - - COFFRSDS rsds = { - .signature = { 'R', 'S', 'D', 'S' }, - .age = age, - }; - memcpy(rsds.guid.data, guid.pointer, sizeof(COFFGUID)); - - vb_copy_scalar(file, rsds); - - vb_copy_string_zero_terminated(file, path); -} - -STRUCT(COFFImportDirectory) -{ - u32 lookup_table_rva; - u32 time_date_stamp; - u32 forwarder_chain; - u32 dll_name_rva; - u32 address_table_rva; -}; - -STRUCT(COFFImportLookup) -{ - u32 name_table_rva; - u8 padding[4]; -}; - -STRUCT(COFFImportAddress) -{ - u32 name_table_rva; - u8 padding[4]; -}; - -STRUCT(COFFImportName) -{ - u16 hint; - u8 name[]; -}; - -fn void coff_import_name(VirtualBuffer(u8)* file, u16 hint, String name) -{ - vb_copy_scalar(file, hint); - vb_copy_string_zero_terminated(file, name); -} - -typedef enum COFFUnwindOperation : u8 -{ - UNW_OP_PUSH_NONVOL = 0, // Save a non-volatile register on the stack. - UNW_OP_ALLOC_LARGE = 1, // Allocate a large stack frame. - UNW_OP_ALLOC_SMALL = 2, // Allocate a small stack frame. - UNW_OP_SET_FPREG = 3, // Establish the frame pointer register. - UNW_OP_SAVE_NONVOL = 4, // Save a non-volatile register at a specified offset. - UNW_OP_SAVE_NONVOL_FAR = 5, // Save a non-volatile register at a far offset. - UNW_OP_SAVE_XMM128 = 8, // Save a 128-bit XMM register. - UNW_OP_SAVE_XMM128_FAR = 9, // Save a 128-bit XMM register at a far offset. - UNW_OP_PUSH_MACHFRAME = 10, // Push a machine frame (used for interrupts and system exceptions). -} COFFUnwindOperation; - -STRUCT(COFFUnwindCode) -{ - u8 code_offset; - COFFUnwindOperation operation:4; - u8 operation_info:4; -}; - -static_assert(sizeof(COFFUnwindCode) == 2); - -STRUCT(COFFUnwindInformation) -{ - u8 version:3; - u8 exception_handler:1; - u8 user_exception_handler:1; - u8 chain_info:1; - u8 reserved:2; - u8 prologue_size; - u8 code_count; - u8 frame_register_and_offset; - COFFUnwindCode code[]; -}; - -STRUCT(PDBHeader) -{ - u8 magic[32]; - u32 block_size; - u32 free_block_map_index; - u32 block_count; - u32 directory_size; - u32 reserved; - u32 directory_block_indices[]; -}; - -static_assert(sizeof(PDBHeader) == 52); - -fn u32 pdb_size_to_block_count(u32 bytes, u32 block_size) -{ - return cast_to(u32, u64, ((u64)bytes + block_size - 1) / block_size); -} - -fn u64 pdb_block_index_to_file_offset(u32 block_index, u32 block_size) -{ - return (u64)block_index * (u64)block_size; -} - -fn u8 pdb_are_block_indices_contiguous(Slice(u32) block_indices) -{ - assert(block_indices.length); - u32 expected_index = block_indices.pointer[0]; - u8 result = 1; - for (u64 i = 1; i < block_indices.length; i += 1) - { - expected_index += 1; - if (block_indices.pointer[i] != expected_index) - { - result = 0; - break; - } - } - - return result; -} - -fn u8 pdb_are_block_indices_contiguous_ex(u32* block_indices, u32 block_size, u32 stream_size) -{ - auto block_count = pdb_size_to_block_count(stream_size, block_size); - - return pdb_are_block_indices_contiguous((Slice(u32)) { block_indices, block_count }); -} - -STRUCT(PDBStreamCreate) -{ - u8* data; - u32* block_indices; - u32 block_size; - u32 size; -}; - -global_variable const u32 nil_page_size = 0xffffffff; -global_variable const u16 nil_stream_index = 0xffff; -global_variable const u32 info_stream_index = 1; -global_variable const u32 tpi_stream_index = 2; -global_variable const u16 dbi_stream_index = 3; -global_variable const u16 ipi_stream_index = 4; - -STRUCT(PDBCoalescedMSFStream) -{ - u8* data; - u64 size; -}; - -typedef PDBStreamCreate PDBDirectMSFStream; - -STRUCT(PDBFile) -{ - String content; - PDBHeader* header; - PDBCoalescedMSFStream directory_stream; - u32 stream_count; - u32* stream_sizes; - u32** stream_blocks; -}; - - -typedef enum PDBStreamIndexValidation -{ - PDB_STREAM_INDEX_VALIDATION_SUCCESS, - PDB_STREAM_INDEX_VALIDATION_NULL, - PDB_STREAM_INDEX_VALIDATION_OUT_OF_BOUNDS, -} PDBStreamIndexValidation; - -fn PDBStreamIndexValidation pdb_validate_stream_index(PDBFile pdb, u32 stream_index) -{ - PDBStreamIndexValidation result = {}; - if (stream_index == nil_stream_index) - { - result = PDB_STREAM_INDEX_VALIDATION_NULL; - } - else if (stream_index >= pdb.stream_count) - { - result = PDB_STREAM_INDEX_VALIDATION_OUT_OF_BOUNDS; - } - - return result; -} - -fn u32 pdb_get_stream_size(PDBFile pdb, u32 index) -{ - auto stream_size = pdb.stream_sizes[index]; - - u32 result = 0; - if (likely(stream_size != nil_page_size)) - { - result = stream_size; - } - - return result; -} - -fn PDBStreamCreate pdb_setup_stream_creation(PDBFile pdb, u32 stream_index) -{ - if (pdb_validate_stream_index(pdb, stream_index) != PDB_STREAM_INDEX_VALIDATION_SUCCESS) - { - failed_execution(); - } - - return (PDBStreamCreate) - { - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = pdb.stream_blocks[stream_index], - .size = pdb_get_stream_size(pdb, stream_index), - }; -} - -fn PDBCoalescedMSFStream pdb_coalesced_msf_stream(PDBStreamCreate create) -{ - PDBCoalescedMSFStream result = {}; - - if (pdb_are_block_indices_contiguous_ex(create.block_indices, create.block_size, create.size)) - { - auto index = create.block_indices[0]; - auto file_offset = pdb_block_index_to_file_offset(index, create.block_size); - print("Creating stream from block #{u32}, file offset 0x{u64:x}\n", index, file_offset); - result.data = create.data + file_offset; - result.size = create.size; - } - else - { - todo(); - // VirtualBuffer(u8) bytes = {}; - // vb_ensure_capacity(&bytes, stream_size); - // bytes.length += stream_size; - // - // u32 full_block_count = stream_size / block_size; - // auto* destination = data; - // - // for (u32 i = 0; i < full_block_count; i += 1) - // { - // auto index = block_indices[i]; - // auto file_offset = pdb_block_index_to_file_offset(index, block_size); - // memcpy(destination, data + file_offset, block_size); - // - // destination += block_size; - // } - // - // auto remaining_bytes = stream_size - (full_block_count * block_size); - // if (remaining_bytes != 0) - // { - // auto index = block_indices[full_block_count]; - // auto file_offset = pdb_block_index_to_file_offset(index, block_size); - // memcpy(destination, data + file_offset, remaining_bytes); - // } - // - // result.data = bytes.pointer; - } - - return result; -} - -fn u32 pdb_direct_msf_stream_block_size_log_2(PDBDirectMSFStream stream) -{ - return first_bit_set_32(stream.block_size); -} - -STRUCT(PDBIndexAndOffset) -{ - u32 index; - u32 offset_within_block; -}; - -fn PDBIndexAndOffset pdb_direct_msf_stream_block_index_for_offset(PDBDirectMSFStream stream, u32 offset) -{ - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - u32 block_index = offset >> block_size_log2; - u32 offset_within_block = offset & (stream.block_size - 1); - - return (PDBIndexAndOffset) { - .index = block_index, - .offset_within_block = offset_within_block, - }; -} - -fn u64 pdb_direct_msf_stream_data_offset_for_index_and_offset(PDBDirectMSFStream stream, PDBIndexAndOffset index_and_offset) -{ - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - auto offset_within_data = ((u64)(stream.block_indices[index_and_offset.index]) << block_size_log2) + index_and_offset.offset_within_block; - return offset_within_data; -} - -fn PDBCoalescedMSFStream pdb_coalesced_msf_stream_from_direct(PDBDirectMSFStream direct, u64 size, u32 offset) -{ - PDBCoalescedMSFStream result = {}; - result.size = size; - - auto index_and_offset = pdb_direct_msf_stream_block_index_for_offset(direct, offset); - - auto block_count = pdb_size_to_block_count(index_and_offset.offset_within_block + size, direct.block_size); - if (pdb_are_block_indices_contiguous((Slice(u32)) { direct.block_indices + index_and_offset.index, block_count })) - { - auto offset_within_data = pdb_direct_msf_stream_data_offset_for_index_and_offset(direct, index_and_offset); - result.data = direct.data + offset_within_data; - } - else - { - todo(); - } - - return result; -} - - -typedef enum PDBValidationResult -{ - PDB_VALIDATION_SUCCESS, - PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCK, - PDB_VALIDATION_BAD_SIGNATURE, - PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCKS, - PDB_VALIDATION_BAD_FREE_BLOCK_MAP_INDEX, -} PDBValidationResult; - -#define pdb_magic_literal "Microsoft C/C++ MSF 7.00\r\n\x1a" "DS\x00\x00\x00" -u8 pdb_magic[32] = pdb_magic_literal; - -fn PDBValidationResult pdb_validate(String pdb) -{ - PDBValidationResult result = {}; - assert(pdb.pointer); - assert(pdb.length); - if (pdb.length < sizeof(PDBHeader)) - { - result = PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCK; - } - else - { - auto* header = (PDBHeader*)pdb.pointer; - - if (memcmp(header->magic, pdb_magic, sizeof(header->magic)) != 0) - { - result = PDB_VALIDATION_BAD_SIGNATURE; - } - else if (pdb.length < header->block_count * header->block_size) - { - result = PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCKS; - } - else if (header->free_block_map_index != 1 && header->free_block_map_index != 2) - { - result = PDB_VALIDATION_BAD_FREE_BLOCK_MAP_INDEX; - } - } - - return result; -} - -fn PDBDirectMSFStream pdb_direct_msf_stream_create(PDBStreamCreate create) -{ - if (!is_power_of_two(create.block_size)) - { - failed_execution(); - } - - return create; -} - -fn void pdb_direct_msf_stream_read_at_offset(PDBDirectMSFStream stream, String buffer, u64 offset) -{ - assert(buffer.pointer); - assert(buffer.length); - assert(offset + buffer.length <= stream.size); - - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - auto block_index = offset >> block_size_log2; - auto offset_within_block = offset & (stream.block_size - 1); - - auto offset_within_data = (u64)(stream.block_indices[block_index] << block_size_log2) + offset_within_block; - auto bytes_left_in_block = stream.block_size - offset_within_block; - - if (bytes_left_in_block >= buffer.length) - { - memcpy(buffer.pointer, stream.data + offset_within_data, buffer.length); - } - else - { - todo(); - } -} - -typedef enum PDBDBIVersion : u32 -{ - PDB_DBI_VERSION_VC41 = 930803, - PDB_DBI_VERSION_V50 = 19960307, - PDB_DBI_VERSION_V60 = 19970606, - PDB_DBI_VERSION_V70 = 19990903, - PDB_DBI_VERSION_V110 = 20091201, -} PDBDBIVersion; - -STRUCT(PDBDBIStreamHeader) -{ - u32 signature; - PDBDBIVersion version; - u32 age; - u16 global_stream_index; - u16 toolchain; - u16 public_stream_index; - u16 pdb_dll_version; - u16 symbol_record_stream_index; - u16 pdb_dll_rbld; - u32 module_info_size; - u32 section_contribution_size; - u32 section_map_size; - u32 source_info_size; - u32 type_server_map_size; - u32 mcf_type_server_index; - u32 optional_debug_header_size; - u32 ec_size; - u16 flags; - u16 machine; - u32 padding; -}; - -global_variable const u32 dbi_stream_header_signature = 0xffffffff; - -STRUCT(PDBDBIStream) -{ - PDBDirectMSFStream stream; - PDBDBIStreamHeader header; -}; - -fn PDBDBIStream pdb_dbi_stream_create(PDBFile pdb) -{ - PDBDBIStream result = {}; - result.stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi_stream_index)); - - if (result.stream.size < sizeof(PDBDBIStreamHeader)) - { - failed_execution(); - } - - pdb_direct_msf_stream_read_at_offset(result.stream, scalar_to_bytes(result.header), 0); - - if (result.header.signature != dbi_stream_header_signature) - { - failed_execution(); - } - else if (result.header.version != PDB_DBI_VERSION_V70) - { - failed_execution(); - } - - return result; -} - -typedef enum PDBStreamVersion : u32 -{ - PDB_STREAM_VERSION_VC2 = 19941610, - PDB_STREAM_VERSION_VC4 = 19950623, - PDB_STREAM_VERSION_VC41 = 19950814, - PDB_STREAM_VERSION_VC50 = 19960307, - PDB_STREAM_VERSION_VC98 = 19970604, - PDB_STREAM_VERSION_VC70Dep = 19990604, - PDB_STREAM_VERSION_VC70 = 20000404, - PDB_STREAM_VERSION_VC80 = 20030901, - PDB_STREAM_VERSION_VC110 = 20091201, - PDB_STREAM_VERSION_VC140 = 20140508, -} PDBStreamVersion; - -STRUCT(PDBStreamHeader) -{ - PDBStreamVersion version; - u32 signature; - u32 age; - COFFGUID guid; -}; - -STRUCT(PDBNamedStreamMap) -{ - u32 length; - u8 string_table[]; -}; - -STRUCT(PDBNamedStreamMapEntry) -{ - u32 offset; - u32 stream_index; -}; - -STRUCT(PDBSerializedHashTableHeader) -{ - u32 length; - u32 capacity; -}; - -STRUCT(PDBSerializedHashTableBitArray) -{ - u32 word_count; - u32 words[]; -}; - -typedef enum PDBFeatureCode : u32 -{ - PDB_FEATURE_CODE_VC110 = 20091201, - PDB_FEATURE_CODE_VC140 = 20140508, - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/pdbcommon.h#L23 - PDB_FEATURE_CODE_NO_TYPE_MERGE = 0x4D544F4E, // "NOTM" - PDB_FEATURE_CODE_MINIMAL_DEBUG_INFO = 0x494E494D // "MINI", i.e. executable was linked with /DEBUG:FASTLINK -} PDBFeatureCode; - -STRUCT(PDBInfoStream) -{ - PDBStreamHeader* header; - u8 uses_debug_fast_link; -}; - -fn PDBInfoStream pdb_info_stream_create(PDBFile pdb) -{ - PDBInfoStream result = {}; - - auto stream = pdb_coalesced_msf_stream(pdb_setup_stream_creation(pdb, info_stream_index)); - result.header = (PDBStreamHeader*)stream.data; - u32 names_stream_index = 0; - - u64 stream_offset = sizeof(PDBStreamHeader); - auto* named_stream_map = (PDBNamedStreamMap*)(stream.data + stream_offset); - stream_offset += sizeof(*named_stream_map) + named_stream_map->length; - - auto* serialized_hash_table_header = (PDBSerializedHashTableHeader*)(stream.data + stream_offset); - stream_offset += sizeof(*serialized_hash_table_header); - - auto* present_bit_array = (PDBSerializedHashTableBitArray*)(stream.data + stream_offset); - stream_offset += sizeof(*present_bit_array) + present_bit_array->word_count * sizeof(present_bit_array->words[0]); - - auto* deleted_bit_array = (PDBSerializedHashTableBitArray*)(stream.data + stream_offset); - stream_offset += sizeof(*deleted_bit_array) + deleted_bit_array->word_count * sizeof(deleted_bit_array->words[0]); - - auto* named_stream_map_entries = (PDBNamedStreamMapEntry*)(stream.data + stream_offset); - - for (u32 i = 0, length = serialized_hash_table_header->length; i < length; i += 1) - { - auto* entry = &named_stream_map_entries[i]; - auto stream_name = cstr(&named_stream_map->string_table[entry->offset]); - - if (s_equal(strlit("/names"), stream_name)) - { - names_stream_index = entry->stream_index; - break; - } - } - - stream_offset += sizeof(named_stream_map_entries[0]) * serialized_hash_table_header->length; - - auto* feature_codes = (PDBFeatureCode*)(stream.data + stream_offset); - auto remaining_bytes = stream.size - stream_offset; - auto count = remaining_bytes / sizeof(feature_codes[0]); - - for (u32 i = 0; i < count; i += 1) - { - if (feature_codes[i] == PDB_FEATURE_CODE_MINIMAL_DEBUG_INFO) - { - result.uses_debug_fast_link = 1; - break; - } - } - - return result; -} - -STRUCT(PDBPublicStreamHeader) -{ - u32 symbol_hash; - u32 address_map; - u32 thunk_count; - u32 thunk_size; - u16 isect_thunk_table; - u16 padding; - u32 offset_thunk_table; - u16 section_count; - u16 padding2; -}; - -STRUCT(PDBHashTableHeader) -{ - u32 signature; - u32 version; - u32 size; - u32 bucket_count; -}; - -global_variable const u32 pdb_hash_table_signature = 0xffffffff; -global_variable const u32 pdb_hash_table_version = 0xeffe0000 + 19990810; - -typedef enum PDBSectionContributionVersion : u32 -{ - PDB_SECTION_CONTRIBUTION_V60 = 0xeffe0000 + 19970605, - PDB_SECTION_CONTRIBUTION_V2 = 0xeffe0000 + 20140516, -} PDBSectionContributionVersion; - -STRUCT(PDBSectionContribution) -{ - u16 section; - u16 padding; - u32 offset; - u32 size; - u32 characteristics; - u16 module_index; - u16 padding2; - u32 data_crc; - u32 relocation_crc; -}; - -fn u32 pdb_module_info_substream_offset() -{ - return sizeof(PDBDBIStreamHeader); -} - -fn u32 pdb_section_contribution_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_module_info_substream_offset() + header.module_info_size; -} - -fn u32 pdb_section_map_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_section_contribution_substream_offset(header) + header.section_contribution_size; -} - -fn u32 pdb_source_info_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_section_map_substream_offset(header) + header.section_map_size; -} - -fn u32 pdb_type_server_map_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_source_info_substream_offset(header) + header.source_info_size; -} - -fn u32 pdb_ec_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_type_server_map_substream_offset(header) + header.type_server_map_size; -} - -fn u32 pdb_debug_header_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_ec_substream_offset(header) + header.ec_size; -} - -STRUCT(PDBDebugHeader) -{ - u16 fpo_data_stream_index; - u16 exception_data_stream_index; - u16 fixup_data_stream_index; - u16 omap_to_src_data_stream_index; - u16 omap_from_src_data_stream_index; - u16 section_header_stream_index; - u16 token_data_stream_index; - u16 xdata_stream_index; - u16 pdata_stream_index; - u16 new_fpo_data_stream_index; - u16 original_section_header_data_stream_index; -}; - -typedef enum TPIStreamVersion : u32 -{ - TPI_STREAM_V40 = 19950410, - TPI_STREAM_V41 = 19951122, - TPI_STREAM_V50 = 19961031, - TPI_STREAM_V70 = 19990903, - TPI_STREAM_V80 = 20040203, -} TPIStreamVersion; - -STRUCT(TPIStreamHeader) -{ - TPIStreamVersion version; - u32 header_size; - u32 type_index_begin; - u32 type_index_end; - u32 type_record_bytes; - u16 hash_stream_index; - u16 hash_aux_stream_index; - u32 hash_key_size; - u32 hash_bucket_count; - s32 hash_value_buffer_offset; - u32 hash_value_buffer_length; - s32 index_offset_buffer_offset; - u32 index_offset_buffer_length; - s32 hash_adj_buffer_offset; - u32 hash_adj_buffer_length; -}; - -typedef enum CodeviewBasicType : u8 -{ - CODEVIEW_BASIC_TYPE_NONE = 0x00, - CODEVIEW_BASIC_TYPE_ABS = 0x01, - CODEVIEW_BASIC_TYPE_SEGMENT = 0x02, - CODEVIEW_BASIC_TYPE_VOID = 0x03, - CODEVIEW_BASIC_TYPE_CURRENT = 0x04, - CODEVIEW_BASIC_TYPE_NBASICSTR = 0x05, - CODEVIEW_BASIC_TYPE_FBASICSTR = 0x06, - CODEVIEW_BASIC_TYPE_NOTTRANS = 0x07, - CODEVIEW_BASIC_TYPE_HRESULT = 0x08, - CODEVIEW_BASIC_TYPE_CHAR = 0x10, - CODEVIEW_BASIC_TYPE_SHORT = 0x11, - CODEVIEW_BASIC_TYPE_LONG = 0x12, - CODEVIEW_BASIC_TYPE_QUAD = 0x13, - CODEVIEW_BASIC_TYPE_OCT = 0x14, - CODEVIEW_BASIC_TYPE_UCHAR = 0x20, - CODEVIEW_BASIC_TYPE_USHORT = 0x21, - CODEVIEW_BASIC_TYPE_ULONG = 0x22, - CODEVIEW_BASIC_TYPE_UQUAD = 0x23, - CODEVIEW_BASIC_TYPE_UOCT = 0x24, - CODEVIEW_BASIC_TYPE_BOOL8 = 0x30, - CODEVIEW_BASIC_TYPE_BOOL16 = 0x31, - CODEVIEW_BASIC_TYPE_BOOL32 = 0x32, - CODEVIEW_BASIC_TYPE_BOOL64 = 0x33, - CODEVIEW_BASIC_TYPE_FLOAT32 = 0x40, - CODEVIEW_BASIC_TYPE_FLOAT64 = 0x41, - CODEVIEW_BASIC_TYPE_FLOAT80 = 0x42, - CODEVIEW_BASIC_TYPE_FLOAT128 = 0x43, - CODEVIEW_BASIC_TYPE_FLOAT48 = 0x44, - CODEVIEW_BASIC_TYPE_FLOAT32PP = 0x45, - CODEVIEW_BASIC_TYPE_FLOAT16 = 0x46, - CODEVIEW_BASIC_TYPE_COMPLEX32 = 0x50, - CODEVIEW_BASIC_TYPE_COMPLEX64 = 0x51, - CODEVIEW_BASIC_TYPE_COMPLEX80 = 0x52, - CODEVIEW_BASIC_TYPE_COMPLEX128 = 0x53, - CODEVIEW_BASIC_TYPE_BIT = 0x60, - CODEVIEW_BASIC_TYPE_PASCHAR = 0x61, - CODEVIEW_BASIC_TYPE_BOOL32F = 0x62, - CODEVIEW_BASIC_TYPE_INT8 = 0x68, - CODEVIEW_BASIC_TYPE_UINT8 = 0x69, - CODEVIEW_BASIC_TYPE_RCHAR = 0x70, - CODEVIEW_BASIC_TYPE_WCHAR = 0x71, - CODEVIEW_BASIC_TYPE_INT16 = 0x72, - CODEVIEW_BASIC_TYPE_UINT16 = 0x73, - CODEVIEW_BASIC_TYPE_INT32 = 0x74, - CODEVIEW_BASIC_TYPE_UINT32 = 0x75, - CODEVIEW_BASIC_TYPE_INT64 = 0x76, - CODEVIEW_BASIC_TYPE_UINT64 = 0x77, - CODEVIEW_BASIC_TYPE_INT128 = 0x78, - CODEVIEW_BASIC_TYPE_UINT128 = 0x79, - CODEVIEW_BASIC_TYPE_CHAR16 = 0x7a, - CODEVIEW_BASIC_TYPE_CHAR32 = 0x7b, - CODEVIEW_BASIC_TYPE_CHAR8 = 0x7c, - CODEVIEW_BASIC_TYPE_PTR = 0xf0, -} CodeviewBasicType; - -STRUCT(PDBStreamDescriptor) -{ - String name; - u32 size; -}; - -fn void print_sep() -{ - print("=====================\n"); -} - -STRUCT(PDBModuleInfo) -{ - u32 unused; - PDBSectionContribution section_contribution; - u16 flags; - u16 module_symbol_stream_index; - u32 symbol_size; - u32 c11_size; - u32 c13_size; - u16 source_file_count; - u16 padding; - u32 unused2; - u32 source_file_name_index; - u32 pdb_file_path_name_index; -}; - -fn u64 pdb_estimate_module_count(u64 stream_size) -{ - return stream_size / sizeof(PDBModuleInfo); -} - -fn void pdb_print_sizes(PDBFile pdb, PDBDBIStream dbi) -{ - print("General\n"); - print_sep(); - - { - print("PDB page size (block size): 0x{u32:x}\n", pdb.header->block_size); - print("PDB block count: {u32}\n", pdb.header->block_count); - - auto raw_size = (u64)(pdb.header->block_size) * pdb.header->block_count; - print("Raw size: {u64}, 0x{u64:x} bytes\n", raw_size, raw_size); - } - - print("\n"); - print("Size of known streams\n"); - print_sep(); - - { - auto stream_count = pdb.stream_count; - assert(stream_count > 4); - auto tpi_stream_size = pdb_get_stream_size(pdb, tpi_stream_index); - auto dbi_stream_size = pdb_get_stream_size(pdb, dbi_stream_index); - auto ipi_stream_size = pdb_get_stream_size(pdb, ipi_stream_index); - - auto global_symbol_stream_size = pdb_get_stream_size(pdb, dbi.header.global_stream_index); - auto public_symbol_stream_size = pdb_get_stream_size(pdb, dbi.header.public_stream_index); - auto symbol_record_stream_size = pdb_get_stream_size(pdb, dbi.header.symbol_record_stream_index); - } - - { - auto stream_size = dbi.header.module_info_size; - auto stream = pdb_coalesced_msf_stream_from_direct(dbi.stream, stream_size, pdb_module_info_substream_offset()); - auto estimated_module_count = pdb_estimate_module_count(pdb_module_info_substream_offset()); - - u64 stream_offset = 0; - - while (stream_offset < stream_size) - { - auto* module_info = (PDBModuleInfo*)(stream.data + stream_offset); - stream_offset += sizeof(*module_info); - - auto name = cstr(stream.data + stream_offset); - stream_offset += name.length + 1; - - auto object_name = cstr(stream.data + stream_offset); - stream_offset += object_name.length + 1; - print("Module \"{s}\": \"{s}\"\n", name, object_name); - - stream_offset = align_forward(stream_offset, 4); - } - } -} - -fn void pdb_playground(Thread* thread) -{ - PDBFile pdb = {}; - print("PDB image: {u64}\n", (u64)array_length(pdb_image)); - - pdb.content = (String)array_to_slice(pdb_image); - - if (pdb_validate(pdb.content) != PDB_VALIDATION_SUCCESS) - { - failed_execution(); - } - - pdb.header = (PDBHeader*)(pdb.content.pointer + 0); - auto directory_block_count = pdb_size_to_block_count(pdb.header->directory_size, pdb.header->block_size); - print("Directory block count: {u32}\n", directory_block_count); - - print("Creating directory indices stream...\n"); - auto directory_indices_stream = pdb_coalesced_msf_stream((PDBStreamCreate){ - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = pdb.header->directory_block_indices, - .size = directory_block_count * sizeof(u32), - }); - auto* directory_indices = (u32*)directory_indices_stream.data; - - print("Creating directory stream...\n"); - pdb.directory_stream = pdb_coalesced_msf_stream((PDBStreamCreate) { - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = directory_indices, - .size = pdb.header->directory_size, - }); - - pdb.stream_count = *(u32*)(pdb.directory_stream.data + 0); - pdb.stream_sizes = (u32*)(pdb.directory_stream.data + sizeof(u32)); - print("Stream count: {u32}\n", pdb.stream_count); - auto* directory_stream_blocks = (u32*)(pdb.directory_stream.data + (sizeof(u32) + (sizeof(u32) * pdb.stream_count))); - - { - VirtualBufferP(u32) stream_blocks = {}; - vb_ensure_capacity(&stream_blocks, pdb.stream_count); - pdb.stream_blocks = stream_blocks.pointer; - } - - auto* indices_for_current_block = directory_stream_blocks; - for (u32 i = 0; i < pdb.stream_count; i += 1) - { - auto byte_size = pdb_get_stream_size(pdb, i); - auto block_count = pdb_size_to_block_count(byte_size, pdb.header->block_size); - - pdb.stream_blocks[i] = indices_for_current_block; - print("Stream #{u32} 0x{u32} bytes ({u32} blocks)\n", i, byte_size, block_count); - - indices_for_current_block += block_count; - } - - auto dbi = pdb_dbi_stream_create(pdb); - auto info_stream = pdb_info_stream_create(pdb); - if (info_stream.uses_debug_fast_link) - { - failed_execution(); - } - - // Symbol record stream validation - if (dbi.header.symbol_record_stream_index == nil_stream_index) - { - failed_execution(); - } - - // Public stream validation - if (dbi.header.public_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto public_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi.header.public_stream_index)); - { - PDBHashTableHeader hash_header; - pdb_direct_msf_stream_read_at_offset(public_stream, scalar_to_bytes(hash_header), sizeof(PDBPublicStreamHeader)); - - if (hash_header.signature != pdb_hash_table_signature) - { - failed_execution(); - } - - if (hash_header.version != pdb_hash_table_version) - { - failed_execution(); - } - } - - // Global stream validation - if (dbi.header.global_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto global_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi.header.global_stream_index)); - { - PDBHashTableHeader hash_header; - pdb_direct_msf_stream_read_at_offset(global_stream, scalar_to_bytes(hash_header), 0); - - if (hash_header.signature != pdb_hash_table_signature) - { - failed_execution(); - } - - if (hash_header.version != pdb_hash_table_version) - { - failed_execution(); - } - } - - if (dbi.header.section_contribution_size < sizeof(PDBSectionContributionVersion)) - { - failed_execution(); - } - - auto stream_offset = pdb_section_contribution_substream_offset(dbi.header); - - PDBSectionContributionVersion version; - pdb_direct_msf_stream_read_at_offset(dbi.stream, scalar_to_bytes(version), stream_offset); - - if (version != PDB_SECTION_CONTRIBUTION_V60) - { - failed_execution(); - } - - if (dbi.header.optional_debug_header_size == 0) - { - failed_execution(); - } - - auto debug_header_offset = pdb_debug_header_substream_offset(dbi.header); - - PDBDebugHeader debug_header; - pdb_direct_msf_stream_read_at_offset(dbi.stream, scalar_to_bytes(debug_header), debug_header_offset); - - if (debug_header.section_header_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto tpi_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, tpi_stream_index)); - - TPIStreamHeader header; - pdb_direct_msf_stream_read_at_offset(tpi_stream, scalar_to_bytes(header), 0); - - if (header.version != TPI_STREAM_V80) - { - failed_execution(); - } - - pdb_print_sizes(pdb, dbi); - -// STRUCT(PDBHeader) -// { -// u8 magic[32]; -// u32 block_size; -// u32 free_block_map_index; -// u32 block_count; -// u32 directory_size; -// u32 reserved; -// u32 directory_block_indices[]; -// }; - - // VirtualBuffer(u8) pdb = {}; - // auto* header = vb_add_scalar(&pdb, PDBHeader); - // *header = (PDBHeader) { - // .magic = "Microsoft C/C++ MSF 7.00\r\n\x1a" "DS\x00\x00\x00", - // .block_size = page_size, - // .free_block_map_index = 1, - // .block_count = 35, - // .directory_size = 184, - // .reserved = 0, - // }; - // - // vb_align(&pdb, page_size); -} - - -fn String pdb_build(Thread* thread) -{ - pdb_playground(thread); - - const u32 block_size = 0x1000; - VirtualBuffer(u8) pdb_file = {}; - - // First block - { - auto header = (PDBHeader) { - .magic = pdb_magic_literal, - .block_size = page_size, - .free_block_map_index = 1, - .block_count = 35, - .directory_size = 184, - .reserved = 0, - }; - vb_copy_scalar(&pdb_file, header); - - auto directory_block_count = pdb_size_to_block_count(header.directory_size, header.block_size); - assert(directory_block_count == 1); - u32 directory_block_indices[] = { 0x1d }; - vb_copy_any_array(&pdb_file, directory_block_indices); - - vb_align(&pdb_file, block_size); - } - - u8 rest_of_chunks[] = { - 0x78, 0x00, 0x00, 0xD0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0xE7, 0x2E, 0xFE, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 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, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, - 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, - 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, - 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, - 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, - 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, 0x07, 0x00, 0x00, 0x00, - 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x3D, 0x11, 0x00, 0x63, 0x77, 0x64, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, - 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, - 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, - 0x3A, 0x00, 0x3C, 0x11, 0x00, 0x40, 0x00, 0x00, 0xD0, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4F, 0x70, 0x74, 0x69, 0x6D, 0x69, 0x7A, 0x69, - 0x6E, 0x67, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x2E, 0x00, 0x10, 0x11, - 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x10, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x39, 0x11, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x4C, 0x11, 0x10, 0x10, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, - 0xF4, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x03, 0x2C, 0x8A, - 0x49, 0x32, 0x20, 0x5B, 0x4D, 0x41, 0xA0, 0x3A, 0x81, 0x12, 0xE6, 0xF9, 0x5D, 0x5A, 0x33, 0x70, - 0x44, 0xA3, 0x93, 0x51, 0x1E, 0x17, 0xA3, 0x32, 0x4E, 0xA9, 0x6E, 0x80, 0x1C, 0xCE, 0x00, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x20, 0x03, 0x6A, 0x10, 0xE9, 0xF0, 0x50, 0x5B, 0x89, 0x6D, 0x35, 0x6D, - 0x98, 0x6D, 0x67, 0x1C, 0x93, 0x9B, 0x7F, 0xB0, 0x60, 0x20, 0x12, 0xE4, 0x63, 0x31, 0x4F, 0xF7, - 0xBF, 0xD0, 0x18, 0x2A, 0x86, 0x1F, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x03, 0xDD, 0xB4, - 0xF8, 0xA4, 0xB4, 0xA7, 0xB3, 0x0D, 0x4F, 0xF1, 0x59, 0x39, 0x41, 0xF5, 0x92, 0x79, 0x60, 0x6C, - 0x76, 0xB6, 0xD9, 0x58, 0xEB, 0x4C, 0x30, 0xEC, 0xC7, 0xDC, 0xA0, 0x1D, 0x9F, 0x07, 0x00, 0x00, - 0x25, 0x01, 0x00, 0x00, 0x20, 0x03, 0xC7, 0x6A, 0xB8, 0xA5, 0x63, 0x1A, 0x32, 0x3E, 0xB0, 0xB1, - 0x9D, 0xEE, 0x4B, 0xDA, 0xD1, 0xC5, 0xF7, 0x5D, 0xB1, 0x3C, 0x2D, 0xF4, 0x9A, 0x22, 0x91, 0x77, - 0x66, 0xFE, 0xD8, 0x5B, 0x3F, 0x41, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x20, 0x03, 0xE0, 0xF9, - 0x9E, 0x5F, 0x43, 0x19, 0x42, 0x63, 0x25, 0xDD, 0xBF, 0x4A, 0x6D, 0x4E, 0x23, 0x29, 0x8E, 0xED, - 0x9B, 0x08, 0x06, 0xEF, 0x49, 0xED, 0x6C, 0x95, 0xAD, 0x9D, 0xEC, 0xE7, 0x0D, 0x82, 0x00, 0x00, - 0xBE, 0x01, 0x00, 0x00, 0x20, 0x03, 0x36, 0xFD, 0x04, 0xBA, 0x37, 0xAA, 0xCF, 0x40, 0x4C, 0xB8, - 0x2E, 0xFF, 0xB9, 0xA3, 0x86, 0x34, 0xB5, 0x02, 0x99, 0x6F, 0x07, 0x9A, 0x01, 0x21, 0xAE, 0xEA, - 0x51, 0x91, 0xF5, 0xF4, 0x24, 0xFB, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x20, 0x03, 0x79, 0x6B, - 0x22, 0x26, 0x80, 0x97, 0x90, 0x07, 0x89, 0x84, 0xB9, 0x19, 0x54, 0x2D, 0x81, 0x8C, 0xE7, 0x41, - 0x90, 0xD2, 0x11, 0x0B, 0x11, 0x9F, 0x93, 0xC2, 0xA7, 0xC3, 0x88, 0x2B, 0x5D, 0xE5, 0x00, 0x00, - 0x52, 0x02, 0x00, 0x00, 0x20, 0x03, 0x8D, 0x76, 0x13, 0x5F, 0xF4, 0x01, 0x40, 0xC6, 0xD6, 0x4A, - 0x09, 0xD1, 0x73, 0xE1, 0x27, 0x6F, 0xEF, 0xB9, 0x6A, 0x2D, 0xB9, 0x07, 0x3B, 0x5A, 0xB2, 0x6F, - 0x25, 0x0C, 0x47, 0x33, 0xF9, 0x99, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0x20, 0x03, 0x18, 0xCA, - 0x52, 0x04, 0x16, 0x57, 0x91, 0x83, 0xBC, 0x36, 0x9C, 0x0A, 0x8E, 0x55, 0x59, 0x14, 0xDB, 0x5C, - 0x75, 0x77, 0x07, 0x5B, 0x93, 0x59, 0x17, 0x3F, 0xC6, 0xBC, 0x45, 0x59, 0x55, 0x60, 0x00, 0x00, - 0xF0, 0x02, 0x00, 0x00, 0x20, 0x03, 0x27, 0x90, 0x4E, 0x90, 0x09, 0x38, 0x74, 0x9C, 0x12, 0xA4, - 0xD1, 0xE7, 0x41, 0xAF, 0xD5, 0x64, 0x19, 0x8A, 0x57, 0xA2, 0x47, 0x24, 0xC1, 0xDD, 0xD3, 0x6C, - 0xD3, 0x30, 0x22, 0x24, 0xDF, 0x26, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x20, 0x03, 0xF2, 0xE0, - 0x91, 0x84, 0x1C, 0x3E, 0xFE, 0x2F, 0x18, 0x7F, 0xE7, 0x03, 0xA0, 0xF5, 0x62, 0xCC, 0xE6, 0x54, - 0xCA, 0x82, 0xE6, 0x8C, 0x34, 0x36, 0x98, 0xB0, 0x6E, 0xC6, 0x7F, 0x9B, 0xA0, 0x39, 0x00, 0x00, - 0x90, 0x03, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x4E, 0x8D, 0xF9, 0x6F, 0x05, 0x7F, 0xDE, 0xBC, 0x04, - 0x74, 0xBD, 0x76, 0x5C, 0xEE, 0x3A, 0xE1, 0x7D, 0xE3, 0x4A, 0x2B, 0x1F, 0xC9, 0xD1, 0x97, 0x59, - 0x73, 0x21, 0xF2, 0xD1, 0xE4, 0x47, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x20, 0x03, 0x72, 0x95, - 0x69, 0x9A, 0x85, 0xD8, 0x9A, 0xC3, 0x8B, 0xF0, 0xC3, 0xC2, 0xBB, 0x13, 0xCE, 0xBB, 0x7D, 0xE9, - 0x23, 0x8A, 0xEF, 0x87, 0x89, 0x6F, 0xF8, 0xD1, 0xC7, 0x80, 0x96, 0xE9, 0x70, 0x91, 0x00, 0x00, - 0xFB, 0x03, 0x00, 0x00, 0x20, 0x03, 0xDE, 0xE2, 0x7F, 0x27, 0x12, 0xB9, 0xE7, 0x2C, 0xA7, 0x8A, - 0x40, 0x48, 0x34, 0x73, 0x53, 0x03, 0xD1, 0x6B, 0xDB, 0x21, 0xC8, 0xAA, 0x3A, 0xDD, 0xAC, 0xA7, - 0xDB, 0xCA, 0x22, 0x66, 0x45, 0x29, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x20, 0x03, 0xD0, 0x71, - 0x10, 0xE7, 0xF7, 0x98, 0x9A, 0xEE, 0xF7, 0xEE, 0xD7, 0x7D, 0x5F, 0x58, 0x4F, 0x3E, 0xE6, 0x0F, - 0xF2, 0xCE, 0x58, 0xBC, 0x1A, 0x37, 0x4D, 0x70, 0x15, 0x1A, 0x18, 0xB4, 0xA6, 0x64, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x74, 0x12, 0xDF, 0x50, 0x2F, 0xB6, 0xEA, 0x39, 0x0C, - 0x96, 0xD7, 0xC9, 0xF8, 0x05, 0xA2, 0xA2, 0x11, 0x60, 0x9B, 0x95, 0xB8, 0xFD, 0xB4, 0x74, 0x05, - 0x40, 0xF7, 0x89, 0xD9, 0xC4, 0xCE, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x20, 0x03, 0x83, 0x18, - 0x07, 0x66, 0x77, 0xFB, 0xA2, 0x76, 0xE4, 0x94, 0xED, 0xC3, 0x9A, 0xAA, 0xC1, 0x1F, 0xBD, 0x9B, - 0xC6, 0x1C, 0xA2, 0xD3, 0x6B, 0xB6, 0x8B, 0xDC, 0xCC, 0xD2, 0x60, 0xEC, 0xE9, 0x77, 0x00, 0x00, - 0x2C, 0x05, 0x00, 0x00, 0x20, 0x03, 0xFB, 0x3A, 0xAE, 0xEF, 0x32, 0x4B, 0x5D, 0x00, 0xCE, 0x0A, - 0x6A, 0xE1, 0x17, 0x02, 0xDC, 0xC3, 0xC1, 0xDE, 0x65, 0xFA, 0x0A, 0x10, 0xCA, 0xAA, 0xB4, 0x33, - 0x6B, 0x97, 0xD3, 0xAD, 0xF4, 0x93, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x20, 0x03, 0xA5, 0x0D, - 0x0E, 0xF5, 0xCF, 0xE9, 0x6D, 0x63, 0x4A, 0x41, 0xEE, 0x9A, 0x97, 0x74, 0x9C, 0x14, 0x71, 0x65, - 0xF8, 0x65, 0x6C, 0xDF, 0xED, 0x5D, 0xF5, 0x3B, 0xC2, 0x4C, 0x8A, 0xDB, 0x12, 0x10, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x3F, 0x65, 0x9F, 0x98, 0xB3, 0xF1, 0x74, 0x8A, 0x31, - 0x4B, 0xD6, 0x41, 0x06, 0x58, 0x3D, 0x01, 0x64, 0x93, 0x33, 0xE0, 0x41, 0x9B, 0x66, 0x23, 0x2B, - 0x4F, 0x64, 0xB3, 0xF8, 0x5B, 0x0C, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x84, - 0xE2, 0x06, 0x81, 0xFD, 0x3D, 0xE7, 0x3C, 0xE1, 0x4A, 0xB0, 0x9D, 0x75, 0x9D, 0x5B, 0x4F, 0xAF, - 0x03, 0xF7, 0xD6, 0x6A, 0x78, 0x60, 0x2D, 0xA2, 0xAC, 0x92, 0x34, 0xB2, 0x4D, 0xF4, 0x00, 0x00, - 0x59, 0x06, 0x00, 0x00, 0x20, 0x03, 0xB0, 0x52, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x36, 0xD0, 0xC1, 0x0D, 0x2A, 0x7E, 0x10, 0x9D, 0x7F, 0xD1, 0xA7, 0x26, 0x59, 0x81, 0xCB, 0xB6, - 0xAD, 0x11, 0xB8, 0xCE, 0xE9, 0x26, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, - 0xC4, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, - 0x60, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0xA8, 0x02, 0x00, 0x00, - 0xBC, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, - 0x40, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, - 0x84, 0x03, 0x00, 0x00, 0xA4, 0x03, 0x00, 0x00, 0xB4, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, - 0xD4, 0x03, 0x00, 0x00, 0xE4, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, - 0x14, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, - 0x54, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, - 0x98, 0x04, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00, 0xC8, 0x04, 0x00, 0x00, - 0xD8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x1A, 0x09, 0x2F, 0xF1, 0x90, 0x01, 0x00, 0x00, 0xC8, 0x02, 0x00, 0x00, - 0xE1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x89, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x79, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x21, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x7D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x41, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x51, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x31, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x81, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x99, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0D, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x45, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xBD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xD1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x55, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x25, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 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, 0x02, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, - 0xB4, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, - 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, - 0x50, 0x01, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, - 0xB0, 0x01, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0xC8, 0x01, 0x00, 0x00, 0xD4, 0x01, 0x00, 0x00, - 0xE0, 0x01, 0x00, 0x00, 0xEC, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, - 0x10, 0x02, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, - 0x40, 0x02, 0x00, 0x00, 0x4C, 0x02, 0x00, 0x00, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x16, 0x00, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x42, 0x41, 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x2E, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, 0x41, 0x47, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x36, 0x00, 0x07, 0x11, - 0x08, 0x10, 0x00, 0x00, 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x53, 0x54, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, - 0x4D, 0x45, 0x00, 0x00, 0x3A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0x00, - 0x42, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x08, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, - 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, 0x46, 0x54, 0x5F, 0x43, - 0x41, 0x50, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x11, 0x0A, 0x10, 0x00, 0x00, 0x03, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0x00, - 0x1E, 0x00, 0x07, 0x11, 0x0C, 0x10, 0x00, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0x00, - 0x36, 0x00, 0x07, 0x11, 0x0E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, - 0x41, 0x43, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x49, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, - 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, - 0x1E, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, - 0x69, 0x6D, 0x70, 0x5F, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x16, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, - 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, - 0x33, 0x32, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x7F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, - 0x5F, 0x54, 0x48, 0x55, 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x50, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1A, 0x09, 0x2F, 0xF1, 0x28, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x04, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, - 0x10, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0xE8, 0x04, 0x00, 0x00, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, - 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x69, 0x6D, 0x70, 0x5F, - 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x0E, 0x11, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x00, 0x00, - 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x29, 0x8E, - 0x0E, 0x00, 0x48, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xA8, 0x01, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0A, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0F, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, - 0x6F, 0x62, 0x6A, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, - 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, - 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, - 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, 0x69, 0x62, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, 0x6C, 0x69, 0x62, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x4B, 0x45, 0x52, 0x4E, 0x45, - 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, - 0x69, 0x62, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, - 0x6C, 0x69, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, - 0x2D, 0xBA, 0x2E, 0xF1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xC0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xDC, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x88, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, - 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, - 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, - 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, - 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, - 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, - 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, - 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, - 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, - 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, - 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, - 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, - 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, - 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, - 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, - 0x65, 0x73, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, - 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, - 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, - 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6D, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x69, 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, - 0x70, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, - 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, - 0x5F, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, - 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, - 0x65, 0x72, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, - 0x70, 0x69, 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x00, 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, - 0x2E, 0x70, 0x64, 0x62, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x23, 0x1E, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, - 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, - 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, - 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, - 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, - 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, - 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, - 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, - 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, - 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, - 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, - 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, - 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, - 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, - 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, - 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, - 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, - 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, - 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, - 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, - 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, - 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, - 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, - 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, - 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, - 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, 0x68, 0x61, - 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x66, - 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x69, - 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, 0x70, 0x61, - 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x75, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, - 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, - 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, - 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, 0x65, 0x72, - 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, - 0x47, 0x53, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, - 0x41, 0x47, 0x53, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x52, 0x65, 0x70, 0x6C, - 0x61, 0x63, 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, - 0x63, 0x44, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, - 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, - 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x8B, - 0x00, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x97, 0x1D, 0x00, 0x00, 0xA5, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0xE1, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF7, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, - 0x0D, 0x00, 0x00, 0x75, 0x1D, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x10, 0x00, 0x00, 0x5D, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0xD4, - 0x0E, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0xCC, 0x1A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x0D, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x2C, - 0x05, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0xAC, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x1D, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0xDB, - 0x1C, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xA8, 0x0C, 0x00, 0x00, 0x29, - 0x0E, 0x00, 0x00, 0x0C, 0x17, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x0D, - 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x00, 0x00, 0xED, - 0x1D, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFC, - 0x17, 0x00, 0x00, 0xF3, 0x18, 0x00, 0x00, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, - 0x0A, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0xFA, 0x1B, 0x00, 0x00, 0x74, - 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x28, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, - 0x09, 0x00, 0x00, 0xC3, 0x05, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x91, - 0x00, 0x00, 0x00, 0xAB, 0x17, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0xC7, - 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0xC0, - 0x16, 0x00, 0x00, 0x92, 0x11, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0xA1, - 0x13, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0xED, 0x13, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x55, - 0x13, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x30, 0x12, 0x00, 0x00, 0x19, 0x15, 0x00, 0x00, 0x90, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x71, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, - 0x01, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x99, - 0x19, 0x00, 0x00, 0xB5, 0x15, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x6D, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xD9, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0xAC, 0x07, 0x00, 0x00, 0x67, - 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, 0x01, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xAD, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x10, 0x00, 0x00, - 0x68, 0x04, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, - 0x9C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 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, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xA2, 0x5E, 0xFD, 0x66, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xC9, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xE4, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_array(&pdb_file, rest_of_chunks); - - if (pdb_file.length != array_length(pdb_image)) - { - failed_execution(); - } - - for (u32 i = 0; i < pdb_file.length; i += 1) - { - auto mine = pdb_file.pointer[i]; - auto original = pdb_image[i]; - - if (mine != original) - { - print("Diff at position {u32}\n", i); - failed_execution(); - } - } - - return (String) { pdb_file.pointer, pdb_file.length }; -} - -fn String write_pe(Thread* thread, ObjectOptions options) -{ - VirtualBuffer(u8) file = {}; - - auto* dos_header = vb_add_scalar(&file, DOSHeader); - *dos_header = (DOSHeader){ - .signature = { 'M', 'Z' }, - .relocation_table_pointer = sizeof(DOSHeader), - }; - vb_copy_scalar(&file, dos_header); - - u32 data_directory_count = 16; - - const u32 virtual_section_alignment = 0x1000; - const u32 file_section_alignment = 0x200; - const u32 timestamp = 0x66fd6370; - - u16 section_count = 3; - auto coff_header = (COFFHeader) { - .signature = { 'P', 'E', 0, 0 }, - .architecture = COFF_ARCH_AMD64, - .section_count = section_count, - .time_date_stamp = timestamp, - .symbol_table_pointer = 0, - .symbol_count = 0, - .optional_header_size = sizeof(COFFOptionalHeader), - .characteristics = { - .executable_image = 1, - .large_address_aware = 1, - }, - }; - - dos_header->coff_header_pointer = file.length; - *vb_add_scalar(&file, COFFHeader) = coff_header; - auto optional_header_offset = file.length; - auto* coff_optional_header = vb_add_scalar(&file, COFFOptionalHeader); - - auto* section_headers = vb_add_any_array(&file, COFFSectionHeader, section_count); - u16 section_i = 0; - auto headers_size = cast_to(u32, u64, align_forward(file.length, file_section_alignment)); - u32 rva = file.length; - - // .text - auto* text_section_header = §ion_headers[section_i]; - u32 entry_point_rva; - section_i += 1; - { - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - vb_align(&file, file_section_alignment); - auto file_offset = file.length; - u8 text_content[] = { 0x48, 0x83, 0xEC, 0x28, 0x33, 0xC9, 0xFF, 0x15, 0xF4, 0x0F, 0x00, 0x00, 0x90, 0x48, 0x83, 0xC4, 0x28, 0xC3, }; - entry_point_rva = rva; - vb_copy_any_array(&file, text_content); - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto current_rva = rva; - rva += virtual_size; - - *text_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".text")), - .virtual_size = virtual_size, - .rva = current_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_code = 1, - .execute = 1, - .read = 1, - }, - }; - } - - auto* rdata_section_header = §ion_headers[section_i]; - section_i += 1; - u32 iat_rva; - u32 iat_size; - u32 import_directory_rva; - u32 import_directory_size; - u32 debug_directory_rva; - u32 debug_directory_size; - u32 unwind_information_rva; - { - // .rdata - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - assert(rva == 0x2000); - vb_align(&file, file_section_alignment); - auto file_offset = file.length; - - auto iat_file_offset = file.length; - auto iat_section_offset = iat_file_offset - file_offset; - iat_rva = rva + iat_section_offset; - - const u32 import_address_count = 2; - auto* import_address_table = vb_add_any_array(&file, COFFImportAddress, import_address_count); - iat_size = file.length - iat_file_offset; - - auto debug_directory_file_offset = file.length; - auto debug_directory_section_offset = debug_directory_file_offset - file_offset; - debug_directory_rva = rva + debug_directory_section_offset; - - const u32 debug_directory_count = 1; - auto* debug_directories = vb_add_any_array(&file, COFFDebugDirectory, debug_directory_count); - debug_directory_size = file.length - debug_directory_file_offset; - - auto debug_directory_data_file_offset = file.length; - auto debug_directory_data_section_offset = debug_directory_data_file_offset - file_offset; - auto debug_directory_data_rva = rva + debug_directory_section_offset; - - u8 rsds_guid[] = { 0x3D, 0x15, 0x84, 0x0A, 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, }; - u32 rsds_age = 3; - file_write_coff_rsds(&file, (String)array_to_slice(rsds_guid), rsds_age, strlit("C:\\Users\\David\\dev\\minimal\\main.pdb")); - auto debug_directory_data_size = file.length - debug_directory_data_file_offset; - - auto unwind_information_file_offset = file.length; - auto unwind_information_section_offset = unwind_information_file_offset - file_offset; - unwind_information_rva = rva + unwind_information_section_offset; - auto* unwind_information = vb_add_scalar(&file, COFFUnwindInformation); - - auto unwind_information_prologue_offset = file.length; - - COFFUnwindCode unwind_codes[] = { - { - .code_offset = 4, - .operation = UNW_OP_ALLOC_SMALL, - .operation_info = 4, // 4 * 8 = 32 bytes of stack - }, - }; - vb_copy_any_array(&file, unwind_codes); - vb_align(&file, sizeof(u32)); - - *unwind_information = (COFFUnwindInformation) { - .version = 1, - .prologue_size = file.length - unwind_information_prologue_offset, - .code_count = array_length(unwind_codes), - .frame_register_and_offset = 0, - }; - - COFFDebugDirectory sample_debug_directories[] = { - { - .characteristics = 0, - .timestamp = timestamp, - .major_version = 0, - .minor_version = 0, - .type = COFF_DEBUG_CODEVIEW, - .size = debug_directory_data_size, - .rva = debug_directory_data_rva, - .file_offset = debug_directory_data_file_offset, - }, - }; - - memcpy(debug_directories, sample_debug_directories, sizeof(sample_debug_directories)); - - auto import_directory_file_offset = file.length; - auto import_directory_section_offset = file.length - file_offset; - import_directory_rva = rva + import_directory_section_offset; - - // IAT - const u32 import_directory_count = 2; - auto* import_directories = vb_add_any_array(&file, COFFImportDirectory, import_directory_count); - - import_directory_size = file.length - import_directory_file_offset; - - auto import_lookup_file_offset = file.length; - auto import_lookup_section_offset = file.length - file_offset; - auto import_lookup_rva = rva + import_lookup_section_offset; - const u32 import_lookup_count = import_directory_count; - auto* import_lookups = vb_add_any_array(&file, COFFImportLookup, import_lookup_count); - assert(import_lookup_count == import_directory_count); - - auto name_table_file_offset = file.length; - auto name_table_section_offset = name_table_file_offset - file_offset; - auto name_table_rva = rva + name_table_section_offset; - // TODO: compute hints - u16 hint = 0; - coff_import_name(&file, hint, strlit("ExitProcess")); - - auto dll_name_file_offset = file.length; - auto dll_name_section_offset = dll_name_file_offset - file_offset; - auto dll_name_rva = rva + dll_name_section_offset; - auto dll_name = strlit("KERNEL32.dll"); - vb_copy_string_zero_terminated(&file, dll_name); - - *vb_add(&file, 1) = 0; - - assert(import_lookup_count == 2); - import_lookups[0] = (COFFImportLookup) { - .name_table_rva = name_table_rva, - }; - import_lookups[1] = (COFFImportLookup) {}; - - assert(import_directory_count == 2); - import_directories[0] = (COFFImportDirectory) { - .lookup_table_rva = import_lookup_rva, - .time_date_stamp = 0, - .forwarder_chain = 0, - .dll_name_rva = dll_name_rva, - .address_table_rva = iat_rva, - }; - - import_directories[1] = (COFFImportDirectory) {}; - assert(import_directories[import_directory_count - 1].forwarder_chain == 0); - - assert(import_address_count == 2); - import_address_table[0] = (COFFImportAddress) { - .name_table_rva = name_table_rva, - }; - import_address_table[1] = (COFFImportAddress) {}; - - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto current_rva = rva; - rva += virtual_size; - - *rdata_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".rdata")), - .virtual_size = virtual_size, - .rva = current_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_initialized_data = 1, - .read = 1, - }, - }; - } - - auto* pdata_section_header = §ion_headers[section_i]; - section_i += 1; - u32 exception_table_rva; - u32 exception_table_size; - { - // .pdata content - vb_align(&file, file_section_alignment); - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - - auto file_offset = file.length; - - COFFExceptionTableEntry_x86_64 exception_entries[] = { - { - .start_rva = text_section_header->rva, - .end_rva = text_section_header->rva + text_section_header->virtual_size, - .unwind_information_rva = unwind_information_rva, - }, - }; - exception_table_rva = rva; - exception_table_size = sizeof(exception_entries); - vb_copy_any_array(&file, exception_entries); - - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto section_rva = rva; - rva += virtual_size; - - *pdata_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".pdata")), - .virtual_size = virtual_size, - .rva = section_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_initialized_data = 1, - .read = 1, - }, - }; - } - - vb_align(&file, file_section_alignment); - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - - assert(section_i == section_count); - - u32 code_size = 0; - u32 initialized_data_size = 0; - u32 uninitialized_data_size = 0; - - for (u16 i = 0; i < section_count; i += 1) - { - auto* section_header = §ion_headers[i]; - - code_size += section_header->file_size * section_header->flags.contains_code; - initialized_data_size += section_header->file_size * section_header->flags.contains_initialized_data; - uninitialized_data_size += section_header->file_size * section_header->flags.contains_uninitialized_data; - } - - assert(debug_directory_size % sizeof(COFFDebugDirectory) == 0); - assert(iat_size % sizeof(COFFImportAddress) == 0); - - *coff_optional_header = (COFFOptionalHeader) { - .format = COFF_FORMAT_PE32_PLUS, - .major_linker_version = 14, - .minor_linker_version = 41, - .code_size = code_size, - .initialized_data_size = initialized_data_size, - .uninitialized_data_size = uninitialized_data_size, - .entry_point_address = entry_point_rva, - .code_offset = text_section_header->rva, - .image_offset = 0x140000000, - .virtual_section_alignment = virtual_section_alignment, - .file_section_alignment = file_section_alignment, - .major_operating_system_version = 6, - .minor_operating_system_version = 0, - .major_image_version = 0, - .minor_image_version = 0, - .major_subsystem_version = 6, - .minor_subsystem_version = 0, - .win32_version_value = 0, - .image_size = rva, - .headers_size = headers_size, - .checksum = 0, - .subsystem = COFF_SUBSYSTEM_WINDOWS_CUI, - .dll_characteristics = { - .high_entropy_va = 1, - .dynamic_base = 1, - .nx_compatible = 1, - .terminal_server_aware = 1, - }, - .stack_reserve_size = MB(1), - .stack_commit_size = 0x1000, - .heap_reserve_size = MB(1), - .heap_commit_size = 0x1000, - .loader_flags = {}, - .directory_count = array_length(coff_optional_header->directories), - .directories = { - [COFF_IMPORT_DIRECTORY_INDEX] = { .rva = import_directory_rva, .size = import_directory_size, }, - [COFF_EXCEPTION_DIRECTORY_INDEX] = { .rva = exception_table_rva, .size = exception_table_size, }, - [COFF_DEBUG_DIRECTORY_INDEX] = { .rva = debug_directory_rva, .size = debug_directory_size, }, - [COFF_IAT_DIRECTORY_INDEX] = { .rva = iat_rva, .size = iat_size, }, - }, - }; - - auto dot_index = string_last_ch(options.exe_path, '.'); - dot_index = dot_index == -1 ? options.exe_path.length : dot_index; - auto path_without_extension = s_get_slice(u8, options.exe_path, 0, dot_index); - assert(path_without_extension.length <= options.exe_path.length); - - String to_join[] = { - path_without_extension, - strlit(".pdb"), - }; - - auto pdb = pdb_build(thread); - - // TODO: -// #if _WIN32 -// auto pdb_path = arena_join_string(thread->arena, (Slice(String))array_to_slice(to_join)); -// auto fd = os_file_open(strlit("mydbg.pdb"), (OSFileOpenFlags) { -// .write = 1, -// .truncate = 1, -// .create = 1, -// }, (OSFilePermissions) { -// .readable = 1, -// .writable = 1, -// }); -// -// os_file_write(fd, pdb); -// -// os_file_close(fd); -// #endif - - // Check if file matches -#define CHECK_PE_MATCH 0 -#if CHECK_PE_MATCH - auto minimal = file_read(thread->arena, strlit("C:/Users/David/dev/minimal/main.exe")); - assert(file.length == minimal.length); - - u32 diff_count = 0; - for (u32 i = 0; i < minimal.length; i += 1) - { - auto mine = file.pointer[i]; - auto original = minimal.pointer[i]; - if (mine != original) - { - print("Diff at {u32}\n", i); - diff_count += 1; - } - } - - assert(diff_count == 0); -#else - unused(thread); -#endif - - return (String){ file.pointer, file.length }; -} - -fn void subsume_node_without_killing(Thread* thread, NodeIndex old_node_index, NodeIndex new_node_index) -{ - assert(!index_equal(old_node_index, new_node_index)); - auto* old = thread_node_get(thread, old_node_index); - auto* new = thread_node_get(thread, new_node_index); - auto old_node_outputs = node_get_outputs(thread, old); - - u8 allow_cycle = old->id == IR_PHI || old->id == IR_REGION || new->id == IR_REGION; - - for (auto i = old->output_count; i > 0; i -= 1) - { - auto output = old_node_outputs.pointer[i - 1]; - old->output_count -= 1; - if (!allow_cycle && index_equal(output, new_node_index)) - { - continue; - } - - auto* output_node = thread_node_get(thread, output); - auto output_inputs = node_get_inputs(thread, output_node); - - u16 output_input_index; - for (output_input_index = 0; output_input_index < output_inputs.length; output_input_index += 1) - { - auto output_input = output_inputs.pointer[output_input_index]; - if (index_equal(output_input, old_node_index)) - { - output_inputs.pointer[output_input_index] = new_node_index; - node_add_output(thread, new_node_index, output); - break; - } - } - - assert(output_input_index < output_inputs.length); - } -} - -fn NodeIndex function_get_control_start(Thread* thread, Function* function) -{ - auto* root = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root); - auto result = outputs.pointer[0]; - return result; -} - -fn u8 cfg_is_control(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto backend_type = type_pair_get_backend(node->type); - if (backend_type == BACKEND_TYPE_CONTROL) - { - return 1; - } - else if (backend_type == BACKEND_TYPE_TUPLE) - { - if (node->id == IR_ROOT) - { - return 1; - } - else - { - todo(); - } - } - - return 0; -} - -fn u8 cfg_node_terminator(Node* node) -{ - u8 is_terminator; - switch (node->id) - { - case IR_PROJECTION: - case IR_REGION: - is_terminator = 0; - break; - case IR_RETURN: - case IR_ROOT: - is_terminator = 1; - break; - default: - todo(); - } - - return is_terminator; -} - -fn NodeIndex basic_block_end(Thread* thread, NodeIndex start_index) -{ - auto node_index = start_index; - while (1) - { - auto* node = thread_node_get(thread, node_index); - u8 is_terminator = cfg_node_terminator(node); - - if (is_terminator) - { - break; - } - - auto outputs = node_get_outputs(thread, node); - auto new_node_index = node_index; - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - auto output_inputs = node_get_inputs(thread, output); - if (index_equal(output_inputs.pointer[0], node_index) && cfg_is_control(thread, output_index)) - { - if (output->id == IR_REGION) - { - return node_index; - } - - new_node_index = output_index; - break; - } - } - - if (index_equal(node_index, new_node_index)) - { - break; - } - - node_index = new_node_index; - } - - return node_index; -} - -STRUCT(Block) -{ - NodeIndex start; - NodeIndex end; - NodeIndex successors[2]; - u32 successor_count; - struct Block* parent; -}; - -fn NodeIndex cfg_next_control(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - if (cfg_is_control(thread, output_index)) - { - return output_index; - } - } - - return invalidi(Node); -} - -fn NodeIndex cfg_next_user(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - if (cfg_is_control(thread, output_index)) - { - return output_index; - } - } - - return invalidi(Node); -} - -fn u8 cfg_is_endpoint(Thread* thread, Node* node) -{ - unused(thread); - switch (node->id) - { - case IR_ROOT: - case IR_RETURN: - return 1; - default: - return 0; - } -} - -fn Block* create_block(Thread* thread, NodeIndex node_index) -{ - auto end_of_basic_block_index = basic_block_end(thread, node_index); - auto* end_node = thread_node_get(thread, end_of_basic_block_index); - - u32 successor_count = 0; - // Branch - auto is_endpoint = cfg_is_endpoint(thread, end_node); - auto is_branch = 0; - if (is_branch) - { - todo(); - } - else if (type_pair_get_backend(end_node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else if (!is_endpoint) - { - successor_count = 1; - } - - auto* block = arena_allocate(thread->arena, Block, 1); - *block = (Block) - { - .start = node_index, - .end = end_of_basic_block_index, - .successor_count = successor_count, - }; - - if (node_is_cfg_fork(end_node)) - { - todo(); - } - else if (!is_endpoint) - { - block->successors[0] = cfg_next_user(thread, end_of_basic_block_index); - } - - return block; -} - -fn NodeIndex node_select_instruction(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case IR_PROJECTION: - return node_index; - case IR_ROOT: - return node_index; - case IR_PHI: - { - auto backend_type = type_pair_get_backend(node->type); - if (backend_type <= BACKEND_TYPE_SCALAR_LAST) - { - { - auto copy_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_COPY, - .type_pair = node->type, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - invalidi(Node), - })), - }); - thread_node_get(thread, copy_index)->machine_copy = (NodeMachineCopy) { - .use_mask = Index(RegisterMask, REGISTER_MASK_GPR), - .def_mask = Index(RegisterMask, REGISTER_MASK_GPR), - }; - subsume_node_without_killing(thread, node_index, copy_index); - node_set_input(thread, copy_index, 1, node_index); - node_gvn_intern(thread, copy_index); - } - - { - auto inputs = node_get_inputs(thread, node); - - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - auto input = thread_node_get(thread, input_index); - assert(input->id != MACHINE_MOVE); - auto move_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_MOVE, - .type_pair = input->type, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - invalidi(Node), - })), - }); - node_set_input(thread, move_index, 1, input_index); - node_set_input(thread, node_index, i, move_index); - node_gvn_intern(thread, move_index); - } - } - } - - return node_index; - } break; - case IR_RETURN: - case IR_REGION: - case IR_INTEGER_CONSTANT: - - case MACHINE_MOVE: - case MACHINE_COPY: - return invalidi(Node); - default: - todo(); - } -} - -STRUCT(BasicBlockIndex) -{ - u32 index; -}; -decl_vb(BasicBlockIndex); - -STRUCT(BasicBlock) -{ - VirtualBuffer(NodeIndex) items; - Bitset gen; - Bitset kill; - Bitset live_in; - Bitset live_out; - NodeIndex start; - NodeIndex end; - s32 dominator_depth; - BasicBlockIndex dominator; - s32 forward; -}; -decl_vb(BasicBlock); -decl_vbp(BasicBlock); - -fn u8 node_is_pinned(Node* node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - return 1; - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn u8 node_has_memory_out(NodeId id) -{ - switch (id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn u8 node_has_memory_in(NodeId id) -{ - switch (id) - { - case IR_ROOT: - case IR_RETURN: - return 1; - case IR_PROJECTION: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn NodeIndex node_memory_in(Thread* thread, Node* node) -{ - auto result = invalidi(Node); - if (node_has_memory_in(node->id)) - { - result = node_get_inputs(thread, node).pointer[1]; - } - - return result; -} - -fn s32 node_last_use_in_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, Slice(s32) order, Node* node, BasicBlockIndex basic_block_index) -{ - auto outputs = node_get_outputs(thread, node); - s32 result = 0; - for (u16 i = 0; i < node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - if (index_equal(basic_block_index, scheduled.pointer[geti(output_index)]) && result < order.pointer[geti(output_index)]) - { - result = order.pointer[geti(output_index)]; - } - } - - return result; -} - -fn BasicBlockIndex find_use_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, NodeIndex node_index, NodeIndex actual_node_index, NodeIndex use_index) -{ - auto use_block_index = scheduled.pointer[geti(use_index)]; - if (!validi(use_block_index)) - { - return use_block_index; - } - - Node* use = thread_node_get(thread, use_index); - auto use_inputs = node_get_inputs(thread, use); - - if (use->id == IR_PHI) - { - auto use_first_input_index = use_inputs.pointer[0]; - auto use_first_input = thread_node_get(thread, use_first_input_index); - assert(use_first_input->id == IR_REGION); - assert(use->input_count == use_first_input->input_count + 1); - - auto use_first_input_inputs = node_get_inputs(thread, use_first_input); - - u16 i; - for (i = 0; i < use_inputs.length; i += 1) - { - auto use_input_index = use_inputs.pointer[i]; - if (index_equal(use_input_index, actual_node_index)) - { - // TODO: this assertion is mine for debugging when this function is only called from a single code path, - // it's not absolutely valid in other contexts - assert(index_equal(actual_node_index, node_index)); - auto input_index = use_first_input_inputs.pointer[i - 1]; - auto bb_index = scheduled.pointer[geti(input_index)]; - if (validi(bb_index)) - { - use_block_index = bb_index; - } - break; - } - } - - assert(i < use_inputs.length); - } - - return use_block_index; -} - -fn BasicBlockIndex find_lca(BasicBlockIndex a, BasicBlockIndex b) -{ - unused(a); - unused(b); - // TODO: dominators - return invalidi(BasicBlock); -} - -fn u8 node_is_ready(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, WorkListHandle handle, Node* node, BasicBlockIndex basic_block_index) -{ - // TODO: this is my assert and might not be true after all - assert(node->input_capacity == node->input_count); - auto inputs = node_get_inputs(thread, node); - for (u16 i = 0; i < node->input_capacity; i += 1) - { - auto input = inputs.pointer[i]; - if (validi(input) && index_equal(scheduled.pointer[geti(input)], basic_block_index) && !thread_worklist_test(thread, handle, input)) - { - return 0; - } - } - - return 1; -} - -fn u64 node_get_latency(Thread* thread, Node* node, Node* end) -{ - unused(end); - unused(thread); - switch (node->id) - { - case IR_INTEGER_CONSTANT: - case IR_RETURN: - case MACHINE_COPY: - return 1; - case MACHINE_MOVE: - return 0; - default: - todo(); - } -} - -fn u64 node_get_unit_mask(Thread* thread, Node* node) -{ - unused(thread); - unused(node); - return 1; -} - -STRUCT(ReadyNode) -{ - u64 unit_mask; - NodeIndex node_index; - s32 priority; -}; -decl_vb(ReadyNode); - -STRUCT(InFlightNode) -{ - NodeIndex node_index; - u32 end; - s32 unit_i; -}; -decl_vb(InFlightNode); - -STRUCT(Scheduler) -{ - Bitset ready_set; - VirtualBuffer(ReadyNode) ready; - NodeIndex cmp; -}; - -fn s32 node_best_ready(Scheduler* restrict scheduler, u64 in_use_mask) -{ - auto length = scheduler->ready.length; - if (length == 1) - { - u64 available = scheduler->ready.pointer[0].unit_mask & ~in_use_mask; - return available ? 0 : -1; - } - - while (length--) - { - auto node_index = scheduler->ready.pointer[length].node_index; - if (index_equal(node_index, scheduler->cmp)) - { - continue; - } - - auto available = scheduler->ready.pointer[length].unit_mask & ~in_use_mask; - if (available == 0) - { - continue; - } - - return cast_to(s32, u32, length); - } - - return -1; -} - -declare_ip_functions(RegisterMask, register_mask) - -fn RegisterMaskIndex register_mask_intern(Thread* thread, RegisterMask register_mask) -{ - auto* new_rm = vb_add(&thread->buffer.register_masks, 1); - *new_rm = register_mask; - auto candidate_index = Index(RegisterMask, cast_to(u32, s64, new_rm - thread->buffer.register_masks.pointer)); - auto result = ip_RegisterMask_get_or_put(&thread->interned.register_masks, thread, candidate_index); - auto final_index = result.index; - assert((!index_equal(candidate_index, final_index)) == result.existing); - thread->buffer.register_masks.length -= result.existing; - - return final_index; -} - -fn RegisterMaskIndex node_constraint(Thread* thread, Node* node, Slice(RegisterMaskIndex) ins) -{ - switch (node->id) - { - case IR_PROJECTION: - { - auto backend_type = type_pair_get_backend(node->type); - if (backend_type == BACKEND_TYPE_MEMORY || backend_type == BACKEND_TYPE_CONTROL) - { - return empty_register_mask; - } - - auto index = node->projection.index; - auto inputs = node_get_inputs(thread, node); - - auto* first_input = thread_node_get(thread, inputs.pointer[0]); - if (first_input->id == IR_ROOT) - { - assert(index >= 2); - if (index == 2) - { - return empty_register_mask; - } - else - { - todo(); - } - todo(); - } - else - { - todo(); - } - } break; - case IR_INTEGER_CONSTANT: - return Index(RegisterMask, REGISTER_MASK_GPR); - case MACHINE_MOVE: - { - // TODO: float - auto mask = Index(RegisterMask, REGISTER_MASK_GPR); - if (ins.length) - { - ins.pointer[1] = mask; - } - return mask; - } break; - case MACHINE_COPY: - { - if (ins.length) - { - ins.pointer[1] = node->machine_copy.use_mask; - } - - return node->machine_copy.def_mask; - } break; - case IR_REGION: - { - if (ins.length) - { - for (u16 i = 1; i < node->input_count; i += 1) - { - ins.pointer[i] = empty_register_mask; - } - } - - return empty_register_mask; - } break; - case IR_PHI: - { - if (ins.length) - { - for (u16 i = 1; i < node->input_count; i += 1) - { - ins.pointer[i] = empty_register_mask; - } - } - - auto backend_type = type_pair_get_backend(node->type); - RegisterMaskIndex mask; - if (backend_type == BACKEND_TYPE_MEMORY) - { - mask = empty_register_mask; - } - // TODO: float - else - { - mask = Index(RegisterMask, REGISTER_MASK_GPR); - } - - return mask; - } break; - case IR_RETURN: - { - if (ins.length) - { - const global_variable s32 ret_gprs[] = { RAX, RDX }; - - ins.pointer[1] = empty_register_mask; - ins.pointer[2] = empty_register_mask; - - // TODO: returns - auto index = 3; - ins.pointer[index] = register_mask_intern(thread, (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .may_spill = 0, - .mask = ((u32)1 << ret_gprs[index - 3]), - }); - - auto gpr_caller_saved = ((1u << RAX) | (1u << RDI) | (1u << RSI) | (1u << RCX) | (1u << RDX) | (1u << R8) | (1u << R9) | (1u << R10) | (1u << R11)); - auto gpr_callee_saved = ~gpr_caller_saved; - gpr_callee_saved &= ~(1u << RSP); - gpr_callee_saved &= ~(1u << RBP); - - auto j = 3 + 1; - - for (u32 i = 0; i < register_count_per_class[REGISTER_CLASS_X86_64_GPR]; i += 1) - { - if ((gpr_callee_saved >> i) & 1) - { - ins.pointer[j++] = register_mask_intern(thread, (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .mask = (u32)1 << i, - .may_spill = 0, - }); - } - } - - // TODO: float - } - - return empty_register_mask; - } break; - default: - todo(); - } -} - -fn u32 node_tmp_count(Node* node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -STRUCT(VirtualRegister) -{ - RegisterMaskIndex mask; - NodeIndex node_index; - f32 spill_cost; - f32 spill_bias; - s16 class; - s16 assigned; - s32 hint_vreg; -}; -decl_vb(VirtualRegister); - -fn s32 fixed_register_mask(RegisterMask mask) -{ - if (mask.class == REGISTER_CLASS_STACK) - { - todo(); - } - else - { - s32 set = -1; - // TODO: count? - for (s32 i = 0; i < 1; i += 1) - { - u32 m = mask.mask; - s32 found = 32 - __builtin_clz(m); - if (m == ((u32)1 << found)) - { - if (set >= 0) - { - return -1; - } - - set = i * 64 + found; - } - } - - return set; - } -} - -fn RegisterMaskIndex register_mask_meet(Thread* thread, RegisterMaskIndex a_index, RegisterMaskIndex b_index) -{ - if (index_equal(a_index, b_index)) - { - return a_index; - } - - if (!validi(a_index)) - { - return b_index; - } - if (!validi(b_index)) - { - return a_index; - } - - auto* a = thread_register_mask_get(thread, a_index); - auto* b = thread_register_mask_get(thread, b_index); - - u32 may_spill = a->may_spill && b->may_spill; - if (!may_spill && a->class != b->class) - { - return empty_register_mask; - } - - auto a_mask = a->mask; - auto b_mask = b->mask; - auto mask = a_mask & b_mask; - - auto result = register_mask_intern(thread, (RegisterMask) { - .class = mask == 0 ? 1 : a->class, - .may_spill = may_spill, - .mask = mask, - }); - - return result; -} - -fn s32 node_to_address(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case IR_PHI: - case IR_INTEGER_CONSTANT: - return -1; - case MACHINE_COPY: - return 1; - default: - todo(); - } -} - -fn u8 interfere_in_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, NodeIndex left, NodeIndex right, BasicBlockIndex block_index) -{ - assert(!index_equal(left, right)); - auto* block = &bb.pointer[geti(block_index)]; - auto left_live_out = bitset_get(&block->live_out, geti(left)); - auto right_live_out = bitset_get(&block->live_out, geti(right)); - auto* left_node = thread_node_get(thread, left); - auto* right_node = thread_node_get(thread, right); - - if (left_node->id == IR_PHI || right_node->id == IR_PHI) - { - auto phi = right; - auto other = left; - - if (left_node->id == IR_PHI && right_node->id != IR_PHI) - { - phi = left; - other = right; - } - - unused(other); - - block_index = scheduled.pointer[geti(phi)]; - block = &bb.pointer[geti(block_index)]; - if (bitset_get(&block->live_out, geti(phi))) - { - todo(); - } - } - - if (left_live_out && right_live_out) - { - todo(); - } - else if (!left_live_out && !right_live_out) - { - auto first = left; - auto last = right; - - if (order.pointer[geti(left)] > order.pointer[geti(right)]) - { - first = right; - last = left; - } - - block_index = scheduled.pointer[geti(last)]; - block = &bb.pointer[geti(block_index)]; - - auto* first_node = thread_node_get(thread, first); - auto outputs = node_get_outputs(thread, first_node); - - for (u16 i = 0; i < first_node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - assert(validi(output_index)); - auto* output_node = thread_node_get(thread, output_index); - auto output_inputs = node_get_inputs(thread, output_node); - - u16 i; - for (i = 0; i < output_node->input_count; i += 1) - { - auto input_index = output_inputs.pointer[i]; - if (index_equal(input_index, first)) - { - if (index_equal(block_index, scheduled.pointer[geti( output_index)])) - { - if (order.pointer[geti(output_index)] > order.pointer[geti(last)]) - { - return 1; - } - } - break; - } - } - assert(i < output_node->input_count); - } - } - else - { - todo(); - } - - return 0; -} - -fn u8 interfere(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, NodeIndex left, NodeIndex right) -{ - auto left_block = scheduled.pointer[geti(left)]; - auto right_block = scheduled.pointer[geti(right)]; - // These asserts are mine, they might not be valid - assert(validi(left_block)); - assert(validi(right_block)); - - auto result = interfere_in_block(thread, scheduled, bb, order, left, right, left_block); - - if (!index_equal(left_block, right_block)) - { - result = result || interfere_in_block(thread, scheduled, bb, order, right, left, right_block); - } - - return result; -} - -fn Slice(s32) compute_ordinals(Thread* thread, VirtualBuffer(BasicBlock) bb, u32 node_count) -{ - auto order_cap = round_up_to_next_power_of_2(node_count); - auto order = arena_allocate(thread->arena, s32, order_cap); - - for (u32 i = 0; i < bb.length; i += 1) - { - auto* basic_block = & bb.pointer[i]; - s32 timeline = 1; - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - order[geti(node_index)] = timeline; - timeline += 1; - } - } - - return (Slice(s32)) { .pointer = order, .length = order_cap, }; -} - -fn u8 can_remat(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case MACHINE_COPY: - return 1; - default: - todo(); - } -} - -fn f32 get_spill_cost(Thread* thread, VirtualRegister* virtual_register) -{ - auto spill_cost = virtual_register->spill_cost; - if (__builtin_isnan(spill_cost)) - { - if (can_remat(thread, virtual_register->node_index)) - { - spill_cost = virtual_register->spill_bias - 1.0f; - } - else - { - todo(); - } - - virtual_register->spill_cost = spill_cost; - } - - return spill_cost; -} - -fn u8 register_mask_not_empty(RegisterMask mask) -{ - return mask.mask != 0; -} - -fn u8 register_mask_spill(RegisterMask mask) -{ - return mask.class != REGISTER_CLASS_STACK && (!register_mask_not_empty(mask) && mask.may_spill); -} - -fn void dataflow(Thread* thread, WorkListHandle worker, VirtualBuffer(BasicBlock) bb, VirtualBuffer(BasicBlockIndex) scheduled, u32 node_count) -{ - // Dataflow analysis - thread_worklist_clear(thread, worker); - - // TODO: separate per function - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - bitset_clear(&basic_block->gen); - bitset_clear(&basic_block->kill); - - bitset_ensure_length(&basic_block->gen, node_count); - bitset_ensure_length(&basic_block->kill, node_count); - } - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - Node* node = thread_node_get(thread, node_index); - - if (node->id == IR_PHI) - { - auto phi_inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < phi_inputs.length; i += 1) - { - auto input = phi_inputs.pointer[i]; - if (validi(input)) - { - auto input_bb_index = scheduled.pointer[geti(input)]; - bitset_set_value(&bb.pointer[geti(input_bb_index)].kill, geti(node_index), 1); - } - } - } - else - { - bitset_set_value(&basic_block->kill, geti(node_index), 1); - } - } - } - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - Node* node = thread_node_get(thread, node_index); - - if (node->id != IR_PHI) - { - auto inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto* input = thread_node_get(thread, input_index); - if (input->id == IR_PHI || !bitset_get(&basic_block->kill, geti(input_index))) - { - bitset_set_value(&basic_block->gen, geti(input_index), 1); - } - } - } - } - } - } - - thread_worklist_clear(thread, worker); - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - assert(basic_block->gen.arr.length == basic_block->live_in.arr.length); - assert(basic_block->gen.arr.capacity == basic_block->live_in.arr.capacity); - memcpy(basic_block->live_in.arr.pointer, basic_block->gen.arr.pointer, sizeof(basic_block->gen.arr.pointer[0]) * basic_block->gen.arr.length); - basic_block->live_in.length = basic_block->gen.length; - thread_worklist_push(thread, worker, basic_block->start); - } - - while (thread_worklist_length(thread, worker) > 0) - { - auto bb_node_index = thread_worklist_pop(thread, worker); - auto basic_block_index = scheduled.pointer[geti(bb_node_index)]; - BasicBlock* basic_block = &bb.pointer[geti(basic_block_index)]; - - auto* live_out = &basic_block->live_out; - auto* live_in = &basic_block->live_in; - bitset_clear(live_out); - - auto end_index = basic_block->end; - auto* end = thread_node_get(thread, end_index); - auto cfg_is_fork = 0; - if (cfg_is_fork) - { - todo(); - } - else if (!cfg_is_endpoint(thread, end)) - { - auto succ_index = cfg_next_control(thread, end_index); - auto succ_bb_index = scheduled.pointer[geti(succ_index)]; - auto succ_bb = &bb.pointer[geti(succ_bb_index)]; - assert(live_out->arr.capacity == live_in->arr.capacity); - u64 changes = 0; - for (u32 i = 0; i < succ_bb->live_in.arr.capacity; i += 1) - { - auto old = live_out->arr.pointer[i]; - auto new = old | succ_bb->live_in.arr.pointer[i]; - - live_out->arr.pointer[i] = new; - changes |= (old ^ new); - } - unused(changes); - } - - auto* gen = &basic_block->gen; - auto* kill = &basic_block->kill; - - auto changes = 0; - - for (u32 i = 0; i < kill->arr.length; i += 1) - { - u64 new_in = (live_out->arr.pointer[i] & ~kill->arr.pointer[i]) | gen->arr.pointer[i]; - changes |= live_in->arr.pointer[i] != new_in; - live_in->arr.pointer[i] = new_in; - } - - if (changes) - { - todo(); - } - } -} - -fn void redo_dataflow(Thread* thread, WorkListHandle worker, VirtualBuffer(BasicBlock) bb, VirtualBuffer(BasicBlockIndex) scheduled, u32 node_count) -{ - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - bitset_clear(&basic_block->gen); - bitset_clear(&basic_block->kill); - - bitset_ensure_length(&basic_block->gen, node_count); - bitset_ensure_length(&basic_block->kill, node_count); - } - - dataflow(thread, worker, bb, scheduled, node_count); -} - -fn String gpr_to_string(GPR gpr) -{ - switch (gpr) - { - case_to_name(, RAX); - case_to_name(, RCX); - case_to_name(, RDX); - case_to_name(, RBX); - case_to_name(, RSP); - case_to_name(, RBP); - case_to_name(, RSI); - case_to_name(, RDI); - case_to_name(, R8); - case_to_name(, R9); - case_to_name(, R10); - case_to_name(, R11); - case_to_name(, R12); - case_to_name(, R13); - case_to_name(, R14); - case_to_name(, R15); - case_to_name(, GPR_NONE); - } -} - -fn u8 register_allocate(Thread* thread, VirtualBuffer(VirtualRegister) virtual_registers, VirtualBuffer(u32)* spills, Bitset* active, Bitset* future_active, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, u32 virtual_register_id, u32 in_use) -{ - if (bitset_get(future_active, virtual_register_id)) - { - todo(); - } - - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto mask = thread_register_mask_get(thread, virtual_register->mask); - - if (virtual_register->assigned >= 0) - { - bitset_set_value(active, virtual_register_id, 1); - return 1; - } - else if (register_mask_spill(*mask)) - { - todo(); - } - else if (mask->class == REGISTER_CLASS_STACK) - { - todo(); - } - - auto mask_value = mask->mask; - auto old_in_use = in_use; - in_use |= ~mask_value; - print("Vreg mask: {u32:x}. Complement: {u32:x}. In use before: {u32:x}. In use after: {u32:x}\n", mask_value, ~mask_value, old_in_use, in_use); - - spills->length = 0; - - *vb_add(spills, 1) = virtual_register_id; - - FOREACH_SET(i, active) - { - print("Active[{u64}] set\n", i); - VirtualRegister* other = &virtual_registers.pointer[i]; - if (other->class == mask->class) - { - print("Interfere with active: {u32}\n", (s32)other->assigned); - in_use |= ((u32)1 << other->assigned); - *vb_add(spills, 1) = cast_to(u32, u64, i); - } - } - - FOREACH_SET(i, future_active) - { - print("Future active[{u64}] set\n", i); - VirtualRegister* other = &virtual_registers.pointer[i]; - if (other->class == mask->class && (in_use & ((u32)1 << other->assigned)) == 0) - { - if (interfere(thread, scheduled, bb, order, virtual_register->node_index, other->node_index)) - { - todo(); - } - } - } - - NodeIndex node_index = virtual_register->node_index; - auto hint_vreg = virtual_register->hint_vreg; - auto shared_edge = node_to_address(thread, node_index); - - if (shared_edge >= 0) - { - todo(); - } - - if (in_use == UINT32_MAX) - { - return 0; - } - - virtual_register->class = mask->class; - - auto hint_virtual_register = virtual_registers.pointer[hint_vreg]; - - s32 hint_reg = hint_vreg > 0 && hint_virtual_register.class == mask->class ? - hint_virtual_register.assigned : -1; - - print("IN USE: {u32:x}: ~ -> {u32:x}\n", in_use, ~in_use); - - if (hint_reg >= 0 && (in_use & ((u64)1 << hint_reg)) == 0) - { - todo(); - } - else - { - virtual_register->assigned = cast_to(s16, s32, __builtin_ffsll(~in_use) - 1); - print("Register assigned: {s}\n", gpr_to_string((GPR)virtual_register->assigned)); - } - - bitset_set_value(active, virtual_register_id, 1); - - return 1; -} - -fn s32 machine_operand_at(u32* virtual_register_map, VirtualBuffer(VirtualRegister) virtual_registers, NodeIndex node_index, s32 class) -{ - assert(validi(node_index)); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id > 0); - assert(virtual_register_id < virtual_registers.length); - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - assert(virtual_register->assigned >= 0); - assert(virtual_register->class == class); - - return virtual_register->assigned; -} - -typedef enum MachineOperandId : u8 -{ - MACHINE_OPERAND_MEMORY, - MACHINE_OPERAND_GPR, - MACHINE_OPERAND_XMM, -} MachineOperandId; - -STRUCT(MachineOperand) -{ - MachineOperandId id; - s16 register_value; -}; - -fn MachineOperand operand_from_node(VirtualBuffer(VirtualRegister) virtual_registers, u32* virtual_register_map, NodeIndex node_index) -{ - assert(validi(node_index)); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id > 0); - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - - if (virtual_register->class == REGISTER_CLASS_STACK) - { - todo(); - } - else - { - assert(virtual_register->assigned >= 0); - MachineOperandId id; - switch (virtual_register->class) - { - case REGISTER_CLASS_X86_64_GPR: - id = MACHINE_OPERAND_GPR; - break; - default: - todo(); - } - - return (MachineOperand) { - .id = id, - .register_value = virtual_register->assigned, - }; - } - - todo(); -} - -fn void node_ready_up(Thread* thread, Scheduler* scheduler, NodeIndex node_index, Node* end) -{ - auto* node = thread_node_get(thread, node_index); - auto priority = node_get_latency(thread, node, end); - auto unit_mask = node_get_unit_mask(thread, node); - - bitset_set_value(&scheduler->ready_set, geti(node_index), 1); - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - u32 i; - auto count = scheduler->ready.length; - - for (i = 0; i < count; i += 1) - { - if (cast_to(s32, u64, priority) < scheduler->ready.pointer[i].priority) - { - break; - } - } - - *vb_add(&scheduler->ready, 1) = (ReadyNode){}; - - memmove(&scheduler->ready.pointer[i + 1], &scheduler->ready.pointer[i], (count - i) * sizeof(ReadyNode)); - - // print("Readying up node #{u32} ({s}) at index {u32}\n", geti(node_index), node_id_to_string(node->id), i); - - scheduler->ready.pointer[i] = (ReadyNode) { - .node_index = node_index, - .priority = cast_to(s32, u64, priority), - .unit_mask = unit_mask, - }; -} - -STRUCT(FixedBlockMap) -{ - NodeIndex* keys; - u32 count; -}; - -fn FixedBlockMap fixed_block_map_create(Thread* restrict thread, u32 count) -{ - auto* pointer = arena_allocate_bytes(thread->arena, sizeof(NodeIndex) * count + sizeof(BasicBlockIndex) * count, MAX(alignof(BasicBlockIndex), alignof(NodeIndex))); - return (FixedBlockMap) { - .keys = (NodeIndex*)pointer, - .count = count, - }; -} - -fn BasicBlockIndex* fixed_block_map_values(FixedBlockMap* restrict map) -{ - return (BasicBlockIndex*)(map->keys + map->count); -} - -fn void fixed_block_map_put(FixedBlockMap* restrict map, NodeIndex key, BasicBlockIndex value) -{ - auto count = map->count; - for (u32 i = 0; i < count; i += 1) - { - if (index_equal(key, map->keys[i])) - { - fixed_block_map_values(map)[i] = value; - break; - } - else if (!validi(map->keys[i])) - { - map->keys[i] = key; - fixed_block_map_values(map)[i] = value; - break; - } - } -} - -fn BasicBlockIndex fixed_block_map_get(FixedBlockMap* restrict map, NodeIndex key) -{ - auto count = map->count; - for (u32 i = 0; i < count; i += 1) - { - if (index_equal(key, map->keys[i])) - { - return fixed_block_map_values(map)[i]; - } - } - - return invalidi(BasicBlock); -} - -STRUCT(CFGBuilder) -{ - VirtualBuffer(NodeIndex) pinned; - VirtualBuffer(BasicBlock) basic_blocks; - VirtualBuffer(BasicBlockIndex) scheduled; - FixedBlockMap block_map; - WorkListHandle walker; - WorkListHandle worker; -}; - -fn CFGBuilder cfg_builder_init(Thread* restrict thread) -{ - CFGBuilder cfg_builder = {}; - cfg_builder.walker = thread_worklist_acquire(thread); - cfg_builder.worker = thread_worklist_acquire(thread); - - return cfg_builder; -} - -fn void cfg_builder_clear(CFGBuilder* restrict builder, Thread* restrict thread) -{ - thread_worklist_clear(thread, builder->walker); - thread_worklist_clear(thread, builder->worker); - - builder->pinned.length = 0; - builder->basic_blocks.length = 0; - builder->scheduled.length = 0; -} - -fn BasicBlockIndex cfg_get_predicate_basic_block(Thread* restrict thread, FixedBlockMap* map, NodeIndex arg_node_index, u16 i) -{ - auto* arg_node = thread_node_get(thread, arg_node_index); - auto arg_inputs = node_get_inputs(thread, arg_node); - auto node_index = arg_inputs.pointer[i]; - - while (1) - { - auto* node = thread_node_get(thread, node_index); - - auto search = fixed_block_map_get(map, node_index); - - if (validi(search)) - { - return search; - } - else - { - // TODO: or dead - if (node->id == IR_REGION) - { - return invalidi(BasicBlock); - } - } - - auto inputs = node_get_inputs(thread, node); - node_index = inputs.pointer[0]; - } - - unreachable(); -} - -fn void cfg_build(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function) -{ - thread_worklist_push(thread, builder->worker, function->root); - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - NodeIndex node_index = thread_worklist_get(thread, builder->worker, i); - Node* node = thread_node_get(thread, node_index); - auto pin = 0; - switch (node->id) - { - case IR_ROOT: - case IR_PHI: - case IR_RETURN: - case IR_REGION: - pin = 1; - break; - case IR_PROJECTION: - case IR_INTEGER_CONSTANT: - case IR_SYMBOL_TABLE: - break; - default: - todo(); - } - - if (pin) - { - *vb_add(&builder->pinned, 1) = node_index; - } - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - assert(validi(output)); - thread_worklist_push(thread, builder->worker, output); - } - } - - thread_worklist_clear(thread, builder->worker); - - for (u64 pin_index = 0; pin_index < builder->pinned.length; pin_index += 1) - { - auto pinned_node_index = builder->pinned.pointer[pin_index]; - thread_worklist_push(thread, builder->walker, pinned_node_index); - // auto* pinned_node = thread_node_get(thread, pinned_node_index); - - while (thread_worklist_length(thread, builder->walker) > 0) - { - auto node_index = thread_worklist_pop_array(thread, builder->walker); - auto* node = thread_node_get(thread, node_index); - assert(node->interned); - auto inputs = node_get_inputs(thread, node); - auto outputs = node_get_outputs(thread, node); - - if (node->id != IR_PROJECTION && node->output_count == 0) - { - todo(); - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_MEMORY) - { - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->output_count == 0) - { - thread_worklist_push(thread, builder->worker, output_index); - } - } - } - - node_gvn_remove(thread, node_index); - - auto new_node_index = node_select_instruction(thread, node_index); - - if (validi(new_node_index) && !index_equal(node_index, new_node_index)) - { - todo(); - } - - for (auto i = inputs.length; i > 0; i -= 1) - { - auto input = inputs.pointer[i - 1]; - if (validi(input)) - { - thread_worklist_push(thread, builder->walker, input); - } - } - - if (node->id == IR_REGION) - { - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - assert(validi(output_index)); - auto output = thread_node_get(thread, output_index); - if (output->id) - { - thread_worklist_push(thread, builder->walker, output_index); - } - } - } - } - } - - auto control_start = function_get_control_start(thread, function); - auto* top = create_block(thread, control_start); - thread_worklist_clear(thread, builder->worker); - thread_worklist_test_and_set(thread, builder->worker, control_start); - - while (top) - { - auto successor_count = top->successor_count; - if (successor_count > 0) - { - auto index = successor_count - 1; - auto node_index = top->successors[index]; - assert(validi(node_index)); - top->successor_count = index; - - // Returns valid when the node hasnt been pushed to the worklist yet - if (!thread_worklist_test_and_set(thread, builder->worker, node_index)) - { - auto* new_top = create_block(thread, node_index); - new_top->parent = top; - top = new_top; - } - } - else - { - Block* parent = top->parent; - *vb_add(&builder->basic_blocks, 1) = (BasicBlock) { - .start = top->start, - .end = top->end, - .dominator_depth = -1, - }; - - top = parent; - } - } - - for (u32 i = 0; i < builder->basic_blocks.length / 2; i += 1) - { - SWAP(builder->basic_blocks.pointer[i], builder->basic_blocks.pointer[(builder->basic_blocks.length - 1) - i]); - } - - auto* blocks = builder->basic_blocks.pointer; - blocks[0].dominator_depth = 0; - blocks[0].dominator = Index(BasicBlock, 0); - auto block_count = builder->basic_blocks.length; - - builder->block_map = fixed_block_map_create(thread, block_count); - for (u32 i = 0; i < block_count; i += 1) - { - auto* block = &blocks[i]; - auto block_index = Index(BasicBlock, i); - fixed_block_map_put(&builder->block_map, block->start, block_index); - } - - // Compute dominators - u8 changed = 1; - while (changed) - { - changed = 0; - - for (u32 i = 1; i < block_count; i += 1) - { - // auto basic_block_index = Index(BasicBlock, i); - auto* basic_block = &blocks[i]; - - auto new_immediate_dominator_index = invalidi(BasicBlock); - - auto start_index = basic_block->start; - auto* start_node = thread_node_get(thread, start_index); - - // auto start_inputs = node_get_inputs(thread, start_node); - - for (u16 j = 0; j < start_node->input_count; j += 1) - { - auto predecessor_basic_block_index = cfg_get_predicate_basic_block(thread, &builder->block_map, start_index, j); - if (validi(predecessor_basic_block_index)) - { - auto* predecessor_basic_block = &blocks[geti(predecessor_basic_block_index)]; - auto immediate_dominator_predecessor_index = predecessor_basic_block->dominator; - if (validi(immediate_dominator_predecessor_index)) - { - if (validi(new_immediate_dominator_index)) - { - todo(); - } - else - { - new_immediate_dominator_index = predecessor_basic_block_index; - } - } - } - } - - assert(validi(new_immediate_dominator_index)); - if (!index_equal(basic_block->dominator, new_immediate_dominator_index)) - { - basic_block->dominator = new_immediate_dominator_index; - changed = 1; - } - } - } - - // Compute the depths - for (u32 i = 0; i < block_count; i += 1) - { - auto basic_block_index = Index(BasicBlock, i); - auto* basic_block = &blocks[geti(basic_block_index)]; - auto current_index = basic_block_index; - s32 depth = 0; - while (1) - { - auto* current = &blocks[geti(current_index)]; - if (current->dominator_depth >= 0) - { - break; - } - - current_index = current->dominator; - depth += 1; - } - - auto* current = &blocks[geti(current_index)]; - basic_block->dominator_depth = depth + current->dominator_depth; - } -} - -STRUCT(GlobalScheduleOptions) -{ - u8 dataflow:1; -}; - -fn void basic_block_add_node(Thread* restrict thread, BasicBlock* restrict basic_block, NodeIndex node_index, u32 place) -{ - // if (geti(node_index) == 1) - // { - // breakpoint(); - // } - print("[PLACE #{u32}] Adding node #{u32} ({s}) to basic block 0x{u64:x} with index {u32}\n", place, geti(node_index), node_id_to_string(thread_node_get(thread, node_index)->id), basic_block, basic_block->items.length); - *vb_add(&basic_block->items, 1) = node_index; -} - -fn void cfg_global_schedule(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function, GlobalScheduleOptions options) -{ - // Global code motion - - auto node_count = thread->buffer.nodes.length; - vb_add(&builder->scheduled, thread->buffer.nodes.length); - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - bitset_ensure_length(&basic_block->live_in, node_count); - bitset_ensure_length(&basic_block->live_out, node_count); - } - - auto bb0 = Index(BasicBlock, cast_to(u32, s64, &builder->basic_blocks.pointer[0] - builder->basic_blocks.pointer)); - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - auto bb_index = Index(BasicBlock, cast_to(u32, s64, basic_block - builder->basic_blocks.pointer)); - builder->scheduled.pointer[geti(basic_block->start)] = bb_index; - - if (i == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root_node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - builder->scheduled.pointer[geti(output)] = bb0; - basic_block_add_node(thread, &builder->basic_blocks.pointer[0], output, 0); - } - } - - auto* start = thread_node_get(thread, basic_block->start); - if (start->id == IR_REGION) - { - basic_block_add_node(thread, basic_block, basic_block->start, 1); - - auto outputs = node_get_outputs(thread, start); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output); - if (output_node->id == IR_PHI) - { - builder->scheduled.pointer[geti(output)] = bb_index; - basic_block_add_node(thread, basic_block, output, 2); - } - } - } - } - - thread_worklist_clear(thread, builder->worker); - thread_worklist_push(thread, builder->worker, function->root); - - VirtualBuffer(NodeIndex) pins = {}; - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - auto* node = thread_node_get(thread, node_index); - if (node->id != IR_ROOT && node_is_pinned(node)) - { - auto bb_index = builder->scheduled.pointer[geti(node_index)]; - if (node->id == IR_PROJECTION && !node_is_pinned(thread_node_get(thread, node_get_inputs(thread, node).pointer[0]))) - { - } - else - { - auto current = node_index; - while (!validi(bb_index)) - { - bb_index = builder->scheduled.pointer[geti(current)]; - auto* current_node = thread_node_get(thread, current); - auto current_inputs = node_get_inputs(thread, current_node); - current = current_inputs.pointer[0]; - } - - auto* basic_block = &builder->basic_blocks.pointer[geti(bb_index)]; - builder->scheduled.pointer[geti(node_index)] = bb_index; - *vb_add(&pins, 1) = node_index; - basic_block_add_node(thread, basic_block, node_index, 3); - } - } - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - thread_worklist_push(thread, builder->worker, output); - } - } - - // Early schedule - thread_worklist_clear(thread, builder->worker); - - for (u32 i = 0; i < pins.length; i += 1) - { - auto pin_node_index = pins.pointer[i]; - auto* pin = thread_node_get(thread, pin_node_index); - - STRUCT(Elem) - { - struct Elem* parent; - NodeIndex node; - u32 i; - }; - - auto* top = arena_allocate(thread->arena, Elem, 1); - *top = (Elem) - { - .node = pin_node_index, - .parent = 0, - .i = pin->input_count, - }; - - while (top) - { - NodeIndex node_index = top->node; - Node* node = thread_node_get(thread, node_index); - auto node_inputs = node_get_inputs(thread, node); - - if (top->i > 0) - { - auto new_top_i = top->i - 1; - top->i = new_top_i; - NodeIndex input_index = node_inputs.pointer[new_top_i]; - - if (validi(input_index)) - { - Node* input = thread_node_get(thread, input_index); - if (input->id == IR_PROJECTION) - { - auto input_inputs = node_get_inputs(thread, input); - input_index = input_inputs.pointer[0]; - input = thread_node_get(thread, input_index); - } - - if (!node_is_pinned(input) && !thread_worklist_test_and_set(thread, builder->worker, input_index)) - { - auto* new_top = arena_allocate(thread->arena, Elem, 1); - *new_top = (Elem) - { - .parent = top, - .node = input_index, - .i = input->input_count, - }; - - top = new_top; - } - } - - continue; - } - - if (!index_equal(node_index, pin_node_index)) - { - auto best = Index(BasicBlock, 0); - s32 best_depth = 0; - - auto inputs = node_get_inputs(thread, node); - - for (u16 i = 0; i < node->input_count; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto basic_block_index = builder->scheduled.pointer[geti(input_index)]; - if (validi(basic_block_index)) - { - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - - if (best_depth < basic_block->dominator_depth) - { - best_depth = basic_block->dominator_depth; - best = basic_block_index; - } - } - } - } - - builder->scheduled.pointer[geti(node_index)] = best; - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - thread_worklist_push_array(thread, builder->worker, node_index); - } - - top = top->parent; - } - } - - // Late schedule - for (u32 i = thread_worklist_length(thread, builder->worker); i > 0; i -= 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i - 1); - auto* node = thread_node_get(thread, node_index); - assert(!node_is_pinned(node)); - auto current_basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto current_basic_block = &builder->basic_blocks.pointer[geti(current_basic_block_index)]; - - auto lca = invalidi(BasicBlock); - - if (!node_has_memory_out(node->id)) - { - auto memory_in = node_memory_in(thread, node); - if (validi(memory_in)) - { - todo(); - } - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else - { - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - auto use_block_index = find_use_block(thread, builder->scheduled, node_index, node_index, output); - if (validi(use_block_index)) - { - lca = find_lca(lca, use_block_index); - } - } - } - - if (validi(lca)) - { - todo(); - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - basic_block_add_node(thread, current_basic_block, node_index, 4); - } - - if (options.dataflow) - { - dataflow(thread, builder->worker, builder->basic_blocks, builder->scheduled, node_count); - } -} - -fn void cfg_build_and_global_schedule(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function, GlobalScheduleOptions options) -{ - cfg_build(builder, thread, function); - - cfg_global_schedule(builder, thread, function, options); -} - -fn void cfg_list_schedule(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - // print("=================================\nLIST SCHEDULER START\n=================================\n"); - thread_worklist_clear(thread, builder->worker); - - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - thread_worklist_push(thread, builder->worker, basic_block->start); - - if (geti(basic_block_index) == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto root_outputs = node_get_outputs(thread, root_node); - - for (u32 i = 0; i < root_outputs.length; i += 1) - { - auto output = root_outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output); - if (output_node->id == IR_PROJECTION) - { - thread_worklist_push(thread, builder->worker, output); - } - } - } - else - { - auto* bb_start = thread_node_get(thread, basic_block->start); - auto outputs = node_get_outputs(thread, bb_start); - for (u32 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->id == IR_PHI) - { - thread_worklist_push(thread, builder->worker, output_index); - } - } - } - - auto end_index = basic_block->end; - auto* end = thread_node_get(thread, end_index); - Scheduler scheduler = {}; - bitset_ensure_length(&scheduler.ready_set, thread->buffer.nodes.length); - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - - if (!thread_worklist_test(thread, builder->worker, node_index) && index_equal(builder->scheduled.pointer[geti(node_index)], basic_block_index) && node_is_ready(thread, builder->scheduled, builder->worker, node, basic_block_index)) - { - node_ready_up(thread, &scheduler, node_index, end); - } - } - - // TODO: IS BRANCH - VirtualBuffer(InFlightNode) active = {}; - u64 in_use_mask = 0; - u64 blocked_mask = UINT64_MAX >> (64 - 1); - u32 cycle = 0; - - while (active.length > 0 || scheduler.ready.length > 0) - { - while (in_use_mask != blocked_mask && scheduler.ready.length > 0) - { - auto signed_index = node_best_ready(&scheduler, in_use_mask); - if (signed_index < 0) - { - break; - } - auto index = cast_to(u32, s32, signed_index); - auto available = scheduler.ready.pointer[index].unit_mask & ~in_use_mask; - auto unit_i = __builtin_ffsll(cast_to(s64, u64, available)) - 1; - - auto node_index = scheduler.ready.pointer[index].node_index; - auto* node = thread_node_get(thread, node_index); - - in_use_mask |= (u64)1 << unit_i; - - if (index + 1 < scheduler.ready.length) - { - todo(); - } - - scheduler.ready.length -= 1; - assert(node->id != IR_PROJECTION); - - auto end_cycle = cycle + node_get_latency(thread, node, end); - *vb_add(&active, 1) = (InFlightNode) - { - .node_index = node_index, - .end = cast_to(u32, u64, end_cycle), - .unit_i = unit_i, - }; - - if (node != end) - { - thread_worklist_push(thread, builder->worker, node_index); - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } - } - - cycle += 1; - - for (u32 i = 0; i < active.length; i += 1) - { - auto active_i = active.pointer[i]; - auto node_index = active_i.node_index; - auto* node = thread_node_get(thread, node_index); - - if (active_i.end > cycle) - { - i += 1; - continue; - } - - in_use_mask &= ~((u64)1 << active_i.unit_i); - auto last = active.pointer[active.length - 1]; - active.pointer[i] = last; - active.length -= 1; - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->id == IR_PROJECTION) - { - print("TODO: proj\n"); - todo(); - } - else if (!bitset_get(&scheduler.ready_set, geti(output_index)) && index_equal(builder->scheduled.pointer[geti(output_index)], basic_block_index) && !thread_worklist_test(thread, builder->worker, output_index) && node_is_ready(thread, builder->scheduled, builder->worker, output, basic_block_index)) - { - node_ready_up(thread, &scheduler, output_index, end); - } - } - } - } - - if (!index_equal(end_index, basic_block->start)) - { - thread_worklist_push(thread, builder->worker, end_index); - } - // print("=================================\nLIST SCHEDULER END\n=================================\n"); -} - -fn u8 operand_equal(MachineOperand a, MachineOperand b) -{ - if (a.id != b.id) - { - return 0; - } - - if (a.id == MACHINE_OPERAND_MEMORY) - { - todo(); - } - - return (a.id == MACHINE_OPERAND_GPR || a.id == MACHINE_OPERAND_XMM) ? a.register_value == b.register_value : 0; -} - -typedef enum MachOCpuType : u32 -{ - MACHO_CPU_X86 = 7, - MACHO_CPU_ARM = 12, - MACHO_CPU_X86_64 = MACHO_CPU_X86 | 0x1000000, - MACHO_CPU_ARM64 = MACHO_CPU_ARM | 0x1000000, - MACHO_CPU_ANY = 0xffffffff, -} MachOCpuType; - -typedef enum MachOFileType : u32 -{ - MACHO_FILE_OBJECT = 1, - MACHO_FILE_EXECUTABLE = 2, - MACHO_FILE_FVM_LIB = 3, - MACHO_FILE_CORE = 4, - MACHO_FILE_PRELOAD = 5, - MACHO_FILE_DYLIB = 6, - MACHO_FILE_DYLINKER = 7, - MACHO_FILE_BUNDLE = 8, - MACHO_FILE_DYLIB_STUB = 9, - MACHO_FILE_DSYM = 10, - MACHO_FILE_KEXT_BUNDLE = 11, -} MachOFileType; - -STRUCT(MachOFlags) -{ - u32 no_undefined:1; - u32 incremental_link:1; - u32 dyld_link:1; - u32 binary_data_load:1; - u32 prebound:1; - u32 split_segments:1; - u32 lazy_init:1; - u32 two_level:1; - u32 force_flat:1; - u32 no_multi_definitions:1; - u32 no_fix_prebinding:1; - u32 prebindable:1; - u32 all_mods_bound:1; - u32 sub_sections_via_symbols:1; - u32 canonical:1; - u32 weak_defines:1; - u32 binds_to_weak:1; - u32 allow_stack_execution:1; - u32 root_safe:1; - u32 setuid_safe:1; - u32 no_reexported_dylibs:1; - u32 pie:1; - u32 dead_strippable_dylib:1; - u32 has_tlv_descriptors:1; - u32 no_heap_execution:1; - u32 app_extension_safe:1; - u32 n_list_out_of_sync_with_dyldinof:1; - u32 simulator_support:1; - u32 padding:3; - u32 dyld_cache:1; -}; - -static_assert(sizeof(MachOFlags) == sizeof(u32)); - -STRUCT(MachOHeader) -{ - u32 magic; - MachOCpuType cpu_type; - u32 sub_cpu_type:24; - u32 padding:7; - u32 lib64:1; - MachOFileType file_type; - u32 command_count; - u32 command_total_size; - MachOFlags flags; - u32 reserved; -}; - -static_assert(sizeof(MachOHeader) == 0x20); - -typedef enum MachOLoadCommandId : u32 -{ - LC_SEGMENT = 0x00000001, - LC_SYMTAB = 0x00000002, - LC_SYMSEG = 0x00000003, - LC_THREAD = 0x00000004, - LC_UNIXTHREAD = 0x00000005, - LC_LOADFVMLIB = 0x00000006, - LC_IDFVMLIB = 0x00000007, - LC_IDENT = 0x00000008, - LC_FVMFILE = 0x00000009, - LC_PREPAGE = 0x0000000A, - LC_DYSYMTAB = 0x0000000B, - LC_LOAD_DYLIB = 0x0000000C, - LC_ID_DYLIB = 0x0000000D, - LC_LOAD_DYLINKER = 0x0000000E, - LC_ID_DYLINKER = 0x0000000F, - LC_PREBOUND_DYLIB = 0x00000010, - LC_ROUTINES = 0x00000011, - LC_SUB_FRAMEWORK = 0x00000012, - LC_SUB_UMBRELLA = 0x00000013, - LC_SUB_CLIENT = 0x00000014, - LC_SUB_LIBRARY = 0x00000015, - LC_TWOLEVEL_HINTS = 0x00000016, - LC_PREBIND_CKSUM = 0x00000017, - LC_LOAD_WEAK_DYLIB = 0x80000018, - LC_SEGMENT_64 = 0x00000019, - LC_ROUTINES_64 = 0x0000001A, - LC_UUID = 0x0000001B, - LC_RPATH = 0x8000001C, - LC_CODE_SIGNATURE = 0x0000001D, - LC_SEGMENT_SPLIT_INFO = 0x0000001E, - LC_REEXPORT_DYLIB = 0x8000001F, - LC_LAZY_LOAD_DYLIB = 0x00000020, - LC_ENCRYPTION_INFO = 0x00000021, - LC_DYLD_INFO = 0x00000022, - LC_DYLD_INFO_ONLY = 0x80000022, - LC_LOAD_UPWARD_DYLIB = 0x80000023, - LC_VERSION_MIN_MACOSX = 0x00000024, - LC_VERSION_MIN_IPHONEOS = 0x00000025, - LC_FUNCTION_STARTS = 0x00000026, - LC_DYLD_ENVIRONMENT = 0x00000027, - LC_MAIN = 0x80000028, - LC_DATA_IN_CODE = 0x00000029, - LC_SOURCE_VERSION = 0x0000002A, - LC_DYLIB_CODE_SIGN_DRS = 0x0000002B, - LC_ENCRYPTION_INFO_64 = 0x0000002C, - LC_LINKER_OPTION = 0x0000002D, - LC_LINKER_OPTIMIZATION_HINT = 0x0000002E, - LC_VERSION_MIN_TVOS = 0x0000002F, - LC_VERSION_MIN_WATCHOS = 0x00000030, - LC_NOTE = 0x00000031, - LC_BUILD_VERSION = 0x00000032, - LC_DYLD_EXPORTS_TRIE = 0x80000033, - LC_DYLD_CHAINED_FIXUPS = 0x80000034, - LC_FILESET_ENTRY = 0x80000035, - LC_ATOM_INFO = 0x00000036, -} MachOLoadCommandId; - -STRUCT(MachOName16) -{ - u8 name[16]; -}; - -fn MachOName16 macho_name16(String string) -{ - MachOName16 result = {}; - assert(string.length <= array_length(result.name)); - memcpy(result.name, string.pointer, string.length); - - return result; -} - -STRUCT(MachOSegment) -{ - MachOName16 name; - u64 memory_address; - u64 memory_size; - u64 file_offset; - u64 file_size; - u32 max_protection; - u32 initial_protection; - u32 section_count; - u32 flags; -}; -static_assert(sizeof(MachOSegment) == 64); - -STRUCT(MachOCommand) -{ - MachOLoadCommandId id; - u32 command_size; -}; -static_assert(sizeof(MachOCommand) == 8); - -STRUCT(MachOSection) -{ - MachOName16 section_name; - MachOName16 segment_name; - u64 address; - u64 size; - u32 offset; - u32 alignment; - u32 relocation_offset; - u32 relocation_count; - u32 flags; - u8 reserved[12]; -}; -static_assert(sizeof(MachOSection) == 0x50); - -fn String write_macho(Thread* restrict thread, ObjectOptions options) -{ - unused(thread); - unused(options); - VirtualBuffer(u8) file = {}; - MachOHeader header = { - .magic = 0xfeedfacf, - .cpu_type = MACHO_CPU_ARM64, - .file_type = MACHO_FILE_EXECUTABLE, - .command_count = 15, - .command_total_size = 688, - .flags = { - .no_undefined = 1, - .dyld_link = 1, - .two_level = 1, - .pie = 1, - }, - }; - vb_copy_scalar(&file, header); - - MachOCommand page_zero_command = { - .id = LC_SEGMENT_64, - .command_size = sizeof(MachOCommand) + sizeof(MachOSegment), - }; - vb_copy_scalar(&file, page_zero_command); - - MachOSegment page_zero_segment = { - .name = macho_name16(strlit("__PAGEZERO")), - .memory_size = GB(4), - }; - vb_copy_scalar(&file, page_zero_segment); - - MachOCommand text_command = { - .id = LC_SEGMENT_64, - .command_size = 232, - }; - vb_copy_scalar(&file, text_command); - - MachOSection text_section = { - .section_name = macho_name16(strlit("__text")), - .segment_name = macho_name16(strlit("__TEXT")), - .address = 0x100003fa0, - .size = 8, - .offset = 16288, - .alignment = 2, - .relocation_offset = 0, - .relocation_count = 0, - .flags = 0x80000400, - }; - - MachOSection unwind_info_section = { - .section_name = macho_name16(strlit("__unwind_info")), - .segment_name = macho_name16(strlit("__TEXT")), - .address = 0x100003fa8, - .size = 88, - .offset = 16296, - .alignment = 2, - .relocation_offset = 0, - .relocation_count = 0, - .flags = 0, - }; - - MachOSegment text_segment = { - .name = macho_name16(strlit("__TEXT")), - .memory_address = GB(4), - .memory_size = KB(16), - .file_offset = 0, - .file_size = KB(16), - .max_protection = 5, - .initial_protection = 5, - .section_count = 2, - .flags = 0, - }; - - vb_copy_scalar(&file, text_segment); - - assert(file.length == 0xb0); - vb_copy_scalar(&file, text_section); - vb_align(&file, 0x10); - vb_copy_scalar(&file, unwind_info_section); - - MachOCommand linkedit_command = { - .id = LC_SEGMENT_64, - .command_size = sizeof(MachOCommand) + sizeof(MachOSegment), - }; - vb_copy_scalar(&file, linkedit_command); - - MachOSegment linkedit_segment = { - .name = macho_name16(strlit("__LINKEDIT")), - .memory_address = 0x100004000, - .memory_size = KB(16), - .file_offset = KB(16), - .file_size = 688, - .max_protection = 1, - .initial_protection = 1, - .section_count = 0, - .flags = 0, - }; - vb_copy_scalar(&file, linkedit_segment); - - MachOCommand chained_fixups_command = { - .id = LC_DYLD_CHAINED_FIXUPS, - .command_size = 16, - }; - vb_copy_scalar(&file, chained_fixups_command); - - { - u8 blob[] = { 0x00, 0x40, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand exports_trie_command = { - .id = LC_DYLD_EXPORTS_TRIE, - .command_size = 16, - }; - vb_copy_scalar(&file, exports_trie_command); - - { - u8 blob[] = { 0x38, 0x40, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand symtab_command = { - .id = LC_SYMTAB, - .command_size = 24, - }; - vb_copy_scalar(&file, symtab_command); - - { - u8 blob[] = { 0x70, 0x40, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand dysymtab_command = { - .id = LC_DYSYMTAB, - .command_size = 80, - }; - vb_copy_scalar(&file, dysymtab_command); - - { - u8 blob[] = { - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 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 - }; - vb_copy_any_array(&file, blob); - } - - MachOCommand load_dylinker_command = { - .id = LC_LOAD_DYLINKER, - .command_size = 32, - }; - vb_copy_scalar(&file, load_dylinker_command); - - { - u8 blob[] = { 0x0C, 0x00, 0x00, 0x00, 0x2F, 0x75, 0x73, 0x72, 0x2F, 0x6C, 0x69, 0x62, 0x2F, 0x64, 0x79, 0x6C, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand uuid_command = { - .id = LC_UUID, - .command_size = 24, - }; - vb_copy_scalar(&file, uuid_command); - - { - u8 uuid[] = { 0x9C, 0x6F, 0xC9, 0x12, 0xED, 0x7F, 0x39, 0x3A, 0x99, 0xA7, 0x93, 0x4B, 0xF6, 0xD1, 0x4D, 0xA1, }; - vb_copy_any_array(&file, uuid); - } - - MachOCommand build_version_command = { - .id = LC_BUILD_VERSION, - .command_size = 32, - }; - vb_copy_scalar(&file, build_version_command); - - { - u8 blob[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x07, 0x5B, 0x04, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand source_version_command = { - .id = LC_SOURCE_VERSION, - .command_size = 16, - }; - vb_copy_scalar(&file, source_version_command); - - { - u8 blob[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand main_command = { - .id = LC_MAIN, - .command_size = 24, - }; - vb_copy_scalar(&file, main_command); - - { - u8 blob[] = { 0xA0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand function_starts_command = { - .id = LC_FUNCTION_STARTS, - .command_size = 16, - }; - vb_copy_scalar(&file, function_starts_command); - - { - u8 blob[] = { 0x68, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand data_in_code_command = { - .id = LC_DATA_IN_CODE, - .command_size = 16, - }; - vb_copy_scalar(&file, data_in_code_command); - { - u8 blob[] = { 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand code_signature_command = { - .id = LC_CODE_SIGNATURE, - .command_size = 16, - }; - vb_copy_scalar(&file, code_signature_command); - - { - u8 blob[] = { - 0x90, 0x41, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, - }; - vb_copy_any_array(&file, blob); - } - - // Pad - unused(vb_add(&file, text_section.offset - file.length)); - - u8 text_section_content[] = { 0x00, 0x00, 0x80, 0x52, 0xC0, 0x03, 0x5F, 0xD6, }; - vb_copy_any_array(&file, text_section_content); - - u8 unwind_info_section_content[] = { - 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_any_array(&file, unwind_info_section_content); - - vb_align(&file, 0x4000); - - u8 linkedit_segment_content[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 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, 0x5F, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xA0, 0x7F, 0x00, 0x00, 0x02, 0x5F, 0x6D, 0x68, 0x5F, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5F, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x00, 0x09, - 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x0D, 0x00, 0x00, 0xA0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x42, 0x00, 0x00, 0x00, 0x66, 0x00, 0x01, 0x00, 0xC1, 0x6A, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2E, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x4E, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x5F, 0x5F, 0x6D, 0x68, 0x5F, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x2F, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x2F, 0x64, 0x61, 0x76, 0x69, 0x64, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, - 0x2F, 0x00, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5F, 0x6D, 0x61, 0x63, 0x6F, 0x73, 0x2E, - 0x63, 0x00, 0x2F, 0x55, 0x73, 0x65, 0x72, 0x73, 0x2F, 0x64, 0x61, 0x76, 0x69, 0x64, 0x2F, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5F, 0x6D, - 0x61, 0x63, 0x6F, 0x73, 0x2E, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFA, 0xDE, 0x0C, 0xC0, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x14, 0xFA, 0xDE, 0x0C, 0x02, 0x00, 0x00, 0x01, 0x06, 0x00, 0x02, 0x04, 0x00, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x41, 0x90, 0x20, 0x02, 0x00, 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, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6D, 0x69, 0x6E, 0x69, - 0x6D, 0x61, 0x6C, 0x5F, 0x6D, 0x61, 0x63, 0x6F, 0x73, 0x00, 0x29, 0x0B, 0x00, 0xDF, 0x14, 0xC1, - 0xD7, 0x61, 0x76, 0xD6, 0xF1, 0xC4, 0x26, 0x31, 0xFC, 0xD7, 0x84, 0x22, 0x15, 0x80, 0xEB, 0xF4, - 0x62, 0x35, 0xD2, 0xC9, 0xF0, 0xE4, 0xA7, 0x6B, 0x9E, 0x1D, 0xAD, 0x7F, 0xAC, 0xB2, 0x58, 0x6F, - 0xC6, 0xE9, 0x66, 0xC0, 0x04, 0xD7, 0xD1, 0xD1, 0x6B, 0x02, 0x4F, 0x58, 0x05, 0xFF, 0x7C, 0xB4, - 0x7C, 0x7A, 0x85, 0xDA, 0xBD, 0x8B, 0x48, 0x89, 0x2C, 0xA7, 0xAD, 0x7F, 0xAC, 0xB2, 0x58, 0x6F, - 0xC6, 0xE9, 0x66, 0xC0, 0x04, 0xD7, 0xD1, 0xD1, 0x6B, 0x02, 0x4F, 0x58, 0x05, 0xFF, 0x7C, 0xB4, - 0x7C, 0x7A, 0x85, 0xDA, 0xBD, 0x8B, 0x48, 0x89, 0x2C, 0xA7, 0xB2, 0x8A, 0x42, 0xCA, 0x3E, 0x6B, - 0xB1, 0x77, 0x13, 0x4F, 0xAB, 0xB6, 0xBD, 0xE2, 0x2E, 0xFD, 0xD4, 0x30, 0x73, 0x08, 0x83, 0x9F, - 0xEC, 0x51, 0x51, 0x2E, 0xCD, 0x15, 0xD0, 0xA2, 0x37, 0x03, 0x4F, 0x6C, 0xF0, 0xCF, 0x98, 0xAE, - 0x46, 0xE9, 0x51, 0x8A, 0x78, 0xC3, 0x8A, 0x49, 0xF4, 0xA0, 0xBC, 0x62, 0x94, 0x68, 0xFD, 0xDE, - 0xA6, 0x9A, 0x08, 0xAD, 0x02, 0xF7, 0x1C, 0xD4, 0x19, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - vb_copy_any_array(&file, linkedit_segment_content); - -#define CHECK 0 -#if CHECK - auto foo = file_read(thread->arena, strlit("C:/Users/David/dev/minimal_macos/minimal_macos")); - assert(file.length == foo.length); - - for (u32 i = 0; i < file.length; i += 1) - { - auto mine = file.pointer[i]; - auto original = foo.pointer[i]; - assert(mine == original); - } -#endif - - return (String) { file.pointer, file.length }; -} - -fn void code_generation(Thread* restrict thread, CodegenOptions options) -{ - auto cfg_builder = cfg_builder_init(thread); - auto* restrict builder = &cfg_builder; - VirtualBuffer(u8) code = {}; - - auto object_path = binary_path_from_options(thread->arena, (BinaryPathOptions) { - .build_directory = strlit(BB_DIR), - .name = options.test_name, - .target = options.target, - .backend = options.backend, - .binary_file_type = BINARY_FILE_OBJECT, - }); - - auto exe_path = binary_path_from_options(thread->arena, (BinaryPathOptions) { - .build_directory = strlit(BB_DIR), - .name = options.test_name, - .target = options.target, - .backend = options.backend, - .binary_file_type = BINARY_FILE_EXECUTABLE, - }); - - for (u32 function_i = 0; function_i < thread->buffer.functions.length; function_i += 1) - { - Function* restrict function = &thread->buffer.functions.pointer[function_i]; - cfg_builder_clear(builder, thread); - - cfg_build_and_global_schedule(builder, thread, function, (GlobalScheduleOptions) { - .dataflow = 1, - }); - - auto node_count = thread->buffer.nodes.length; - VirtualBuffer(VirtualRegister) virtual_registers = {}; - auto* virtual_register_map = arena_allocate(thread->arena, u32, round_up_to_next_power_of_2(node_count + 16)); - { - u32 max_ins = 0; - u32 virtual_register_count = 1; - VirtualBuffer(u32) spills = {}; - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto basic_block_index = Index(BasicBlock, i); - BasicBlock* basic_block = &builder->basic_blocks.pointer[i]; - - cfg_list_schedule(thread, builder, function, basic_block_index); - - auto max_item_count = thread_worklist_length(thread, builder->worker); - print("Item count: {u32}\n", max_item_count); - - basic_block->items.length = 0; - - for (u32 i = 0; i < max_item_count; i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - basic_block_add_node(thread, basic_block, node_index, 5); - auto* node = thread_node_get(thread, node_index); - auto def_mask = node_constraint(thread, node, (Slice(RegisterMaskIndex)){}); - auto inputs = node->input_count + node_tmp_count(node); - - if (inputs > max_ins) - { - max_ins = inputs; - } - - u32 virtual_register_id = 0; - if (!index_equal(def_mask, empty_register_mask)) - { - if (node->id == MACHINE_MOVE) - { - assert(node->output_count == 1); - auto outputs = node_get_outputs(thread, node); - auto phi_index = outputs.pointer[0]; - auto* phi = thread_node_get(thread, phi_index); - assert(phi->id == IR_PHI); - - if (virtual_register_map[geti(phi_index)] == 0) - { - virtual_register_id = virtual_register_count; - virtual_register_count += 1; - virtual_register_map[geti(phi_index)] = virtual_register_id; - } - else - { - todo(); - } - } - else if (node->id == IR_PHI && virtual_register_map[geti(node_index)] > 0) - { - virtual_register_id = virtual_register_map[geti(node_index)]; - } - else - { - virtual_register_id = virtual_register_count; - virtual_register_count += 1; - } - } - - virtual_register_map[geti(node_index)] = virtual_register_id; - print("Assigning VR{u32} to node #{u32} ({s})\n", virtual_register_id, geti(node_index), node_id_to_string(node->id)); - } - } - auto ins = (Slice(RegisterMaskIndex)) { - .pointer = arena_allocate(thread->arena, RegisterMaskIndex, max_ins), - .length = max_ins, - }; - // TODO: remove? - memset(ins.pointer, 0, sizeof(RegisterMaskIndex) * max_ins); - - vb_ensure_capacity(&virtual_registers, cast_to(u32, u64, round_up_to_next_power_of_2(virtual_register_count + 16))); - virtual_registers.length = virtual_register_count; - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - - print("BB items: {u32}\n", basic_block->items.length); - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id >= 0 && virtual_register_id < virtual_register_count); - - if (virtual_register_id > 0 && node->id != MACHINE_MOVE) - { - auto mask_index = node_constraint(thread, node, (Slice(RegisterMaskIndex)){}); - print("Node #{u32} ({s}), VR{u32}, mask: ", geti(node_index), node_id_to_string(node->id), virtual_register_id); - if (validi(mask_index)) - { - print("0x{u32:x}", thread_register_mask_get(thread, mask_index)->mask); - } - else - { - print("invalid"); - } - print("\n"); - virtual_registers.pointer[virtual_register_id] = (VirtualRegister) { - .mask = mask_index, - .node_index = node_index, - .assigned = -1, - .spill_cost = NAN, - }; - } - } - } - - thread_worklist_clear(thread, builder->worker); - - u32 max_registers_in_class = 0; - auto* fixed = arena_allocate(thread->arena, s32, REGISTER_CLASS_X86_64_COUNT); - auto* in_use = arena_allocate(thread->arena, u32, REGISTER_CLASS_X86_64_COUNT); - - for (u32 class = 0; class < REGISTER_CLASS_X86_64_COUNT; class += 1) - { - auto count = register_count_per_class[class]; - max_registers_in_class = MAX(max_registers_in_class, count); - auto base = virtual_registers.length; - - for (u32 i = 0; i < count; i += 1) - { - auto mask = register_mask_intern(thread, (RegisterMask) { - .class = class, - .may_spill = 0, - .mask = class == 0 ? i : ((u32)1 << i), - }); - - *vb_add(&virtual_registers, 1) = (VirtualRegister) { - .mask = mask, - .class = cast_to(s16, u32, class), - .assigned = cast_to(s16, u32, i), - .spill_cost = INFINITY, - }; - } - - fixed[class] = cast_to(s32, u32, base); - } - - // Insert legalizing moves - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - // auto basic_block_index = Index(BasicBlock, i); - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto tmp_count = node_tmp_count(node); - node_constraint(thread, node, ins); - - auto inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - // auto* input = thread_node_get(thread, input_index); - auto in_mask_index = ins.pointer[i]; - - if (!index_equal(in_mask_index, empty_register_mask)) - { - auto in_mask = thread_register_mask_get(thread, in_mask_index); - VirtualRegister* vreg = 0; - auto vreg_index = virtual_register_map[geti(input_index)]; - if (vreg_index > 0) - { - vreg = &virtual_registers.pointer[vreg_index]; - } - assert(vreg); - auto vreg_mask = thread_register_mask_get(thread, vreg->mask); - - auto hint = fixed_register_mask(*in_mask); - if (hint >= 0 && vreg_mask->class == in_mask->class) - { - vreg->hint_vreg = fixed[in_mask->class] + hint; - } - - auto new_mask_index = register_mask_meet(thread, in_mask_index, vreg->mask); - print("Input #{u32} ({s})\n", geti(input_index), node_id_to_string(thread_node_get(thread, input_index)->id)); - print("IN mask index: {u32}. TODO: not equal: {u32}, {u32}, {u32}\n", i, in_mask_index, empty_register_mask, new_mask_index); - if (!index_equal(in_mask_index, empty_register_mask) && index_equal(new_mask_index, empty_register_mask)) - { - // if (node->id == MACHINE_COPY) - { - print("{s} input count: {u32}\n", node_id_to_string(node->id), (u32)node->input_count); - } - todo(); - } - - auto* new_mask = thread_register_mask_get(thread, new_mask_index); - auto fixed = fixed_register_mask(*new_mask); - - if (fixed >= 0) - { - // auto fixed_mask = ((u32)1 << fixed); - auto shared_edge = node_to_address(thread, input_index); - - if (shared_edge >= 0) - { - auto* input_node = thread_node_get(thread, input_index); - auto p_shared_edge = cast_to(u16, s32, shared_edge); - assert(p_shared_edge < input_node->input_count); - auto inputs = node_get_inputs(thread, input_node); - for (u16 i = 1; i < input_node->input_count; i += 1) - { - if (i != shared_edge) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - todo(); - } - } - } - } - } - - vreg->mask = new_mask_index; - } - } - } - - auto virtual_register_index = virtual_register_map[geti(node_index)]; - - if (tmp_count > 0) - { - todo(); - } - - if (virtual_register_index > 0) - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_index]; - virtual_register->spill_cost = NAN; - - if (node->id == MACHINE_COPY) - { - auto* in = thread_node_get(thread, inputs.pointer[1]); - if (in->id == IR_PHI) - { - thread_worklist_push(thread, builder->worker, node_index); - } - } - } - } - } - - u8 changes = 0; - - if (thread_worklist_length(thread, builder->worker) > 0) - { - // Compute ordinals - auto order = compute_ordinals(thread, builder->basic_blocks, node_count); - while (thread_worklist_length(thread, builder->worker) > 0) - { - auto node_index = thread_worklist_pop(thread, builder->worker); - auto* node = thread_node_get(thread, node_index); - assert(node->id == MACHINE_COPY); - auto id = virtual_register_map[geti(node_index)]; - assert(id > 0); - // auto mask_index = virtual_registers.pointer[id].mask; - auto inputs = node_get_inputs(thread, node); - - if (!interfere(thread, builder->scheduled, builder->basic_blocks, order, node_index, inputs.pointer[1])) - { - auto basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - u64 i = 0; - auto count = basic_block->items.length; - while (i < count && !index_equal(basic_block->items.pointer[i], node_index)) - { - i += 1; - } - - assert(index_equal(basic_block->items.pointer[i], node_index)); - memmove(&basic_block->items.pointer[i], &basic_block->items.pointer[i + 1], (count - (i + 1)) * sizeof(NodeIndex)); - basic_block->items.length -= 1; - builder->scheduled.pointer[geti(node_index)] = invalidi(BasicBlock); - subsume_node_without_killing(thread, node_index, inputs.pointer[1]); - changes = 1; - } - } - } - - // TODO: spills - if (spills.length) - { - todo(); - changes = 1; - } - - if (changes) - { - redo_dataflow(thread, builder->worker, builder->basic_blocks, builder->scheduled, node_count); - } - - auto al_index = 0; - // Allocate loop - while (1) - { - print("==============================\n#{u32} Allocate loop\n==============================\n", al_index++); - - auto order = compute_ordinals(thread, builder->basic_blocks, node_count); - - Bitset active = {}; - bitset_ensure_length(&active, virtual_registers.length); - Bitset future_active = {}; - bitset_ensure_length(&future_active, virtual_registers.length); - Bitset live_out = {}; - bitset_ensure_length(&live_out, node_count); - - for (u32 block_i = 0; block_i < builder->basic_blocks.length; block_i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[block_i]; - - for (u32 node_i = 0; node_i < basic_block->items.length; node_i += 1) - { - auto node_index = basic_block->items.pointer[node_i]; - auto virtual_register_id = virtual_register_map[geti(node_index)]; - - if (virtual_register_id > 0) - { - // auto* node = thread_node_get(thread, node_index); - - auto mask_index = virtual_registers.pointer[virtual_register_id].mask; - auto mask_pointer = thread_register_mask_get(thread, mask_index); - auto mask_value = *mask_pointer; - auto reg = fixed_register_mask(mask_value); - - // print("Block #{u32}, Node index #{u32}, Node GVN #{u32}, Node id: {s}, VR{u32}. Mask: {u32:x}. Reg: {u32:x}\n", block_i, node_i, geti(node_index), node_id_to_string(node->id), virtual_register_id, mask_value.mask, reg); - - if (reg >= 0) - { - todo(); - } - } - } - } - - if (spills.length) - { - todo(); - } - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - print("============\nBlock #{u32}\n============\n", i); - - auto basic_block_index = Index(BasicBlock, i); - - auto bb_live_in = &basic_block->live_in; - auto bb_live_out = &basic_block->live_out; - - FOREACH_SET(j, &live_out) if (!bitset_get(bb_live_in, j)) - { - auto virtual_register_id = virtual_register_map[j]; - print("General live out not present in basic block live in: N{u64}, VR{u32}\n", j, virtual_register_id); - if (virtual_register_id != 0) - { - u8 pause = 0; - for (u32 k = i; k < builder->basic_blocks.length; k += 1) - { - auto* other_basic_block = &builder->basic_blocks.pointer[k]; - if (bitset_get(&other_basic_block->live_in, j)) - { - unused(pause); - todo(); - } - } - - bitset_set_value(&active, virtual_register_id, 0); - bitset_set_value(&live_out, j, 0); - } - } - - FOREACH_SET(j, bb_live_in) if (!bitset_get(&live_out, j)) - { - auto virtual_register_id = virtual_register_map[j]; - print("Basic block live in not present in general live out: N{u64}, VR{u32}\n", j, virtual_register_id); - - if (virtual_register_id > 0) - { - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto node_index = virtual_register->node_index; - auto* node = thread_node_get(thread, node_index); - print("[BB LIVE IN ] Allocating register for node #{u32} ({s})\n", geti(node_index), node_id_to_string(node->id)); - } - - if (!register_allocate(thread, virtual_registers, &spills, &active, &future_active, builder->scheduled, builder->basic_blocks, order, virtual_register_id, 0)) - { - todo(); - } - } - } - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto def = order.pointer[geti(node_index)]; - - auto inputs = node_get_inputs(thread, node); - - print("Node #{u32} ({s}). Def: {u32}\n", geti(node_index), node_id_to_string(node->id), def); - - if (node->id == IR_PROJECTION && !index_equal(inputs.pointer[0], function->root)) - { - print("Skipping...\n"); - continue; - } - - if (node->id != IR_PHI) - { - print("Node is not PHI. Examining inputs ({u32})...\n", (u32)node->input_count); - - for (u16 i = 1; i < node->input_count; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto virtual_register_id = virtual_register_map[geti(input_index)]; - print("Input {u32}: node #{u32} ({s}). VR{u32}\n", i, geti(input_index), node_id_to_string(thread_node_get(thread, input_index)->id), virtual_register_id); - if (virtual_register_id == 0) - { - print("Invalid vreg id. Removing from general live out and skipping...\n"); - bitset_set_value(&live_out, geti(input_index), 0); - continue; - } - - if (!bitset_get(&live_out, geti(input_index))) - { - print("Duplicate input. Skipping...\n"); - continue; - } - - auto* input = thread_node_get(thread, input_index); - auto last_use = node_last_use_in_block(thread, builder->scheduled, order, input, basic_block_index); - print("Last use: {u32}\n", last_use); - - if (bitset_get(bb_live_out, geti(input_index))) - { - todo(); - } - - print("Removing node #{u32} from general liveout\n", geti(input_index)); - bitset_set_value(&live_out, geti(input_index), 0); - - auto pause = last_use > def; - if (!pause) - { - for (u32 i = geti(basic_block_index); i < builder->basic_blocks.length; i += 1) - { - auto* other = &builder->basic_blocks.pointer[i]; - if (bitset_get(&other->live_in, geti(input_index))) - { - pause = 1; - break; - } - } - } - - if (pause) - { - bitset_set_value(&future_active, virtual_register_id, 1); - } - - print("Removing VR{u32} from general active\n", virtual_register_id); - bitset_set_value(&active, virtual_register_id, 0); - } - } - } - - for (u32 i = 0; i < REGISTER_CLASS_X86_64_COUNT; i += 1) - { - in_use[i] = 0; - } - - // TODO: tmps - - auto virtual_register_id = virtual_register_map[geti(node_index)]; - - if (virtual_register_id > 0) - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto class = virtual_register->class; - auto in_use_local = in_use[class]; - print("[ALLOCATE LOOP] Allocating register for node #{u32} ({s}), VR{u32}\n", geti(node_index), node_id_to_string(node->id), virtual_register_id); - if (!register_allocate(thread, virtual_registers, &spills, &active, &future_active, builder->scheduled, builder->basic_blocks, order, virtual_register_id, in_use_local)) - { - todo(); - } - - print("[END ALLOCATE LOOP]\n"); - assert(virtual_register_map[geti(node_index)] == virtual_register_id); - - auto def = virtual_register->node_index; - bitset_set_value(&live_out, geti(def), 1); - print("Setting as general live out node #{u32} ({s})\n", geti(def), node_id_to_string(thread_node_get(thread, def)->id)); - } - else if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } - } - - break; - } - } - - // Basic block scheduling - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - auto basic_block_index = Index(BasicBlock, cast_to(u32, s64, basic_block - builder->basic_blocks.pointer)); - auto first_node = thread_node_get(thread, basic_block->items.pointer[0]); - auto item_count = basic_block->items.length; - u8 empty = 1; - - if (first_node->id == IR_REGION) - { - for (u32 i = 1; i < item_count; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - if (node->id != IR_PHI) - { - empty = 0; - break; - } - } - } - else if (item_count > 1 || node_is_control_projection(first_node)) - { - empty = 0; - } - - if (empty) - { - todo(); - } - else - { - basic_block->forward = cast_to(s32, u32, i); - - auto* bb_end = thread_node_get(thread, basic_block->end); - if (!cfg_node_terminator(bb_end)) - { - auto jump_node_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_JUMP, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - })), - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - auto successor_node_index = cfg_next_user(thread, basic_block->end); - auto* successor_node = thread_node_get(thread, successor_node_index); - auto successor_inputs = node_get_inputs(thread, successor_node); - u16 i; - for (i = 0; i < successor_node->input_count; i += 1) - { - auto input_index = successor_inputs.pointer[i]; - if (index_equal(input_index, basic_block->end)) - { - break; - } - } - assert(i < successor_node->input_count); - node_set_input(thread, successor_node_index, i, jump_node_index); - node_set_input(thread, jump_node_index, 0, basic_block->end); - basic_block->end = jump_node_index; - - basic_block_add_node(thread, basic_block, jump_node_index, 6); - - assert(builder->scheduled.length == geti(jump_node_index)); - *vb_add(&builder->scheduled, 1) = basic_block_index; - } - } - } - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - - auto forward = basic_block->forward; - while (forward != builder->basic_blocks.pointer[forward].forward) - { - forward = builder->basic_blocks.pointer[forward].forward; - } - - basic_block->forward = forward; - } - - auto* order = arena_allocate(thread->arena, s32, builder->basic_blocks.length); - - u32 order_index = 0; - for (s32 i = 0; i < cast_to(s32, u32, builder->basic_blocks.length); i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - if (basic_block->forward == i) - { - auto* end_node = thread_node_get(thread, basic_block->end); - if (end_node->id != IR_RETURN) - { - order[order_index] = i; - order_index += 1; - } - } - } - - for (s32 i = 0; i < cast_to(s32, u32, builder->basic_blocks.length); i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - if (basic_block->forward == i) - { - auto* end_node = thread_node_get(thread, basic_block->end); - if (end_node->id == IR_RETURN) - { - order[order_index] = i; - order_index += 1; - } - } - } - - // Emit - auto final_order_count = order_index; - - for (u32 order_index = 0; order_index < final_order_count; order_index += 1) - { - auto i = order[order_index]; - auto* basic_block = &builder->basic_blocks.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - // auto virtual_register_id = virtual_register_map[geti(node_index)]; - // auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto inputs = node_get_inputs(thread, node); - - auto fallthrough = INT32_MAX; - if (order_index + 1 < final_order_count) - { - fallthrough = order[order_index + 1]; - } - - switch (node->id) - { - case IR_PROJECTION: - case IR_REGION: - case IR_PHI: - break; - case IR_INTEGER_CONSTANT: - { - auto value = node->integer_constant.unsigned_value; - auto gpr = (GPR)machine_operand_at(virtual_register_map, virtual_registers, node_index, REGISTER_CLASS_X86_64_GPR); - auto backend_type = type_pair_get_backend(node->type); - - if (backend_type == BACKEND_TYPE_INTEGER_32) - { - if (value == 0) - { - if (gpr == RAX) - { -#ifdef __x86_64__ - *vb_add(&code, 1) = 0x31; - *vb_add(&code, 1) = 0xc0; -#else - *vb_add(&code, 1) = 0x2a; - *vb_add(&code, 1) = 0x1f; - *vb_add(&code, 1) = 0x03; - *vb_add(&code, 1) = 0xe0; -#endif - } - else - { - todo(); - } - } - else - { - todo(); - } - } - } break; - case MACHINE_MOVE: - { - auto destination = operand_from_node(virtual_registers, virtual_register_map, node_index); - auto source = operand_from_node(virtual_registers, virtual_register_map, inputs.pointer[1]); - if (!operand_equal(destination, source)) - { - todo(); - } - } break; - case MACHINE_JUMP: - { - auto successor_node_index = cfg_next_control(thread, node_index); - assert(validi(successor_node_index)); - auto successor_basic_block_index = fixed_block_map_get(&builder->block_map, successor_node_index); - assert(validi(successor_basic_block_index)); - auto* successor_basic_block = &builder->basic_blocks.pointer[geti(successor_basic_block_index)]; - if (fallthrough != successor_basic_block->forward) - { - todo(); - } - } break; - case IR_RETURN: - { -#ifdef __x86_64__ - *vb_add(&code, 1) = 0xc3; -#else - *vb_add(&code, 1) = 0xd6; - *vb_add(&code, 1) = 0x5f; - *vb_add(&code, 1) = 0x03; - *vb_add(&code, 1) = 0xc0; -#endif - } break; - default: - todo(); - } - } - } - } - - switch (options.backend) - { - case COMPILER_BACKEND_LLVM: - { - // TODO: delete, this is testing - llvm_codegen(options, object_path); - - auto lld_args = lld_driver(thread->arena, (LinkerArguments) { - .target = options.target, - .out_path = exe_path, - .objects = (Slice(String)) { .pointer = &object_path, .length = 1 }, - .link_libc = 1, - }); - - LLDArguments arguments = { - .disable_output = 0, - .exit_early = 1, - .argument_pointer = (const char**)lld_args.pointer, - .argument_count = lld_args.length, - }; - - u8 result; - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - result = lld_elf_link(arguments); - break; - case OPERATING_SYSTEM_MAC: - result = lld_macho_link(arguments); - break; - case OPERATING_SYSTEM_WINDOWS: - result = lld_coff_link(arguments); - break; - } - - if (!result) - { - failed_execution(); - } - } break; - case COMPILER_BACKEND_BB: - { - auto code_slice = (Slice(u8)) { .pointer = code.pointer, .length = code.length, }; - auto object_options = (ObjectOptions) { - .object_path = object_path, - .exe_path = exe_path, - .code = code_slice, - .dynamic = 1, - }; - - String executable; - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - { - executable = write_elf(thread, object_options); - write_pe(thread, object_options); - } break; - case OPERATING_SYSTEM_MAC: - { - executable = write_macho(thread, object_options); - } break; - case OPERATING_SYSTEM_WINDOWS: - { - executable = write_pe(thread, object_options); - } break; - } - - file_write((FileWriteOptions) { - .path = exe_path, - .content = (String) { executable.pointer, executable.length }, - .executable = 1, - }); - } break; - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -fn u8 node_is_empty_control_projection(Thread* restrict thread, CFGBuilder* restrict builder, NodeIndex node_index) -{ - auto* restrict node = thread_node_get(thread, node_index); - u8 result = 0; - - if (node_is_control_projection(node)) - { - auto basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - result = basic_block->items.length == 1; - } - - return result; -} - -STRUCT(SchedPhi) -{ - NodeIndex phi; - NodeIndex node; -}; -decl_vb(SchedPhi); - -fn void fill_phis(Thread* restrict thread, VirtualBuffer(SchedPhi)* sched_phis, Node* restrict successor_node, NodeIndex original_index) -{ - auto succesor_inputs = node_get_inputs(thread, successor_node); - u16 i; - for (i = 0; i < successor_node->input_count; i += 1) - { - auto input_index = succesor_inputs.pointer[i]; - if (index_equal(input_index, original_index)) - { - break; - } - } - assert(i < successor_node->input_count); - auto phi_index = i; - - auto successor_outputs = node_get_outputs(thread, successor_node); - for (u16 i = 0; i < successor_node->output_count; i += 1) - { - auto output_index = successor_outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output_index); - if (output_node->id == IR_PHI) - { - auto output_inputs = node_get_inputs(thread, output_node); - assert(phi_index + 1 < output_node->input_count); - *vb_add(sched_phis, 1) = (SchedPhi) { - .phi = output_index, - .node = output_inputs.pointer[phi_index + 1], - }; - } - } -} - -STRUCT(SchedNode) -{ - SchedNode* parent; - NodeIndex node_index; - s32 index; -}; - -fn u8 sched_in_basic_block(Thread* restrict thread, CFGBuilder* restrict builder, BasicBlockIndex basic_block_index, NodeIndex node_index) -{ - return index_equal(builder->scheduled.pointer[geti(node_index)], basic_block_index) && !thread_worklist_test_and_set(thread, builder->worker, node_index); -} - -fn void greedy_scheduler(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - thread_worklist_clear(thread, builder->worker); - - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - auto end_index = basic_block->end; - auto* end_node = thread_node_get(thread, end_index); - - VirtualBuffer(SchedPhi) phis = {}; - - if (node_is_cfg_fork(end_node)) - { - todo(); - } - else if (!cfg_is_endpoint(thread, end_node)) - { - auto successor_index = cfg_next_user(thread, end_index); - auto* successor_node = thread_node_get(thread, successor_index); - if (successor_node->id == IR_REGION) - { - fill_phis(thread, &phis, successor_node, end_index); - } - } - - auto* top = arena_allocate(thread->arena, SchedNode, 1); - *top = (SchedNode) - { - .node_index = end_index, - }; - thread_worklist_test_and_set(thread, builder->worker, end_index); - - if (geti(basic_block_index) == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root_node); - for (u16 i = 0; i < root_node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output_index); - - if (output_node->id == IR_PROJECTION && !thread_worklist_test_and_set(thread, builder->worker, output_index)) - { - thread_worklist_push_array(thread, builder->worker, output_index); - } - } - } - - u64 phi_current = 0; - u64 leftovers = 0; - auto leftover_count = basic_block->items.length; - - while (top) - { - auto node_index = top->node_index; - auto* node = thread_node_get(thread, node_index); - - if (node->id != IR_PHI && top->index < node->input_capacity) - { - auto inputs = node_get_inputs(thread, node); - auto input_index = inputs.pointer[top->index]; - top->index += 1; - - if (validi(input_index)) - { - auto* input_node = thread_node_get(thread, input_index); - if (input_node->id == IR_PROJECTION) - { - auto projection_inputs = node_get_inputs(thread, input_node); - input_index = projection_inputs.pointer[0]; - input_node = thread_node_get(thread, input_index); - } - - if (sched_in_basic_block(thread, builder, basic_block_index, input_index)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = input_index, - .parent = top, - }; - top = new_top; - } - } - - continue; - } - - if (index_equal(end_index, node_index)) - { - if (phi_current < phis.length) - { - auto* restrict phi = &phis.pointer[phi_current]; - phi_current += 1; - - auto value = phi->node; - if (sched_in_basic_block(thread, builder, basic_block_index, value)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = value, - .parent = top, - }; - top = new_top; - } - - continue; - } - - auto try_again = 0; - while (leftovers < leftover_count) - { - auto index = leftovers; - leftovers += 1; - - auto bb_node_index = basic_block->items.pointer[index]; - - if (!thread_worklist_test_and_set(thread, builder->worker, bb_node_index)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = bb_node_index, - .parent = top, - }; - top = new_top; - try_again = 1; - break; - } - } - - if (try_again) - { - continue; - } - } - - thread_worklist_push_array(thread, builder->worker, node_index); - auto* parent = top->parent; - top = parent; - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } -} - -fn void print_reference_to_node(Thread* restrict thread, NodeIndex node_index, u8 def) -{ - unused(def); - auto* restrict node = thread_node_get(thread, node_index); - print("[#{u32} ({s})", geti(node_index), node_id_to_string(node->id)); - - switch (node->id) - { - case IR_PROJECTION: - { - if (node_is_control_projection(node)) - { - todo(); - } - else - { - } - } break; - case IR_INTEGER_CONSTANT: - { - print(": 0x{u64:x}", node->integer_constant.unsigned_value); - } break; - // TODO: - case IR_REGION: - break; - case IR_PHI: - break; - case MACHINE_COPY: - case MACHINE_MOVE: - break; - default: - todo(); - } - - print("]"); -} - -fn void print_basic_block(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - print_reference_to_node(thread, basic_block->start, 1); - print("\n"); - greedy_scheduler(thread, builder, function, basic_block_index); - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - auto* node = thread_node_get(thread, node_index); - - switch (node->id) - { - case IR_PROJECTION: - case IR_INTEGER_CONSTANT: - case IR_REGION: - case IR_PHI: - continue; - case MACHINE_MOVE: - case MACHINE_COPY: - case IR_RETURN: - { - auto is_branch = 0; - - if (is_branch) - { - todo(); - } - else if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else - { - print(" "); - print("#{u32}", geti(node_index)); - print(" = {s}.", node_id_to_string(node->id)); - // TODO: print type - } - - print(" I({u32})", (u32)node->input_count); - - u64 first = node->id != IR_PROJECTION; - auto inputs = node_get_inputs(thread, node); - if (node->input_count - first) - { - print(": "); - for (auto i = first; i < node->input_count; i += 1) - { - if (i != first) - { - print(", "); - } - print_reference_to_node(thread, inputs.pointer[i], 0); - } - } - else - { - print(" "); - } - - switch (node->id) - { - case MACHINE_MOVE: - case MACHINE_COPY: - case IR_REGION: - case IR_PHI: - case IR_RETURN: - break; - default: - todo(); - } - } break; - default: - todo(); - } - - print("\n"); - } - - thread_worklist_clear(thread, builder->worker); - - auto* end_node = thread_node_get(thread, basic_block->end); - if (cfg_node_terminator(end_node)) - { - // todo(); - } -} - -fn void print_ir(Thread* restrict thread) -{ - auto cfg_builder = cfg_builder_init(thread); - auto* restrict builder = &cfg_builder; - - for (u32 i = 0; i < thread->buffer.functions.length; i += 1) - { - Function* restrict function = &thread->buffer.functions.pointer[i]; - cfg_builder_clear(builder, thread); - - cfg_build_and_global_schedule(builder, thread, function, (GlobalScheduleOptions) { - .dataflow = 0, - }); - - auto end_basic_block_index = invalidi(BasicBlock); - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* restrict basic_block = &builder->basic_blocks.pointer[i]; - auto end_node_index = basic_block->end; - auto* end_node = thread_node_get(thread, end_node_index); - if (end_node->id == IR_RETURN) - { - end_basic_block_index = Index(BasicBlock, i); - continue; - } - else if (node_is_empty_control_projection(thread, builder, end_node_index)) - { - continue; - } - - print_basic_block(thread, builder, function, Index(BasicBlock, i)); - } - - if (validi(end_basic_block_index)) - { - print_basic_block(thread, builder, function, end_basic_block_index); - } - } -} - -void entry_point(int argc, char* argv[], char* envp[]) -{ - // unused(envp); -#if DO_UNIT_TESTS - unit_tests(); -#endif - -#if BB_CI - Arena* global_arena = arena_init(MB(512), KB(64), KB(64)); - - { - arguments.length = cast_to(u64, s32, argc); - arguments.pointer = arena_allocate(global_arena, String, arguments.length); - - for (int i = 0; i < argc; i += 1) - { - arguments.pointer[i] = cstr(argv[i]); - } - } - - Thread* thread = arena_allocate(global_arena, Thread, 1); - thread_init(thread); - - // clang -c main.c -o main.o -g -Oz -fno-exceptions -fno-asynchronous-unwind-tables -fno-addrsig -fno-stack-protector -fno-ident - // dwarf_playground(thread); - - if (argc < 3) - { - failed_execution(); - } - - String source_file_path = arguments.pointer[1]; - CompilerBackend compiler_backend = one_char_string_to_compiler_backend(arguments.pointer[2]); - if (compiler_backend == COMPILER_BACKEND_COUNT) - { - print("Invalid backend: {s}\n", arguments.pointer[2]); - failed_execution(); - } - u8 emit_ir = arguments.length >= 4 && arguments.pointer[3].pointer[0] == 'y'; - - Target target = native_target_get(); - - os_directory_make(strlit(BB_DIR)); - - File file = { - .path = source_file_path, - .source = file_read(thread->arena, source_file_path), - }; - analyze_file(thread, &file); - - if (thread->main_function == -1) - { - failed_execution(); - } - - print("File path: {s}\n", source_file_path); - auto test_dir = path_no_extension(file.path); - print("Test dir path: {s}\n", test_dir); - auto test_name = path_base(test_dir); - print("Test name: {s}\n", test_name); - - if (emit_ir) - { - print_ir(thread); - } - else - { - code_generation(thread, (CodegenOptions) { - .test_name = test_name, - .backend = compiler_backend, - .target = target, - }); - } - - thread_clear(thread); -#else - run_app(); -#endif -} diff --git a/bootstrap/bloat-buster/pdb_image.c b/bootstrap/bloat-buster/pdb_image.c deleted file mode 100644 index 28599f1..0000000 --- a/bootstrap/bloat-buster/pdb_image.c +++ /dev/null @@ -1,8964 +0,0 @@ -#include - -u8 pdb_image[143360] = { - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x2F, 0x43, 0x2B, 0x2B, 0x20, - 0x4D, 0x53, 0x46, 0x20, 0x37, 0x2E, 0x30, 0x30, 0x0D, 0x0A, 0x1A, 0x44, 0x53, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0xD0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0xE7, 0x2E, 0xFE, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 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, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, - 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, - 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, - 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, - 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, - 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, 0x07, 0x00, 0x00, 0x00, - 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x3D, 0x11, 0x00, 0x63, 0x77, 0x64, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, - 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, - 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, - 0x3A, 0x00, 0x3C, 0x11, 0x00, 0x40, 0x00, 0x00, 0xD0, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4F, 0x70, 0x74, 0x69, 0x6D, 0x69, 0x7A, 0x69, - 0x6E, 0x67, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x2E, 0x00, 0x10, 0x11, - 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x10, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x39, 0x11, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x4C, 0x11, 0x10, 0x10, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, - 0xF4, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x03, 0x2C, 0x8A, - 0x49, 0x32, 0x20, 0x5B, 0x4D, 0x41, 0xA0, 0x3A, 0x81, 0x12, 0xE6, 0xF9, 0x5D, 0x5A, 0x33, 0x70, - 0x44, 0xA3, 0x93, 0x51, 0x1E, 0x17, 0xA3, 0x32, 0x4E, 0xA9, 0x6E, 0x80, 0x1C, 0xCE, 0x00, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x20, 0x03, 0x6A, 0x10, 0xE9, 0xF0, 0x50, 0x5B, 0x89, 0x6D, 0x35, 0x6D, - 0x98, 0x6D, 0x67, 0x1C, 0x93, 0x9B, 0x7F, 0xB0, 0x60, 0x20, 0x12, 0xE4, 0x63, 0x31, 0x4F, 0xF7, - 0xBF, 0xD0, 0x18, 0x2A, 0x86, 0x1F, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x03, 0xDD, 0xB4, - 0xF8, 0xA4, 0xB4, 0xA7, 0xB3, 0x0D, 0x4F, 0xF1, 0x59, 0x39, 0x41, 0xF5, 0x92, 0x79, 0x60, 0x6C, - 0x76, 0xB6, 0xD9, 0x58, 0xEB, 0x4C, 0x30, 0xEC, 0xC7, 0xDC, 0xA0, 0x1D, 0x9F, 0x07, 0x00, 0x00, - 0x25, 0x01, 0x00, 0x00, 0x20, 0x03, 0xC7, 0x6A, 0xB8, 0xA5, 0x63, 0x1A, 0x32, 0x3E, 0xB0, 0xB1, - 0x9D, 0xEE, 0x4B, 0xDA, 0xD1, 0xC5, 0xF7, 0x5D, 0xB1, 0x3C, 0x2D, 0xF4, 0x9A, 0x22, 0x91, 0x77, - 0x66, 0xFE, 0xD8, 0x5B, 0x3F, 0x41, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x20, 0x03, 0xE0, 0xF9, - 0x9E, 0x5F, 0x43, 0x19, 0x42, 0x63, 0x25, 0xDD, 0xBF, 0x4A, 0x6D, 0x4E, 0x23, 0x29, 0x8E, 0xED, - 0x9B, 0x08, 0x06, 0xEF, 0x49, 0xED, 0x6C, 0x95, 0xAD, 0x9D, 0xEC, 0xE7, 0x0D, 0x82, 0x00, 0x00, - 0xBE, 0x01, 0x00, 0x00, 0x20, 0x03, 0x36, 0xFD, 0x04, 0xBA, 0x37, 0xAA, 0xCF, 0x40, 0x4C, 0xB8, - 0x2E, 0xFF, 0xB9, 0xA3, 0x86, 0x34, 0xB5, 0x02, 0x99, 0x6F, 0x07, 0x9A, 0x01, 0x21, 0xAE, 0xEA, - 0x51, 0x91, 0xF5, 0xF4, 0x24, 0xFB, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x20, 0x03, 0x79, 0x6B, - 0x22, 0x26, 0x80, 0x97, 0x90, 0x07, 0x89, 0x84, 0xB9, 0x19, 0x54, 0x2D, 0x81, 0x8C, 0xE7, 0x41, - 0x90, 0xD2, 0x11, 0x0B, 0x11, 0x9F, 0x93, 0xC2, 0xA7, 0xC3, 0x88, 0x2B, 0x5D, 0xE5, 0x00, 0x00, - 0x52, 0x02, 0x00, 0x00, 0x20, 0x03, 0x8D, 0x76, 0x13, 0x5F, 0xF4, 0x01, 0x40, 0xC6, 0xD6, 0x4A, - 0x09, 0xD1, 0x73, 0xE1, 0x27, 0x6F, 0xEF, 0xB9, 0x6A, 0x2D, 0xB9, 0x07, 0x3B, 0x5A, 0xB2, 0x6F, - 0x25, 0x0C, 0x47, 0x33, 0xF9, 0x99, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0x20, 0x03, 0x18, 0xCA, - 0x52, 0x04, 0x16, 0x57, 0x91, 0x83, 0xBC, 0x36, 0x9C, 0x0A, 0x8E, 0x55, 0x59, 0x14, 0xDB, 0x5C, - 0x75, 0x77, 0x07, 0x5B, 0x93, 0x59, 0x17, 0x3F, 0xC6, 0xBC, 0x45, 0x59, 0x55, 0x60, 0x00, 0x00, - 0xF0, 0x02, 0x00, 0x00, 0x20, 0x03, 0x27, 0x90, 0x4E, 0x90, 0x09, 0x38, 0x74, 0x9C, 0x12, 0xA4, - 0xD1, 0xE7, 0x41, 0xAF, 0xD5, 0x64, 0x19, 0x8A, 0x57, 0xA2, 0x47, 0x24, 0xC1, 0xDD, 0xD3, 0x6C, - 0xD3, 0x30, 0x22, 0x24, 0xDF, 0x26, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x20, 0x03, 0xF2, 0xE0, - 0x91, 0x84, 0x1C, 0x3E, 0xFE, 0x2F, 0x18, 0x7F, 0xE7, 0x03, 0xA0, 0xF5, 0x62, 0xCC, 0xE6, 0x54, - 0xCA, 0x82, 0xE6, 0x8C, 0x34, 0x36, 0x98, 0xB0, 0x6E, 0xC6, 0x7F, 0x9B, 0xA0, 0x39, 0x00, 0x00, - 0x90, 0x03, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x4E, 0x8D, 0xF9, 0x6F, 0x05, 0x7F, 0xDE, 0xBC, 0x04, - 0x74, 0xBD, 0x76, 0x5C, 0xEE, 0x3A, 0xE1, 0x7D, 0xE3, 0x4A, 0x2B, 0x1F, 0xC9, 0xD1, 0x97, 0x59, - 0x73, 0x21, 0xF2, 0xD1, 0xE4, 0x47, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x20, 0x03, 0x72, 0x95, - 0x69, 0x9A, 0x85, 0xD8, 0x9A, 0xC3, 0x8B, 0xF0, 0xC3, 0xC2, 0xBB, 0x13, 0xCE, 0xBB, 0x7D, 0xE9, - 0x23, 0x8A, 0xEF, 0x87, 0x89, 0x6F, 0xF8, 0xD1, 0xC7, 0x80, 0x96, 0xE9, 0x70, 0x91, 0x00, 0x00, - 0xFB, 0x03, 0x00, 0x00, 0x20, 0x03, 0xDE, 0xE2, 0x7F, 0x27, 0x12, 0xB9, 0xE7, 0x2C, 0xA7, 0x8A, - 0x40, 0x48, 0x34, 0x73, 0x53, 0x03, 0xD1, 0x6B, 0xDB, 0x21, 0xC8, 0xAA, 0x3A, 0xDD, 0xAC, 0xA7, - 0xDB, 0xCA, 0x22, 0x66, 0x45, 0x29, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x20, 0x03, 0xD0, 0x71, - 0x10, 0xE7, 0xF7, 0x98, 0x9A, 0xEE, 0xF7, 0xEE, 0xD7, 0x7D, 0x5F, 0x58, 0x4F, 0x3E, 0xE6, 0x0F, - 0xF2, 0xCE, 0x58, 0xBC, 0x1A, 0x37, 0x4D, 0x70, 0x15, 0x1A, 0x18, 0xB4, 0xA6, 0x64, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x74, 0x12, 0xDF, 0x50, 0x2F, 0xB6, 0xEA, 0x39, 0x0C, - 0x96, 0xD7, 0xC9, 0xF8, 0x05, 0xA2, 0xA2, 0x11, 0x60, 0x9B, 0x95, 0xB8, 0xFD, 0xB4, 0x74, 0x05, - 0x40, 0xF7, 0x89, 0xD9, 0xC4, 0xCE, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x20, 0x03, 0x83, 0x18, - 0x07, 0x66, 0x77, 0xFB, 0xA2, 0x76, 0xE4, 0x94, 0xED, 0xC3, 0x9A, 0xAA, 0xC1, 0x1F, 0xBD, 0x9B, - 0xC6, 0x1C, 0xA2, 0xD3, 0x6B, 0xB6, 0x8B, 0xDC, 0xCC, 0xD2, 0x60, 0xEC, 0xE9, 0x77, 0x00, 0x00, - 0x2C, 0x05, 0x00, 0x00, 0x20, 0x03, 0xFB, 0x3A, 0xAE, 0xEF, 0x32, 0x4B, 0x5D, 0x00, 0xCE, 0x0A, - 0x6A, 0xE1, 0x17, 0x02, 0xDC, 0xC3, 0xC1, 0xDE, 0x65, 0xFA, 0x0A, 0x10, 0xCA, 0xAA, 0xB4, 0x33, - 0x6B, 0x97, 0xD3, 0xAD, 0xF4, 0x93, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x20, 0x03, 0xA5, 0x0D, - 0x0E, 0xF5, 0xCF, 0xE9, 0x6D, 0x63, 0x4A, 0x41, 0xEE, 0x9A, 0x97, 0x74, 0x9C, 0x14, 0x71, 0x65, - 0xF8, 0x65, 0x6C, 0xDF, 0xED, 0x5D, 0xF5, 0x3B, 0xC2, 0x4C, 0x8A, 0xDB, 0x12, 0x10, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x3F, 0x65, 0x9F, 0x98, 0xB3, 0xF1, 0x74, 0x8A, 0x31, - 0x4B, 0xD6, 0x41, 0x06, 0x58, 0x3D, 0x01, 0x64, 0x93, 0x33, 0xE0, 0x41, 0x9B, 0x66, 0x23, 0x2B, - 0x4F, 0x64, 0xB3, 0xF8, 0x5B, 0x0C, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x84, - 0xE2, 0x06, 0x81, 0xFD, 0x3D, 0xE7, 0x3C, 0xE1, 0x4A, 0xB0, 0x9D, 0x75, 0x9D, 0x5B, 0x4F, 0xAF, - 0x03, 0xF7, 0xD6, 0x6A, 0x78, 0x60, 0x2D, 0xA2, 0xAC, 0x92, 0x34, 0xB2, 0x4D, 0xF4, 0x00, 0x00, - 0x59, 0x06, 0x00, 0x00, 0x20, 0x03, 0xB0, 0x52, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x36, 0xD0, 0xC1, 0x0D, 0x2A, 0x7E, 0x10, 0x9D, 0x7F, 0xD1, 0xA7, 0x26, 0x59, 0x81, 0xCB, 0xB6, - 0xAD, 0x11, 0xB8, 0xCE, 0xE9, 0x26, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, - 0xC4, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, - 0x60, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0xA8, 0x02, 0x00, 0x00, - 0xBC, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, - 0x40, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, - 0x84, 0x03, 0x00, 0x00, 0xA4, 0x03, 0x00, 0x00, 0xB4, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, - 0xD4, 0x03, 0x00, 0x00, 0xE4, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, - 0x14, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, - 0x54, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, - 0x98, 0x04, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00, 0xC8, 0x04, 0x00, 0x00, - 0xD8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x1A, 0x09, 0x2F, 0xF1, 0x90, 0x01, 0x00, 0x00, 0xC8, 0x02, 0x00, 0x00, - 0xE1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x89, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x79, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x21, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x7D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x41, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x51, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x31, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x81, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x99, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0D, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x45, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xBD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xD1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x55, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x25, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 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, 0x02, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, - 0xB4, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, - 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, - 0x50, 0x01, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, - 0xB0, 0x01, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0xC8, 0x01, 0x00, 0x00, 0xD4, 0x01, 0x00, 0x00, - 0xE0, 0x01, 0x00, 0x00, 0xEC, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, - 0x10, 0x02, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, - 0x40, 0x02, 0x00, 0x00, 0x4C, 0x02, 0x00, 0x00, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x16, 0x00, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x42, 0x41, 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x2E, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, 0x41, 0x47, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x36, 0x00, 0x07, 0x11, - 0x08, 0x10, 0x00, 0x00, 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x53, 0x54, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, - 0x4D, 0x45, 0x00, 0x00, 0x3A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0x00, - 0x42, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x08, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, - 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, 0x46, 0x54, 0x5F, 0x43, - 0x41, 0x50, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x11, 0x0A, 0x10, 0x00, 0x00, 0x03, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0x00, - 0x1E, 0x00, 0x07, 0x11, 0x0C, 0x10, 0x00, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0x00, - 0x36, 0x00, 0x07, 0x11, 0x0E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, - 0x41, 0x43, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x49, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, - 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, - 0x1E, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, - 0x69, 0x6D, 0x70, 0x5F, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x16, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, - 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, - 0x33, 0x32, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x7F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, - 0x5F, 0x54, 0x48, 0x55, 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x50, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1A, 0x09, 0x2F, 0xF1, 0x28, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x04, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, - 0x10, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0xE8, 0x04, 0x00, 0x00, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, - 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x69, 0x6D, 0x70, 0x5F, - 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x0E, 0x11, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x00, 0x00, - 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x29, 0x8E, - 0x0E, 0x00, 0x48, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xA8, 0x01, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0A, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0F, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, - 0x6F, 0x62, 0x6A, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, - 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, - 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, - 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, 0x69, 0x62, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, 0x6C, 0x69, 0x62, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x4B, 0x45, 0x52, 0x4E, 0x45, - 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, - 0x69, 0x62, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, - 0x6C, 0x69, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, - 0x2D, 0xBA, 0x2E, 0xF1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xC0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xDC, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x88, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, - 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, - 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, - 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, - 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, - 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, - 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, - 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, - 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, - 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, - 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, - 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, - 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, - 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, - 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, - 0x65, 0x73, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, - 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, - 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, - 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6D, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x69, 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, - 0x70, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, - 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, - 0x5F, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, - 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, - 0x65, 0x72, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, - 0x70, 0x69, 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x00, 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, - 0x2E, 0x70, 0x64, 0x62, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x23, 0x1E, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, - 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, - 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, - 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, - 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, - 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, - 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, - 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, - 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, - 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, - 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, - 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, - 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, - 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, - 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, - 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, - 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, - 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, - 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, - 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, - 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, - 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, - 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, - 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, - 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, - 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, 0x68, 0x61, - 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x66, - 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x69, - 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, 0x70, 0x61, - 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x75, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, - 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, - 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, - 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, 0x65, 0x72, - 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, - 0x47, 0x53, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, - 0x41, 0x47, 0x53, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x52, 0x65, 0x70, 0x6C, - 0x61, 0x63, 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, - 0x63, 0x44, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, - 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, - 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x8B, - 0x00, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x97, 0x1D, 0x00, 0x00, 0xA5, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0xE1, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF7, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, - 0x0D, 0x00, 0x00, 0x75, 0x1D, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x10, 0x00, 0x00, 0x5D, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0xD4, - 0x0E, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0xCC, 0x1A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x0D, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x2C, - 0x05, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0xAC, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x1D, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0xDB, - 0x1C, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xA8, 0x0C, 0x00, 0x00, 0x29, - 0x0E, 0x00, 0x00, 0x0C, 0x17, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x0D, - 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x00, 0x00, 0xED, - 0x1D, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFC, - 0x17, 0x00, 0x00, 0xF3, 0x18, 0x00, 0x00, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, - 0x0A, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0xFA, 0x1B, 0x00, 0x00, 0x74, - 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x28, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, - 0x09, 0x00, 0x00, 0xC3, 0x05, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x91, - 0x00, 0x00, 0x00, 0xAB, 0x17, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0xC7, - 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0xC0, - 0x16, 0x00, 0x00, 0x92, 0x11, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0xA1, - 0x13, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0xED, 0x13, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x55, - 0x13, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x30, 0x12, 0x00, 0x00, 0x19, 0x15, 0x00, 0x00, 0x90, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x71, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, - 0x01, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x99, - 0x19, 0x00, 0x00, 0xB5, 0x15, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x6D, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xD9, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0xAC, 0x07, 0x00, 0x00, 0x67, - 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, 0x01, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xAD, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x10, 0x00, 0x00, - 0x68, 0x04, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, - 0x9C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 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, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xA2, 0x5E, 0xFD, 0x66, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xC9, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xE4, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/bootstrap/bloat-buster/pdb_image.h b/bootstrap/bloat-buster/pdb_image.h deleted file mode 100644 index 53fc9c6..0000000 --- a/bootstrap/bloat-buster/pdb_image.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -extern u8 pdb_image[143360]; diff --git a/bootstrap/std/base.c b/bootstrap/std/base.c deleted file mode 100644 index 8e03c85..0000000 --- a/bootstrap/std/base.c +++ /dev/null @@ -1,463 +0,0 @@ -#pragma once - -#if _MSC_VER -extern u32 _lzcnt_u32(u32); -extern u32 _tzcnt_u32(u32); -extern u64 _lzcnt_u64(u64); -extern u64 _tzcnt_u64(u64); -#endif - -fn u8 leading_zeroes_u32(u32 value) -{ -#if _MSC_VER - return (u8)_lzcnt_u32(value); -#else - return __builtin_clz(value); -#endif -} - -fn u8 leading_zeroes_u64(u64 value) -{ -#if _MSC_VER - return (u8)_lzcnt_u64(value); -#else - return __builtin_clzll(value); -#endif -} - -fn u8 log2_alignment(u64 alignment) -{ - assert(alignment != 0); - assert((alignment & (alignment - 1)) == 0); - u8 left = (sizeof(alignment) * 8) - 1; - u8 right = leading_zeroes_u64(alignment); - let_cast(u8, result, left - right); - return result; -} - -fn u8 log2_u64(u64 v) -{ - assert(v != 0); - return (sizeof(u64) * 8 - 1) - leading_zeroes_u64(v); -} - -fn u8 log2_u32(u32 v) -{ - assert(v != 0); - return (sizeof(u32) * 8 - 1) - leading_zeroes_u32(v); -} - -fn u8 hex_digit_count(u64 v) -{ - u8 result = 1; - if (v) - { - result = log2_u64(v) / log2_u64(16) + 1; - } - - return result; -} - -fn u128 u128_from_u64(u64 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = { .low = n }; - return result; -#else - return n; -#endif -} - -fn u64 u64_from_u128(u128 n) -{ -#if defined (__TINYC__) || defined(_MSC_VER) - return n.low; -#else - return (u64)n; -#endif -} - -fn u128 u128_shift_right(u128 value, u16 n) -{ -#if defined (__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - if (n < 128) - { - if (n >= 64) - { - // If n >= 64, only the high part contributes to the low part - result.low = value.high >> (n - 64); - result.high = 0; - } - else - { - // Standard case: n < 64 - result.low = (value.low >> n) | (value.high << (64 - n)); - result.high = value.high >> n; - } - } - - return result; -#else - return value >> n; -#endif -} - -fn u128 u128_shift_left(u128 value, u16 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - if (n < 128) - { - if (n >= 64) - { - // If n >= 64, only the low part contributes to the high part - result.high = value.low << (n - 64); - result.low = 0; - } - else - { - // Standard case: n < 64 - result.high = (value.high << n) | (value.low >> (64 - n)); - result.low = value.low << n; - } - } - - return result; -#else - return value << n; -#endif -} - -fn u128 u128_u64_or(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - a.low |= b; - return a; -#else - return a | b; -#endif -} - -fn u128 u128_u64_add(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result; - - // Add the lower 64 bits and check for overflow - result.low = a.low + b; - u64 carry = (result.low < a.low) ? 1 : 0; - - // Add the carry to the upper 64 bits - result.high = a.high + carry; - - return result; -#else - return a + b; -#endif -} - -// Multiply two u128 values -fn u128 u128_u64_mul(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - // Compute low and high parts of the product - u64 low_low = (a.low & 0xFFFFFFFF) * (b & 0xFFFFFFFF); - u64 low_high = (a.low >> 32) * (b & 0xFFFFFFFF); - u64 high_low = (a.low & 0xFFFFFFFF) * (b >> 32); - u64 high_high = (a.low >> 32) * (b >> 32); - - // Combine partial products for the lower 64 bits - u64 carry = (low_low >> 32) + (low_high & 0xFFFFFFFF) + (high_low & 0xFFFFFFFF); - result.low = (low_low & 0xFFFFFFFF) | (carry << 32); - - // Add carry from lower to the high product - result.high = a.high * b + (low_high >> 32) + (high_low >> 32) + (carry >> 32) + high_high; - - return result; -#else - return a * b; -#endif -} - -fn u64 u128_shift_right_by_64(u128 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - return n.high; -#else - return n >> 64; -#endif -} - -// Lehmer's generator -// https://lemire.me/blog/2019/03/19/the-fastest-conventional-random-number-generator-that-can-pass-big-crush/ -global_variable u128 rn_state; -fn u64 generate_random_number() -{ - rn_state = u128_u64_mul(rn_state, 0xda942042e4dd58b5); - return u128_shift_right_by_64(rn_state); -} - -fn u64 next_power_of_two(u64 n) -{ - n -= 1; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n |= n >> 32; - n += 1; - return n; -} - -fn u64 absolute_int(s64 n) -{ - return n < 0 ? cast_to(u64, -n) : cast_to(u64, n); -} - -fn u64 parse_decimal(String string) -{ - u64 value = 0; - for (u64 i = 0; i < string.length; i += 1) - { - u8 ch = s_get(string, i); - assert(((ch >= '0') & (ch <= '9'))); - value = (value * 10) + (ch - '0'); - } - - return value; -} - -fn u8 get_next_ch_safe(String string, u64 index) -{ - u64 next_index = index + 1; - u64 is_in_range = next_index < string.length; - u64 safe_index = safe_flag(next_index, is_in_range); - u8 unsafe_result = string.pointer[safe_index]; - u64 safe_result = safe_flag(unsafe_result, is_in_range); - assert(safe_result < 256); - return (u8)safe_result; -} - -fn u32 is_space(u8 ch, u8 next_ch) -{ - u32 is_comment = (ch == '/') & (next_ch == '/'); - u32 is_whitespace = ch == ' '; - u32 is_vertical_tab = ch == 0x0b; - u32 is_horizontal_tab = ch == '\t'; - u32 is_line_feed = ch == '\n'; - u32 is_carry_return = ch == '\r'; - u32 result = (((is_vertical_tab | is_horizontal_tab) | (is_line_feed | is_carry_return)) | (is_comment | is_whitespace)); - return result; -} - -fn u64 is_lower(u8 ch) -{ - return (ch >= 'a') & (ch <= 'z'); -} - -fn u64 is_upper(u8 ch) -{ - return (ch >= 'A') & (ch <= 'Z'); -} - -fn u64 is_alphabetic(u8 ch) -{ - return is_lower(ch) | is_upper(ch); -} - -fn u64 is_decimal_digit(u8 ch) -{ - return (ch >= '0') & (ch <= '9'); -} - -fn u64 is_alphanumeric(u8 ch) -{ - return is_alphabetic(ch) | is_decimal_digit(ch); -} - -fn u64 is_hex_digit_alpha_lower(u8 ch) -{ - return (ch >= 'a') & (ch <= 'f'); -} - -fn u64 is_hex_digit_alpha_upper(u8 ch) -{ - return (ch >= 'A') & (ch <= 'F'); -} - -fn u64 is_hex_digit_alpha(u8 ch) -{ - return is_hex_digit_alpha_lower(ch) | is_hex_digit_alpha_upper(ch); -} - -fn u64 is_hex_digit(u8 ch) -{ - return is_decimal_digit(ch) | is_hex_digit_alpha(ch); -} - -fn u8 hex_ch_to_int(u8 ch) -{ - if ((ch >= '0') & (ch <= '9')) - { - return ch - '0'; - } - else if ((ch >= 'a') & (ch <= 'f')) - { - return ch - 'a' + 10; - } - else if ((ch >= 'A') & (ch <= 'F')) - { - return ch - 'A' + 10; - } - else - { - unreachable(); - } -} - -fn u64 is_identifier_start(u8 ch) -{ - u64 alphabetic = is_alphabetic(ch); - u64 is_underscore = ch == '_'; - return alphabetic | is_underscore; -} - -fn u64 is_identifier_ch(u8 ch) -{ - u64 identifier_start = is_identifier_start(ch); - u64 decimal = is_decimal_digit(ch); - return identifier_start | decimal; -} - -fn Hash64 hash_byte(Hash64 source, u8 ch) -{ - source ^= ch; - source *= fnv_prime; - return source; -} - -fn Hash64 hash_bytes(String bytes) -{ - u64 result = fnv_offset; - for (u64 i = 0; i < bytes.length; i += 1) - { - result = hash_byte(result, bytes.pointer[i]); - } - - return result; -} - -fn Hash32 hash64_to_hash32(Hash64 hash64) -{ - Hash32 low = hash64 & 0xffff; - Hash32 high = (hash64 >> 32) & 0xffff; - Hash32 result = (high << 16) | low; - return result; -} - -fn u64 align_forward_u32(u32 value, u32 alignment) -{ - u32 mask = alignment - 1; - u32 result = (value + mask) & ~mask; - return result; -} - -fn u32 align_backward_u32(u32 value, u32 alignment) -{ - u32 result = value & ~(alignment - 1); - return result; -} - -fn u64 align_forward_u64(u64 value, u64 alignment) -{ - u64 mask = alignment - 1; - u64 result = (value + mask) & ~mask; - return result; -} - -fn u64 align_backward_u64(u64 value, u64 alignment) -{ - u64 result = value & ~(alignment - 1); - return result; -} - -fn u8 is_power_of_two_u64(u64 value) -{ - return (value & (value - 1)) == 0; -} - -fn u8 first_bit_set_u32(u32 value) -{ -#if _MSC_VER - DWORD result_dword; - u8 result_u8 = _BitScanForward(&result_dword, value); - unused(result_u8); - let_cast(u8, result, result_dword); -#else - let(result, (u8)__builtin_ffs((s32)value)); -#endif - result -= result != 0; - return result; -} - -fn u64 first_bit_set_u64(u64 value) -{ -#if _MSC_VER - DWORD result_dword; - u8 result_u8 = _BitScanForward64(&result_dword, value); - unused(result_u8); - let_cast(u8, result, result_dword); -#else - let(result, (u8) __builtin_ffs((s64)value)); -#endif - result -= result != 0; - return result; -} - -fn Hash32 hash32_fib_end(Hash32 hash) -{ - let(result, TRUNCATE(Hash32, ((hash + 1) * 11400714819323198485ull) >> 32)); - return result; -} - -fn Hash32 hash64_fib_end(Hash64 hash) -{ - let(result, TRUNCATE(Hash32, ((hash + 1) * 11400714819323198485ull) >> 32)); - return result; -} - -fn u64 parse_hexadecimal(String string, u8* error) -{ - u8* it = &string.pointer[string.length - 1]; - u8 is_error = 0; - - u64 result = 0; - - while (it >= string.pointer) - { - u8 ch = *it; - - u8 is_error_it = !is_hex_digit(ch); - is_error |= is_error_it; - if (is_error_it) - { - break; - } - - u8 sub = is_decimal_digit(ch) ? '0' : (is_hex_digit_alpha_lower(ch) ? 'a' : 'A'); - u8 hex_value = ch - sub + 10 * is_hex_digit_alpha(ch); - assert((hex_value & 0xf) == hex_value); - result = (result << 4) | hex_value; - - it -= 1; - } - - *error = is_error; - return result; -} diff --git a/bootstrap/std/base.h b/bootstrap/std/base.h deleted file mode 100644 index 9a50b27..0000000 --- a/bootstrap/std/base.h +++ /dev/null @@ -1,373 +0,0 @@ -#pragma once - -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) - -#define USE_MEMCPY 1 - -#if _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#define LINK_LIBC 1 - -#ifndef BB_DEBUG -#define BB_DEBUG 1 -#endif - -#include -#include -#include - -#ifndef BB_SAFETY -#define BB_SAFETY BB_DEBUG -#endif - -#define STRUCT_FORWARD_DECL(S) typedef struct S S -#define STRUCT(S) STRUCT_FORWARD_DECL(S); struct S -#define UNION_FORWARD_DECL(U) typedef union U U -#define UNION(U) UNION_FORWARD_DECL(U); union U - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define CLAMP(a, x, b) (((a)>(x))?(a):((b)<(x))?(b):(x)) - -#ifdef __TINYC__ -#define declare_vector_type #error -#else -#ifdef __clang__ -#define declare_vector_type(T, count, name) typedef T name __attribute__((ext_vector_type(count))) -#else -#define declare_vector_type(T, count, name) typedef T name __attribute__((vector_size(count))) -#endif -#endif -#define array_length(arr) sizeof(arr) / sizeof((arr)[0]) -#define KB(n) ((n) * 1024) -#define MB(n) ((n) * 1024 * 1024) -#define GB(n) ((u64)(n) * 1024 * 1024 * 1024) -#define TB(n) ((u64)(n) * 1024 * 1024 * 1024 * 1024) -#define unused(x) (void)(x) -#if _MSC_VER -#define BB_NORETURN __declspec(noreturn) -#define BB_COLD __declspec(noinline) -#elif defined(__TINYC__) -#define BB_NORETURN __attribute__((noreturn)) -#define BB_COLD __attribute__((cold)) -#else -#define BB_NORETURN [[noreturn]] -#define BB_COLD [[gnu::cold]] -#endif -#define TRUNCATE(Destination, source) (Destination)(source) - -#if _MSC_VER -#define ENUM_START(EnumName, T) typedef T EnumName; typedef enum EnumName ## Flags -#define ENUM_END(EnumName) EnumName ## Flags -#else -#define ENUM_START(EnumName, T) typedef enum EnumName : T -#define ENUM_END(EnumName) EnumName -#endif - -#define ENUM(EnumName, T, ...) \ -ENUM_START(EnumName, T)\ -{\ - __VA_ARGS__\ -} ENUM_END(EnumName) - -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; -#if defined (__TINYC__) || defined(_MSC_VER) -UNION(u128) -{ - struct - { - u64 low; - u64 high; - }; - u64 v[2]; -}; -#else -typedef __uint128_t u128; -#endif -typedef unsigned int uint; - -typedef int8_t s8; -typedef int16_t s16; -typedef int32_t s32; -typedef int64_t s64; -#if !defined(__TINYC__) && !defined(_MSC_VER) -typedef __int128_t s128; -#endif - -typedef size_t usize; - -#if !defined(__TINYC__) && !defined(_MSC_VER) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpedantic" -typedef _Float16 f16; -#pragma GCC diagnostic pop -#endif -typedef float f32; -typedef double f64; - -typedef u32 Hash32; -typedef u64 Hash64; - -#define Slice(T) Slice_ ## T -#define SliceP(T) SliceP_ ## T -#define declare_slice_ex(T, StructName) STRUCT(StructName) \ -{\ - T* pointer;\ - u64 length;\ -} - -#define declare_slice(T) declare_slice_ex(T, Slice(T)) -#define declare_slice_p(T) declare_slice_ex(T*, SliceP(T)) - -declare_slice(u8); -declare_slice(u16); -declare_slice(u32); -declare_slice(u64); -declare_slice(s8); -declare_slice(s16); -declare_slice(s32); -declare_slice(s64); - -declare_slice_p(char); -declare_slice_p(u8); -declare_slice_p(void); - -typedef Slice(u8) String; -declare_slice(String); - -#if BB_DEBUG -#define assert(x) (unlikely(!(x)) ? panic("Assert failed: \"" # x "\" at {cstr}:{u32}\n", __FILE__, __LINE__) : unused(0)) -#else -#define assert(x) unused(likely(x)) -#endif - -#ifndef __cplusplus -#if _MSC_VER -#define unreachable_raw() __assume(0) -#else -#define unreachable_raw() __builtin_unreachable() -#endif -// Undefine unreachable if needed to provide a more safe-guard implementation -#ifdef unreachable -#undef unreachable -#endif -#if BB_DEBUG -#define unreachable() panic("Unreachable triggered\n", __FILE__, __LINE__) -#else -#define unreachable() unreachable_raw() -#endif -#define fix_unreachable() unreachable_raw() - -#ifndef static_assert -#define static_assert(x) _Static_assert((x), "Static assert failed!") -#endif -#define alignof(x) _Alignof(x) -#else -#define restrict __restrict -#endif -#ifndef BB_INFINITY -#define BB_INFINITY __builtin_inff() -#endif -#ifndef BB_NAN -#define BB_NAN __builtin_nanf("") -#endif -#define fn static -#define method __attribute__((visibility("internal"))) -#define global_variable static -#define forceinline __attribute__((always_inline)) -#if _MSC_VER -#define expect(x, b) (!!(x)) -#else -#define expect(x, b) __builtin_expect(!!(x), b) -#endif -#define likely(x) expect(x, 1) -#define unlikely(x) expect(x, 0) -#define breakpoint() __builtin_debugtrap() -#define failed_execution() panic("Failed execution at {cstr}:{u32}\n", __FILE__, __LINE__) -#define todo() os_is_being_debugged() ? trap() : panic("TODO at {cstr}:{u32}\n", __FILE__, __LINE__); fix_unreachable() - -fn void print(const char* format, ...); -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code); - -#if _MSC_VER -#define trap() __fastfail(1) -#elif __has_builtin(__builtin_trap) -#define trap() __builtin_trap() -#else -extern BB_NORETURN BB_COLD void abort(void); -fn BB_NORETURN BB_COLD void trap_ext() -{ -#ifdef __x86_64__ - asm volatile("ud2"); -#else - abort(); -#endif -} -#define trap() (trap_ext(), __builtin_unreachable()) -#endif - -fn u8 os_is_being_debugged(); -#define panic(format, ...) (!os_is_being_debugged() ? print(format, __VA_ARGS__), os_exit(1) : os_exit(1)) - -#define let_pointer_cast(PointerChildType, var_name, value) PointerChildType* var_name = (PointerChildType*)(value) -#if defined(__TINYC__) || defined(_MSC_VER) -#define let(name, value) typeof(value) name = (value) -#else -#define let(name, value) __auto_type name = (value) -#endif -#define let_cast(T, name, value) T name = cast_to(T, value) -#define assign_cast(to, from) to = cast_to(typeof(to), from) -#define let_va_arg(T, name, args) T name = va_arg(args, T) -#define transmute(D, source) *(D*)&source - -#if BB_SAFETY -#define cast_to(T, value) (assert((typeof(value)) (T) (value) == (value) && ((value) > 0) == ((T) (value) > 0)), (T) (value)) -#else -#define cast_to(T, value) (T)(value) -#endif - -typedef enum Corner -{ - CORNER_00, - CORNER_01, - CORNER_10, - CORNER_11, - CORNER_COUNT, -} Corner; - -typedef enum Axis2 -{ - AXIS2_X, - AXIS2_Y, - AXIS2_COUNT, -} Axis2; - -// #ifdef __cplusplus -// #define EXPORT extern "C" -// #else -// #define EXPORT -// #endif - -#if defined(__cplusplus) && defined(__linux__) -#define NO_EXCEPT __THROW -#else -#define NO_EXCEPT -#endif - -#define NamedEnumMemberEnum(e, enum_member) e ## _ ## enum_member -#define NamedEnumMemberString(e, enum_member) strlit(#enum_member) - -typedef SliceP(char) CStringSlice; - -#ifdef _WIN32 -typedef void* FileDescriptor; -#else -typedef int FileDescriptor; -#endif - -#define FOR_N(it, start, end) \ -for (u32 it = (start), end__ = (end); it < end__; ++it) - -#define FOR_REV_N(it, start, end) \ -for (u32 it = (end), start__ = (start); (it--) > start__;) - -#define FOR_BIT(it, start, bits) \ -for (typeof(bits) _bits_ = (bits), it = (start); _bits_; _bits_ >>= 1, ++it) if (_bits_ & 1) - -#define FOREACH_SET(it, set) \ -FOR_N(_i, 0, ((set)->arr.capacity + 63) / 64) FOR_BIT(it, _i*64, (set)->arr.pointer[_i]) - -#define size_until_end(T, field_name) (sizeof(T) - offsetof(T, field_name)) -#define SWAP(a, b) \ - do {\ - static_assert(typeof(a) == typeof(b));\ - let(temp, a);\ - a = b;\ - b = temp;\ - } while (0) - -#define slice_from_pointer_range(T, start, end) (Slice(T)) { .pointer = start, .length = (u64)(end - start), } - -#define strlit_len(s) (sizeof(s) - 1) -#define strlit(s) (String){ .pointer = (u8*)(s), .length = strlit_len(s), } -#define ch_to_str(ch) (String){ .pointer = &ch, .length = 1 } -#define array_to_slice(arr) { .pointer = (arr), .length = array_length(arr) } -#define array_to_bytes(arr) { .pointer = (u8*)(arr), .length = sizeof(arr) } -#define pointer_to_bytes(p) (String) { .pointer = (u8*)(p), .length = sizeof(*p) } -#define scalar_to_bytes(s) pointer_to_bytes(&(s)) -#define string_to_c(s) ((char*)((s).pointer)) -#define cstr(s) ((String) { .pointer = (u8*)(s), .length = strlen((char*)s), } ) - -#define case_to_name(prefix, e) case prefix ## e: return strlit(#e) - -global_variable const u8 brace_open = '{'; -global_variable const u8 brace_close = '}'; - -global_variable const u8 parenthesis_open = '('; -global_variable const u8 parenthesis_close = ')'; - -global_variable const u8 bracket_open = '['; -global_variable const u8 bracket_close = ']'; - -#define s_get(s, i) (s).pointer[i] -#define s_get_pointer(s, i) &((s).pointer[i]) -#define s_get_slice(T, s, start, end) (Slice(T)){ .pointer = ((s).pointer) + (start), .length = (end) - (start) } -#define s_equal(a, b) ((a).length == (b).length && memcmp((a).pointer, (b).pointer, sizeof(*((a).pointer)) * (a).length) == 0) - -fn u64 align_forward_u64(u64 value, u64 alignment); -fn u64 align_backward_u64(u64 value, u64 alignment); -fn u8 log2_alignment_u64(u64 alignment); -fn u8 is_power_of_two_u64(u64 value); -fn u8 first_bit_set_u32(u32 value); -fn u64 first_bit_set_u64(u64 value); - -fn u32 format_decimal(String buffer, u64 decimal); -fn u32 format_hexadecimal(String buffer, u64 hexadecimal); -fn u64 format_float(String buffer, f64 value_double); - -fn u64 is_decimal_digit(u8 ch); -fn u32 is_space(u8 ch, u8 next_ch); -fn u8 get_next_ch_safe(String string, u64 index); -fn u64 is_identifier_start(u8 ch); -fn u64 is_identifier_ch(u8 ch); -fn u64 is_alphabetic(u8 ch); -fn u64 is_alphanumeric(u8 ch); - -fn u64 parse_decimal(String string); - -global_variable const Hash64 fnv_offset = 14695981039346656037ull; -global_variable const u64 fnv_prime = 1099511628211ull; - -fn Hash32 hash32_fib_end(Hash32 hash); -fn Hash32 hash64_fib_end(Hash64 hash); - -fn Hash64 hash_byte(Hash64 source, u8 ch); -fn Hash64 hash_bytes(String bytes); -fn Hash32 hash64_to_hash32(Hash64 hash64); - -fn u64 round_up_to_next_power_of_2(u64 n); - -STRUCT(TextureIndex) -{ - u32 value; -}; - -fn u64 safe_flag(u64 value, u64 flag) -{ - u64 result = value & ((u64)0 - flag); - return result; -} - -#define member_from_offset(pointer, type, memory_offset) (*(type*)((u8*)pointer + memory_offset)) -#if _MSC_VER -#define offset_of(T, member) offsetof(T, member) -#else -#define offset_of(T, member) __builtin_offsetof(T, member) -#endif - diff --git a/bootstrap/std/cocoa_windowing.c b/bootstrap/std/cocoa_windowing.c deleted file mode 100644 index c64bf4f..0000000 --- a/bootstrap/std/cocoa_windowing.c +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -@implementation AppleApplicationDelegate -- (void)applicationDidFinishLaunching:(NSNotification*)aNotification -{ -} - -@end -@implementation AppleWindow -@end - -global_variable WindowConnection window_connection; - -fn u8 windowing_initialize() -{ - u8 result = 1; - window_connection.application = [NSApplication sharedApplication]; - AppleApplicationDelegate* application_delegate = [[AppleApplicationDelegate alloc] init]; - NSApp.delegate = application_delegate; - - return result; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate) -{ - NSRect rect = { { 0, 0 }, { 800, 600 } }; - AppleWindow* window = [[AppleWindow alloc] initWithContentRect:rect styleMask:(NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable) backing:NSBackingStoreBuffered defer:NO]; - window.title = @"Hello Metal"; - [window_connection.application activate]; - [window orderFrontRegardless]; - return window; -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - WindowingSize size; - @autoreleasepool { - const NSRect contentRect = instance.contentView.frame; - const NSRect fbRect = [instance.contentView convertRectToBacking:contentRect]; - - size = (WindowingSize) { - .width = fbRect.size.width, - .height = fbRect.size.height, - }; - } // autoreleasepool - return size; -} - -fn void windowing_poll_events() -{ - @autoreleasepool { - while (1) - { - NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; - - if (event == nil) - { - break; - } - - [NSApp sendEvent:event]; - } - - } // autoreleasepool -} diff --git a/bootstrap/std/cocoa_windowing.h b/bootstrap/std/cocoa_windowing.h deleted file mode 100644 index a727a8a..0000000 --- a/bootstrap/std/cocoa_windowing.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#import -#import - -@interface AppleApplicationDelegate : NSObject -@end -@interface AppleWindow : NSWindow -@end -@interface AppleWindowDelegate : NSObject -@end - -typedef AppleWindow WindowingInstance; - -STRUCT(WindowConnection) -{ - NSApplication* application; -}; diff --git a/bootstrap/std/directx12_rendering.c b/bootstrap/std/directx12_rendering.c deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/directx12_rendering.c +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/directx12_rendering.h b/bootstrap/std/directx12_rendering.h deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/directx12_rendering.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/entry_point.c b/bootstrap/std/entry_point.c deleted file mode 100644 index aeb007c..0000000 --- a/bootstrap/std/entry_point.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#if LINK_LIBC == 0 -[[gnu::naked]] BB_NORETURN void _start() -{ - __asm__ __volatile__( - "\nxor %ebp, %ebp" - "\npopq %rdi" - "\nmov %rsp, %rsi" - "\nand $~0xf, %rsp" - "\npushq %rsp" - "\npushq $0" - "\ncallq static_entry_point" - "\nud2\n" - ); -} -#endif - -#if LINK_LIBC == 0 -void static_entry_point(int argc, char* argv[]) -{ - char** envp = (char**)&argv[argc + 1]; -#else -int main(int argc, char* argv[], char* envp[]) -{ -#endif - calibrate_cpu_timer(); - entry_point(argc, argv, envp); -#if LINK_LIBC - return 0; -#else - syscall_exit(0); -#endif -} diff --git a/bootstrap/std/entry_point.h b/bootstrap/std/entry_point.h deleted file mode 100644 index 240fc9c..0000000 --- a/bootstrap/std/entry_point.h +++ /dev/null @@ -1,11 +0,0 @@ -#include - -void entry_point(int argc, char* argv[], char* envp[]); - -#if LINK_LIBC == 0 -[[gnu::naked]] BB_NORETURN void _start(); -#endif - -#if LINK_LIBC == 0 -void static_entry_point(int argc, char* argv[]); -#endif diff --git a/bootstrap/std/font_provider.c b/bootstrap/std/font_provider.c deleted file mode 100644 index e2e479c..0000000 --- a/bootstrap/std/font_provider.c +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once - -#include - -#define STBTT_STATIC -#define STB_TRUETYPE_IMPLEMENTATION -#define stbtt_uint8 u8 -#define stbtt_uint16 u16 -#define stbtt_uint32 u32 -#define stbtt_int8 s8 -#define stbtt_int16 s16 -#define stbtt_int32 s32 - -extern float sqrtf(float x); -extern float roundf(float x); -extern float floorf(float x); - -extern double sqrt(double x); -extern double fabs(double x); -extern double floor(double x); -extern double ceil(double x); -extern double fmod(double x, double y); -extern double pow(double x, double y); -extern double acos(double x); -extern double cos(double x); - -#define STBTT_ifloor(x) ((int) floor(x)) -#define STBTT_iceil(x) ((int) ceil(x)) -#define STBTT_sqrt(x) sqrt(x) -#define STBTT_pow(x,y) pow(x,y) -#define STBTT_fmod(x,y) fmod(x,y) -#define STBTT_cos(x) cos(x) -#define STBTT_acos(x) acos(x) -#define STBTT_fabs(x) fabs(x) -#define STBTT_malloc(x,u) ((void)(u),malloc(x)) -#define STBTT_free(x,u) ((void)(u),free(x)) -#define STBTT_assert(x) assert(x) -#define STBTT_strlen(x) strlen(x) -#define STBTT_memcpy memcpy -#define STBTT_memset memset - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#endif -#include -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -fn TextureAtlas font_texture_atlas_create(Arena* arena, Renderer* renderer, TextureAtlasCreate create) -{ - let(font_file, file_read(arena, create.font_path)); - stbtt_fontinfo font_info; - if (!stbtt_InitFont(&font_info, font_file.pointer, stbtt_GetFontOffsetForIndex(font_file.pointer, 0))) - { - failed_execution(); - } - - TextureAtlas result = {}; - u32 character_count = 256; - result.characters = arena_allocate(arena, FontCharacter, character_count); - result.kerning_tables = arena_allocate(arena, s32, character_count * character_count); - result.height = (u32)sqrtf((f32)(create.text_height * create.text_height * character_count)); - result.width = result.height; - result.pointer = arena_allocate(arena, u32, result.width * result.height); - let(scale_factor, stbtt_ScaleForPixelHeight(&font_info, create.text_height)); - - int ascent; - int descent; - int line_gap; - stbtt_GetFontVMetrics(&font_info, &ascent, &descent, &line_gap); - - result.ascent = (u32)roundf(ascent * scale_factor); - result.descent = (u32)roundf(descent * scale_factor); - result.line_gap = (u32)roundf(line_gap * scale_factor); - - u32 x = 0; - u32 y = 0; - u32 max_row_height = 0; - u32 first_character = ' '; - u32 last_character = '~'; - - for (let(i, first_character); i <= last_character; ++i) - { - u32 width; - u32 height; - int advance; - int left_bearing; - - let(ch, (u8)i); - let(character, &result.characters[i]); - stbtt_GetCodepointHMetrics(&font_info, ch, &advance, &left_bearing); - - character->advance = (u32)roundf(advance * scale_factor); - character->left_bearing = (u32)roundf(left_bearing * scale_factor); - - u8* bitmap = stbtt_GetCodepointBitmap(&font_info, 0.0f, scale_factor, ch, (int*)&width, (int*)&height, &character->x_offset, &character->y_offset); - let(kerning_table, result.kerning_tables + i * character_count); - for (u32 j = first_character; j <= last_character; j += 1) - { - let(kerning_advance, stbtt_GetCodepointKernAdvance(&font_info, i, j)); - kerning_table[j] = (s32)roundf(kerning_advance * scale_factor); - } - - if (x + width > result.width) - { - y += max_row_height; - max_row_height = height; - x = 0; - } - else - { - max_row_height = MAX(height, max_row_height); - } - - character->x = x; - character->y = y; - character->width = width; - character->height = height; - - let(source, bitmap); - let(destination, result.pointer); - - for (u32 bitmap_y = 0; bitmap_y < height; bitmap_y += 1) - { - for (u32 bitmap_x = 0; bitmap_x < width; bitmap_x += 1) - { - let(source_index, bitmap_y * width + bitmap_x); - let(destination_index, (bitmap_y + y) * result.width + (bitmap_x + x)); - let(value, source[source_index]); - destination[destination_index] = ((u32)value << 24) | 0xffffff; - } - } - - x += width; - - stbtt_FreeBitmap(bitmap, 0); - } - - result.texture = renderer_texture_create(renderer, (TextureMemory) { - .pointer = result.pointer, - .width = result.width, - .height = result.height, - .depth = 1, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - }); - - return result; -} - -fn uint2 texture_atlas_compute_string_rect(String string, const TextureAtlas* atlas) -{ - let(height, atlas->ascent - atlas->descent); - u32 x_offset = 0; - u32 y_offset = height; - - for (u64 i = 0; i < string.length; i += 1) - { - let(ch, string.pointer[i]); - let(character, &atlas->characters[ch]); - let(kerning, (atlas->kerning_tables + ch * 256)[string.pointer[i + 1]]); - x_offset += character->advance + kerning; - } - - return (uint2) { x_offset, y_offset }; -} diff --git a/bootstrap/std/font_provider.h b/bootstrap/std/font_provider.h deleted file mode 100644 index 8daa3b8..0000000 --- a/bootstrap/std/font_provider.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -STRUCT(FontCharacter) -{ - u32 advance; - u32 left_bearing; - u32 x; - u32 y; - u32 width; - u32 height; - s32 x_offset; - s32 y_offset; -}; - -STRUCT(TextureAtlas) -{ - u32* pointer; - FontCharacter* characters; - s32* kerning_tables; - u32 width; - u32 height; - s32 ascent; - s32 descent; - s32 line_gap; - TextureIndex texture; -}; - -STRUCT(TextureAtlasCreate) -{ - String font_path; - u32 text_height; -}; - -fn TextureAtlas font_texture_atlas_create(Arena* arena, Renderer* renderer, TextureAtlasCreate create); -fn uint2 texture_atlas_compute_string_rect(String string, const TextureAtlas* atlas); diff --git a/bootstrap/std/format.c b/bootstrap/std/format.c deleted file mode 100644 index 672c59b..0000000 --- a/bootstrap/std/format.c +++ /dev/null @@ -1,1442 +0,0 @@ -#include - -fn u32 format_hexadecimal(String buffer, u64 hexadecimal) -{ - u64 value = hexadecimal; - if (value) - { - u8 reverse_buffer[16]; - u8 reverse_index = 0; - - while (value) - { - u8 digit_value = value % 16; - u8 ascii_ch = digit_value >= 10 ? (digit_value + 'a' - 10) : (digit_value + '0'); - value /= 16; - reverse_buffer[reverse_index] = ascii_ch; - reverse_index += 1; - } - - u32 index = 0; - - while (reverse_index > 0) - { - reverse_index -= 1; - buffer.pointer[index] = reverse_buffer[reverse_index]; - index += 1; - } - - return index; - } - else - { - buffer.pointer[0] = '0'; - return 1; - } -} - -fn u32 format_decimal(String buffer, u64 decimal) -{ - u64 value = decimal; - if (value) - { - u8 reverse_buffer[64]; - u8 reverse_index = 0; - - while (value) - { - u8 digit_value = (value % 10); - u8 ascii_ch = digit_value + '0'; - value /= 10; - reverse_buffer[reverse_index] = ascii_ch; - reverse_index += 1; - } - - u32 index = 0; - while (reverse_index > 0) - { - reverse_index -= 1; - buffer.pointer[index] = reverse_buffer[reverse_index]; - index += 1; - } - - return index; - } - else - { - buffer.pointer[0] = '0'; - return 1; - } -} - -STRUCT(SmallIntResult) -{ - u64 mantissa; - s32 exponent; - u32 is_small_int:1; -}; - -#define double_mantissa_bits 52 -#define double_exponent_bits 11 -#define double_bias 1023 - -#define double_pow5_bitcount 125 -#define double_pow5_inv_bitcount 125 - -// Returns floor(log_10(2^e)); requires 0 <= e <= 1650. -fn u32 log10_pow2(const s32 e) -{ - // The first value this approximation fails for is 2^1651 which is just greater than 10^297. - assert(e >= 0); - assert(e <= 1650); - return (((u32) e) * 78913) >> 18; -} - -// Returns e == 0 ? 1 : ceil(log_2(5^e)); requires 0 <= e <= 3528. -fn s32 pow5_bits(const s32 e) -{ - // This approximation works up to the point that the multiplication overflows at e = 3529. - // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater - // than 2^9297. - assert(e >= 0); - assert(e <= 3528); - return (s32) (((((u32) e) * 1217359) >> 19) + 1); -} - -#define DOUBLE_POW5_INV_BITCOUNT 125 -#define DOUBLE_POW5_BITCOUNT 125 - -#define DOUBLE_POW5_INV_TABLE_SIZE 342 -#define DOUBLE_POW5_TABLE_SIZE 326 - -global_variable const u8 DIGIT_TABLE[200] = { - '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', - '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', - '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', - '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', - '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', - '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', - '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', - '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', - '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', - '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' -}; - -global_variable const u64 DOUBLE_POW5_INV_SPLIT[DOUBLE_POW5_INV_TABLE_SIZE][2] = -{ - { 1u, 2305843009213693952u }, { 11068046444225730970u, 1844674407370955161u }, - { 5165088340638674453u, 1475739525896764129u }, { 7821419487252849886u, 1180591620717411303u }, - { 8824922364862649494u, 1888946593147858085u }, { 7059937891890119595u, 1511157274518286468u }, - { 13026647942995916322u, 1208925819614629174u }, { 9774590264567735146u, 1934281311383406679u }, - { 11509021026396098440u, 1547425049106725343u }, { 16585914450600699399u, 1237940039285380274u }, - { 15469416676735388068u, 1980704062856608439u }, { 16064882156130220778u, 1584563250285286751u }, - { 9162556910162266299u, 1267650600228229401u }, { 7281393426775805432u, 2028240960365167042u }, - { 16893161185646375315u, 1622592768292133633u }, { 2446482504291369283u, 1298074214633706907u }, - { 7603720821608101175u, 2076918743413931051u }, { 2393627842544570617u, 1661534994731144841u }, - { 16672297533003297786u, 1329227995784915872u }, { 11918280793837635165u, 2126764793255865396u }, - { 5845275820328197809u, 1701411834604692317u }, { 15744267100488289217u, 1361129467683753853u }, - { 3054734472329800808u, 2177807148294006166u }, { 17201182836831481939u, 1742245718635204932u }, - { 6382248639981364905u, 1393796574908163946u }, { 2832900194486363201u, 2230074519853062314u }, - { 5955668970331000884u, 1784059615882449851u }, { 1075186361522890384u, 1427247692705959881u }, - { 12788344622662355584u, 2283596308329535809u }, { 13920024512871794791u, 1826877046663628647u }, - { 3757321980813615186u, 1461501637330902918u }, { 10384555214134712795u, 1169201309864722334u }, - { 5547241898389809503u, 1870722095783555735u }, { 4437793518711847602u, 1496577676626844588u }, - { 10928932444453298728u, 1197262141301475670u }, { 17486291911125277965u, 1915619426082361072u }, - { 6610335899416401726u, 1532495540865888858u }, { 12666966349016942027u, 1225996432692711086u }, - { 12888448528943286597u, 1961594292308337738u }, { 17689456452638449924u, 1569275433846670190u }, - { 14151565162110759939u, 1255420347077336152u }, { 7885109000409574610u, 2008672555323737844u }, - { 9997436015069570011u, 1606938044258990275u }, { 7997948812055656009u, 1285550435407192220u }, - { 12796718099289049614u, 2056880696651507552u }, { 2858676849947419045u, 1645504557321206042u }, - { 13354987924183666206u, 1316403645856964833u }, { 17678631863951955605u, 2106245833371143733u }, - { 3074859046935833515u, 1684996666696914987u }, { 13527933681774397782u, 1347997333357531989u }, - { 10576647446613305481u, 2156795733372051183u }, { 15840015586774465031u, 1725436586697640946u }, - { 8982663654677661702u, 1380349269358112757u }, { 18061610662226169046u, 2208558830972980411u }, - { 10759939715039024913u, 1766847064778384329u }, { 12297300586773130254u, 1413477651822707463u }, - { 15986332124095098083u, 2261564242916331941u }, { 9099716884534168143u, 1809251394333065553u }, - { 14658471137111155161u, 1447401115466452442u }, { 4348079280205103483u, 1157920892373161954u }, - { 14335624477811986218u, 1852673427797059126u }, { 7779150767507678651u, 1482138742237647301u }, - { 2533971799264232598u, 1185710993790117841u }, { 15122401323048503126u, 1897137590064188545u }, - { 12097921058438802501u, 1517710072051350836u }, { 5988988032009131678u, 1214168057641080669u }, - { 16961078480698431330u, 1942668892225729070u }, { 13568862784558745064u, 1554135113780583256u }, - { 7165741412905085728u, 1243308091024466605u }, { 11465186260648137165u, 1989292945639146568u }, - { 16550846638002330379u, 1591434356511317254u }, { 16930026125143774626u, 1273147485209053803u }, - { 4951948911778577463u, 2037035976334486086u }, { 272210314680951647u, 1629628781067588869u }, - { 3907117066486671641u, 1303703024854071095u }, { 6251387306378674625u, 2085924839766513752u }, - { 16069156289328670670u, 1668739871813211001u }, { 9165976216721026213u, 1334991897450568801u }, - { 7286864317269821294u, 2135987035920910082u }, { 16897537898041588005u, 1708789628736728065u }, - { 13518030318433270404u, 1367031702989382452u }, { 6871453250525591353u, 2187250724783011924u }, - { 9186511415162383406u, 1749800579826409539u }, { 11038557946871817048u, 1399840463861127631u }, - { 10282995085511086630u, 2239744742177804210u }, { 8226396068408869304u, 1791795793742243368u }, - { 13959814484210916090u, 1433436634993794694u }, { 11267656730511734774u, 2293498615990071511u }, - { 5324776569667477496u, 1834798892792057209u }, { 7949170070475892320u, 1467839114233645767u }, - { 17427382500606444826u, 1174271291386916613u }, { 5747719112518849781u, 1878834066219066582u }, - { 15666221734240810795u, 1503067252975253265u }, { 12532977387392648636u, 1202453802380202612u }, - { 5295368560860596524u, 1923926083808324180u }, { 4236294848688477220u, 1539140867046659344u }, - { 7078384693692692099u, 1231312693637327475u }, { 11325415509908307358u, 1970100309819723960u }, - { 9060332407926645887u, 1576080247855779168u }, { 14626963555825137356u, 1260864198284623334u }, - { 12335095245094488799u, 2017382717255397335u }, { 9868076196075591040u, 1613906173804317868u }, - { 15273158586344293478u, 1291124939043454294u }, { 13369007293925138595u, 2065799902469526871u }, - { 7005857020398200553u, 1652639921975621497u }, { 16672732060544291412u, 1322111937580497197u }, - { 11918976037903224966u, 2115379100128795516u }, { 5845832015580669650u, 1692303280103036413u }, - { 12055363241948356366u, 1353842624082429130u }, { 841837113407818570u, 2166148198531886609u }, - { 4362818505468165179u, 1732918558825509287u }, { 14558301248600263113u, 1386334847060407429u }, - { 12225235553534690011u, 2218135755296651887u }, { 2401490813343931363u, 1774508604237321510u }, - { 1921192650675145090u, 1419606883389857208u }, { 17831303500047873437u, 2271371013423771532u }, - { 6886345170554478103u, 1817096810739017226u }, { 1819727321701672159u, 1453677448591213781u }, - { 16213177116328979020u, 1162941958872971024u }, { 14873036941900635463u, 1860707134196753639u }, - { 15587778368262418694u, 1488565707357402911u }, { 8780873879868024632u, 1190852565885922329u }, - { 2981351763563108441u, 1905364105417475727u }, { 13453127855076217722u, 1524291284333980581u }, - { 7073153469319063855u, 1219433027467184465u }, { 11317045550910502167u, 1951092843947495144u }, - { 12742985255470312057u, 1560874275157996115u }, { 10194388204376249646u, 1248699420126396892u }, - { 1553625868034358140u, 1997919072202235028u }, { 8621598323911307159u, 1598335257761788022u }, - { 17965325103354776697u, 1278668206209430417u }, { 13987124906400001422u, 2045869129935088668u }, - { 121653480894270168u, 1636695303948070935u }, { 97322784715416134u, 1309356243158456748u }, - { 14913111714512307107u, 2094969989053530796u }, { 8241140556867935363u, 1675975991242824637u }, - { 17660958889720079260u, 1340780792994259709u }, { 17189487779326395846u, 2145249268790815535u }, - { 13751590223461116677u, 1716199415032652428u }, { 18379969808252713988u, 1372959532026121942u }, - { 14650556434236701088u, 2196735251241795108u }, { 652398703163629901u, 1757388200993436087u }, - { 11589965406756634890u, 1405910560794748869u }, { 7475898206584884855u, 2249456897271598191u }, - { 2291369750525997561u, 1799565517817278553u }, { 9211793429904618695u, 1439652414253822842u }, - { 18428218302589300235u, 2303443862806116547u }, { 7363877012587619542u, 1842755090244893238u }, - { 13269799239553916280u, 1474204072195914590u }, { 10615839391643133024u, 1179363257756731672u }, - { 2227947767661371545u, 1886981212410770676u }, { 16539753473096738529u, 1509584969928616540u }, - { 13231802778477390823u, 1207667975942893232u }, { 6413489186596184024u, 1932268761508629172u }, - { 16198837793502678189u, 1545815009206903337u }, { 5580372605318321905u, 1236652007365522670u }, - { 8928596168509315048u, 1978643211784836272u }, { 18210923379033183008u, 1582914569427869017u }, - { 7190041073742725760u, 1266331655542295214u }, { 436019273762630246u, 2026130648867672343u }, - { 7727513048493924843u, 1620904519094137874u }, { 9871359253537050198u, 1296723615275310299u }, - { 4726128361433549347u, 2074757784440496479u }, { 7470251503888749801u, 1659806227552397183u }, - { 13354898832594820487u, 1327844982041917746u }, { 13989140502667892133u, 2124551971267068394u }, - { 14880661216876224029u, 1699641577013654715u }, { 11904528973500979224u, 1359713261610923772u }, - { 4289851098633925465u, 2175541218577478036u }, { 18189276137874781665u, 1740432974861982428u }, - { 3483374466074094362u, 1392346379889585943u }, { 1884050330976640656u, 2227754207823337509u }, - { 5196589079523222848u, 1782203366258670007u }, { 15225317707844309248u, 1425762693006936005u }, - { 5913764258841343181u, 2281220308811097609u }, { 8420360221814984868u, 1824976247048878087u }, - { 17804334621677718864u, 1459980997639102469u }, { 17932816512084085415u, 1167984798111281975u }, - { 10245762345624985047u, 1868775676978051161u }, { 4507261061758077715u, 1495020541582440929u }, - { 7295157664148372495u, 1196016433265952743u }, { 7982903447895485668u, 1913626293225524389u }, - { 10075671573058298858u, 1530901034580419511u }, { 4371188443704728763u, 1224720827664335609u }, - { 14372599139411386667u, 1959553324262936974u }, { 15187428126271019657u, 1567642659410349579u }, - { 15839291315758726049u, 1254114127528279663u }, { 3206773216762499739u, 2006582604045247462u }, - { 13633465017635730761u, 1605266083236197969u }, { 14596120828850494932u, 1284212866588958375u }, - { 4907049252451240275u, 2054740586542333401u }, { 236290587219081897u, 1643792469233866721u }, - { 14946427728742906810u, 1315033975387093376u }, { 16535586736504830250u, 2104054360619349402u }, - { 5849771759720043554u, 1683243488495479522u }, { 15747863852001765813u, 1346594790796383617u }, - { 10439186904235184007u, 2154551665274213788u }, { 15730047152871967852u, 1723641332219371030u }, - { 12584037722297574282u, 1378913065775496824u }, { 9066413911450387881u, 2206260905240794919u }, - { 10942479943902220628u, 1765008724192635935u }, { 8753983955121776503u, 1412006979354108748u }, - { 10317025513452932081u, 2259211166966573997u }, { 874922781278525018u, 1807368933573259198u }, - { 8078635854506640661u, 1445895146858607358u }, { 13841606313089133175u, 1156716117486885886u }, - { 14767872471458792434u, 1850745787979017418u }, { 746251532941302978u, 1480596630383213935u }, - { 597001226353042382u, 1184477304306571148u }, { 15712597221132509104u, 1895163686890513836u }, - { 8880728962164096960u, 1516130949512411069u }, { 10793931984473187891u, 1212904759609928855u }, - { 17270291175157100626u, 1940647615375886168u }, { 2748186495899949531u, 1552518092300708935u }, - { 2198549196719959625u, 1242014473840567148u }, { 18275073973719576693u, 1987223158144907436u }, - { 10930710364233751031u, 1589778526515925949u }, { 12433917106128911148u, 1271822821212740759u }, - { 8826220925580526867u, 2034916513940385215u }, { 7060976740464421494u, 1627933211152308172u }, - { 16716827836597268165u, 1302346568921846537u }, { 11989529279587987770u, 2083754510274954460u }, - { 9591623423670390216u, 1667003608219963568u }, { 15051996368420132820u, 1333602886575970854u }, - { 13015147745246481542u, 2133764618521553367u }, { 3033420566713364587u, 1707011694817242694u }, - { 6116085268112601993u, 1365609355853794155u }, { 9785736428980163188u, 2184974969366070648u }, - { 15207286772667951197u, 1747979975492856518u }, { 1097782973908629988u, 1398383980394285215u }, - { 1756452758253807981u, 2237414368630856344u }, { 5094511021344956708u, 1789931494904685075u }, - { 4075608817075965366u, 1431945195923748060u }, { 6520974107321544586u, 2291112313477996896u }, - { 1527430471115325346u, 1832889850782397517u }, { 12289990821117991246u, 1466311880625918013u }, - { 17210690286378213644u, 1173049504500734410u }, { 9090360384495590213u, 1876879207201175057u }, - { 18340334751822203140u, 1501503365760940045u }, { 14672267801457762512u, 1201202692608752036u }, - { 16096930852848599373u, 1921924308174003258u }, { 1809498238053148529u, 1537539446539202607u }, - { 12515645034668249793u, 1230031557231362085u }, { 1578287981759648052u, 1968050491570179337u }, - { 12330676829633449412u, 1574440393256143469u }, { 13553890278448669853u, 1259552314604914775u }, - { 3239480371808320148u, 2015283703367863641u }, { 17348979556414297411u, 1612226962694290912u }, - { 6500486015647617283u, 1289781570155432730u }, { 10400777625036187652u, 2063650512248692368u }, - { 15699319729512770768u, 1650920409798953894u }, { 16248804598352126938u, 1320736327839163115u }, - { 7551343283653851484u, 2113178124542660985u }, { 6041074626923081187u, 1690542499634128788u }, - { 12211557331022285596u, 1352433999707303030u }, { 1091747655926105338u, 2163894399531684849u }, - { 4562746939482794594u, 1731115519625347879u }, { 7339546366328145998u, 1384892415700278303u }, - { 8053925371383123274u, 2215827865120445285u }, { 6443140297106498619u, 1772662292096356228u }, - { 12533209867169019542u, 1418129833677084982u }, { 5295740528502789974u, 2269007733883335972u }, - { 15304638867027962949u, 1815206187106668777u }, { 4865013464138549713u, 1452164949685335022u }, - { 14960057215536570740u, 1161731959748268017u }, { 9178696285890871890u, 1858771135597228828u }, - { 14721654658196518159u, 1487016908477783062u }, { 4398626097073393881u, 1189613526782226450u }, - { 7037801755317430209u, 1903381642851562320u }, { 5630241404253944167u, 1522705314281249856u }, - { 814844308661245011u, 1218164251424999885u }, { 1303750893857992017u, 1949062802279999816u }, - { 15800395974054034906u, 1559250241823999852u }, { 5261619149759407279u, 1247400193459199882u }, - { 12107939454356961969u, 1995840309534719811u }, { 5997002748743659252u, 1596672247627775849u }, - { 8486951013736837725u, 1277337798102220679u }, { 2511075177753209390u, 2043740476963553087u }, - { 13076906586428298482u, 1634992381570842469u }, { 14150874083884549109u, 1307993905256673975u }, - { 4194654460505726958u, 2092790248410678361u }, { 18113118827372222859u, 1674232198728542688u }, - { 3422448617672047318u, 1339385758982834151u }, { 16543964232501006678u, 2143017214372534641u }, - { 9545822571258895019u, 1714413771498027713u }, { 15015355686490936662u, 1371531017198422170u }, - { 5577825024675947042u, 2194449627517475473u }, { 11840957649224578280u, 1755559702013980378u }, - { 16851463748863483271u, 1404447761611184302u }, { 12204946739213931940u, 2247116418577894884u }, - { 13453306206113055875u, 1797693134862315907u }, { 3383947335406624054u, 1438154507889852726u }, - { 16482362180876329456u, 2301047212623764361u }, { 9496540929959153242u, 1840837770099011489u }, - { 11286581558709232917u, 1472670216079209191u }, { 5339916432225476010u, 1178136172863367353u }, - { 4854517476818851293u, 1885017876581387765u }, { 3883613981455081034u, 1508014301265110212u }, - { 14174937629389795797u, 1206411441012088169u }, { 11611853762797942306u, 1930258305619341071u }, - { 5600134195496443521u, 1544206644495472857u }, { 15548153800622885787u, 1235365315596378285u }, - { 6430302007287065643u, 1976584504954205257u }, { 16212288050055383484u, 1581267603963364205u }, - { 12969830440044306787u, 1265014083170691364u }, { 9683682259845159889u, 2024022533073106183u }, - { 15125643437359948558u, 1619218026458484946u }, { 8411165935146048523u, 1295374421166787957u }, - { 17147214310975587960u, 2072599073866860731u }, { 10028422634038560045u, 1658079259093488585u }, - { 8022738107230848036u, 1326463407274790868u }, { 9147032156827446534u, 2122341451639665389u }, - { 11006974540203867551u, 1697873161311732311u }, { 5116230817421183718u, 1358298529049385849u }, - { 15564666937357714594u, 2173277646479017358u }, { 1383687105660440706u, 1738622117183213887u }, - { 12174996128754083534u, 1390897693746571109u }, { 8411947361780802685u, 2225436309994513775u }, - { 6729557889424642148u, 1780349047995611020u }, { 5383646311539713719u, 1424279238396488816u }, - { 1235136468979721303u, 2278846781434382106u }, { 15745504434151418335u, 1823077425147505684u }, - { 16285752362063044992u, 1458461940118004547u }, { 5649904260166615347u, 1166769552094403638u }, - { 5350498001524674232u, 1866831283351045821u }, { 591049586477829062u, 1493465026680836657u }, - { 11540886113407994219u, 1194772021344669325u }, { 18673707743239135u, 1911635234151470921u }, - { 14772334225162232601u, 1529308187321176736u }, { 8128518565387875758u, 1223446549856941389u }, - { 1937583260394870242u, 1957514479771106223u }, { 8928764237799716840u, 1566011583816884978u }, - { 14521709019723594119u, 1252809267053507982u }, { 8477339172590109297u, 2004494827285612772u }, - { 17849917782297818407u, 1603595861828490217u }, { 6901236596354434079u, 1282876689462792174u }, - { 18420676183650915173u, 2052602703140467478u }, { 3668494502695001169u, 1642082162512373983u }, - { 10313493231639821582u, 1313665730009899186u }, { 9122891541139893884u, 2101865168015838698u }, - { 14677010862395735754u, 1681492134412670958u }, { 673562245690857633u, 1345193707530136767u } -}; -// Best case: use 128-bit type. -fn u64 mul_shift_64(const u64 m, const u64* const mul, const s32 j) -{ - const u128 b0 = u128_u64_mul(u128_from_u64(m), mul[0]); - const u128 b2 = u128_u64_mul(u128_from_u64(m), mul[1]); - return u64_from_u128(u128_shift_right(u128_u64_add(b2, u128_shift_right_by_64(b0)), cast_to(u16, j - 64))); - // return (u64) (((b0 >> 64) + b2) >> (j - 64)); -} - -fn u64 mul_shift_all_64(const u64 m, const u64* const mul, const s32 j, u64* const vp, u64* const vm, const u32 mmShift) -{ - *vp = mul_shift_64(4 * m + 2, mul, j); - *vm = mul_shift_64(4 * m - 1 - mmShift, mul, j); - return mul_shift_64(4 * m, mul, j); -} - -// Returns e == 0 ? 1 : [log_2(5^e)]; requires 0 <= e <= 3528. -// fn s32 log2_pow5(const s32 e) -// { -// // This approximation works up to the point that the multiplication overflows at e = 3529. -// // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater -// // than 2^9297. -// assert(e >= 0); -// assert(e <= 3528); -// return (s32) ((((u32) e) * 1217359) >> 19); -// } -// Returns floor(log_10(5^e)); requires 0 <= e <= 2620. -fn u32 log10_pow5(const s32 e) { - // The first value this approximation fails for is 5^2621 which is just greater than 10^1832. - assert(e >= 0); - assert(e <= 2620); - return (((u32) e) * 732923) >> 20; -} - -global_variable const u64 DOUBLE_POW5_SPLIT[DOUBLE_POW5_TABLE_SIZE][2] = -{ - { 0u, 1152921504606846976u }, { 0u, 1441151880758558720u }, - { 0u, 1801439850948198400u }, { 0u, 2251799813685248000u }, - { 0u, 1407374883553280000u }, { 0u, 1759218604441600000u }, - { 0u, 2199023255552000000u }, { 0u, 1374389534720000000u }, - { 0u, 1717986918400000000u }, { 0u, 2147483648000000000u }, - { 0u, 1342177280000000000u }, { 0u, 1677721600000000000u }, - { 0u, 2097152000000000000u }, { 0u, 1310720000000000000u }, - { 0u, 1638400000000000000u }, { 0u, 2048000000000000000u }, - { 0u, 1280000000000000000u }, { 0u, 1600000000000000000u }, - { 0u, 2000000000000000000u }, { 0u, 1250000000000000000u }, - { 0u, 1562500000000000000u }, { 0u, 1953125000000000000u }, - { 0u, 1220703125000000000u }, { 0u, 1525878906250000000u }, - { 0u, 1907348632812500000u }, { 0u, 1192092895507812500u }, - { 0u, 1490116119384765625u }, { 4611686018427387904u, 1862645149230957031u }, - { 9799832789158199296u, 1164153218269348144u }, { 12249790986447749120u, 1455191522836685180u }, - { 15312238733059686400u, 1818989403545856475u }, { 14528612397897220096u, 2273736754432320594u }, - { 13692068767113150464u, 1421085471520200371u }, { 12503399940464050176u, 1776356839400250464u }, - { 15629249925580062720u, 2220446049250313080u }, { 9768281203487539200u, 1387778780781445675u }, - { 7598665485932036096u, 1734723475976807094u }, { 274959820560269312u, 2168404344971008868u }, - { 9395221924704944128u, 1355252715606880542u }, { 2520655369026404352u, 1694065894508600678u }, - { 12374191248137781248u, 2117582368135750847u }, { 14651398557727195136u, 1323488980084844279u }, - { 13702562178731606016u, 1654361225106055349u }, { 3293144668132343808u, 2067951531382569187u }, - { 18199116482078572544u, 1292469707114105741u }, { 8913837547316051968u, 1615587133892632177u }, - { 15753982952572452864u, 2019483917365790221u }, { 12152082354571476992u, 1262177448353618888u }, - { 15190102943214346240u, 1577721810442023610u }, { 9764256642163156992u, 1972152263052529513u }, - { 17631875447420442880u, 1232595164407830945u }, { 8204786253993389888u, 1540743955509788682u }, - { 1032610780636961552u, 1925929944387235853u }, { 2951224747111794922u, 1203706215242022408u }, - { 3689030933889743652u, 1504632769052528010u }, { 13834660704216955373u, 1880790961315660012u }, - { 17870034976990372916u, 1175494350822287507u }, { 17725857702810578241u, 1469367938527859384u }, - { 3710578054803671186u, 1836709923159824231u }, { 26536550077201078u, 2295887403949780289u }, - { 11545800389866720434u, 1434929627468612680u }, { 14432250487333400542u, 1793662034335765850u }, - { 8816941072311974870u, 2242077542919707313u }, { 17039803216263454053u, 1401298464324817070u }, - { 12076381983474541759u, 1751623080406021338u }, { 5872105442488401391u, 2189528850507526673u }, - { 15199280947623720629u, 1368455531567204170u }, { 9775729147674874978u, 1710569414459005213u }, - { 16831347453020981627u, 2138211768073756516u }, { 1296220121283337709u, 1336382355046097823u }, - { 15455333206886335848u, 1670477943807622278u }, { 10095794471753144002u, 2088097429759527848u }, - { 6309871544845715001u, 1305060893599704905u }, { 12499025449484531656u, 1631326116999631131u }, - { 11012095793428276666u, 2039157646249538914u }, { 11494245889320060820u, 1274473528905961821u }, - { 532749306367912313u, 1593091911132452277u }, { 5277622651387278295u, 1991364888915565346u }, - { 7910200175544436838u, 1244603055572228341u }, { 14499436237857933952u, 1555753819465285426u }, - { 8900923260467641632u, 1944692274331606783u }, { 12480606065433357876u, 1215432671457254239u }, - { 10989071563364309441u, 1519290839321567799u }, { 9124653435777998898u, 1899113549151959749u }, - { 8008751406574943263u, 1186945968219974843u }, { 5399253239791291175u, 1483682460274968554u }, - { 15972438586593889776u, 1854603075343710692u }, { 759402079766405302u, 1159126922089819183u }, - { 14784310654990170340u, 1448908652612273978u }, { 9257016281882937117u, 1811135815765342473u }, - { 16182956370781059300u, 2263919769706678091u }, { 7808504722524468110u, 1414949856066673807u }, - { 5148944884728197234u, 1768687320083342259u }, { 1824495087482858639u, 2210859150104177824u }, - { 1140309429676786649u, 1381786968815111140u }, { 1425386787095983311u, 1727233711018888925u }, - { 6393419502297367043u, 2159042138773611156u }, { 13219259225790630210u, 1349401336733506972u }, - { 16524074032238287762u, 1686751670916883715u }, { 16043406521870471799u, 2108439588646104644u }, - { 803757039314269066u, 1317774742903815403u }, { 14839754354425000045u, 1647218428629769253u }, - { 4714634887749086344u, 2059023035787211567u }, { 9864175832484260821u, 1286889397367007229u }, - { 16941905809032713930u, 1608611746708759036u }, { 2730638187581340797u, 2010764683385948796u }, - { 10930020904093113806u, 1256727927116217997u }, { 18274212148543780162u, 1570909908895272496u }, - { 4396021111970173586u, 1963637386119090621u }, { 5053356204195052443u, 1227273366324431638u }, - { 15540067292098591362u, 1534091707905539547u }, { 14813398096695851299u, 1917614634881924434u }, - { 13870059828862294966u, 1198509146801202771u }, { 12725888767650480803u, 1498136433501503464u }, - { 15907360959563101004u, 1872670541876879330u }, { 14553786618154326031u, 1170419088673049581u }, - { 4357175217410743827u, 1463023860841311977u }, { 10058155040190817688u, 1828779826051639971u }, - { 7961007781811134206u, 2285974782564549964u }, { 14199001900486734687u, 1428734239102843727u }, - { 13137066357181030455u, 1785917798878554659u }, { 11809646928048900164u, 2232397248598193324u }, - { 16604401366885338411u, 1395248280373870827u }, { 16143815690179285109u, 1744060350467338534u }, - { 10956397575869330579u, 2180075438084173168u }, { 6847748484918331612u, 1362547148802608230u }, - { 17783057643002690323u, 1703183936003260287u }, { 17617136035325974999u, 2128979920004075359u }, - { 17928239049719816230u, 1330612450002547099u }, { 17798612793722382384u, 1663265562503183874u }, - { 13024893955298202172u, 2079081953128979843u }, { 5834715712847682405u, 1299426220705612402u }, - { 16516766677914378815u, 1624282775882015502u }, { 11422586310538197711u, 2030353469852519378u }, - { 11750802462513761473u, 1268970918657824611u }, { 10076817059714813937u, 1586213648322280764u }, - { 12596021324643517422u, 1982767060402850955u }, { 5566670318688504437u, 1239229412751781847u }, - { 2346651879933242642u, 1549036765939727309u }, { 7545000868343941206u, 1936295957424659136u }, - { 4715625542714963254u, 1210184973390411960u }, { 5894531928393704067u, 1512731216738014950u }, - { 16591536947346905892u, 1890914020922518687u }, { 17287239619732898039u, 1181821263076574179u }, - { 16997363506238734644u, 1477276578845717724u }, { 2799960309088866689u, 1846595723557147156u }, - { 10973347230035317489u, 1154122327223216972u }, { 13716684037544146861u, 1442652909029021215u }, - { 12534169028502795672u, 1803316136286276519u }, { 11056025267201106687u, 2254145170357845649u }, - { 18439230838069161439u, 1408840731473653530u }, { 13825666510731675991u, 1761050914342066913u }, - { 3447025083132431277u, 2201313642927583642u }, { 6766076695385157452u, 1375821026829739776u }, - { 8457595869231446815u, 1719776283537174720u }, { 10571994836539308519u, 2149720354421468400u }, - { 6607496772837067824u, 1343575221513417750u }, { 17482743002901110588u, 1679469026891772187u }, - { 17241742735199000331u, 2099336283614715234u }, { 15387775227926763111u, 1312085177259197021u }, - { 5399660979626290177u, 1640106471573996277u }, { 11361262242960250625u, 2050133089467495346u }, - { 11712474920277544544u, 1281333180917184591u }, { 10028907631919542777u, 1601666476146480739u }, - { 7924448521472040567u, 2002083095183100924u }, { 14176152362774801162u, 1251301934489438077u }, - { 3885132398186337741u, 1564127418111797597u }, { 9468101516160310080u, 1955159272639746996u }, - { 15140935484454969608u, 1221974545399841872u }, { 479425281859160394u, 1527468181749802341u }, - { 5210967620751338397u, 1909335227187252926u }, { 17091912818251750210u, 1193334516992033078u }, - { 12141518985959911954u, 1491668146240041348u }, { 15176898732449889943u, 1864585182800051685u }, - { 11791404716994875166u, 1165365739250032303u }, { 10127569877816206054u, 1456707174062540379u }, - { 8047776328842869663u, 1820883967578175474u }, { 836348374198811271u, 2276104959472719343u }, - { 7440246761515338900u, 1422565599670449589u }, { 13911994470321561530u, 1778206999588061986u }, - { 8166621051047176104u, 2222758749485077483u }, { 2798295147690791113u, 1389224218428173427u }, - { 17332926989895652603u, 1736530273035216783u }, { 17054472718942177850u, 2170662841294020979u }, - { 8353202440125167204u, 1356664275808763112u }, { 10441503050156459005u, 1695830344760953890u }, - { 3828506775840797949u, 2119787930951192363u }, { 86973725686804766u, 1324867456844495227u }, - { 13943775212390669669u, 1656084321055619033u }, { 3594660960206173375u, 2070105401319523792u }, - { 2246663100128858359u, 1293815875824702370u }, { 12031700912015848757u, 1617269844780877962u }, - { 5816254103165035138u, 2021587305976097453u }, { 5941001823691840913u, 1263492066235060908u }, - { 7426252279614801142u, 1579365082793826135u }, { 4671129331091113523u, 1974206353492282669u }, - { 5225298841145639904u, 1233878970932676668u }, { 6531623551432049880u, 1542348713665845835u }, - { 3552843420862674446u, 1927935892082307294u }, { 16055585193321335241u, 1204959932551442058u }, - { 10846109454796893243u, 1506199915689302573u }, { 18169322836923504458u, 1882749894611628216u }, - { 11355826773077190286u, 1176718684132267635u }, { 9583097447919099954u, 1470898355165334544u }, - { 11978871809898874942u, 1838622943956668180u }, { 14973589762373593678u, 2298278679945835225u }, - { 2440964573842414192u, 1436424174966147016u }, { 3051205717303017741u, 1795530218707683770u }, - { 13037379183483547984u, 2244412773384604712u }, { 8148361989677217490u, 1402757983365377945u }, - { 14797138505523909766u, 1753447479206722431u }, { 13884737113477499304u, 2191809349008403039u }, - { 15595489723564518921u, 1369880843130251899u }, { 14882676136028260747u, 1712351053912814874u }, - { 9379973133180550126u, 2140438817391018593u }, { 17391698254306313589u, 1337774260869386620u }, - { 3292878744173340370u, 1672217826086733276u }, { 4116098430216675462u, 2090272282608416595u }, - { 266718509671728212u, 1306420176630260372u }, { 333398137089660265u, 1633025220787825465u }, - { 5028433689789463235u, 2041281525984781831u }, { 10060300083759496378u, 1275800953740488644u }, - { 12575375104699370472u, 1594751192175610805u }, { 1884160825592049379u, 1993438990219513507u }, - { 17318501580490888525u, 1245899368887195941u }, { 7813068920331446945u, 1557374211108994927u }, - { 5154650131986920777u, 1946717763886243659u }, { 915813323278131534u, 1216698602428902287u }, - { 14979824709379828129u, 1520873253036127858u }, { 9501408849870009354u, 1901091566295159823u }, - { 12855909558809837702u, 1188182228934474889u }, { 2234828893230133415u, 1485227786168093612u }, - { 2793536116537666769u, 1856534732710117015u }, { 8663489100477123587u, 1160334207943823134u }, - { 1605989338741628675u, 1450417759929778918u }, { 11230858710281811652u, 1813022199912223647u }, - { 9426887369424876662u, 2266277749890279559u }, { 12809333633531629769u, 1416423593681424724u }, - { 16011667041914537212u, 1770529492101780905u }, { 6179525747111007803u, 2213161865127226132u }, - { 13085575628799155685u, 1383226165704516332u }, { 16356969535998944606u, 1729032707130645415u }, - { 15834525901571292854u, 2161290883913306769u }, { 2979049660840976177u, 1350806802445816731u }, - { 17558870131333383934u, 1688508503057270913u }, { 8113529608884566205u, 2110635628821588642u }, - { 9682642023980241782u, 1319147268013492901u }, { 16714988548402690132u, 1648934085016866126u }, - { 11670363648648586857u, 2061167606271082658u }, { 11905663298832754689u, 1288229753919426661u }, - { 1047021068258779650u, 1610287192399283327u }, { 15143834390605638274u, 2012858990499104158u }, - { 4853210475701136017u, 1258036869061940099u }, { 1454827076199032118u, 1572546086327425124u }, - { 1818533845248790147u, 1965682607909281405u }, { 3442426662494187794u, 1228551629943300878u }, - { 13526405364972510550u, 1535689537429126097u }, { 3072948650933474476u, 1919611921786407622u }, - { 15755650962115585259u, 1199757451116504763u }, { 15082877684217093670u, 1499696813895630954u }, - { 9630225068416591280u, 1874621017369538693u }, { 8324733676974063502u, 1171638135855961683u }, - { 5794231077790191473u, 1464547669819952104u }, { 7242788847237739342u, 1830684587274940130u }, - { 18276858095901949986u, 2288355734093675162u }, { 16034722328366106645u, 1430222333808546976u }, - { 1596658836748081690u, 1787777917260683721u }, { 6607509564362490017u, 2234722396575854651u }, - { 1823850468512862308u, 1396701497859909157u }, { 6891499104068465790u, 1745876872324886446u }, - { 17837745916940358045u, 2182346090406108057u }, { 4231062170446641922u, 1363966306503817536u }, - { 5288827713058302403u, 1704957883129771920u }, { 6611034641322878003u, 2131197353912214900u }, - { 13355268687681574560u, 1331998346195134312u }, { 16694085859601968200u, 1664997932743917890u }, - { 11644235287647684442u, 2081247415929897363u }, { 4971804045566108824u, 1300779634956185852u }, - { 6214755056957636030u, 1625974543695232315u }, { 3156757802769657134u, 2032468179619040394u }, - { 6584659645158423613u, 1270292612261900246u }, { 17454196593302805324u, 1587865765327375307u }, - { 17206059723201118751u, 1984832206659219134u }, { 6142101308573311315u, 1240520129162011959u }, - { 3065940617289251240u, 1550650161452514949u }, { 8444111790038951954u, 1938312701815643686u }, - { 665883850346957067u, 1211445438634777304u }, { 832354812933696334u, 1514306798293471630u }, - { 10263815553021896226u, 1892883497866839537u }, { 17944099766707154901u, 1183052186166774710u }, - { 13206752671529167818u, 1478815232708468388u }, { 16508440839411459773u, 1848519040885585485u }, - { 12623618533845856310u, 1155324400553490928u }, { 15779523167307320387u, 1444155500691863660u }, - { 1277659885424598868u, 1805194375864829576u }, { 1597074856780748586u, 2256492969831036970u }, - { 5609857803915355770u, 1410308106144398106u }, { 16235694291748970521u, 1762885132680497632u }, - { 1847873790976661535u, 2203606415850622041u }, { 12684136165428883219u, 1377254009906638775u }, - { 11243484188358716120u, 1721567512383298469u }, { 219297180166231438u, 2151959390479123087u }, - { 7054589765244976505u, 1344974619049451929u }, { 13429923224983608535u, 1681218273811814911u }, - { 12175718012802122765u, 2101522842264768639u }, { 14527352785642408584u, 1313451776415480399u }, - { 13547504963625622826u, 1641814720519350499u }, { 12322695186104640628u, 2052268400649188124u }, - { 16925056528170176201u, 1282667750405742577u }, { 7321262604930556539u, 1603334688007178222u }, - { 18374950293017971482u, 2004168360008972777u }, { 4566814905495150320u, 1252605225005607986u }, - { 14931890668723713708u, 1565756531257009982u }, { 9441491299049866327u, 1957195664071262478u }, - { 1289246043478778550u, 1223247290044539049u }, { 6223243572775861092u, 1529059112555673811u }, - { 3167368447542438461u, 1911323890694592264u }, { 1979605279714024038u, 1194577431684120165u }, - { 7086192618069917952u, 1493221789605150206u }, { 18081112809442173248u, 1866527237006437757u }, - { 13606538515115052232u, 1166579523129023598u }, { 7784801107039039482u, 1458224403911279498u }, - { 507629346944023544u, 1822780504889099373u }, { 5246222702107417334u, 2278475631111374216u }, - { 3278889188817135834u, 1424047269444608885u }, { 8710297504448807696u, 1780059086805761106u } -}; - -fn uint32_t pow5_factor(uint64_t value) -{ - const uint64_t m_inv_5 = 14757395258967641293u; // 5 * m_inv_5 = 1 (mod 2^64) - const uint64_t n_div_5 = 3689348814741910323u; // #{ n | n = 0 (mod 2^64) } = 2^64 / 5 - uint32_t count = 0; - for (;;) { - assert(value != 0); - value *= m_inv_5; - if (value > n_div_5) - break; - ++count; - } - return count; -} - -// Returns true if value is divisible by 5^p. -fn u8 multiple_of_power_of_5(const uint64_t value, const uint32_t p) -{ - // I tried a case distinction on p, but there was no performance difference. - return pow5_factor(value) >= p; -} - -// Returns true if value is divisible by 2^p. -fn u8 multiple_of_power_of_2(const u64 value, const u32 p) { - assert(value != 0); - assert(p < 64); - // __builtin_ctzll doesn't appear to be faster here. - return (value & ((1ull << p) - 1)) == 0; -} - -fn inline uint64_t div5(const uint64_t x) { - return x / 5; -} - -fn inline uint64_t div10(const uint64_t x) { - return x / 10; -} - -fn inline uint64_t div100(const uint64_t x) { - return x / 100; -} - -fn inline uint64_t div1e8(const uint64_t x) { - return x / 100000000; -} - -fn inline uint64_t div1e9(const uint64_t x) { - return x / 1000000000; -} - -fn inline uint32_t mod1e9(const uint64_t x) { - return (uint32_t) (x - 1000000000 * div1e9(x)); -} - -STRUCT(Double) -{ - u64 mantissa; - s32 exponent; - u32 reserved; -}; - -fn Double double_transform(u64 ieee_mantissa, u32 ieee_exponent) -{ - u64 m2; - s32 e2; - if (ieee_exponent) - { - m2 = ((u64)1 << double_mantissa_bits) | ieee_mantissa; - e2 = (s32)(ieee_exponent) - double_bias - double_mantissa_bits - 2; - } - else - { - m2 = ieee_mantissa; - e2 = 1 - double_bias - double_mantissa_bits - 2; - } - - u8 is_even = (m2 & 1) == 0; - let(accept_bounds, is_even); - - u64 mv = 4 * m2; - u32 mm_shift = (ieee_mantissa != 0) | (ieee_exponent <= 1); - - u64 vr, vp, vm; - s32 e10; - u8 vm_is_trailing_zeroes = 0; - u8 vr_is_trailing_zeroes = 0; - - if (e2 >= 0) - { - u32 q = log10_pow2(e2) - (e2 > 3); - e10 = (s32)q; - s32 k = double_pow5_inv_bitcount + pow5_bits((s32)q) - 1; - s32 i = -e2 + (s32)q + k; - vr = mul_shift_all_64(m2, DOUBLE_POW5_INV_SPLIT[q], i, &vp, &vm, mm_shift); - if (q <= 21) - { - u32 mv_mod_5 = ((u32)mv) - 5 * ((u32)div5(mv)); - if (mv_mod_5 == 0) - { - vr_is_trailing_zeroes = multiple_of_power_of_5(mv, q); - } - else if (accept_bounds) - { - vm_is_trailing_zeroes = multiple_of_power_of_5(mv - 1 - mm_shift, q); - } - else - { - vp -= multiple_of_power_of_5(mv + 2, q); - } - } - } - else - { - u32 q = log10_pow5(-e2) - (-e2 > 1); - e10 = (s32) q + e2; - s32 i = -e2 - (s32)q; - s32 k = pow5_bits(i) - double_pow5_bitcount; - s32 j = (s32)q - k; - vr = mul_shift_all_64(m2, DOUBLE_POW5_SPLIT[i], j, &vp, &vm, mm_shift); - - if (q <= 1) - { - vr_is_trailing_zeroes = 1; - if (accept_bounds) - { - vm_is_trailing_zeroes = mm_shift == 1; - } - else - { - vp -= 1; - } - } - else if (q < 63) - { - vr_is_trailing_zeroes = multiple_of_power_of_2(mv, q); - } - } - - s32 removed = 0; - u64 output; - u8 last_removed_digit = 0; - - if (vm_is_trailing_zeroes | vr_is_trailing_zeroes) - { - while (1) - { - u64 vp_div10 = div10(vp); - u64 vm_div10 = div10(vm); - - if (vp_div10 <= vm_div10) - { - break; - } - - u32 vm_mod10 = ((u32)vm) - 10 * ((u32)vm_div10); - u64 vr_div10 = div10(vr); - u32 vr_mod10 = ((u32)vr) - 10 * ((u32)vr_div10); - vm_is_trailing_zeroes &= vm_mod10 == 0; - vr_is_trailing_zeroes &= last_removed_digit == 0; - last_removed_digit = (u8)vr_mod10; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - - if (vm_is_trailing_zeroes) - { - while (1) - { - const uint64_t vm_div10 = div10(vm); - const uint32_t vm_mod10 = ((uint32_t) vm) - 10 * ((uint32_t) vm_div10); - - if (vm_mod10 != 0) - { - break; - } - - const uint64_t vp_div10 = div10(vp); - const uint64_t vr_div10 = div10(vr); - const uint32_t vr_mod10 = ((uint32_t) vr) - 10 * ((uint32_t) vr_div10); - vr_is_trailing_zeroes &= last_removed_digit == 0; - last_removed_digit = (uint8_t) vr_mod10; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - } - - if (vr_is_trailing_zeroes && last_removed_digit == 5 && vr % 2 == 0) - { - // Round even if the exact number is .....50..0. - last_removed_digit = 4; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - output = vr + ((vr == vm && (!accept_bounds || !vm_is_trailing_zeroes)) || last_removed_digit >= 5); - } - else - { - u8 round_up = 0; - u64 vp_div100 = div100(vp); - u64 vm_div100 = div100(vm); - - if (vp_div100 > vm_div100) - { - u64 vr_div100 = div100(vr); - u32 vr_mod100 = ((u32)vr) - 100 * ((u32)vr_div100); - round_up = vr_mod100 >= 50; - vr = vr_div100; - vp = vp_div100; - vm = vm_div100; - removed += 2; - } - - while (1) - { - u64 vp_div10 = div10(vp); - u64 vm_div10 = div10(vm); - if (vp_div10 <= vm_div10) - { - break; - } - u64 vr_div10 = div10(vr); - u32 vr_mod10 = ((u32)vr) - 10 * ((u32) vr_div10); - round_up = vr_mod10 >= 5; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - - output = vr + ((vr == vm) | round_up); - } - - s32 exp = e10 + removed; - - return (Double) - { - .mantissa = output, - .exponent = exp, - }; -} - -fn SmallIntResult small_int(u64 ieee_mantissa, u32 ieee_exponent) -{ - SmallIntResult result = {}; - let(m2, ((u64)1 << double_mantissa_bits) | ieee_mantissa); - let(e2, (s32)ieee_exponent - double_bias - double_mantissa_bits); - - if (e2 > 0) - { - return result; - } - - if (e2 < -52) - { - return result; - } - - u64 mask = ((u64)1 << -e2) - 1; - u64 fraction = m2 & mask; - if (fraction != 0) - { - return result; - } - - result.mantissa = m2 >> -e2; - result.exponent = 0; - result.is_small_int = 1; - - return result; -} - -fn u32 decimalLength17(const u64 v) { - // This is slightly faster than a loop. - // The average output length is 16.38 digits, so we check high-to-low. - // Function precondition: v is not an 18, 19, or 20-digit number. - // (17 digits are sufficient for round-tripping.) - assert(v < 100000000000000000L); - if (v >= 10000000000000000L) { return 17; } - if (v >= 1000000000000000L) { return 16; } - if (v >= 100000000000000L) { return 15; } - if (v >= 10000000000000L) { return 14; } - if (v >= 1000000000000L) { return 13; } - if (v >= 100000000000L) { return 12; } - if (v >= 10000000000L) { return 11; } - if (v >= 1000000000L) { return 10; } - if (v >= 100000000L) { return 9; } - if (v >= 10000000L) { return 8; } - if (v >= 1000000L) { return 7; } - if (v >= 100000L) { return 6; } - if (v >= 10000L) { return 5; } - if (v >= 1000L) { return 4; } - if (v >= 100L) { return 3; } - if (v >= 10L) { return 2; } - return 1; -} - -// A floating decimal representing m * 10^e. -STRUCT(floating_decimal_64) -{ - u64 mantissa; - // Decimal exponent's range is -324 to 308 - // inclusive, and can fit in a short if needed. - s32 exponent; - u32 reserved; -}; - -fn u8* digits2(u64 value) -{ - String str = strlit("00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899"); - return str.pointer + (value * 2); -} - -fn void write_float_decimal(String buffer, u64* value, u64 count) -{ - u64 i = 0; - - while (i + 2 < count) - { - let_cast(u8, c, *value % 100); - *value /= 100; - let(ptr, digits2(c)); - buffer.pointer[count - i - 1] = ptr[1]; - buffer.pointer[count - i - 2] = ptr[0]; - i += 2; - } - - while (i < count) - { - let(c, cast_to(u8, *value % 10)); - *value /= 10; - buffer.pointer[count - i - 1] = '0' + c; - - i += 1; - } -} - -fn u64 format_float(String buffer, f64 value_double) -{ - let(value_int, *(u64*)&value_double); - u64 buffer_i = 0; - - const u8 ieee_sign = ((value_int >> (double_mantissa_bits + double_exponent_bits)) & 1) != 0; - let(ieee_mantissa, value_int & (((u64)1 << double_mantissa_bits) - 1)); - let(ieee_exponent, (u32)((value_int >> double_mantissa_bits) & (((u32)1 << double_exponent_bits) - 1))); - - if (ieee_exponent == (((u32)1 << double_exponent_bits) - 1) || (ieee_exponent == 0 && ieee_mantissa == 0)) - { - if (ieee_mantissa) - { - String nan = strlit("NaN"); - memcpy(&buffer.pointer[buffer_i], nan.pointer, nan.length); - buffer_i += nan.length; - } - else - { - if (ieee_sign) - { - buffer.pointer[buffer_i] = '-'; - buffer_i += 1; - } - - if (ieee_exponent) - { - String inf = strlit("Infinity"); - memcpy(&buffer.pointer[buffer_i], inf.pointer, inf.length); - buffer_i += inf.length; - } - else - { - String e0 = strlit("0E0"); - memcpy(&buffer.pointer[buffer_i], e0.pointer, e0.length); - buffer_i += e0.length; - } - } - } - else - { - let(small_int_result, small_int(ieee_mantissa, ieee_exponent)); - Double result; - if (small_int_result.is_small_int) - { - while (1) - { - u64 q = div10(small_int_result.mantissa); - u32 r = ((u32)small_int_result.mantissa) - 10 * ((u32)q); - - if (r != 0) - { - break; - } - - small_int_result.mantissa = q; - small_int_result.exponent += 1; - } - } - else - { - result = double_transform(ieee_mantissa, ieee_exponent); - } - - typedef enum FloatFormat - { - FLOAT_FORMAT_DECIMAL, - FLOAT_FORMAT_SCIENTIFIC, - } FloatFormat; - - FloatFormat format = FLOAT_FORMAT_DECIMAL; - u64 output = result.mantissa; - u32 olength = decimalLength17(output); - - // Sign - buffer.pointer[buffer_i] = '-'; - buffer_i += ieee_sign; - - switch (format) - { - case FLOAT_FORMAT_SCIENTIFIC: - { - u32 i = 0; - - if ((output >> 32) != 0) - { - u64 q = div1e8(output); - u32 output2 = ((u32)output) - 100000000 * ((u32)q); - output = q; - - u32 c = output % 10000; - output2 /= 10000; - - const uint32_t d = output2 % 10000; - const uint32_t c0 = (c % 100) << 1; - const uint32_t c1 = (c / 100) << 1; - const uint32_t d0 = (d % 100) << 1; - const uint32_t d1 = (d / 100) << 1; - - let(base_index, buffer_i + olength); - let(base, buffer.pointer + base_index); - memcpy(base - 1, DIGIT_TABLE + c0, 2); - memcpy(base - 3, DIGIT_TABLE + c1, 2); - memcpy(base - 5, DIGIT_TABLE + d0, 2); - memcpy(base - 7, DIGIT_TABLE + d1, 2); - - i += 8; - } - - let(output2, (u32)output); - - while (output2 >= 10000) - { -#ifdef __clang__ - const u32 c = output2 - 10000 * (output2 / 10000); -#else - const uint32_t c = output2 % 10000; -#endif - output2 /= 10000; - const u32 c0 = (c % 100) << 1; - const u32 c1 = (c / 100) << 1; - let(base_index, buffer_i + olength - i); - memcpy(buffer.pointer + base_index - 1, DIGIT_TABLE + c0, 2); - memcpy(buffer.pointer + base_index - 3, DIGIT_TABLE + c1, 2); - - i += 4; - } - - if (output2 >= 100) - { - const u32 c = (output2 % 100) << 1; - output2 /= 100; - memcpy(buffer.pointer + buffer_i + olength - i - 1, DIGIT_TABLE + c, 2); - i += 2; - } - - if (output2 >= 10) - { - const uint32_t c = output2 << 1; - // We can't use memcpy here: the decimal dot goes between these two digits. - buffer.pointer[buffer_i + olength - i] = DIGIT_TABLE[c + 1]; - buffer.pointer[buffer_i] = DIGIT_TABLE[c]; - } - else - { - buffer.pointer[buffer_i] = (u8)output2 + '0'; - } - - // Print decimal point if needed. - if (olength > 1) - { - buffer.pointer[buffer_i + 1] = '.'; - buffer_i += olength + 1; - } else { - buffer_i += 1; - } - - // Print the exponent. - buffer.pointer[buffer_i] = 'E'; - buffer_i += 1; - int32_t exp = result.exponent + (int32_t) olength - 1; - if (exp < 0) { - buffer.pointer[buffer_i] = '-'; - buffer_i += 1; - exp = -exp; - } - - if (exp >= 100) - { - const int32_t c = exp % 10; - memcpy(buffer.pointer + buffer_i, DIGIT_TABLE + 2 * (exp / 10), 2); - buffer.pointer[buffer_i + 2] = (u8)c + '0'; - buffer_i += 3; - } - else if (exp >= 10) - { - memcpy(buffer.pointer + buffer_i, DIGIT_TABLE + 2 * exp, 2); - buffer_i += 2; - } - else - { - buffer.pointer[buffer_i] = (u8)exp + '0'; - buffer_i += 1; - } - } break; - case FLOAT_FORMAT_DECIMAL: - { - let(dp_offset, result.exponent + cast_to(s32, olength)); - - if (dp_offset <= 0) - { - buffer.pointer[buffer_i] = '0'; - buffer.pointer[buffer_i + 1] = '.'; - buffer_i += 2; - - // let(dp_index, buffer_i); - - let(dp_poffset, (u32)(-dp_offset)); - memset(buffer.pointer + buffer_i, '0', dp_poffset); - buffer_i += dp_poffset; - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, olength); - buffer_i += olength; - } - else - { - let(dp_uoffset, (u64)dp_offset); - if (dp_uoffset >= olength) - { - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, olength); - buffer_i += olength; - let(length, dp_uoffset - olength); - String memset_slice = s_get_slice(u8, buffer, buffer_i, buffer_i + length); - memset(memset_slice.pointer, 0, length); - buffer_i += length; - } - else - { - write_float_decimal(s_get_slice(u8, buffer, buffer_i + dp_uoffset + 1, buffer.length), &output, olength - dp_uoffset); - buffer.pointer[buffer_i + dp_uoffset] = '.'; - // let(dp_index, buffer_i + dp_uoffset + 1); - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, dp_uoffset); - buffer_i += olength + 1; - } - } - } break; - } - } - - return buffer_i; -} - -typedef enum IntegerFormat -{ - INTEGER_FORMAT_HEXADECIMAL, - INTEGER_FORMAT_DECIMAL, - INTEGER_FORMAT_OCTAL, - INTEGER_FORMAT_BINARY, -} IntegerFormat; - -STRUCT(IntegerFormatOptions) -{ - IntegerFormat format; - u32 width; -}; - -fn IntegerFormatOptions integer_format_options(u8** it) -{ - IntegerFormatOptions options = { - .format = INTEGER_FORMAT_DECIMAL, - }; - - if (**it == ':') - { - *it += 1; - - while (**it != brace_close) - { - switch (**it) - { - case 'x': - options.format = INTEGER_FORMAT_HEXADECIMAL; - *it += 1; - break; - case 'd': - options.format = INTEGER_FORMAT_DECIMAL; - *it += 1; - break; - case 'o': - options.format = INTEGER_FORMAT_OCTAL; - *it += 1; - break; - case 'b': - options.format = INTEGER_FORMAT_BINARY; - *it += 1; - break; - case 'w': - { - *it += 1; - - if (**it != '=') - { - todo(); - } - - *it += 1; - - let(start, *it); - while (is_decimal_digit(**it)) - { - *it += 1; - } - let(end, *it); - assign_cast(options.width, parse_decimal(slice_from_pointer_range(u8, start, end))); - } break; - default: - unreachable(); - } - - *it += **it == ','; - } - } - - return options; -} - -fn String format_string_va(String buffer, const char* format, va_list args) -{ - u8* it = (u8*)format; - u64 buffer_i = 0; - - while (*it) - { - while (*it && *it != brace_open) - { - s_get(buffer, buffer_i) = *it; - buffer_i += 1; - it += 1; - } - - if (*it == brace_open) - { - it += 1; - let(next_ch, *it); - - if (next_ch == brace_open) - { - todo(); - } - else - { - switch (next_ch) - { - case 'c': - { - int done = 0; - it += 1; - if (*it == 's') - { - it += 1; - if (*it == 't') - { - it += 1; - if (*it == 'r') - { - it += 1; - done = 1; - let_va_arg(const u8*, cstring, args); - while (*cstring) - { - buffer.pointer[buffer_i] = *cstring; - buffer_i += 1; - cstring += 1; - } - } - } - } - else - { - let_cast(u8, character, cast_to(u8, va_arg(args, u32))); - buffer.pointer[buffer_i] = character; - buffer_i += 1; - done = 1; - } - - assert(done); - } break; - case 'f': - { - it += 1; - f64 value_double; - switch (*it) - { - case '3': - it += 1; - if (*it != '2') - { - failed_execution(); - } - it += 1; - value_double = va_arg(args, f64); - break; - case '6': - it += 1; - if (*it != '4') - { - failed_execution(); - } - it += 1; - value_double = va_arg(args, f64); - break; - default: - failed_execution(); - } - - buffer_i += format_float(s_get_slice(u8, buffer, buffer_i, buffer.length), value_double); - } break; - case 's': - { - it += 1; - - if (is_decimal_digit(*it)) - { - u8* bit_count_start = it; - while (is_decimal_digit(*it)) - { - it += 1; - } - - u8* bit_count_end = it; - u64 bit_count = parse_decimal(slice_from_pointer_range(u8, (u8*)bit_count_start, (u8*)bit_count_end)); - - IntegerFormatOptions options = integer_format_options(&it); - - s64 original_value; - switch (bit_count) - { - case 8: - case 16: - case 32: - original_value = va_arg(args, s32); - break; - case 64: - original_value = va_arg(args, s64); - break; - default: - unreachable(); - } - - String buffer_slice = s_get_slice(u8, buffer, buffer_i, buffer.length); - - switch (options.format) - { - case INTEGER_FORMAT_HEXADECIMAL: - { - u32 expected_characters = hex_digit_count(original_value); - - if (expected_characters < options.width) - { - u32 extra_characters = options.width - expected_characters; - memset(buffer.pointer, '0', extra_characters); - buffer_i += extra_characters; - } - - let(written_characters, format_hexadecimal(buffer_slice, original_value)); - assert(expected_characters == written_characters); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_DECIMAL: - { - u64 value; - if (original_value < 0) - { - buffer_slice.pointer[0] = '-'; - buffer_slice.pointer += 1; - buffer_slice.length -= 1; - buffer_i += 1; - value = (u64)(-(original_value - (original_value == INT64_MIN))) + (original_value == INT64_MIN); - } - else - { - value = (u64)original_value; - } - - let(written_characters, format_decimal(buffer_slice, value)); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_OCTAL: - { - todo(); - } break; - case INTEGER_FORMAT_BINARY: - { - todo(); - } break; - } - } - else - { - String string = va_arg(args, String); - memcpy(buffer.pointer + buffer_i, string.pointer, string.length); - buffer_i += string.length; - } - - } break; - case 'u': - { - it += 1; - - u8* bit_count_start = it; - while (is_decimal_digit(*it)) - { - it += 1; - } - - u8* bit_count_end = it; - u64 bit_count = parse_decimal(slice_from_pointer_range(u8, (u8*)bit_count_start, (u8*)bit_count_end)); - - IntegerFormatOptions options = integer_format_options(&it); - - u64 original_value; - switch (bit_count) - { - case 8: - case 16: - case 32: - original_value = va_arg(args, u32); - break; - case 64: - original_value = va_arg(args, u64); - break; - default: - unreachable(); - } - - - switch (options.format) - { - case INTEGER_FORMAT_HEXADECIMAL: - { - u32 expected_characters = hex_digit_count(original_value); - - if (expected_characters < options.width) - { - u32 extra_characters = options.width - expected_characters; - memset(buffer.pointer + buffer_i, '0', extra_characters); - buffer_i += extra_characters; - } - - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - let(written_characters, format_hexadecimal(buffer_slice, original_value)); - assert(expected_characters == written_characters); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_DECIMAL: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - let(written_characters, format_decimal(buffer_slice, original_value)); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_OCTAL: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - unused(buffer_slice); - todo(); - } break; - case INTEGER_FORMAT_BINARY: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - unused(buffer_slice); - todo(); - } break; - } - } break; - default: - buffer.pointer[buffer_i] = '{'; - buffer_i += 1; - continue; - } - - if (*it != brace_close) - { - failed_execution(); - } - - it += 1; - } - } - } - - return (String) { .pointer = buffer.pointer, .length = buffer_i }; -} - -fn String format_string(String buffer, const char* format, ...) -{ - va_list args; - va_start(args, format); - let(result, format_string_va(buffer, format, args)); - va_end(args); - return result; -} - -fn void formatter_append(StringFormatter* formatter, const char* format, ...) -{ - va_list args; - va_start(args, format); - String buffer = s_get_slice(u8, formatter->buffer, formatter->index, formatter->buffer.length); - let(result, format_string_va(buffer, format, args)); - va_end(args); - formatter->index += result.length; -} - -fn void formatter_append_string(StringFormatter* formatter, String string) -{ - assert(string.length + formatter->index <= formatter->buffer.length); - memcpy(formatter->buffer.pointer + formatter->index, string.pointer, string.length); - formatter->index += string.length; -} - -fn void formatter_append_character(StringFormatter* formatter, u8 ch) -{ - assert(formatter->index < formatter->buffer.length); - formatter->buffer.pointer[formatter->index] = ch; - formatter->index += 1; -} diff --git a/bootstrap/std/format.h b/bootstrap/std/format.h deleted file mode 100644 index 1eeca03..0000000 --- a/bootstrap/std/format.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -STRUCT(StringFormatter) -{ - String buffer; - u64 index; -}; - -fn void formatter_append(StringFormatter* formatter, const char* format, ...); -fn void formatter_append_string(StringFormatter* formatter, String string); -fn void formatter_append_character(StringFormatter* formatter, u8 ch); -fn String format_string(String buffer, const char* format, ...); -fn String format_string_va(String buffer, const char* format, va_list args); diff --git a/bootstrap/std/image_loader.c b/bootstrap/std/image_loader.c deleted file mode 100644 index db4c4c6..0000000 --- a/bootstrap/std/image_loader.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#define STB_IMAGE_STATIC -#define STB_IMAGE_IMPLEMENTATION -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#include -#pragma clang diagnostic pop - -EXPORT TextureMemory texture_load_from_file(Arena* arena, String path) -{ - auto file = file_read(arena, path); - int width; - int height; - int channels; - u8* buffer = stbi_load_from_memory(file.pointer, file.length, &width, &height, &channels, STBI_rgb_alpha); - channels += 1; - - return (TextureMemory) { - .pointer = buffer, - .width = width, - .height = height, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - .depth = 1, - }; -} diff --git a/bootstrap/std/image_loader.h b/bootstrap/std/image_loader.h deleted file mode 100644 index fde4fd0..0000000 --- a/bootstrap/std/image_loader.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include -#include -#include - -EXPORT TextureMemory texture_load_from_file(Arena* arena, String path); diff --git a/bootstrap/std/md5.c b/bootstrap/std/md5.c deleted file mode 100644 index 8895618..0000000 --- a/bootstrap/std/md5.c +++ /dev/null @@ -1,178 +0,0 @@ -#include - -STRUCT(MD5Context) -{ - u32 buffer[4]; - u8 input[64]; - u64 size; -}; - -// Took from: https://github.com/Zunawe/md5-c - -#define MD5_A 0x67452301 -#define MD5_B 0xefcdab89 -#define MD5_C 0x98badcfe -#define MD5_D 0x10325476 - -#define MD5_F(X, Y, Z) ((X & Y) | (~X & Z)) -#define MD5_G(X, Y, Z) ((X & Z) | (Y & ~Z)) -#define MD5_H(X, Y, Z) (X ^ Y ^ Z) -#define MD5_I(X, Y, Z) (Y ^ (X | ~Z)) - -global_variable u32 md5_s[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; - -global_variable u32 md5_k[] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, - 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, - 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, - 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, - 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, - 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, - 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, - 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, - 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, - 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, - 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, - 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, - 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, - 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, - 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}; - -/* - * Padding used to make the size (in bits) of the input congruent to 448 mod 512 - */ -global_variable u8 md5_padding[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - -fn MD5Context md5_init() -{ - return (MD5Context) { - .buffer = { MD5_A, MD5_B, MD5_C, MD5_D }, - }; -} - -fn u32 rotate_left_u32(u32 x, u32 n) -{ - return (x << n) | (x >> (32 - n)); -} - -fn void md5_step(u32* buffer, u32* input) -{ - u32 aa = buffer[0]; - u32 bb = buffer[1]; - u32 cc = buffer[2]; - u32 dd = buffer[3]; - - for (u32 i = 0; i < 64; i += 1) - { - u32 j; - u32 e; - switch (i / 16) - { - case 0: - { - e = MD5_F(bb, cc, dd); - j = i; - } break; - case 1: - { - e = MD5_G(bb, cc, dd); - j = ((i * 5) + 1) % 16; - } break; - case 2: - { - e = MD5_H(bb, cc, dd); - j = ((i * 3) + 5) % 16; - } break; - default: - { - e = MD5_I(bb, cc, dd); - j = (i * 7) % 16; - } break; - } - - u32 old_dd = dd; - dd = cc; - cc = bb; - bb = bb + rotate_left_u32(aa + e + md5_k[i] + input[j], md5_s[i]); - aa = old_dd; - } - - buffer[0] += aa; - buffer[1] += bb; - buffer[2] += cc; - buffer[3] += dd; -} - -fn void md5_update(MD5Context* context, String input_argument) -{ - u32 input_local[16]; - auto offset = context->size % 64; - context->size += input_argument.length; - - for (u64 i = 0; i < input_argument.length; i += 1) - { - context->input[offset] = input_argument.pointer[i]; - offset += 1; - - if (offset % 64 == 0) - { - // TODO: convert to little-endian in case we are big-endian? - for (u16 i = 0; i < 16; i += 1) - { - auto existing = *(u32*)&input_argument.pointer[i * 4]; - input_local[i] = existing; - } - md5_step(context->buffer, input_local); - offset = 0; - } - } -} - -fn MD5Result md5_end(MD5Context* context) -{ - u32 input[16]; - auto offset = context->size % 64; - auto padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset; - - md5_update(context, (String) { .pointer = md5_padding, .length = padding_length }); - context->size -= (u64)padding_length; - - for (u32 i = 0; i < 14; i += 1) - { - input[i] = *(u32*)&context->input[i * 4]; - } - input[14] = (u32)(context->size * 8); - input[15] = (u32)((context->size * 8) >> 32); - - md5_step(context->buffer, input); - - MD5Result result; - for (u32 i = 0; i < 4; i += 1) - { - result.hash[(i * 4) + 0] = (u8)((context->buffer[i] & 0x000000ff) >> 0); - result.hash[(i * 4) + 1] = (u8)((context->buffer[i] & 0x0000ff00) >> 8); - result.hash[(i * 4) + 2] = (u8)((context->buffer[i] & 0x00ff0000) >> 16); - result.hash[(i * 4) + 3] = (u8)((context->buffer[i] & 0xff000000) >> 24); - } - - return result; -} - -MD5Result md5_string(String string) -{ - auto context = md5_init(); - md5_update(&context, string); - auto result = md5_end(&context); - return result; -} diff --git a/bootstrap/std/md5.h b/bootstrap/std/md5.h deleted file mode 100644 index c889c31..0000000 --- a/bootstrap/std/md5.h +++ /dev/null @@ -1,8 +0,0 @@ -#include - -STRUCT(MD5Result) -{ - u8 hash[16]; -}; - -MD5Result md5_string(String string); diff --git a/bootstrap/std/metal_rendering.c b/bootstrap/std/metal_rendering.c deleted file mode 100644 index a5cd8b3..0000000 --- a/bootstrap/std/metal_rendering.c +++ /dev/null @@ -1,148 +0,0 @@ -#pragma once - -global_variable Renderer renderer_memory; - -fn NSString* apple_string(String string) -{ - NSString* result = [[NSString alloc] initWithBytes:string.pointer length:string.length encoding:NSUTF8StringEncoding]; - return result; -} - -fn Renderer* rendering_initialize(Arena* arena) -{ - Renderer* renderer = &renderer_memory; - @autoreleasepool { - renderer->device = MTLCreateSystemDefaultDevice(); - String shader_source = file_read(arena, strlit("bootstrap/std/shaders/rect.metal")); - NSString* apple_shader_source = apple_string(shader_source); - NSError* error = nil; - id library = [renderer->device newLibraryWithSource: apple_shader_source options:nil error:&error]; - if (!library) - { - // Inspect the error - NSLog(@"Error Domain: %@", error.domain); - NSLog(@"Error Code: %ld", (long)error.code); - NSLog(@"Localized Description: %@", error.localizedDescription); - - NSDictionary *userInfo = error.userInfo; - if (userInfo) { - NSLog(@"Additional Info: %@", userInfo); - } - - // Take action based on the error - if ([error.domain isEqualToString:MTLLibraryErrorDomain]) { - NSLog(@"Metal Library Compilation Error. Check the shader source."); - } else { - NSLog(@"Unexpected error occurred."); - } - } - - id vertex = [library newFunctionWithName:@"vertex_main"]; - id fragment = [library newFunctionWithName:@"fragment_main"]; - - MTLRenderPipelineDescriptor* pipeline_descriptor = [[MTLRenderPipelineDescriptor alloc] init]; - pipeline_descriptor.vertexFunction = vertex; - pipeline_descriptor.fragmentFunction = fragment; - pipeline_descriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - - id pipeline_state = [renderer->device newRenderPipelineStateWithDescriptor:pipeline_descriptor error:&error]; - - if (!pipeline_state) - { - // Inspect the error - NSLog(@"Error Domain: %@", error.domain); - NSLog(@"Error Code: %ld", (long)error.code); - NSLog(@"Localized Description: %@", error.localizedDescription); - - NSDictionary *userInfo = error.userInfo; - if (userInfo) { - NSLog(@"Additional Info: %@", userInfo); - } - } - - id command_queue = [renderer->device newCommandQueue]; - } - - return renderer; -} - -global_variable RenderWindow render_window_memory; - -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window) -{ - RenderWindow* render_window = &render_window_memory; - - CAMetalLayer* layer = [CAMetalLayer layer]; - render_window->layer = layer; - layer.device = renderer->device; - layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - layer.framebufferOnly = true; - layer.frame = window.frame; - window.contentView.layer = layer; - window.opaque = true; - window.backgroundColor = nil; - - return render_window; -} - -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window) -{ - @autoreleasepool { - id drawable = [window->layer nextDrawable]; - MTLRenderPassDescriptor* render_pass_descriptor = [MTLRenderPassDescriptor renderPassDescriptor]; - MTLRenderPassColorAttachmentDescriptor* color_attachment = render_pass_descriptor.colorAttachments[0]; - color_attachment.clearColor = MTLClearColorMake(1, 1, 1, 1); - color_attachment.storeAction = MTLStoreActionStore; - color_attachment.texture = drawable.texture; - - id command_buffer = [renderer->command_queue commandBuffer]; - - id render_command_encoder = [command_buffer renderCommandEncoderWithDescriptor:render_pass_descriptor]; - [render_command_encoder setRenderPipelineState: renderer->pipeline_state]; - [render_command_encoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:3]; - [render_command_encoder endEncoding]; - [command_buffer presentDrawable:drawable]; - [command_buffer commit]; - } -} - -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window) -{ - - // todo(); -} - -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory) -{ - todo(); -} - -fn void window_rect_texture_update_begin(RenderWindow* window) -{ - todo(); -} - -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas) -{ - todo(); -} - -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index) -{ - todo(); -} - -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window) -{ - todo(); -} - -fn void window_render_rect(RenderWindow* window, RectDraw draw) -{ - // todo(); -} - -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset) -{ - // todo(); -} diff --git a/bootstrap/std/metal_rendering.h b/bootstrap/std/metal_rendering.h deleted file mode 100644 index 5c9fc2a..0000000 --- a/bootstrap/std/metal_rendering.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#import - -STRUCT(Renderer) -{ - id device; - id command_queue; - id pipeline_state; -}; - -STRUCT(RenderWindow) -{ - CAMetalLayer* layer; -}; - diff --git a/bootstrap/std/os.c b/bootstrap/std/os.c deleted file mode 100644 index 0d1b68d..0000000 --- a/bootstrap/std/os.c +++ /dev/null @@ -1,1701 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include -#include - -#if _WIN32 -global_variable u64 cpu_frequency; -#else -#if LINK_LIBC -global_variable struct timespec cpu_resolution; -#else -global_variable u64 cpu_frequency; -#endif -#endif - -fn Timestamp os_timestamp() -{ - Timestamp result; - -#if _WIN32 - LARGE_INTEGER li; - QueryPerformanceCounter(&li); - result.value = u128_from_u64(li.QuadPart); -#else - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - result.value = u128_u64_or(u128_shift_left(u128_from_u64(ts.tv_sec), 64), ts.tv_nsec); -#endif - - return result; -} - -fn f64 os_resolve_timestamps(Timestamp start, Timestamp end, TimeUnit time_unit) -{ - f64 result; -#if _WIN32 - let(start_tick, (s64)u64_from_u128(start.value)); - let(end_tick, (s64)u64_from_u128(end.value)); - - let(seconds, (f64)(end_tick - start_tick) / cpu_frequency); - - switch (time_unit) - { - case TIME_UNIT_NANOSECONDS: - result = seconds * 1000000000.0; - break; - case TIME_UNIT_MICROSECONDS: - result = seconds * 1000000.0; - break; - case TIME_UNIT_MILLISECONDS: - result = seconds * 1000.0; - break; - case TIME_UNIT_SECONDS: - result = seconds; - break; - } -#else - let(segmented_nanoseconds, (s64)u64_from_u128(end.value) - (s64)u64_from_u128(start.value)); - let(segmented_seconds, (s64)u128_shift_right_by_64(end.value) - (s64)u128_shift_right_by_64(start.value)); - - if (segmented_nanoseconds < 0) - { - segmented_seconds -= 1; - segmented_nanoseconds += 1000000000; - } - - let(total_ns, segmented_seconds * 1000000000 + segmented_nanoseconds); - - switch (time_unit) - { - case TIME_UNIT_NANOSECONDS: - result = total_ns; - break; - case TIME_UNIT_MICROSECONDS: - result = total_ns / 1000.0; - break; - case TIME_UNIT_MILLISECONDS: - result = total_ns / 1000000.0; - break; - case TIME_UNIT_SECONDS: - result = total_ns / 1000000000.0; - break; - } -#endif - - return result; -} - -fn FileDescriptor os_stdout_get() -{ -#if _WIN32 - let(handle, GetStdHandle(STD_OUTPUT_HANDLE)); - assert(handle != INVALID_HANDLE_VALUE); - return handle; -#else - return 1; -#endif -} - -fn String path_dir(String string) -{ - String result = {}; - let(index, string_last_ch(string, '/')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, 0, index); - } - - return result; -} - -fn String path_base(String string) -{ - String result = {}; - let(index, string_last_ch(string, '/')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, index + 1, string.length); - } -#if _WIN32 - if (!result.pointer) - { - index = string_last_ch(string, '\\'); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, index + 1, string.length); - } - } -#endif - - return result; -} - -fn String path_no_extension(String string) -{ - String result = {}; - let(index, string_last_ch(string, '.')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, 0, index); - } - - return result; -} - -#if LINK_LIBC == 0 -#ifdef __linux__ -fn forceinline long syscall0(long n) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall1(long n, long a1) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall2(long n, long a1, long a2) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) - : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall3(long n, long a1, long a2, long a3) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall4(long n, long a1, long a2, long a3, long a4) -{ - long ret; - register long r10 __asm__("r10") = a4; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10): "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall5(long n, long a1, long a2, long a3, long a4, long a5) -{ - long ret; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) -{ - long ret; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - register long r9 __asm__("r9") = a6; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); - return ret; -} - -enum SyscallX86_64 : u64 { - syscall_x86_64_read = 0, - syscall_x86_64_write = 1, - syscall_x86_64_open = 2, - syscall_x86_64_close = 3, - syscall_x86_64_stat = 4, - syscall_x86_64_fstat = 5, - syscall_x86_64_lstat = 6, - syscall_x86_64_poll = 7, - syscall_x86_64_lseek = 8, - syscall_x86_64_mmap = 9, - syscall_x86_64_mprotect = 10, - syscall_x86_64_munmap = 11, - syscall_x86_64_brk = 12, - syscall_x86_64_rt_sigaction = 13, - syscall_x86_64_rt_sigprocmask = 14, - syscall_x86_64_rt_sigreturn = 15, - syscall_x86_64_ioctl = 16, - syscall_x86_64_pread64 = 17, - syscall_x86_64_pwrite64 = 18, - syscall_x86_64_readv = 19, - syscall_x86_64_writev = 20, - syscall_x86_64_access = 21, - syscall_x86_64_pipe = 22, - syscall_x86_64_select = 23, - syscall_x86_64_sched_yield = 24, - syscall_x86_64_mremap = 25, - syscall_x86_64_msync = 26, - syscall_x86_64_mincore = 27, - syscall_x86_64_madvise = 28, - syscall_x86_64_shmget = 29, - syscall_x86_64_shmat = 30, - syscall_x86_64_shmctl = 31, - syscall_x86_64_dup = 32, - syscall_x86_64_dup2 = 33, - syscall_x86_64_pause = 34, - syscall_x86_64_nanosleep = 35, - syscall_x86_64_getitimer = 36, - syscall_x86_64_alarm = 37, - syscall_x86_64_setitimer = 38, - syscall_x86_64_getpid = 39, - syscall_x86_64_sendfile = 40, - syscall_x86_64_socket = 41, - syscall_x86_64_connect = 42, - syscall_x86_64_accept = 43, - syscall_x86_64_sendto = 44, - syscall_x86_64_recvfrom = 45, - syscall_x86_64_sendmsg = 46, - syscall_x86_64_recvmsg = 47, - syscall_x86_64_shutdown = 48, - syscall_x86_64_bind = 49, - syscall_x86_64_listen = 50, - syscall_x86_64_getsockname = 51, - syscall_x86_64_getpeername = 52, - syscall_x86_64_socketpair = 53, - syscall_x86_64_setsockopt = 54, - syscall_x86_64_getsockopt = 55, - syscall_x86_64_clone = 56, - syscall_x86_64_fork = 57, - syscall_x86_64_vfork = 58, - syscall_x86_64_execve = 59, - syscall_x86_64_exit = 60, - syscall_x86_64_wait4 = 61, - syscall_x86_64_kill = 62, - syscall_x86_64_uname = 63, - syscall_x86_64_semget = 64, - syscall_x86_64_semop = 65, - syscall_x86_64_semctl = 66, - syscall_x86_64_shmdt = 67, - syscall_x86_64_msgget = 68, - syscall_x86_64_msgsnd = 69, - syscall_x86_64_msgrcv = 70, - syscall_x86_64_msgctl = 71, - syscall_x86_64_fcntl = 72, - syscall_x86_64_flock = 73, - syscall_x86_64_fsync = 74, - syscall_x86_64_fdatasync = 75, - syscall_x86_64_truncate = 76, - syscall_x86_64_ftruncate = 77, - syscall_x86_64_getdents = 78, - syscall_x86_64_getcwd = 79, - syscall_x86_64_chdir = 80, - syscall_x86_64_fchdir = 81, - syscall_x86_64_rename = 82, - syscall_x86_64_mkdir = 83, - syscall_x86_64_rmdir = 84, - syscall_x86_64_creat = 85, - syscall_x86_64_link = 86, - syscall_x86_64_unlink = 87, - syscall_x86_64_symlink = 88, - syscall_x86_64_readlink = 89, - syscall_x86_64_chmod = 90, - syscall_x86_64_fchmod = 91, - syscall_x86_64_chown = 92, - syscall_x86_64_fchown = 93, - syscall_x86_64_lchown = 94, - syscall_x86_64_umask = 95, - syscall_x86_64_gettimeofday = 96, - syscall_x86_64_getrlimit = 97, - syscall_x86_64_getrusage = 98, - syscall_x86_64_sysinfo = 99, - syscall_x86_64_times = 100, - syscall_x86_64_ptrace = 101, - syscall_x86_64_getuid = 102, - syscall_x86_64_syslog = 103, - syscall_x86_64_getgid = 104, - syscall_x86_64_setuid = 105, - syscall_x86_64_setgid = 106, - syscall_x86_64_geteuid = 107, - syscall_x86_64_getegid = 108, - syscall_x86_64_setpgid = 109, - syscall_x86_64_getppid = 110, - syscall_x86_64_getpgrp = 111, - syscall_x86_64_setsid = 112, - syscall_x86_64_setreuid = 113, - syscall_x86_64_setregid = 114, - syscall_x86_64_getgroups = 115, - syscall_x86_64_setgroups = 116, - syscall_x86_64_setresuid = 117, - syscall_x86_64_getresuid = 118, - syscall_x86_64_setresgid = 119, - syscall_x86_64_getresgid = 120, - syscall_x86_64_getpgid = 121, - syscall_x86_64_setfsuid = 122, - syscall_x86_64_setfsgid = 123, - syscall_x86_64_getsid = 124, - syscall_x86_64_capget = 125, - syscall_x86_64_capset = 126, - syscall_x86_64_rt_sigpending = 127, - syscall_x86_64_rt_sigtimedwait = 128, - syscall_x86_64_rt_sigqueueinfo = 129, - syscall_x86_64_rt_sigsuspend = 130, - syscall_x86_64_sigaltstack = 131, - syscall_x86_64_utime = 132, - syscall_x86_64_mknod = 133, - syscall_x86_64_uselib = 134, - syscall_x86_64_personality = 135, - syscall_x86_64_ustat = 136, - syscall_x86_64_statfs = 137, - syscall_x86_64_fstatfs = 138, - syscall_x86_64_sysfs = 139, - syscall_x86_64_getpriority = 140, - syscall_x86_64_setpriority = 141, - syscall_x86_64_sched_setparam = 142, - syscall_x86_64_sched_getparam = 143, - syscall_x86_64_sched_setscheduler = 144, - syscall_x86_64_sched_getscheduler = 145, - syscall_x86_64_sched_get_priority_max = 146, - syscall_x86_64_sched_get_priority_min = 147, - syscall_x86_64_sched_rr_get_interval = 148, - syscall_x86_64_mlock = 149, - syscall_x86_64_munlock = 150, - syscall_x86_64_mlockall = 151, - syscall_x86_64_munlockall = 152, - syscall_x86_64_vhangup = 153, - syscall_x86_64_modify_ldt = 154, - syscall_x86_64_pivot_root = 155, - syscall_x86_64__sysctl = 156, - syscall_x86_64_prctl = 157, - syscall_x86_64_arch_prctl = 158, - syscall_x86_64_adjtimex = 159, - syscall_x86_64_setrlimit = 160, - syscall_x86_64_chroot = 161, - syscall_x86_64_sync = 162, - syscall_x86_64_acct = 163, - syscall_x86_64_settimeofday = 164, - syscall_x86_64_mount = 165, - syscall_x86_64_umount2 = 166, - syscall_x86_64_swapon = 167, - syscall_x86_64_swapoff = 168, - syscall_x86_64_reboot = 169, - syscall_x86_64_sethostname = 170, - syscall_x86_64_setdomainname = 171, - syscall_x86_64_iopl = 172, - syscall_x86_64_ioperm = 173, - syscall_x86_64_create_module = 174, - syscall_x86_64_init_module = 175, - syscall_x86_64_delete_module = 176, - syscall_x86_64_get_kernel_syms = 177, - syscall_x86_64_query_module = 178, - syscall_x86_64_quotactl = 179, - syscall_x86_64_nfsservctl = 180, - syscall_x86_64_getpmsg = 181, - syscall_x86_64_putpmsg = 182, - syscall_x86_64_afs_syscall = 183, - syscall_x86_64_tuxcall = 184, - syscall_x86_64_security = 185, - syscall_x86_64_gettid = 186, - syscall_x86_64_readahead = 187, - syscall_x86_64_setxattr = 188, - syscall_x86_64_lsetxattr = 189, - syscall_x86_64_fsetxattr = 190, - syscall_x86_64_getxattr = 191, - syscall_x86_64_lgetxattr = 192, - syscall_x86_64_fgetxattr = 193, - syscall_x86_64_listxattr = 194, - syscall_x86_64_llistxattr = 195, - syscall_x86_64_flistxattr = 196, - syscall_x86_64_removexattr = 197, - syscall_x86_64_lremovexattr = 198, - syscall_x86_64_fremovexattr = 199, - syscall_x86_64_tkill = 200, - syscall_x86_64_time = 201, - syscall_x86_64_futex = 202, - syscall_x86_64_sched_setaffinity = 203, - syscall_x86_64_sched_getaffinity = 204, - syscall_x86_64_set_thread_area = 205, - syscall_x86_64_io_setup = 206, - syscall_x86_64_io_destroy = 207, - syscall_x86_64_io_getevents = 208, - syscall_x86_64_io_submit = 209, - syscall_x86_64_io_cancel = 210, - syscall_x86_64_get_thread_area = 211, - syscall_x86_64_lookup_dcookie = 212, - syscall_x86_64_epoll_create = 213, - syscall_x86_64_epoll_ctl_old = 214, - syscall_x86_64_epoll_wait_old = 215, - syscall_x86_64_remap_file_pages = 216, - syscall_x86_64_getdents64 = 217, - syscall_x86_64_set_tid_address = 218, - syscall_x86_64_restart_syscall = 219, - syscall_x86_64_semtimedop = 220, - syscall_x86_64_fadvise64 = 221, - syscall_x86_64_timer_create = 222, - syscall_x86_64_timer_settime = 223, - syscall_x86_64_timer_gettime = 224, - syscall_x86_64_timer_getoverrun = 225, - syscall_x86_64_timer_delete = 226, - syscall_x86_64_clock_settime = 227, - syscall_x86_64_clock_gettime = 228, - syscall_x86_64_clock_getres = 229, - syscall_x86_64_clock_nanosleep = 230, - syscall_x86_64_exit_group = 231, - syscall_x86_64_epoll_wait = 232, - syscall_x86_64_epoll_ctl = 233, - syscall_x86_64_tgkill = 234, - syscall_x86_64_utimes = 235, - syscall_x86_64_vserver = 236, - syscall_x86_64_mbind = 237, - syscall_x86_64_set_mempolicy = 238, - syscall_x86_64_get_mempolicy = 239, - syscall_x86_64_mq_open = 240, - syscall_x86_64_mq_unlink = 241, - syscall_x86_64_mq_timedsend = 242, - syscall_x86_64_mq_timedreceive = 243, - syscall_x86_64_mq_notify = 244, - syscall_x86_64_mq_getsetattr = 245, - syscall_x86_64_kexec_load = 246, - syscall_x86_64_waitid = 247, - syscall_x86_64_add_key = 248, - syscall_x86_64_request_key = 249, - syscall_x86_64_keyctl = 250, - syscall_x86_64_ioprio_set = 251, - syscall_x86_64_ioprio_get = 252, - syscall_x86_64_inotify_init = 253, - syscall_x86_64_inotify_add_watch = 254, - syscall_x86_64_inotify_rm_watch = 255, - syscall_x86_64_migrate_pages = 256, - syscall_x86_64_openat = 257, - syscall_x86_64_mkdirat = 258, - syscall_x86_64_mknodat = 259, - syscall_x86_64_fchownat = 260, - syscall_x86_64_futimesat = 261, - syscall_x86_64_fstatat64 = 262, - syscall_x86_64_unlinkat = 263, - syscall_x86_64_renameat = 264, - syscall_x86_64_linkat = 265, - syscall_x86_64_symlinkat = 266, - syscall_x86_64_readlinkat = 267, - syscall_x86_64_fchmodat = 268, - syscall_x86_64_faccessat = 269, - syscall_x86_64_pselect6 = 270, - syscall_x86_64_ppoll = 271, - syscall_x86_64_unshare = 272, - syscall_x86_64_set_robust_list = 273, - syscall_x86_64_get_robust_list = 274, - syscall_x86_64_splice = 275, - syscall_x86_64_tee = 276, - syscall_x86_64_sync_file_range = 277, - syscall_x86_64_vmsplice = 278, - syscall_x86_64_move_pages = 279, - syscall_x86_64_utimensat = 280, - syscall_x86_64_epoll_pwait = 281, - syscall_x86_64_signalfd = 282, - syscall_x86_64_timerfd_create = 283, - syscall_x86_64_eventfd = 284, - syscall_x86_64_fallocate = 285, - syscall_x86_64_timerfd_settime = 286, - syscall_x86_64_timerfd_gettime = 287, - syscall_x86_64_accept4 = 288, - syscall_x86_64_signalfd4 = 289, - syscall_x86_64_eventfd2 = 290, - syscall_x86_64_epoll_create1 = 291, - syscall_x86_64_dup3 = 292, - syscall_x86_64_pipe2 = 293, - syscall_x86_64_inotify_init1 = 294, - syscall_x86_64_preadv = 295, - syscall_x86_64_pwritev = 296, - syscall_x86_64_rt_tgsigqueueinfo = 297, - syscall_x86_64_perf_event_open = 298, - syscall_x86_64_recvmmsg = 299, - syscall_x86_64_fanotify_init = 300, - syscall_x86_64_fanotify_mark = 301, - syscall_x86_64_prlimit64 = 302, - syscall_x86_64_name_to_handle_at = 303, - syscall_x86_64_open_by_handle_at = 304, - syscall_x86_64_clock_adjtime = 305, - syscall_x86_64_syncfs = 306, - syscall_x86_64_sendmmsg = 307, - syscall_x86_64_setns = 308, - syscall_x86_64_getcpu = 309, - syscall_x86_64_process_vm_readv = 310, - syscall_x86_64_process_vm_writev = 311, - syscall_x86_64_kcmp = 312, - syscall_x86_64_finit_module = 313, - syscall_x86_64_sched_setattr = 314, - syscall_x86_64_sched_getattr = 315, - syscall_x86_64_renameat2 = 316, - syscall_x86_64_seccomp = 317, - syscall_x86_64_getrandom = 318, - syscall_x86_64_memfd_create = 319, - syscall_x86_64_kexec_file_load = 320, - syscall_x86_64_bpf = 321, - syscall_x86_64_execveat = 322, - syscall_x86_64_userfaultfd = 323, - syscall_x86_64_membarrier = 324, - syscall_x86_64_mlock2 = 325, - syscall_x86_64_copy_file_range = 326, - syscall_x86_64_preadv2 = 327, - syscall_x86_64_pwritev2 = 328, - syscall_x86_64_pkey_mprotect = 329, - syscall_x86_64_pkey_alloc = 330, - syscall_x86_64_pkey_free = 331, - syscall_x86_64_statx = 332, - syscall_x86_64_io_pgetevents = 333, - syscall_x86_64_rseq = 334, - syscall_x86_64_pidfd_send_signal = 424, - syscall_x86_64_io_uring_setup = 425, - syscall_x86_64_io_uring_enter = 426, - syscall_x86_64_io_uring_register = 427, - syscall_x86_64_open_tree = 428, - syscall_x86_64_move_mount = 429, - syscall_x86_64_fsopen = 430, - syscall_x86_64_fsconfig = 431, - syscall_x86_64_fsmount = 432, - syscall_x86_64_fspick = 433, - syscall_x86_64_pidfd_open = 434, - syscall_x86_64_clone3 = 435, - syscall_x86_64_close_range = 436, - syscall_x86_64_openat2 = 437, - syscall_x86_64_pidfd_getfd = 438, - syscall_x86_64_faccessat2 = 439, - syscall_x86_64_process_madvise = 440, - syscall_x86_64_epoll_pwait2 = 441, - syscall_x86_64_mount_setattr = 442, - syscall_x86_64_quotactl_fd = 443, - syscall_x86_64_landlock_create_ruleset = 444, - syscall_x86_64_landlock_add_rule = 445, - syscall_x86_64_landlock_restrict_self = 446, - syscall_x86_64_memfd_secret = 447, - syscall_x86_64_process_mrelease = 448, - syscall_x86_64_futex_waitv = 449, - syscall_x86_64_set_mempolicy_home_node = 450, - syscall_x86_64_cachestat = 451, - syscall_x86_64_fchmodat2 = 452, - syscall_x86_64_map_shadow_stack = 453, - syscall_x86_64_futex_wake = 454, - syscall_x86_64_futex_wait = 455, - syscall_x86_64_futex_requeue = 456, -}; -#endif -#endif - -#ifndef _WIN32 -fn void* posix_mmap(void* address, size_t length, int protection_flags, int map_flags, int fd, signed long offset) -{ -#if LINK_LIBC - return mmap(address, length, protection_flags, map_flags, fd, offset); -#else -#ifdef __linux__ - return (void*) syscall6(syscall_x86_64_mmap, (s64)address, cast_to(s64, length), protection_flags, map_flags, fd, offset); -#else -#error "Unsupported operating system for static linking" -#endif -#endif -} - -fn int syscall_mprotect(void *address, size_t length, int protection_flags) -{ -#if LINK_LIBC - return mprotect(address, length, protection_flags); -#else -#ifdef __linux__ - return cast_to(s32, syscall3(syscall_x86_64_mprotect, (s64)address, cast_to(s64, length), protection_flags)); -#else - return mprotect(address, length, protection_flags); -#endif -#endif -} - -fn int syscall_open(const char *file_path, int flags, int mode) -{ -#if LINK_LIBC - return open(file_path, flags, mode); -#else -#ifdef __linux__ - return cast_to(s32, syscall3(syscall_x86_64_open, (s64)file_path, flags, mode)); -#else - return open(file_path, flags, mode); -#endif -#endif -} - -fn int syscall_close(int fd) -{ -#if LINK_LIBC - return close(fd); -#else -#ifdef __linux__ - return cast_to(s32, syscall1(syscall_x86_64_close, fd)); -#else - return close(fd); -#endif -#endif -} - -fn int syscall_fstat(int fd, struct stat *buffer) -{ -#if LINK_LIBC - return fstat(fd, buffer); -#else -#ifdef __linux__ - return cast_to(s32, syscall2(syscall_x86_64_fstat, fd, (s64)buffer)); -#else - return fstat(fd, buffer); -#endif -#endif -} - -fn ssize_t syscall_read(int fd, void* buffer, size_t bytes) -{ -#if LINK_LIBC - return read(fd, buffer, bytes); -#else -#ifdef __linux__ - return syscall3(syscall_x86_64_read, fd, (s64)buffer, (s64)bytes); -#else - return read(fd, buffer, bytes); -#endif -#endif -} - -fn ssize_t syscall_write(int fd, const void *buffer, size_t bytes) -{ -#if LINK_LIBC - return write(fd, buffer, bytes); -#else -#ifdef __linux__ - return syscall3(syscall_x86_64_write, fd, (s64)buffer, (s64)bytes); -#else - return write(fd, buffer, bytes); -#endif -#endif -} - -fn int syscall_mkdir(String path, u32 mode) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return mkdir((char*)path.pointer, mode); -#else - return cast_to(s32, syscall2(syscall_x86_64_mkdir, (s64)path.pointer, (s64)mode)); -#endif -} - -fn int syscall_rmdir(String path) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return rmdir((char*)path.pointer); -#else - return cast_to(s32, syscall1(syscall_x86_64_rmdir, (s64)path.pointer)); -#endif -} - -fn int syscall_unlink(String path) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return unlink((char*)path.pointer); -#else - return cast_to(s32, syscall1(syscall_x86_64_unlink, (s64)path.pointer)); -#endif -} - -fn pid_t syscall_fork() -{ -#if LINK_LIBC - return fork(); -#else - return cast_to(s32, syscall0(syscall_x86_64_fork)); -#endif - -} - -fn signed long syscall_execve(const char* path, char *const argv[], char *const envp[]) -{ -#if LINK_LIBC - return execve(path, argv, envp); -#else - return syscall3(syscall_x86_64_execve, (s64)path, (s64)argv, (s64)envp); -#endif -} - -fn pid_t syscall_waitpid(pid_t pid, int* status, int options) -{ -#if LINK_LIBC - return waitpid(pid, status, options); -#else - return cast_to(s32, syscall4(syscall_x86_64_wait4, pid, (s64)status, options, 0)); -#endif -} - -fn int syscall_gettimeofday(struct timeval* tv, struct timezone* tz) -{ -#if LINK_LIBC - return gettimeofday(tv, tz); -#else - return cast_to(s32, syscall2(syscall_x86_64_gettimeofday, (s64)tv, (s64)tz)); -#endif -} - -BB_NORETURN BB_COLD fn void syscall_exit(int status) -{ -#if LINK_LIBC - _exit(status); -#else -#ifdef __linux__ - (void)syscall1(231, status); - trap(); -#else - _exit(status); -#endif -#endif -} -#endif - -fn u64 os_timer_freq() -{ - return 1000 * 1000; -} - -fn u64 os_timer_get() -{ -#if _WIN32 - LARGE_INTEGER large_integer; - QueryPerformanceCounter(&large_integer); - return (u64)large_integer.QuadPart; -#else - struct timeval tv; - syscall_gettimeofday(&tv, 0); - let(result, os_timer_freq() * cast_to(u64, tv.tv_sec) + cast_to(u64, tv.tv_usec)); - return result; -#endif -} - -FileDescriptor os_file_descriptor_invalid() -{ -#if _WIN32 - return INVALID_HANDLE_VALUE; -#else - return -1; -#endif -} - -fn u8 os_file_descriptor_is_valid(FileDescriptor fd) -{ -#if _WIN32 - return fd != INVALID_HANDLE_VALUE; -#else - return fd >= 0; -#endif -} - -fn FileDescriptor os_file_open(String path, OSFileOpenFlags flags, OSFilePermissions permissions) -{ - assert(path.pointer[path.length] == 0); -#if _WIN32 - unused(permissions); - - DWORD dwDesiredAccess = 0; - dwDesiredAccess |= flags.read * GENERIC_READ; - dwDesiredAccess |= flags.write * GENERIC_WRITE; - dwDesiredAccess |= flags.executable * GENERIC_EXECUTE; - DWORD dwShareMode = 0; - LPSECURITY_ATTRIBUTES lpSecurityAttributes = 0; - DWORD dwCreationDisposition = 0; - dwCreationDisposition |= (!flags.create) * OPEN_EXISTING; - dwCreationDisposition |= flags.create * CREATE_ALWAYS; - DWORD dwFlagsAndAttributes = 0; - dwFlagsAndAttributes |= FILE_ATTRIBUTE_NORMAL; - dwFlagsAndAttributes |= flags.directory * FILE_FLAG_BACKUP_SEMANTICS; - HANDLE hTemplateFile = 0; - - let(handle, CreateFileA(string_to_c(path), dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)); - return handle; -#else - int posix_flags = 0; - posix_flags |= O_WRONLY * (flags.write & !flags.read); - posix_flags |= O_RDONLY * ((!flags.write) & flags.read); - posix_flags |= O_RDWR * (flags.write & flags.read); - posix_flags |= O_CREAT * flags.create; - posix_flags |= O_TRUNC * flags.truncate; - - int posix_permissions; - // TODO: make permissions better - if (permissions.executable) - { - posix_permissions = 0755; - } - else - { - posix_permissions = 0644; - } - let(result, syscall_open((char*)path.pointer, posix_flags, posix_permissions)); - return result; -#endif -} - -fn u64 os_file_get_size(FileDescriptor fd) -{ -#if _WIN32 - LARGE_INTEGER file_size; - BOOL result = GetFileSizeEx(fd, &file_size); - assert(result != 0); - return (u64)file_size.QuadPart; -#else - struct stat stat_buffer; - int stat_result = syscall_fstat(fd, &stat_buffer); - assert(stat_result == 0); - let_cast(u64, size, stat_buffer.st_size); - return size; -#endif -} - -fn void os_file_write(FileDescriptor fd, String content) -{ -#if _WIN32 - DWORD bytes_written = 0; - BOOL result = WriteFile(fd, content.pointer, cast_to(u32, content.length), &bytes_written, 0); - assert(result != 0); -#else - let(result, syscall_write(fd, content.pointer, content.length)); - let(my_errno, strerror(errno)); - unused(my_errno); - assert(cast_to(u64, result) == content.length); -#endif -} - -fn u64 os_file_read(FileDescriptor fd, String buffer, u64 byte_count) -{ - assert(byte_count); - assert(byte_count <= buffer.length); - u64 bytes_read = 0; - if (byte_count <= buffer.length) - { -#if _WIN32 - DWORD read = 0; - BOOL result = ReadFile(fd, buffer.pointer, cast_to(u32, byte_count), &read, 0); - assert(result != 0); - bytes_read = read; -#else - let(result, syscall_read(fd, buffer.pointer, byte_count)); - assert(result > 0); - if (result > 0) - { - assign_cast(bytes_read, result); - } -#endif - } - assert(bytes_read == byte_count); - return bytes_read; -} - -fn void os_file_close(FileDescriptor fd) -{ -#if _WIN32 - BOOL result = CloseHandle(fd); - assert(result != 0); -#else - let(result, syscall_close(fd)); - assert(result == 0); -#endif -} - -fn void calibrate_cpu_timer() -{ -#ifndef SILENT -#if _WIN32 - LARGE_INTEGER li; - QueryPerformanceFrequency(&li); - cpu_frequency = (u64)li.QuadPart; -#else -#if LINK_LIBC - clock_getres(CLOCK_MONOTONIC, &cpu_resolution); -#else - u64 miliseconds_to_wait = 100; - u64 cpu_start = os_timestamp(); - u64 os_frequency = os_timer_freq(); - u64 os_elapsed = 0; - u64 os_start = os_timer_get(); - u64 os_wait_time = os_frequency * miliseconds_to_wait / 1000; - - while (os_elapsed < os_wait_time) - { - let(os_end, os_timer_get()); - os_elapsed = os_end - os_start; - } - - u64 cpu_end = os_timestamp(); - u64 cpu_elapsed = cpu_end - cpu_start; - cpu_frequency = os_frequency * cpu_elapsed / os_elapsed; -#endif -#endif -#endif -} - -fn u8* os_reserve(u64 base, u64 size, OSReserveProtectionFlags protection, OSReserveMapFlags map) -{ -#if _WIN32 - DWORD map_flags = 0; - map_flags |= (MEM_RESERVE * map.noreserve); - DWORD protection_flags = 0; - protection_flags |= PAGE_READWRITE * (!protection.write && !protection.read); - protection_flags |= PAGE_READWRITE * (protection.write && protection.read); - protection_flags |= PAGE_READONLY * (protection.write && !protection.read); - return (u8*)VirtualAlloc((void*)base, size, map_flags, protection_flags); -#else - int protection_flags = (protection.read * PROT_READ) | (protection.write * PROT_WRITE) | (protection.execute * PROT_EXEC); - int map_flags = (map.anon * MAP_ANONYMOUS) | (map.priv * MAP_PRIVATE) | (map.noreserve * MAP_NORESERVE); -#ifdef __linux__ - map_flags |= (map.populate * MAP_POPULATE); -#endif - u8* result = (u8*)posix_mmap((void*)base, size, protection_flags, map_flags, -1, 0); - assert(result != MAP_FAILED); - return result; -#endif -} - -fn void os_commit(void* address, u64 size) -{ -#if _WIN32 - VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE); -#else - int result = syscall_mprotect(address, size, PROT_READ | PROT_WRITE); - assert(result == 0); -#endif -} - -fn void os_directory_make(String path) -{ - assert(path.pointer[path.length] == 0); -#if _WIN32 - CreateDirectoryA((char*)path.pointer, 0); -#else - syscall_mkdir(path, 0755); -#endif -} - -fn u8 os_is_being_debugged() -{ - u8 result = 0; -#if _WIN32 - result = IsDebuggerPresent() != 0; -#else -#ifdef __APPLE__ - let(request, PT_TRACE_ME); -#else - let(request, PTRACE_TRACEME); -#endif - if (ptrace(request, 0, 0, 0) == -1) - { - let(error, errno); - if (error == EPERM) - { - result = 1; - } - } -#endif - - return result; -} - -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code) -{ - if (exit_code != 0 && os_is_being_debugged()) - { - trap(); - } - exit(exit_code); -} - -fn void vprint(const char* format, va_list args) -{ - u8 stack_buffer[16*1024]; - String buffer = { .pointer = stack_buffer, .length = array_length(stack_buffer) }; - String final_string = format_string_va(buffer, format, args); - os_file_write(os_stdout_get(), final_string); -} - -fn void print(const char* format, ...) -{ - va_list args; - va_start(args, format); - vprint(format, args); - va_end(args); -} - -static_assert(sizeof(Arena) == 64); -global_variable const u64 minimum_position = sizeof(Arena); - -fn Arena* arena_initialize(u64 reserved_size, u64 granularity, u64 initial_size) -{ - OSReserveProtectionFlags protection_flags = { - .read = 1, - .write = 1, - }; - OSReserveMapFlags map_flags = { - .priv = 1, - .anon = 1, - .noreserve = 1, - }; - Arena* arena = (Arena*)os_reserve(0, reserved_size, protection_flags, map_flags); - os_commit(arena, initial_size); - *arena = (Arena) { - .reserved_size = reserved_size, - .os_position = initial_size, - .position = minimum_position, - .granularity = granularity, - }; - return arena; -} - -fn Arena* arena_initialize_default(u64 initial_size) -{ - return arena_initialize(default_size, minimum_granularity, initial_size); -} - -fn u8* arena_allocate_bytes(Arena* arena, u64 size, u64 alignment) -{ - u64 aligned_offset = align_forward_u64(arena->position, alignment); - u64 aligned_size_after = aligned_offset + size; - - if (aligned_size_after > arena->os_position) - { - u64 committed_size = align_forward_u64(aligned_size_after, arena->granularity); - u64 size_to_commit = committed_size - arena->os_position; - void* commit_pointer = (u8*)arena + arena->os_position; - os_commit(commit_pointer, size_to_commit); - arena->os_position = committed_size; - } - - let(result, (u8*)arena + aligned_offset); - arena->position = aligned_size_after; - assert(arena->position <= arena->os_position); - return result; -} - -fn String arena_join_string(Arena* arena, Slice(String) pieces) -{ - u64 size = 0; - for (u64 i = 0; i < pieces.length; i += 1) - { - String piece = pieces.pointer[i]; - size += piece.length; - } - - u8* pointer = arena_allocate_bytes(arena, size + 1, 1); - let(it, pointer); - for (u64 i = 0; i < pieces.length; i += 1) - { - String piece = pieces.pointer[i]; - memcpy(it, piece.pointer, piece.length); - it += piece.length; - } - assert((u64)(it - pointer) == size); - *it = 0; - - return (String) { .pointer = pointer, .length = size }; -} - -fn String arena_duplicate_string(Arena* arena, String string) -{ - u8* result = arena_allocate(arena, u8, string.length + 1); - memcpy(result, string.pointer, string.length); - result[string.length] = 0; - - return (String) { - .pointer = result, - .length = string.length, - }; -} - -fn void arena_reset(Arena* arena) -{ - arena->position = minimum_position; - memset(arena + 1, 0, arena->position - minimum_position); -} - -fn String file_read(Arena* arena, String path) -{ - String result = {}; - let(file_descriptor, os_file_open(path, (OSFileOpenFlags) { - .truncate = 0, - .executable = 0, - .write = 0, - .read = 1, - .create = 0, - }, (OSFilePermissions) { - .readable = 1, - })); - - if (os_file_descriptor_is_valid(file_descriptor)) - { - let(file_size, os_file_get_size(file_descriptor)); - if (file_size > 0) - { - result = (String){ - .pointer = arena_allocate_bytes(arena, file_size, 64), - .length = file_size, - }; - - // TODO: big files - // TODO: result codes - os_file_read(file_descriptor, result, file_size); - } - else - { - result.pointer = (u8*)&result; - } - - // TODO: check result - os_file_close(file_descriptor); - } - - - return result; -} - -fn void file_write(FileWriteOptions options) -{ - let(fd, os_file_open(options.path, (OSFileOpenFlags) { - .write = 1, - .truncate = 1, - .create = 1, - .executable = options.executable, - }, (OSFilePermissions) { - .readable = 1, - .writable = 1, - .executable = options.executable, - })); - assert(os_file_descriptor_is_valid(fd)); - - os_file_write(fd, options.content); - os_file_close(fd); -} - -fn RunCommandResult run_command(Arena* arena, CStringSlice arguments, char* envp[], RunCommandOptions run_options) -{ - unused(arena); - assert(arguments.length > 0); - assert(arguments.pointer[arguments.length - 1] == 0); - - RunCommandResult result = {}; - Timestamp start_timestamp = {}; - Timestamp end_timestamp = {}; - f64 ms = 0.0; - u64 measure_time = run_options.debug; - - if (run_options.debug) - { - print("Running command:\n"); - for (u32 i = 0; i < arguments.length - 1; i += 1) - { - char* argument = arguments.pointer[i]; - print("{cstr} ", argument); - } - print("\n"); - } - -#if _WIN32 - u32 length = 0; - for (u32 i = 0; i < arguments.length; i += 1) - { - let(argument, arguments.pointer[i]); - if (argument) - { - let(string_len, strlen(argument)); - length += cast_to(u32, string_len + 1); - } - } - - char* bytes = (char*)arena_allocate_bytes(arena, length, 1); - u32 byte_i = 0; - for (u32 i = 0; i < arguments.length; i += 1) - { - let(argument, arguments.pointer[i]); - if (argument) - { - let(len, strlen(argument)); - memcpy(&bytes[byte_i], argument, len); - byte_i += cast_to(u32, len); - bytes[byte_i] = ' '; - byte_i += 1; - } - } - bytes[byte_i - 1] = 0; - - PROCESS_INFORMATION process_information = {}; - STARTUPINFOA startup_info = {}; - startup_info.cb = sizeof(startup_info); - startup_info.dwFlags |= STARTF_USESTDHANDLES; - startup_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); - startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); - let(handle_inheritance, 1); - - if (measure_time) - { - start_timestamp = os_timestamp(); - } - - if (CreateProcessA(0, bytes, 0, 0, handle_inheritance, 0, 0, 0, &startup_info, &process_information)) - { - WaitForSingleObject(process_information.hProcess, INFINITE); - if (measure_time) - { - end_timestamp = os_timestamp(); - ms = os_resolve_timestamps(start_timestamp, end_timestamp, TIME_UNIT_MILLISECONDS); - } - - - if (run_options.debug) - { - print("Process ran in {f64} ms\n", ms); - } - - DWORD exit_code; - if (GetExitCodeProcess(process_information.hProcess, &exit_code)) - { - if (run_options.debug) - { - print("Process ran with exit code: 0x{u32:x}\n", exit_code); - } - - if (exit_code != 0) - { - failed_execution(); - } - } - else - { - failed_execution(); - } - - CloseHandle(process_information.hProcess); - CloseHandle(process_information.hThread); - } - else - { - let(err, GetLastError()); - LPSTR lpMsgBuf; - DWORD bufSize = FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - err, - LANG_NEUTRAL, // Use default language - (LPSTR)&lpMsgBuf, - 0, - NULL - ); - unused(bufSize); - print("CreateProcessA call failed: {cstr}\n", lpMsgBuf); - todo(); - } -#else - int null_fd; - - if (run_options.use_null_file_descriptor) - { - null_fd = run_options.null_file_descriptor; - assert(os_file_descriptor_is_valid(null_fd)); - } - else if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_IGNORE || run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_IGNORE) - { - null_fd = open("/dev/null", O_WRONLY); - assert(os_file_descriptor_is_valid(null_fd)); - } - - int stdout_pipe[2]; - int stderr_pipe[2]; - - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE && pipe(stdout_pipe) == -1) - { - todo(); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE && pipe(stderr_pipe) == -1) - { - todo(); - } - - pid_t pid = syscall_fork(); - if (pid == -1) - { - todo(); - } - - if (measure_time) - { - start_timestamp = os_timestamp(); - } - - if (pid == 0) - { - switch (run_options.stdout_stream.policy) - { - case CHILD_PROCESS_STREAM_PIPE: - { - close(stdout_pipe[0]); - dup2(stdout_pipe[1], STDOUT_FILENO); - close(stdout_pipe[1]); - } break; - case CHILD_PROCESS_STREAM_IGNORE: - { - dup2(null_fd, STDOUT_FILENO); - close(null_fd); - } break; - case CHILD_PROCESS_STREAM_INHERIT: - { - } break; - } - - switch (run_options.stderr_stream.policy) - { - case CHILD_PROCESS_STREAM_PIPE: - { - close(stderr_pipe[0]); - dup2(stderr_pipe[1], STDERR_FILENO); - close(stderr_pipe[1]); - } break; - case CHILD_PROCESS_STREAM_IGNORE: - { - dup2(null_fd, STDERR_FILENO); - close(null_fd); - } break; - case CHILD_PROCESS_STREAM_INHERIT: - { - } break; - } - - // fcntl(pipes[1], F_SETFD, FD_CLOEXEC); - let(result, syscall_execve(arguments.pointer[0], arguments.pointer, envp)); - unused(result); - panic("Execve failed! Error: {cstr}\n", strerror(errno)); - } - else - { - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - close(stdout_pipe[1]); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - close(stderr_pipe[1]); - } - - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - assert(run_options.stdout_stream.capacity); - ssize_t byte_count = read(stdout_pipe[0], run_options.stdout_stream.buffer, run_options.stdout_stream.capacity); - assert(byte_count >= 0); - *run_options.stdout_stream.length = byte_count; - - close(stdout_pipe[0]); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - assert(run_options.stderr_stream.capacity); - ssize_t byte_count = read(stderr_pipe[0], run_options.stderr_stream.buffer, run_options.stderr_stream.capacity); - assert(byte_count >= 0); - *run_options.stderr_stream.length = byte_count; - - close(stderr_pipe[0]); - } - - int status = 0; - int options = 0; - pid_t waitpid_result = syscall_waitpid(pid, &status, options); - - if (measure_time) - { - end_timestamp = os_timestamp(); - } - - if (waitpid_result == pid) - { - if (run_options.debug) - { - print("{cstr} ", arguments.pointer[0]); - } - - if (WIFEXITED(status)) - { - let(exit_code, WEXITSTATUS(status)); - result.termination_code = exit_code; - result.termination_kind = PROCESS_TERMINATION_EXIT; - - if (run_options.debug) - { - print("exited with code {u32}\n", exit_code); - } - } - else if (WIFSIGNALED(status)) - { - let(signal_code, WTERMSIG(status)); - result.termination_code = signal_code; - result.termination_kind = PROCESS_TERMINATION_SIGNAL; - - if (run_options.debug) - { - print("was signaled: {u32}\n", signal_code); - } - } - else if (WIFSTOPPED(status)) - { - let(stop_code, WSTOPSIG(status)); - result.termination_code = stop_code; - result.termination_kind = PROCESS_TERMINATION_STOP; - - if (run_options.debug) - { - print("was stopped: {u32}\n", stop_code); - } - } - else - { - result.termination_kind = PROCESS_TERMINATION_UNKNOWN; - - if (run_options.debug) - { - print("terminated unexpectedly with status {u32}\n", status); - } - } - } - else if (waitpid_result == -1) - { - let(waitpid_error, errno); - print("Error waiting for process termination: {u32}\n", waitpid_error); - trap(); - } - else - { - todo(); - } - - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (run_options.debug && !success) - { - print("{cstr} failed to run successfully!\n", arguments.pointer[0]); - } - - if (run_options.debug) - { - ms = os_resolve_timestamps(start_timestamp, end_timestamp, TIME_UNIT_MILLISECONDS); - u32 ticks = 0; -#if LINK_LIBC == 0 - ticks = cpu_frequency != 0; -#endif - print("Command run {cstr} in {f64} {cstr}\n", success ? "successfully" : "with errors", ms, ticks ? "ticks" : "ms"); - } - - if (!run_options.use_null_file_descriptor && os_file_descriptor_is_valid(null_fd)) - { - close(null_fd); - } - } -#endif - - return result; -} - -fn void print_string(String message) -{ -#ifndef SILENT - // TODO: check writes - os_file_write(os_stdout_get(), message); - // assert(result >= 0); - // assert((u64)result == message.length); -#else - unused(message); -#endif -} - -fn String os_get_environment_variable(const char* name) -{ - String result = {}; - char* env = getenv(name); - if (env) - { - result = cstr(env); - } - - return result; -} - -#ifndef _WIN32 -fn u64 os_readlink(String path, String buffer) -{ - u64 result = 0; - assert(path.pointer[path.length] == 0); - let(sys_result, readlink(string_to_c(path), string_to_c(buffer), buffer.length)); - if (sys_result > 0) - { - assign_cast(result, sys_result); - } - - return result; -} - -fn String os_readlink_allocate(Arena* arena, String path) -{ - String result = {}; - u8 buffer[4096]; - let(bytes, os_readlink(path, (String)array_to_slice(buffer))); - - if (bytes > 0) - { - result.pointer = arena_allocate(arena, u8, bytes + 1); - result.length = bytes; - memcpy(result.pointer, buffer, bytes); - result.pointer[bytes] = 0; - } - - return result; -} - -fn String os_realpath(String path, String buffer) -{ - String result = {}; - assert(path.pointer[path.length] == 0); - char* system_result = realpath(string_to_c(path), string_to_c(buffer)); - if (system_result) - { - result = cstr(system_result); - } - - return result; -} -#endif - -fn void os_free(void* pointer) -{ - free(pointer); -} - -#if _WIN32 -fn HANDLE os_windows_get_module_handle() -{ - return GetModuleHandleW(0); -} -#endif - -// TODO: structure this better -#if _WIN32 -fn OSLibrary os_library_load(const char* library_name) -{ - OSLibrary library = {}; - library.handle = LoadLibraryA(library_name); - return library; -} - -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name) -{ - OSSymbol symbol = (OSSymbol)GetProcAddress(library.handle, symbol_name); - return symbol; -} -#else -fn OSLibrary os_library_load(const char* library_name) -{ - OSLibrary library = {}; - library.handle = dlopen(library_name, RTLD_NOW | RTLD_LOCAL); - return library; -} - -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name) -{ - OSSymbol symbol = dlsym(library.handle, symbol_name); - return symbol; -} -#endif - -fn u8 os_library_is_valid(OSLibrary library) -{ - return library.handle != 0; -} - -fn String file_find_in_path(Arena* arena, String file, String path_env, String extension) -{ - String result = {}; - assert(path_env.pointer); - - String path_it = path_env; - u8 buffer[4096]; - -#if _WIN32 - u8 env_path_separator = ';'; - u8 path_separator = '\\'; -#else - u8 env_path_separator = ':'; - u8 path_separator = '/'; -#endif - - while (path_it.length) - { - let(index, string_first_ch(path_it, env_path_separator)); - index = unlikely(index == STRING_NO_MATCH) ? path_it.length : index; - let(path_chunk, s_get_slice(u8, path_it, 0, index)); - - u64 i = 0; - - memcpy(&buffer[i], path_chunk.pointer, path_chunk.length); - i += path_chunk.length; - - buffer[i] = path_separator; - i += 1; - - memcpy(&buffer[i], file.pointer, file.length); - i += file.length; - - if (extension.length) - { - memcpy(&buffer[i], extension.pointer, extension.length); - i += extension.length; - } - - buffer[i] = 0; - i += 1; - - let(total_length, i - 1); - OSFileOpenFlags flags = { - .read = 1, - }; - OSFilePermissions permissions = { - .readable = 1, - .writable = 1, - }; - - String path = { .pointer = buffer, .length = total_length }; - - FileDescriptor fd = os_file_open(path, flags, permissions); - - if (os_file_descriptor_is_valid(fd)) - { - os_file_close(fd); - result.pointer = arena_allocate(arena, u8, total_length + 1); - memcpy(result.pointer, buffer, total_length + 1); - result.length = total_length; - break; - } - - String new_path = s_get_slice(u8, path_it, index + (index != path_it.length), path_it.length); - assert(new_path.length < path_env.length); - path_it = new_path; - } - - return result; -} - -fn String executable_find_in_path(Arena* arena, String executable, String path_env) -{ - String extension = {}; -#if _WIN32 - extension = strlit(".exe"); -#endif - return file_find_in_path(arena, executable, path_env, extension); -} - diff --git a/bootstrap/std/os.h b/bootstrap/std/os.h deleted file mode 100644 index fb4879f..0000000 --- a/bootstrap/std/os.h +++ /dev/null @@ -1,195 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN 1 -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -typedef enum TimeUnit -{ - TIME_UNIT_NANOSECONDS, - TIME_UNIT_MICROSECONDS, - TIME_UNIT_MILLISECONDS, - TIME_UNIT_SECONDS, -} TimeUnit; - -ENUM(ProcessTerminationKind, u8, - PROCESS_TERMINATION_UNKNOWN, - PROCESS_TERMINATION_EXIT, - PROCESS_TERMINATION_SIGNAL, - PROCESS_TERMINATION_STOP, -); - -STRUCT(RunCommandResult) -{ - u32 termination_code; - ProcessTerminationKind termination_kind; - u8 reserved[3]; -}; - -typedef enum ChildProcessStreamPolicy -{ - CHILD_PROCESS_STREAM_INHERIT, - CHILD_PROCESS_STREAM_PIPE, - CHILD_PROCESS_STREAM_IGNORE, -} ChildProcessStreamPolicy; - -STRUCT(ChildProcessStream) -{ - u8* buffer; - u32* length; - u32 capacity; - ChildProcessStreamPolicy policy; -}; - -STRUCT(RunCommandOptions) -{ - ChildProcessStream stdout_stream; - ChildProcessStream stderr_stream; - FileDescriptor null_file_descriptor; - u64 use_null_file_descriptor:1; - u64 debug:1; - u64 reserved:62; -}; - -STRUCT(Timestamp) -{ - u128 value; -}; - -STRUCT(OSFileOpenFlags) -{ - u32 truncate:1; - u32 executable:1; - u32 write:1; - u32 read:1; - u32 create:1; - u32 directory:1; -}; - -STRUCT(OSFilePermissions) -{ - u8 readable:1; - u8 writable:1; - u8 executable:1; -}; - -STRUCT(OSReserveProtectionFlags) -{ - u32 read:1; - u32 write:1; - u32 execute:1; - u32 reserved:29; -}; - -STRUCT(OSReserveMapFlags) -{ - u32 priv:1; - u32 anon:1; - u32 populate:1; - u32 noreserve:1; - u32 reserved:29; -}; - -STRUCT(Arena) -{ - u64 reserved_size; - u64 position; - u64 os_position; - u64 granularity; - u8 reserved[4 * 8]; -}; - -STRUCT(FileWriteOptions) -{ - String path; - String content; - u64 executable:1; -}; - -#ifndef __APPLE__ -#define MY_PAGE_SIZE KB(4) -#else -#define MY_PAGE_SIZE KB(16) -#endif -global_variable const u64 page_size = MY_PAGE_SIZE; - -global_variable u64 minimum_granularity = MY_PAGE_SIZE; -// global_variable u64 middle_granularity = MB(2); -global_variable u64 default_size = GB(4); - -fn void vprint(const char* format, va_list args); -fn void print(const char* format, ...); -fn RunCommandResult run_command(Arena* arena, CStringSlice arguments, char* envp[], RunCommandOptions options); -fn String file_read(Arena* arena, String path); -fn void file_write(FileWriteOptions options); - -fn String path_dir(String string); -fn String path_base(String string); -fn String path_no_extension(String string); - - -fn Arena* arena_initialize(u64 reserved_size, u64 granularity, u64 initial_size); -fn Arena* arena_initialize_default(u64 initial_size); -fn void arena_clear(Arena* arena); -fn String arena_join_string(Arena* arena, Slice(String) pieces); -fn u8* arena_allocate_bytes(Arena* arena, u64 size, u64 alignment); -fn void arena_reset(Arena* arena); - -#define arena_allocate(arena, T, count) (T*)(arena_allocate_bytes(arena, sizeof(T) * count, alignof(T))) -#define arena_allocate_slice(arena, T, count) (Slice(T)){ .pointer = arena_allocate(arena, T, count), .length = count } - -fn u8* os_reserve(u64 base, u64 size, OSReserveProtectionFlags protection, OSReserveMapFlags map); -fn void os_commit(void* address, u64 size); - -fn u8 os_file_descriptor_is_valid(FileDescriptor fd); -fn FileDescriptor os_file_open(String path, OSFileOpenFlags flags, OSFilePermissions permissions); -fn void os_file_close(FileDescriptor fd); -fn u64 os_file_get_size(FileDescriptor fd); -fn void os_file_write(FileDescriptor fd, String content); -fn FileDescriptor os_stdout_get(); -fn void os_directory_make(String path); -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code); - -fn void calibrate_cpu_timer(); - -fn void print_string(String string); - -fn Timestamp os_timestamp(); -fn f64 os_resolve_timestamps(Timestamp start, Timestamp end, TimeUnit time_unit); -fn u8 os_is_being_debugged(); - -#if _WIN32 -typedef void* HANDLE; -fn HANDLE os_windows_get_module_handle(); -#endif - -#if _WIN32 -#define EXECUTABLE_EXTENSION ".exe" -#else -#define EXECUTABLE_EXTENSION "" -#endif - -STRUCT(OSLibrary) -{ - void* handle; -}; - -typedef void* OSSymbol; - -fn OSLibrary os_library_load(const char* library_name); -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name); diff --git a/bootstrap/std/project.h b/bootstrap/std/project.h deleted file mode 100644 index 1bea07d..0000000 --- a/bootstrap/std/project.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#ifndef BUILD_DIR -#define BUILD_DIR "cache" -#endif - -typedef enum RenderingBackend -{ - RENDERING_BACKEND_NONE, - RENDERING_BACKEND_METAL, - RENDERING_BACKEND_VULKAN, - RENDERING_BACKEND_DIRECTX12, - RENDERING_BACKEND_COUNT, -} RenderingBackend; - -typedef enum WindowingBackend -{ - WINDOWING_BACKEND_NONE, - WINDOWING_BACKEND_WIN32, - WINDOWING_BACKEND_X11, - WINDOWING_BACKEND_WAYLAND, - WINDOWING_BACKEND_COCOA, - WINDOWING_BACKEND_COUNT, -} WindowingBackend; - -fn u8 rendering_backend_is_valid(RenderingBackend rendering_backend) -{ - u8 valid = rendering_backend != RENDERING_BACKEND_COUNT; - - if (valid && rendering_backend != RENDERING_BACKEND_NONE) - { -#ifdef __linux__ - valid = rendering_backend == RENDERING_BACKEND_VULKAN; -#elif defined(__APPLE__) - valid = rendering_backend == RENDERING_BACKEND_METAL || rendering_backend == RENDERING_BACKEND_VULKAN; -#elif _WIN32 - valid = rendering_backend == RENDERING_BACKEND_DIRECTX12 || rendering_backend == RENDERING_BACKEND_VULKAN; -#endif - } - - return valid; -} - -fn u8 windowing_backend_is_valid(WindowingBackend windowing_backend) -{ - u8 valid = windowing_backend != WINDOWING_BACKEND_COUNT; - - if (valid && windowing_backend != WINDOWING_BACKEND_NONE) - { -#ifdef __linux__ - valid = windowing_backend == WINDOWING_BACKEND_WAYLAND || windowing_backend == WINDOWING_BACKEND_X11; -#elif _WIN32 - valid = windowing_backend == WINDOWING_BACKEND_WIN32; -#elif __APPLE__ - valid = windowing_backend == WINDOWING_BACKEND_COCOA; -#endif - } - - return valid; -} diff --git a/bootstrap/std/rendering.c b/bootstrap/std/rendering.c deleted file mode 100644 index 5cb4248..0000000 --- a/bootstrap/std/rendering.c +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include - -#if BB_RENDERING_BACKEND_VULKAN -#include -#endif - -#if BB_RENDERING_BACKEND_METAL -#include -#endif - -#if BB_RENDERING_BACKEND_DIRECTX12 -#include -#endif diff --git a/bootstrap/std/rendering.h b/bootstrap/std/rendering.h deleted file mode 100644 index 2e0713e..0000000 --- a/bootstrap/std/rendering.h +++ /dev/null @@ -1,334 +0,0 @@ -#pragma once - -#if BB_RENDERING_BACKEND_VULKAN -#include -#endif - -#if BB_RENDERING_BACKEND_METAL -#include -#endif - -#if BB_RENDERING_BACKEND_DIRECTX12 -#include -#endif - -#ifdef __clang__ -#define BB_HAS_NATIVE_FLOAT2 1 -#define BB_HAS_NATIVE_FLOAT3 1 -#define BB_HAS_NATIVE_FLOAT4 1 -#define BB_HAS_NATIVE_UINT2 1 -#define BB_HAS_NATIVE_UINT3 1 -#define BB_HAS_NATIVE_UINT4 1 -#else -#define BB_HAS_NATIVE_FLOAT2 0 -#define BB_HAS_NATIVE_FLOAT3 0 -#define BB_HAS_NATIVE_FLOAT4 0 -#define BB_HAS_NATIVE_UINT2 0 -#define BB_HAS_NATIVE_UINT3 0 -#define BB_HAS_NATIVE_UINT4 0 -#endif - -#if BB_HAS_NATIVE_FLOAT2 -declare_vector_type(float, 2, float2); -#else -UNION(float2) -{ - struct - { - float x, y; - }; - float v[2]; -}; -#endif - -#if BB_HAS_NATIVE_FLOAT3 -declare_vector_type(float, 3, float3); -#else -UNION(float3) -{ - struct - { - float x, y, z; - }; - float v[3]; -}; -#endif - -#if BB_HAS_NATIVE_FLOAT4 -declare_vector_type(float, 4, float4); -#else -UNION(float4) -{ - struct - { - float x, y, z, w; - }; - float v[4]; -}; -#endif - -#if BB_HAS_NATIVE_UINT2 -declare_vector_type(uint, 2, uint2); -#else -UNION(uint2) -{ - struct - { - uint x, y; - }; - uint v[2]; -}; -#endif - -#if BB_HAS_NATIVE_UINT3 -declare_vector_type(uint, 3, uint3); -#else -UNION(uint3) -{ - struct - { - uint x, y, z; - }; - uint v[3]; -}; -#endif - -#if BB_HAS_NATIVE_UINT4 -declare_vector_type(uint, 4, uint4); -#else -UNION(uint4) -{ - struct - { - uint x, y, z, w; - }; - uint v[4]; -}; -#endif - -typedef float2 vec2; -typedef float3 vec3; -typedef float4 vec4; - -#if BB_HAS_NATIVE_FLOAT2 -#define VEC2(_x, y) ((vec2){_x, _y}) -#else -#define VEC2(_x, _y) ((vec2){ .x = _x, .y = _y}) -#endif - -#if BB_HAS_NATIVE_FLOAT3 -#define VEC3(_x, _y, _z) ((vec3){_x, _y, _z}) -#else -#define VEC3(_x, _y, _z) ((vec3){ .x = _x, .y = _y, .z = _z}) -#endif - -#if BB_HAS_NATIVE_FLOAT4 -#define VEC4(_x, _y, _z, _w) ((vec4){_x, _y, _z, _w}) -#else -#define VEC4(_x, _y, _z, _w) ((vec4){ .x = _x, .y = _y, .z = _z, .w = _w}) -#endif - -fn float2 float2_add(float2 a, float2 b) -{ -#if BB_HAS_NATIVE_FLOAT2 - return a + b; -#else - float2 result; - result.x = a.x + b.x; - result.y = a.y + b.y; - return result; -#endif -} - -fn float2 float2_sub(float2 a, float2 b) -{ -#if BB_HAS_NATIVE_FLOAT2 - return a - b; -#else - float2 result; - result.x = a.x - b.x; - result.y = a.y - b.y; - return result; -#endif -} - -UNION(F32Interval2) -{ - struct - { - vec2 min; - vec2 max; - }; - struct - { - float2 p0; - float2 p1; - }; - struct - { - f32 x0; - f32 y0; - f32 x1; - f32 y1; - }; - float2 v[2]; -}; -static_assert(sizeof(F32Interval2) == 4 * sizeof(f32)); - -typedef struct Renderer Renderer; -typedef struct RenderWindow RenderWindow; -typedef struct Pipeline Pipeline; - -STRUCT(RectDraw) -{ - F32Interval2 vertex; - F32Interval2 texture; - vec4 colors[4]; - u32 texture_index; -}; - -#include "../std/shaders/rect.inc" -typedef struct RectVertex RectVertex; -decl_vb(RectVertex); - -typedef enum BBPipeline -{ - BB_PIPELINE_RECT, - BB_PIPELINE_COUNT, -} BBPipeline; - -typedef enum RenderFontType -{ - RENDER_FONT_TYPE_MONOSPACE, - RENDER_FONT_TYPE_PROPORTIONAL, - RENDER_FONT_TYPE_COUNT, -} RenderFontType; - -typedef enum RectTextureSlot -{ - RECT_TEXTURE_SLOT_WHITE, - RECT_TEXTURE_SLOT_MONOSPACE_FONT, - RECT_TEXTURE_SLOT_PROPORTIONAL_FONT, - RECT_TEXTURE_SLOT_COUNT -} RectTextureSlot; - -typedef enum TextureFormat -{ - TEXTURE_FORMAT_R8_UNORM, - TEXTURE_FORMAT_R8G8B8A8_SRGB, -} TextureFormat; - -STRUCT(TextureMemory) -{ - void* pointer; - u32 width; - u32 height; - u32 depth; - TextureFormat format; -}; - -ENUM(ShaderStage, u8, - SHADER_STAGE_VERTEX, - SHADER_STAGE_FRAGMENT, -); - -STRUCT(PipelineCreate) -{ - Slice(u16) shader_source_indices; - u16 layout_index; -}; -declare_slice(PipelineCreate); - -STRUCT(PushConstantRange) -{ - u16 offset; - u16 size; - ShaderStage stage; -}; -declare_slice(PushConstantRange); - -ENUM(DescriptorType, u8, - DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER, - DESCRIPTOR_TYPE_COUNT, -); - -STRUCT(DescriptorSetLayoutBinding) -{ - u8 binding; - DescriptorType type; - ShaderStage stage; - u8 count; -}; -declare_slice(DescriptorSetLayoutBinding); - -STRUCT(DescriptorSetLayoutCreate) -{ - Slice(DescriptorSetLayoutBinding) bindings; -}; -declare_slice(DescriptorSetLayoutCreate); - -STRUCT(PipelineLayoutCreate) -{ - Slice(PushConstantRange) push_constant_ranges; - Slice(DescriptorSetLayoutCreate) descriptor_set_layouts; -}; -declare_slice(PipelineLayoutCreate); - -STRUCT(GraphicsPipelinesCreate) -{ - Slice(String) shader_binaries; - Slice(PipelineLayoutCreate) layouts; - Slice(PipelineCreate) pipelines; -}; - -STRUCT(PipelineIndex) -{ - u32 value; -}; - -STRUCT(PipelineLayoutIndex) -{ - u32 value; -}; - -STRUCT(DescriptorSetIndex) -{ - u32 value; -}; - -ENUM(BufferType, u8, - BUFFER_TYPE_VERTEX, - BUFFER_TYPE_INDEX, - BUFFER_TYPE_STAGING, -); - -STRUCT(HostBufferCopy) -{ - String source; - u64 destination_offset; -}; -declare_slice(HostBufferCopy); - -STRUCT(LocalBufferCopyRegion) -{ - u64 source_offset; - u64 destination_offset; - u64 size; -}; -declare_slice(LocalBufferCopyRegion); - -#include - -fn Renderer* rendering_initialize(Arena* arena); -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window); -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window); -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window); -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory); - -fn void window_rect_texture_update_begin(RenderWindow* window); -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas); -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index); -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window); - -fn void window_render_rect(RenderWindow* window, RectDraw draw); -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset); diff --git a/bootstrap/std/sha1.c b/bootstrap/std/sha1.c deleted file mode 100644 index f38cf4e..0000000 --- a/bootstrap/std/sha1.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -// https://github.com/jasinb/sha1.git -// STRUCT(Sha1Digest) -// { -// u32 digest[5]; -// }; - -// static uint32_t rotl32(uint32_t x, int b) -// { -// return (x << b) | (x >> (32-b)); -// } -// -// switch endianness -// fn u32 sha1_get32(u8* p) -// { -// return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; -// } - -// fn u32 sha1_f(int t, u32 b, u32 c, u32 d) -// { -// assert(0 <= t && t < 80); -// -// if (t < 20) -// { -// return (b & c) | ((~b) & d); -// } -// else if (t < 40) -// { -// return b ^ c ^ d; -// } -// else if (t < 60) -// { -// return (b & c) | (b & d) | (c & d); -// } -// else -// //if (t < 80) -// { -// return b ^ c ^ d; -// } -// } - -// STRUCT(Sha1Context) -// { -// u8 block[64]; -// u32 h[5]; -// u64 bytes; -// u32 cur; -// }; - -// fn void sha1_reset(Sha1Context* ctx) -// { -// ctx->h[0] = 0x67452301; -// ctx->h[1] = 0xefcdab89; -// ctx->h[2] = 0x98badcfe; -// ctx->h[3] = 0x10325476; -// ctx->h[4] = 0xc3d2e1f0; -// ctx->bytes = 0; -// ctx->cur = 0; -// } - -// fn void sha1_process_block(Sha1Context* ctx) -// { -// global_variable const u32 k[4] = -// { -// 0x5A827999, -// 0x6ED9EBA1, -// 0x8F1BBCDC, -// 0xCA62C1D6 -// }; -// -// u32 w[16]; -// u32 a = ctx->h[0]; -// u32 b = ctx->h[1]; -// u32 c = ctx->h[2]; -// u32 d = ctx->h[3]; -// u32 e = ctx->h[4]; -// u32 t; -// -// for (t = 0; t < 16; t++) -// w[t] = sha1_get32((u8*)(&((uint32_t*)ctx->block)[t])); -// -// for (t = 0; t < 80; t++) -// { -// auto s = t & 0xf; -// u32 temp; -// if (t >= 16) -// w[s] = rotate_left_u32(w[(s + 13) & 0xf] ^ w[(s + 8) & 0xf] ^ w[(s + 2) & 0xf] ^ w[s], 1); -// -// temp = rotate_left_u32(a, 5) + sha1_f(t, b,c,d) + e + w[s] + k[t/20]; -// -// e = d; d = c; c = rotate_left_u32(b, 30); b = a; a = temp; -// } -// -// ctx->h[0] += a; -// ctx->h[1] += b; -// ctx->h[2] += c; -// ctx->h[3] += d; -// ctx->h[4] += e; -// } - -// fn void sha1_write(Sha1Context* ctx, String bytes) -// { -// auto length = bytes.length; -// ctx->bytes += length; -// -// const uint8_t* src = bytes.pointer; -// while (length--) -// { -// // TODO: could optimize the first and last few bytes, and then copy -// // 128 bit blocks with SIMD in between -// ctx->block[ctx->cur++] = *src++; -// if (ctx->cur == 64) -// { -// sha1_process_block(ctx); -// ctx->cur = 0; -// } -// } -// } - -// fn Sha1Digest sha1_get_digest(Sha1Context* ctx) -// { -// // append separator -// ctx->block[ctx->cur++] = 0x80; -// if (ctx->cur > 56) -// { -// // no space in block for the 64-bit message length, flush -// memset(&ctx->block[ctx->cur], 0, 64 - ctx->cur); -// sha1_process_block(ctx); -// ctx->cur = 0; -// } -// -// memset(&ctx->block[ctx->cur], 0, 56 - ctx->cur); -// uint64_t bits = ctx->bytes * 8; -// -// // TODO a few instructions could be shaven -// ctx->block[56] = (uint8_t)(bits >> 56 & 0xff); -// ctx->block[57] = (uint8_t)(bits >> 48 & 0xff); -// ctx->block[58] = (uint8_t)(bits >> 40 & 0xff); -// ctx->block[59] = (uint8_t)(bits >> 32 & 0xff); -// ctx->block[60] = (uint8_t)(bits >> 24 & 0xff); -// ctx->block[61] = (uint8_t)(bits >> 16 & 0xff); -// ctx->block[62] = (uint8_t)(bits >> 8 & 0xff); -// ctx->block[63] = (uint8_t)(bits >> 0 & 0xff); -// sha1_process_block(ctx); -// -// { -// Sha1Digest ret; -// int i; -// for (i = 0; i < 5; i++) -// ret.digest[i] = sha1_get32((u8*)&ctx->h[i]); -// sha1_reset(ctx); -// return ret; -// } -// } - -// fn Sha1Digest sha1_compute(String bytes) -// { -// Sha1Context ctx; -// sha1_reset(&ctx); -// sha1_write(&ctx, bytes); -// return sha1_get_digest(&ctx); -// } - diff --git a/bootstrap/std/sha1.h b/bootstrap/std/sha1.h deleted file mode 100644 index e69de29..0000000 diff --git a/bootstrap/std/shaders/rect.frag b/bootstrap/std/shaders/rect.frag deleted file mode 100644 index a05a157..0000000 --- a/bootstrap/std/shaders/rect.frag +++ /dev/null @@ -1,43 +0,0 @@ -#version 450 -#extension GL_EXT_nonuniform_qualifier : require -#extension GL_EXT_debug_printf : require -#extension GL_GOOGLE_include_directive : require - -#include "rect.inc" - -layout (location = 0) in flat uint texture_index; -layout (location = 1) in RectFragmentShaderInput inputs; - -layout (location = 0) out vec4 color; - -layout(set = 0, binding = 0) uniform sampler2D textures[]; - -float rounded_rect_sdf(vec2 position, vec2 center, vec2 half_size, float radius) -{ - vec2 r2 = vec2(radius, radius); - // This is 0 when the point is at the border - vec2 d2_no_r2 = abs(center - position) - half_size; - vec2 d2 = d2_no_r2 + r2; - // 0 when outside the rectangle - float negative_euclidean_distance = min(max(d2.x, d2.y), 0.0); - // 0 when inside the rectangle - float positive_euclidean_distance = length(max(d2, 0.0)); - float result = negative_euclidean_distance + positive_euclidean_distance - radius; - return result; -} - -void main() -{ - // WARN: do not cache nonuniformEXT indexing - vec2 texture_size = textureSize(textures[nonuniformEXT(texture_index)], 0); - vec2 uv = vec2(inputs.uv.x / texture_size.x, inputs.uv.y / texture_size.y); - // WARN: do not cache nonuniformEXT indexing - vec4 sampled = texture(textures[nonuniformEXT(texture_index)], uv); - float softness = inputs.softness; - float softness_padding_scalar = max(0, softness * 2 - 1); - vec2 softness_padding = vec2(softness_padding_scalar, softness_padding_scalar); - float distance = rounded_rect_sdf(inputs.position, inputs.center, inputs.half_size - softness_padding, inputs.corner_radius); - - float sdf_factor = 1.0 - smoothstep(0, 2 * softness, distance); - color = inputs.color * sampled * sdf_factor; -} diff --git a/bootstrap/std/shaders/rect.inc b/bootstrap/std/shaders/rect.inc deleted file mode 100644 index dfa78a4..0000000 --- a/bootstrap/std/shaders/rect.inc +++ /dev/null @@ -1,22 +0,0 @@ -struct RectVertex -{ - vec2 p0; - vec2 uv0; - vec2 extent; - float corner_radius; - float softness; - vec4 colors[4]; - uint texture_index; - uint reserved[3]; -}; - -struct RectFragmentShaderInput -{ - vec4 color; - vec2 uv; - vec2 position; - vec2 center; - vec2 half_size; - float corner_radius; - float softness; -}; diff --git a/bootstrap/std/shaders/rect.metal b/bootstrap/std/shaders/rect.metal deleted file mode 100644 index 4532602..0000000 --- a/bootstrap/std/shaders/rect.metal +++ /dev/null @@ -1,122 +0,0 @@ -#include -using namespace metal; - -// Structs to match buffer data -struct RectVertex -{ - float2 p0; // Bottom-left corner position - float2 extent; // Rectangle size (width and height) - float2 uv0; // UV coordinates for bottom-left - float corner_radius; // Corner radius - float softness; // Edge softness - float4 colors[4]; // Per-vertex colors - uint texture_index; // Texture index -}; - -struct RectFragmentShaderInput -{ - float4 vertex_position [[position]]; - float4 color; // Vertex color - float2 uv; // UV coordinates - float2 position; // Position in world space - float2 center; // Center of the rectangle - float2 half_size; // Half dimensions of the rectangle - float corner_radius; // Corner radius - float softness; // Edge softness -}; - -// Push constants (Metal uses constant buffers or argument buffers for this) -struct PushConstants -{ - device const RectVertex* vertex_buffer; - float width; // Screen width - float height; // Screen height -}; - -// Vertex shader main function -vertex RectFragmentShaderInput vertex_main(const device PushConstants& push_constants [[buffer(0)]], uint vertex_id [[vertex_id]]) -{ - // Constants for normalized quad corners - constexpr float2 vertices[] = { - float2(-1.0, -1.0), - float2( 1.0, -1.0), - float2(-1.0, 1.0), - float2( 1.0, 1.0) - }; - - // Fetch the vertex data from the buffer - const RectVertex v = push_constants.vertex_buffer[vertex_id / 4]; - - // Rectangle calculations - float2 p0 = v.p0; - float2 p1 = p0 + v.extent; - float2 position_center = (p1 + p0) * 0.5; - float2 half_size = (p1 - p0) * 0.5; - float2 position = vertices[vertex_id % 4] * half_size + position_center; - - // Screen-space transformation - float2 ndc_position = float2(2.0 * position.x / push_constants.width - 1.0, - 2.0 * position.y / push_constants.height - 1.0); - - // Texture UV calculations - float2 uv0 = v.uv0; - float2 uv1 = uv0 + v.extent; - float2 texture_center = (uv1 + uv0) * 0.5; - float2 uv = vertices[vertex_id % 4] * half_size + texture_center; - - // Output to fragment shader - RectFragmentShaderInput out_data; - out_data.color = v.colors[vertex_id % 4]; - out_data.uv = uv; - out_data.position = position; - out_data.vertex_position = float4(ndc_position.x, ndc_position.y, 0, 1); - out_data.center = position_center; - out_data.half_size = half_size; - out_data.corner_radius = v.corner_radius; - out_data.softness = v.softness; - - return out_data; -} - -// Uniform buffer for textures -struct FragmentUniforms -{ - array, 100> textures; // Array of textures - sampler texture_sampler; // Sampler for texture sampling -}; - -// Calculate the signed distance field (SDF) for a rounded rectangle -float rounded_rect_sdf(float2 position, float2 center, float2 half_size, float radius) -{ - float2 r2 = float2(radius, radius); - float2 d2_no_r2 = abs(center - position) - half_size; - float2 d2 = d2_no_r2 + r2; - float negative_euclidean_distance = min(max(d2.x, d2.y), 0.0); - float positive_euclidean_distance = length(max(d2, 0.0)); - return negative_euclidean_distance + positive_euclidean_distance - radius; -} - -// Fragment shader function -fragment float4 fragment_main(RectFragmentShaderInput inputs [[stage_in]], constant FragmentUniforms &uniforms [[buffer(0)]], uint texture_index) -{ - // Texture size - float2 texture_size = float2(uniforms.textures[texture_index].get_width(), uniforms.textures[texture_index].get_height()); - float2 uv = float2(inputs.uv.x / texture_size.x, inputs.uv.y / texture_size.y); - - // Sample texture - float4 sampled = uniforms.textures[texture_index].sample(uniforms.texture_sampler, uv); - - // Compute softness padding - float softness = inputs.softness; - float softness_padding_scalar = max(0.0, softness * 2.0 - 1.0); - float2 softness_padding = float2(softness_padding_scalar, softness_padding_scalar); - - // Compute signed distance - float distance = rounded_rect_sdf(inputs.position, inputs.center, inputs.half_size - softness_padding, inputs.corner_radius); - - // Compute SDF factor - float sdf_factor = 1.0 - smoothstep(0.0, 2.0 * softness, distance); - - // Compute final color - return inputs.color * sampled * sdf_factor; -} diff --git a/bootstrap/std/shaders/rect.vert b/bootstrap/std/shaders/rect.vert deleted file mode 100644 index 9e79819..0000000 --- a/bootstrap/std/shaders/rect.vert +++ /dev/null @@ -1,61 +0,0 @@ -#version 450 -#extension GL_EXT_buffer_reference : require -#extension GL_EXT_debug_printf : require -#extension GL_GOOGLE_include_directive : require - -#include "rect.inc" - -layout (location = 0) out uint texture_index; -layout (location = 1) out RectFragmentShaderInput outputs; - -layout(buffer_reference, std430) readonly buffer VertexBuffer{ - RectVertex vertices[]; -}; - -layout(push_constant) uniform constants -{ - VertexBuffer vertex_buffer; - float width; - float height; -} PushConstants; - -const vec2 vertices[] = { - { -1, -1 }, - { +1, -1 }, - { -1, +1 }, - { +1, +1 }, -}; - -void main() -{ - RectVertex v = PushConstants.vertex_buffer.vertices[gl_VertexIndex]; - uint vertex_id = gl_VertexIndex % 4; - float width = PushConstants.width; - float height = PushConstants.height; - - vec2 extent = v.extent; - - vec2 p0 = v.p0; - vec2 p1 = p0 + extent; - vec2 position_center = (p1 + p0) / 2; - vec2 half_size = (p1 - p0) / 2; - vec2 position = vertices[vertex_id] * half_size + position_center; - //debugPrintfEXT("Vertex index: (%u). P0: (%f, %f). P1: (%f, %f). Center: (%f, %f). Half size: (%f, %f). Position: (%f, %f)\n", gl_VertexIndex, p0.x, p0.y, p1.x, p1.y, center.x, center.y, half_size.x, half_size.y, position.x, position.y); - - gl_Position = vec4(2 * position.x / width - 1, 2 * position.y / height - 1, 0, 1); - - vec2 uv0 = v.uv0; - vec2 uv1 = uv0 + extent; - vec2 texture_center = (uv1 + uv0) / 2; - vec2 uv = vertices[vertex_id] * half_size + texture_center; - - texture_index = v.texture_index; - - outputs.color = v.colors[vertex_id]; - outputs.uv = uv; - outputs.position = position; - outputs.center = position_center; - outputs.half_size = half_size; - outputs.corner_radius = v.corner_radius; - outputs.softness = v.softness; -} diff --git a/bootstrap/std/string.c b/bootstrap/std/string.c deleted file mode 100644 index 7c26c31..0000000 --- a/bootstrap/std/string.c +++ /dev/null @@ -1,136 +0,0 @@ -#include - -u64 string_first_ch(String string, u8 ch) -{ - u64 result = STRING_NO_MATCH; - for (u64 i = 0; i < string.length; i += 1) - { - if (string.pointer[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -u64 string_last_ch(String string, u8 ch) -{ - u64 result = STRING_NO_MATCH; - u64 i = string.length; - while (i > 0) - { - i -= 1; - if (string.pointer[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -u8 string_starts_with(String string, String start) -{ - u8 result = 0; - - if (likely(start.length <= string.length)) - { - if (unlikely(start.pointer == string.pointer)) - { - result = 1; - } - else - { - u64 i; - for (i = 0; i < start.length; i += 1) - { - let(start_ch, start.pointer[i]); - let(string_ch, string.pointer[i]); - if (unlikely(string_ch != start_ch)) - { - break; - } - } - - result = i == start.length; - } - } - - return result; -} - -u8 string_ends_with(String string, String end) -{ - u8 result = 0; - - if (likely(end.length <= string.length)) - { - u64 i; - u64 offset = string.length - end.length; - for (i = 0; i < end.length; i += 1) - { - let(start_ch, end.pointer[i]); - let(string_ch, string.pointer[i + offset]); - if (unlikely(string_ch != start_ch)) - { - break; - } - } - - result = i == end.length; - } - - return result; -} - -u64 string_first_occurrence(String string, String substring) -{ - u64 result = STRING_NO_MATCH; - - if (substring.length < string.length) - { - for (u64 i = 0; i < string.length; i += 1) - { - if ((string.length - i) < substring.length) - { - break; - } - - String s = s_get_slice(u8, string, i, i + substring.length); - if (s_equal(s, substring)) - { - result = i; - break; - } - } - } - else if (unlikely(substring.length == string.length)) - { - if (unlikely(string.pointer == substring.pointer)) - { - result = 0; - } - else if (memcmp(string.pointer, substring.pointer, substring.length) == 0) - { - result = 0; - } - } - - return result; -} - -fn u64 string_last_occurrence(String string, String substring) -{ - unused(string); - unused(substring); - - todo(); -} - -fn u8 string_contains(String string, String substring) -{ - return string_first_occurrence(string, substring) != STRING_NO_MATCH; -} diff --git a/bootstrap/std/string.h b/bootstrap/std/string.h deleted file mode 100644 index 20b8d9a..0000000 --- a/bootstrap/std/string.h +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#define STRING_NO_MATCH UINT64_MAX - -fn u64 string_first_ch(String string, u8 ch); -fn u64 string_last_ch(String string, u8 ch); -fn u8 string_starts_with(String string, String start); -fn u8 string_ends_with(String string, String end); -fn u64 string_first_occurrence(String string, String substring); -fn u64 string_last_occurrence(String string, String substring); diff --git a/bootstrap/std/ui_builder.c b/bootstrap/std/ui_builder.c deleted file mode 100644 index 1a6a1b4..0000000 --- a/bootstrap/std/ui_builder.c +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -fn UI_Signal ui_button(String string) -{ - let(widget, ui_widget_make((UI_WidgetFlags) { - .draw_text = 1, - .draw_background = 1, - .mouse_clickable = 1, - .keyboard_pressable = 1, - }, string)); - - UI_Signal signal = ui_signal_from_widget(widget); - return signal; -} diff --git a/bootstrap/std/ui_builder.h b/bootstrap/std/ui_builder.h deleted file mode 100644 index b3c8578..0000000 --- a/bootstrap/std/ui_builder.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include -#include - -fn UI_Signal ui_button(String string); diff --git a/bootstrap/std/ui_core.c b/bootstrap/std/ui_core.c deleted file mode 100644 index 4b36d23..0000000 --- a/bootstrap/std/ui_core.c +++ /dev/null @@ -1,810 +0,0 @@ -// This UI is heavily inspired by the ideas of Casey Muratori and Ryan Fleury ideas on GUI programming, to whom I am deeply grateful. -// Here are some links which helped me achieve this build -// https://www.youtube.com/watch?v=Z1qyvQsjK5Y -// https://www.rfleury.com/p/ui-part-1-the-interaction-medium -// https://www.rfleury.com/p/ui-part-2-build-it-every-frame-immediate -// https://www.rfleury.com/p/ui-part-3-the-widget-building-language -// https://www.rfleury.com/p/ui-part-4-the-widget-is-a-lie-node -// https://www.rfleury.com/p/ui-part-5-visual-content -// https://www.rfleury.com/p/ui-part-6-rendering -// https://www.rfleury.com/p/ui-part-7-where-imgui-ends -// https://www.rfleury.com/p/ui-part-8-state-mutation-jank-and -// https://www.rfleury.com/p/ui-part-9-keyboard-and-gamepad-navigation -// https://www.rfleury.com/p/ui-bonus-1-simple-single-line-text -// https://www.rfleury.com/p/codebase-walkthrough-multi-window - -#pragma once - -global_variable UI_State* ui_state = 0; - -fn void ui_autopop(UI_State* state) -{ - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - let(bitset_pointer, (u64*)&state->stack_autopops); - u64 bitset_index = 0; - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(bitset, *bitset_pointer); - let(shift_value, 1 << bitset_index); - let(autopop, (bitset & shift_value) != 0); - let(mask, ~shift_value); - *bitset_pointer = bitset & mask; - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - let(current_length, *length_pointer); - assert(!autopop | current_length); - *length_pointer -= autopop; - - u64 increment_bitset_element = (bitset_index > 0) & (bitset_index % 64 == 0); - bitset_pointer += increment_bitset_element; - bitset_index = increment_bitset_element ? 0 : bitset_index + 1; - } -} - -fn void ui_state_select(UI_State* state) -{ - ui_state = state; -} - -fn UI_State* ui_state_get() -{ - return ui_state; -} - -fn Arena* ui_build_arena() -{ - let(arena, ui_state->build_arenas[ui_state->build_count % array_length(ui_state->build_arenas)]); - return arena; -} - -fn UI_Key ui_key_null() -{ - UI_Key key = {}; - return key; -} - -fn UI_State* ui_state_allocate(Renderer* renderer, RenderWindow* window) -{ - Arena* arena = arena_initialize(GB(8), MB(2), MB(2)); - UI_State* state = arena_allocate(arena, UI_State, 1); - state->renderer = renderer; - state->render_window = window; - state->arena = arena; - state->widget_table.length = 4096; - state->widget_table.pointer = arena_allocate(arena, UI_WidgetSlot, state->widget_table.length); - - for (u64 i = 0; i < array_length(state->build_arenas); i += 1) - { - state->build_arenas[i] = arena_initialize(GB(8), MB(2), MB(2)); - } - - state->stack_nulls = (UI_StateStackNulls){ - .parent = 0, - .child_layout_axis = AXIS2_COUNT, - .pref_width = {}, - .pref_height = {}, - }; - - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - assert(*length_pointer == 0); - } - - return state; -} - -fn u64 ui_widget_index_from_key(UI_Key key) -{ - let(length, ui_state->widget_table.length); - assert(is_power_of_two(length)); - return key.value & (length - 1); -} - - -fn String ui_text_from_key_string(String string) -{ - String result = string; - String text_end_delimiter = strlit("##"); - let(index, string_first_occurrence(string, text_end_delimiter)); - if (index < string.length) - { - result.length = index; - } - return result; -} - -fn String ui_hash_from_key_string(String string) -{ - String result = string; - String hash_start_delimiter = strlit("###"); - let(index, string_first_occurrence(string, hash_start_delimiter)); - if (index < string.length) - { - result = s_get_slice(u8, string, index, string.length); - } - - return result; -} - -fn UI_Key ui_key_from_string(UI_Key seed, String string) -{ - UI_Key key = ui_key_null(); - - if (string.length) - { - key = seed; - - for (u64 i = 0; i < string.length; i += 1) - { - key.value = ((key.value << 5) + key.value) + string.pointer[i]; - } - } - - return key; -} - -fn UI_Key ui_key_from_string_format(UI_Key seed, char* format, ...) -{ - u8 buffer[256]; - va_list args; - va_start(args, format); - let(string, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - let(result, ui_key_from_string(seed, string)); - return result; -} - -fn u8 ui_key_equal(UI_Key a, UI_Key b) -{ - return a.value == b.value; -} - -fn UI_Widget* ui_widget_from_key(UI_Key key) -{ - UI_Widget* result = 0; - - if (!ui_key_equal(key, ui_key_null())) - { - let(index, ui_widget_index_from_key(key)); - for (UI_Widget* widget = ui_state->widget_table.pointer[index].first; widget; widget = widget->hash_next) - { - if (ui_key_equal(widget->key, key)) - { - result = widget; - break; - } - } - } - - return result; -} - -fn UI_Widget* ui_widget_make_from_key(UI_WidgetFlags flags, UI_Key key) -{ - let(widget, ui_widget_from_key(key)); - static let(count, 0); - count += 1; - - if (widget) - { - if (widget->last_build_touched == ui_state->build_count) - { - key = ui_key_null(); - widget = 0; - } - } - - u8 first_frame = 0; - if (!widget) - { - let(index, ui_widget_index_from_key(key)); - first_frame = 1; - - widget = arena_allocate(ui_state->arena, UI_Widget, 1); - - let(table_widget_slot, &ui_state->widget_table.pointer[index]); - if (!table_widget_slot->last) - { - table_widget_slot->first = widget; - table_widget_slot->last = widget; - } - else - { - table_widget_slot->last->hash_next = widget; - widget->hash_previous = table_widget_slot->last; - table_widget_slot->last = widget; - } - } - - let(parent, ui_top(parent)); - - if (parent) - { - if (!parent->last) - { - parent->last = widget; - parent->first = widget; - } - else - { - let(previous_last, parent->last); - previous_last->next = widget; - widget->previous = previous_last; - parent->last = widget; - } - - parent->child_count += 1; - widget->parent = parent; - } - else - { - ui_state->root = widget; - } - - widget->key = key; - - for (u64 i = 0; i < array_length(widget->background_colors); i += 1) - { - widget->background_colors[i] = ui_top(background_color); - } - widget->text_color = ui_top(text_color); - widget->flags = flags; - widget->first = 0; - widget->last = 0; - widget->last_build_touched = ui_state->build_count; - widget->pref_size[AXIS2_X] = ui_top(pref_width); - widget->pref_size[AXIS2_Y] = ui_top(pref_height); - widget->child_layout_axis = ui_top(child_layout_axis); - - ui_autopop(ui_state); - - return widget; -} - -fn UI_Widget* ui_widget_make(UI_WidgetFlags flags, String string) -{ - // TODO: - let(seed, ui_key_null()); - - let(hash_string, ui_hash_from_key_string(string)); - let(key, ui_key_from_string(seed, hash_string)); - - let(widget, ui_widget_make_from_key(flags, key)); - - if (flags.draw_text) - { - widget->text = ui_text_from_key_string(string); - } - - return widget; -} - -fn UI_Widget* ui_widget_make_format(UI_WidgetFlags flags, const char* format, ...) -{ - va_list args; - u8 buffer[4096]; - va_start(args, format); - let(string, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - - let(result, ui_widget_make(flags, string)); - return result; -} - -fn UI_Signal ui_signal_from_widget(UI_Widget* widget) -{ - let(rect, widget->rect); - let(mouse_position, ui_state->mouse_position); - UI_Signal signal = { - .clicked_left = - (widget->flags.mouse_clickable & (ui_state->mouse_button_events[WINDOWING_EVENT_MOUSE_LEFT].action == WINDOWING_EVENT_MOUSE_RELEASE)) & - ((mouse_position.x >= rect.x0) & (mouse_position.x <= rect.x1)) & - ((mouse_position.y >= rect.y0) & (mouse_position.y <= rect.y1)), - }; - return signal; -} - -fn void ui_stack_reset(UI_State* state) -{ - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - *length_pointer = 0; - } -} - -fn UI_Size ui_pixels(u32 width, f32 strictness) -{ - return (UI_Size) { - .kind = UI_SIZE_PIXEL_COUNT, - .strictness = strictness, - .value = (f32)width, - }; -} - -fn UI_Size ui_percentage(f32 percentage, f32 strictness) -{ - return (UI_Size) { - .kind = UI_SIZE_PERCENTAGE, - .strictness = strictness, - .value = percentage, - }; -} - -fn UI_Size ui_em(f32 value, f32 strictness) -{ - let(font_size, ui_top(font_size)); - assert(font_size); - return (UI_Size) { - .kind = UI_SIZE_PIXEL_COUNT, - .strictness = strictness, - .value = value * font_size, - }; -} - -fn u8 ui_build_begin(WindowingInstance* window, f64 frame_time, WindowingEventQueue* event_queue) -{ - ui_state->build_count += 1; - let(build_arena, ui_build_arena()); - arena_reset(build_arena); - ui_state->frame_time = frame_time; - ui_state->window = window; - - ui_stack_reset(ui_state); - - u8 open = 1; - - let(mouse_button_count, 0); - for (u32 generic_event_index = 0; open & (generic_event_index < event_queue->descriptors.length); generic_event_index += 1) - { - let(event_descriptor, event_queue->descriptors.pointer[generic_event_index]); - u32 event_index = event_descriptor.index; - - switch (event_descriptor.type) - { - case WINDOWING_EVENT_TYPE_MOUSE_BUTTON: - { - let(button, event_queue->mouse_buttons.pointer[event_index]); - let(previous_button_event, ui_state->mouse_button_events[button.button]); - switch (button.event.action) - { - case WINDOWING_EVENT_MOUSE_RELAX: - unreachable(); - case WINDOWING_EVENT_MOUSE_RELEASE: - { - assert(previous_button_event.action == WINDOWING_EVENT_MOUSE_PRESS); - } break; - case WINDOWING_EVENT_MOUSE_PRESS: - { - // TODO: handle properly - assert(previous_button_event.action == WINDOWING_EVENT_MOUSE_RELAX || mouse_button_count); - } break; - case WINDOWING_EVENT_MOUSE_REPEAT: - { - unreachable(); - } break; - } - - ui_state->mouse_button_events[button.button] = button.event; - mouse_button_count += 1; - } break; - case WINDOWING_EVENT_TYPE_WINDOW_FOCUS: - { - } break; - case WINDOWING_EVENT_TYPE_CURSOR_POSITION: - { - let(mouse_position, event_queue->cursor_positions.pointer[event_index]); - ui_state->mouse_position = (UI_MousePosition) { - .x = mouse_position.x, - .y = mouse_position.y, - }; - } break; - case WINDOWING_EVENT_TYPE_CURSOR_ENTER: - { - todo(); - } break; - case WINDOWING_EVENT_TYPE_WINDOW_POSITION: - { - // event_queue->window_positions.pointer[event_index]; - // todo(); - } break; - case WINDOWING_EVENT_TYPE_WINDOW_CLOSE: - { - open = 0; - } break; - } - } - - if (open) - { - for (u64 i = 0; i < ui_state->widget_table.length; i += 1) - { - let(widget_table_element, &ui_state->widget_table.pointer[i]); - for (UI_Widget* widget = widget_table_element->first, *next = 0; widget; widget = next) - { - next = widget->hash_next; - - if (ui_key_equal(widget->key, ui_key_null()) || widget->last_build_touched + 1 < ui_state->build_count) - { - // Remove from the list - if (widget->hash_previous) - { - widget->hash_previous->hash_next = widget->hash_next; - } - - if (widget->hash_next) - { - widget->hash_next->hash_previous = widget->hash_previous; - } - - if (widget_table_element->first == widget) - { - widget_table_element->first = widget->hash_next; - } - - if (widget_table_element->last == widget) - { - widget_table_element->last = widget->hash_previous; - } - } - } - } - - let(framebuffer_size, windowing_get_instance_framebuffer_size(window)); - ui_push_next_only(pref_width, ui_pixels(framebuffer_size.width, 1.0f)); - ui_push_next_only(pref_height, ui_pixels(framebuffer_size.height, 1.0f)); - ui_push_next_only(child_layout_axis, AXIS2_Y); - - let(root, ui_widget_make_format((UI_WidgetFlags) {}, "window_root_{u64}", window)); - assert(!ui_state->stack_autopops.child_layout_axis); - - ui_push(parent, root); - - ui_push(font_size, 12); - - ui_push(text_color, VEC4(0.9, 0.9, 0.02, 1)); - ui_push(background_color, VEC4(0.1, 0.1, 0.1, 1)); - ui_push(pref_width, ui_percentage(1.0, 0.0)); - ui_push(pref_height, ui_percentage(1.0, 0.0)); - // ui_push(pref_height, ui_em(1.8, 0.0)); - } - - return open; -} - -fn void ui_compute_independent_sizes(UI_Widget* widget) -{ - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_PIXEL_COUNT: - { -#if BB_HAS_NATIVE_FLOAT2 - widget->computed_size[axis] = floorf(widget->pref_size[axis].value); -#else - widget->computed_size.v[axis] = floorf(widget->pref_size[axis].value); -#endif - } break; - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_independent_sizes(child_widget); - } -} - -fn void ui_compute_upward_dependent_sizes(UI_Widget* widget) -{ - // TODO: optimize loop out if possible - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_PERCENTAGE: - { - for (UI_Widget* ancestor = widget->parent; ancestor; ancestor = ancestor->parent) - { - if (ancestor->pref_size[axis].kind != UI_SIZE_BY_CHILDREN) - { -#if BB_HAS_NATIVE_FLOAT2 - widget->computed_size[axis] = floorf(ancestor->computed_size[axis] * widget->pref_size[axis].value); -#else - widget->computed_size.v[axis] = floorf(ancestor->computed_size.v[axis] * widget->pref_size[axis].value); -#endif - break; - } - } - } break; - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_upward_dependent_sizes(child_widget); - } -} - -fn void ui_compute_downward_dependent_sizes(UI_Widget* widget) -{ - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_downward_dependent_sizes(child_widget); - } - - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_BY_CHILDREN: - { - todo(); - } break; - } - } -} - -fn void ui_resolve_conflicts(UI_Widget* widget) -{ - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { -#if BB_HAS_NATIVE_FLOAT2 - let(available_space, widget->computed_size[axis]); -#else - let(available_space, widget->computed_size.v[axis]); -#endif - f32 taken_space = 0; - f32 total_fixup_budget = 0; - - if (!(widget->flags.v & (UI_WIDGET_FLAG_OVERFLOW_X << axis))) - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - if (axis == widget->child_layout_axis) - { -#if BB_HAS_NATIVE_FLOAT2 - taken_space += child_widget->computed_size[axis]; -#else - taken_space += child_widget->computed_size.v[axis]; -#endif - } - else - { -#if BB_HAS_NATIVE_FLOAT2 - taken_space = MAX(taken_space, child_widget->computed_size[axis]); -#else - taken_space = MAX(taken_space, child_widget->computed_size.v[axis]); -#endif - } -#if BB_HAS_NATIVE_FLOAT2 - let(fixup_budget_this_child, child_widget->computed_size[axis] * (1 - child_widget->pref_size[axis].strictness)); -#else - let(fixup_budget_this_child, child_widget->computed_size.v[axis] * (1 - child_widget->pref_size[axis].strictness)); -#endif - total_fixup_budget += fixup_budget_this_child; - } - } - - let(conflict, taken_space - available_space); - - if (conflict > 0 && total_fixup_budget > 0) - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - let(fixup_budget_this_child, child_widget->computed_size[axis] * (1 - child_widget->pref_size[axis].strictness)); -#else - let(fixup_budget_this_child, child_widget->computed_size.v[axis] * (1 - child_widget->pref_size[axis].strictness)); -#endif - f32 fixup_size_this_child = 0; - - if (axis == widget->child_layout_axis) - { - fixup_size_this_child = fixup_budget_this_child * (conflict / total_fixup_budget); - } - else - { -#if BB_HAS_NATIVE_FLOAT2 - fixup_size_this_child = child_widget->computed_size[axis] - available_space; -#else - fixup_size_this_child = child_widget->computed_size.v[axis] - available_space; -#endif - } - - fixup_size_this_child = CLAMP(0, fixup_size_this_child, fixup_budget_this_child); -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_size[axis] = floorf(child_widget->computed_size[axis] - fixup_size_this_child); -#else - child_widget->computed_size.v[axis] = floorf(child_widget->computed_size.v[axis] - fixup_size_this_child); -#endif - } - } - } - } - - if (axis == widget->child_layout_axis) - { - f32 p = 0; - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_relative_position[axis] = p; - p += child_widget->computed_size[axis]; -#else - child_widget->computed_relative_position.v[axis] = p; - p += child_widget->computed_size.v[axis]; -#endif - } - } - } - else - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_relative_position[axis] = 0; -#else - child_widget->computed_relative_position.v[axis] = 0; -#endif - } - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - let(last_relative_rect, child_widget->relative_rect); -#if BB_HAS_NATIVE_FLOAT2 - child_widget->relative_rect.p0[axis] = child_widget->computed_relative_position[axis]; - child_widget->relative_rect.p1[axis] = child_widget->relative_rect.p0[axis] + child_widget->computed_size[axis]; -#else - child_widget->relative_rect.p0.v[axis] = child_widget->computed_relative_position.v[axis]; - child_widget->relative_rect.p1.v[axis] = child_widget->relative_rect.p0.v[axis] + child_widget->computed_size.v[axis]; -#endif - - float2 last_corner_01 = { last_relative_rect.x0, last_relative_rect.y1 }; - float2 last_corner_10 = { last_relative_rect.x1, last_relative_rect.y0 }; - float2 this_corner_01 = { child_widget->relative_rect.x0, child_widget->relative_rect.y1 }; - float2 this_corner_10 = { child_widget->relative_rect.x1, child_widget->relative_rect.y0 }; - -#if BB_HAS_NATIVE_FLOAT2 - child_widget->relative_corner_delta[CORNER_00][axis] = child_widget->relative_rect.p0[axis] - last_relative_rect.p0[axis]; - child_widget->relative_corner_delta[CORNER_01][axis] = this_corner_01[axis] - last_corner_01[axis]; - child_widget->relative_corner_delta[CORNER_10][axis] = this_corner_10[axis] - last_corner_10[axis]; - child_widget->relative_corner_delta[CORNER_11][axis] = child_widget->relative_rect.p1[axis] - last_relative_rect.p1[axis]; - - child_widget->rect.p0[axis] = widget->rect.p0[axis] + child_widget->relative_rect.p0[axis] - widget->view_offset[axis]; - child_widget->rect.p1[axis] = child_widget->rect.p0[axis] + child_widget->computed_size[axis]; - - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - child_widget->rect.p0[axis] = floorf(child_widget->rect.p0[axis]); - child_widget->rect.p1[axis] = floorf(child_widget->rect.p1[axis]); - } -#else - child_widget->relative_corner_delta[CORNER_00].v[axis] = child_widget->relative_rect.p0.v[axis] - last_relative_rect.p0.v[axis]; - child_widget->relative_corner_delta[CORNER_01].v[axis] = this_corner_01.v[axis] - last_corner_01.v[axis]; - child_widget->relative_corner_delta[CORNER_10].v[axis] = this_corner_10.v[axis] - last_corner_10.v[axis]; - child_widget->relative_corner_delta[CORNER_11].v[axis] = child_widget->relative_rect.p1.v[axis] - last_relative_rect.p1.v[axis]; - - child_widget->rect.p0.v[axis] = widget->rect.p0.v[axis] + child_widget->relative_rect.p0.v[axis] - widget->view_offset.v[axis]; - child_widget->rect.p1.v[axis] = child_widget->rect.p0.v[axis] + child_widget->computed_size.v[axis]; - - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - child_widget->rect.p0.v[axis] = floorf(child_widget->rect.p0.v[axis]); - child_widget->rect.p1.v[axis] = floorf(child_widget->rect.p1.v[axis]); - } -#endif - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_resolve_conflicts(child_widget); - } - } -} - -fn void ui_build_end() -{ - // Clear release button presses - for (u32 i = 0; i < array_length(ui_state->mouse_button_events); i += 1) - { - let(event, &ui_state->mouse_button_events[i]); - if (event->action == WINDOWING_EVENT_MOUSE_RELEASE) - { - event->action = WINDOWING_EVENT_MOUSE_RELAX; - } - } - - ui_pop(parent); - - ui_compute_independent_sizes(ui_state->root); - ui_compute_upward_dependent_sizes(ui_state->root); - ui_compute_downward_dependent_sizes(ui_state->root); - ui_resolve_conflicts(ui_state->root); -} - -STRUCT(WidgetIterator) -{ - UI_Widget* next; - u32 push_count; - u32 pop_count; -}; - -#define ui_widget_recurse_depth_first_preorder(widget) ui_widget_recurse_depth_first((widget), offset_of(UI_Widget, next), offset_of(UI_Widget, first)) -#define ui_widget_recurse_depth_first_postorder(widget) ui_widget_recurse_depth_first((widget), offset_of(UI_Widget, previous), offset_of(UI_Widget, last)) - -fn WidgetIterator ui_widget_recurse_depth_first(UI_Widget* widget, u64 sibling_offset, u64 child_offset) -{ - WidgetIterator it = {}; - let(child, member_from_offset(widget, UI_Widget*, child_offset)); - if (child) - { - it.next = child; - it.push_count += 1; - } - else - { - for (UI_Widget* w = widget; w; w = w->parent) - { - let(sibling, member_from_offset(w, UI_Widget*, sibling_offset)); - if (sibling) - { - it.next = sibling; - break; - } - - it.pop_count += 1; - } - } - - return it; -} - -fn void ui_draw() -{ - UI_Widget* root = ui_state->root; - - UI_Widget* widget = root; - RenderWindow* window = ui_state->render_window; - Renderer* renderer = ui_state->renderer; - - while (widget) - { - if (widget->flags.draw_background) - { - window_render_rect(window, (RectDraw) { - .colors = { widget->background_colors[0], widget->background_colors[1], widget->background_colors[2], widget->background_colors[3] }, - .vertex = widget->rect, - }); - } - - if (widget->flags.draw_text) - { - window_render_text(renderer, window, widget->text, widget->text_color, RENDER_FONT_TYPE_PROPORTIONAL, widget->rect.x0, widget->rect.y0); - } - - widget = ui_widget_recurse_depth_first_postorder(widget).next; - } -} diff --git a/bootstrap/std/ui_core.h b/bootstrap/std/ui_core.h deleted file mode 100644 index 8e83d79..0000000 --- a/bootstrap/std/ui_core.h +++ /dev/null @@ -1,223 +0,0 @@ -#pragma once - -ENUM(UI_SizeKind, u8, - UI_SIZE_PIXEL_COUNT, - UI_SIZE_PERCENTAGE, - UI_SIZE_BY_CHILDREN, - UI_SIZE_COUNT, -); - -STRUCT(UI_Size) -{ - UI_SizeKind kind; - f32 value; - f32 strictness; -}; -static_assert(sizeof(UI_Size) == 12); -decl_vb(UI_Size); - -STRUCT(UI_Key) -{ - u64 value; -}; - -STRUCT(UI_MousePosition) -{ - f64 x; - f64 y; -}; - -ENUM(UI_WidgetFlagEnum, u64, - UI_WIDGET_FLAG_DISABLED = 1 << 0, - UI_WIDGET_FLAG_MOUSE_CLICKABLE = 1 << 1, - UI_WIDGET_FLAG_KEYBOARD_PRESSABLE = 1 << 2, - UI_WIDGET_FLAG_DRAW_TEXT = 1 << 3, - UI_WIDGET_FLAG_DRAW_BACKGROUND = 1 << 4, - UI_WIDGET_FLAG_OVERFLOW_X = 1 << 5, - UI_WIDGET_FLAG_OVERFLOW_Y = 1 << 6, - UI_WIDGET_FLAG_FLOATING_X = 1 << 7, - UI_WIDGET_FLAG_FLOATING_Y = 1 << 8, -); - -UNION(UI_WidgetFlags) -{ - struct - { - u64 disabled:1; - u64 mouse_clickable:1; - u64 keyboard_pressable:1; - u64 draw_text:1; - u64 draw_background:1; - u64 overflow_x:1; - u64 overflow_y:1; - u64 floating_x:1; - u64 floating_y:1; - }; - u64 v; -}; -static_assert(sizeof(UI_WidgetFlags) == sizeof(u64)); - -STRUCT(UI_Widget) -{ - // Random category I temporarily introduce - String text; - - UI_Widget* hash_previous; - UI_Widget* hash_next; - - UI_Widget* first; - UI_Widget* last; - UI_Widget* next; - UI_Widget* previous; - UI_Widget* parent; - u64 child_count; - - UI_Key key; - - // Input parameters - UI_Size pref_size[AXIS2_COUNT]; - Axis2 child_layout_axis; - UI_WidgetFlags flags; - - // Data known after size determination happens - float2 computed_size; - float2 computed_relative_position; - - // Data known after layout computation happens - F32Interval2 relative_rect; - F32Interval2 rect; - float2 relative_corner_delta[CORNER_COUNT]; - - // Persistent data across frames - u64 last_build_touched; - float2 view_offset; - float4 background_colors[4]; - float4 text_color; -}; -decl_vbp(UI_Widget); - -STRUCT(UI_WidgetSlot) -{ - UI_Widget* first; - UI_Widget* last; -}; -declare_slice(UI_WidgetSlot); - -decl_vb(Axis2); -decl_vb(float4); - -STRUCT(UI_StateStackAutoPops) -{ - u64 parent:1; - u64 pref_width:1; - u64 pref_height:1; - u64 child_layout_axis:1; - u64 text_color:1; - u64 background_color:1; - u64 font_size:1; -}; -static_assert(sizeof(UI_StateStackAutoPops) % sizeof(u64) == 0); - -STRUCT(UI_StateStackNulls) -{ - UI_Widget* parent; - UI_Size pref_width; - UI_Size pref_height; - Axis2 child_layout_axis; - float4 text_color; - float4 background_color; - f32 font_size; -}; - -STRUCT(UI_StateStacks) -{ - VirtualBufferP(UI_Widget) parent; - VirtualBuffer(UI_Size) pref_width; - VirtualBuffer(UI_Size) pref_height; - VirtualBuffer(Axis2) child_layout_axis; - VirtualBuffer(float4) text_color; - VirtualBuffer(float4) background_color; - VirtualBuffer(f32) font_size; -}; - -STRUCT(UI_State) -{ - Arena* arena; - Arena* build_arenas[2]; - Renderer* renderer; - RenderWindow* render_window; - WindowingInstance* window; - u64 build_count; - f64 frame_time; - UI_Widget* root; - UI_MousePosition mouse_position; - Slice(UI_WidgetSlot) widget_table; - UI_Widget* free_widget_list; - u64 free_widget_count; - WindowingEventMouseButtonEvent mouse_button_events[WINDOWING_EVENT_MOUSE_BUTTON_COUNT]; - u8 focused:1; - - UI_StateStacks stacks; - UI_StateStackNulls stack_nulls; - UI_StateStackAutoPops stack_autopops; -}; - -enum -{ - UI_SignalFlag_ClickedLeft = (1 << 0), -}; - -typedef u32 UI_SignalFlags; - -STRUCT(UI_Signal) -{ - UI_Widget* widget; - union - { - UI_SignalFlags flags; - struct - { - u32 clicked_left:1; - u32 reserved:31; - }; - }; -}; - -#define ui_stack_autopop_set(field_name, value) ui_state->stack_autopops.field_name = (value) -#define ui_stack_push_impl(field_name, value, auto_pop_value) do \ -{\ - *vb_add(&ui_state->stacks.field_name, 1) = (value);\ - ui_stack_autopop_set(field_name, auto_pop_value);\ -} while (0) - -#define ui_push(field_name, value) ui_stack_push_impl(field_name, value, 0) -#define ui_push_next_only(field_name, value) ui_stack_push_impl(field_name, value, 1) -#define ui_pop(field_name) (typeof(ui_state->stacks.field_name.pointer)) ui_pop_generic((VirtualBuffer(u8)*)&ui_state->stacks.field_name, sizeof(*ui_state->stacks.field_name.pointer)) -#define ui_top(field_name) (ui_state->stacks.field_name.length ? ui_state->stacks.field_name.pointer[ui_state->stacks.field_name.length - 1] : ui_state->stack_nulls.field_name) - -fn u8* ui_pop_generic(VirtualBuffer(u8)* stack, u32 element_size) -{ - let(length, stack->length); - - assert(length > 0); - let(next_length, length - 1); - let(index, next_length); - let(result, &stack->pointer[index * element_size]); - stack->length = next_length; - - return result; -} - -fn UI_State* ui_state_allocate(Renderer* renderer, RenderWindow* window); -fn void ui_state_select(UI_State* state); -fn u8 ui_build_begin(WindowingInstance* window, f64 frame_time, WindowingEventQueue* event_queue); -fn void ui_build_end(); -fn void ui_draw(); -fn UI_Signal ui_signal_from_widget(UI_Widget* widget); -fn UI_State* ui_state_get(); - -fn UI_Widget* ui_widget_make(UI_WidgetFlags flags, String string); -fn UI_Widget* ui_widget_make_format(UI_WidgetFlags flags, const char* format, ...); -fn UI_Size ui_pixels(u32 width, f32 strictness); -fn UI_Size ui_percentage(f32 percentage, f32 strictness); -fn UI_Size ui_em(f32 value, f32 strictness); diff --git a/bootstrap/std/virtual_buffer.c b/bootstrap/std/virtual_buffer.c deleted file mode 100644 index 7df3de0..0000000 --- a/bootstrap/std/virtual_buffer.c +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -fn void vb_generic_ensure_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - u32 old_capacity = vb->capacity; - u32 wanted_capacity = vb->length + item_count; - - if (old_capacity < wanted_capacity) - { - if (old_capacity == 0) - { - vb->pointer = os_reserve(0, item_size * UINT32_MAX, (OSReserveProtectionFlags) {}, (OSReserveMapFlags) { .priv = 1, .anon = 1, .noreserve = 1 }); - } - - let_cast(u32, old_page_capacity, align_forward_u64(old_capacity * item_size, minimum_granularity)); - let_cast(u32, new_page_capacity, align_forward_u64(wanted_capacity * item_size, minimum_granularity)); - - let(commit_size, new_page_capacity - old_page_capacity); - void* commit_pointer = vb->pointer + old_page_capacity; - - os_commit(commit_pointer, commit_size); - - let(new_capacity, new_page_capacity / item_size); - vb->capacity = new_capacity; - } -} - -fn u8* vb_generic_add_assume_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - u32 index = vb->length; - assert(vb->capacity >= index + item_count); - vb->length = index + item_count; - return vb->pointer + (index * item_size); -} - -fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - vb_generic_ensure_capacity(vb, item_size, item_count); - return vb_generic_add_assume_capacity(vb, item_size, item_count); -} - -fn u8* vb_append_bytes(VirtualBuffer(u8*) vb, Slice(u8) bytes) -{ - let_cast(u32, len, bytes.length); - vb_generic_ensure_capacity(vb, sizeof(u8), len); - let(pointer, vb_generic_add_assume_capacity(vb, sizeof(u8), len)); - memcpy(pointer, bytes.pointer, len); - return pointer; -} - -fn u32 vb_copy_string(VirtualBuffer(u8)* buffer, String string) -{ - let(offset, buffer->length); - let_cast(u32, length, string.length); - let(pointer, vb_add(buffer, length)); - memcpy(pointer, string.pointer, length); - return offset; -} - -fn u64 vb_copy_string_zero_terminated(VirtualBuffer(u8)* buffer, String string) -{ - assert(string.pointer[string.length] == 0); - string.length += 1; - - vb_copy_string(buffer, string); - - return string.length; -} - -fn void vb_copy_byte_repeatedly(VirtualBuffer(u8)* buffer, u8 byte, u32 times) -{ - u8* ptr = vb_generic_add(buffer, 1, times); - memset(ptr, byte, times); -} - -fn u64 vb_format(VirtualBuffer(u8)* vb, const char* format, ...) -{ - u8 buffer[4096]; - va_list args; - va_start(args, format); - let(result, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - - assert(result.length <= array_length(buffer)); - vb_copy_string(vb, result); - - return result.length; -} diff --git a/bootstrap/std/virtual_buffer.h b/bootstrap/std/virtual_buffer.h deleted file mode 100644 index cf0e2e3..0000000 --- a/bootstrap/std/virtual_buffer.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include - -#define VirtualBuffer(T) VirtualBuffer_ ## T -#define VirtualBufferP(T) VirtualBufferPointerTo_ ## T - -#define decl_vb_ex(T, StructName) \ -struct StructName \ -{\ - T* pointer;\ - u32 length;\ - u32 capacity;\ -};\ -typedef struct StructName StructName - -#define decl_vb(T) decl_vb_ex(T, VirtualBuffer(T)) -#define decl_vbp(T) decl_vb_ex(T*, VirtualBufferP(T)) - -decl_vb(u8); -decl_vbp(u8); -decl_vb(u16); -decl_vbp(u16); -decl_vb(u32); -decl_vbp(u32); -decl_vb(s32); -decl_vbp(s32); -decl_vb(s64); -decl_vbp(s64); -decl_vb(String); -decl_vbp(char); -decl_vb(f32); -decl_vb(f64); - -#define vb_size_of_element(vb) sizeof(*((vb)->pointer)) -#define vb_add(vb, count) (typeof((vb)->pointer)) vb_generic_add((VirtualBuffer(u8)*)(vb), (vb_size_of_element(vb)), (count)) -#define vb_add_scalar(vb, S) (S*) vb_generic_add(vb, 1, sizeof(S)) -#define vb_copy_scalar(vb, s) *vb_add_scalar(vb, typeof(s)) = s -#define vb_append_struct(vb, T, s) *(vb_add_struct(vb, T)) = s -#define vb_append_one(vb, item) (typeof((vb)->pointer)) vb_generic_append((VirtualBuffer(u8)*)(vb), &(item), (vb_size_of_element(vb)), 1) -#define vb_to_bytes(vb) (Slice(u8)) { .pointer = (u8*)((vb).pointer), .length = (vb_size_of_element(vb)) * (vb).length, } -#define vb_ensure_capacity(vb, count) vb_generic_ensure_capacity((VirtualBuffer(u8)*)(vb), vb_size_of_element(vb), (count)) -#define vb_copy_array(vb, arr) memcpy(vb_add(vb, array_length(arr)), arr, sizeof(arr)) -#define vb_add_any_array(vb, E, count) (E*)vb_generic_add(vb, vb_size_of_element(vb), sizeof(E) * count) -#define vb_copy_any_array(vb, arr) memcpy(vb_generic_add(vb, vb_size_of_element(vb), sizeof(arr)), (arr), sizeof(arr)) -#define vb_copy_any_slice(vb, slice) memcpy(vb_generic_add(vb, vb_size_of_element(vb), sizeof(*((slice).pointer)) * (slice).length), (slice).pointer, sizeof(*((slice).pointer)) * (slice).length) - -fn void vb_generic_ensure_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_generic_add_assume_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_append_bytes(VirtualBuffer(u8*) vb, Slice(u8) bytes); -fn u32 vb_copy_string(VirtualBuffer(u8)* buffer, String string); -fn u64 vb_copy_string_zero_terminated(VirtualBuffer(u8)* buffer, String string); -fn u64 vb_format(VirtualBuffer(u8)* vb, const char* format, ...); diff --git a/bootstrap/std/vulkan_rendering.c b/bootstrap/std/vulkan_rendering.c deleted file mode 100644 index a14300a..0000000 --- a/bootstrap/std/vulkan_rendering.c +++ /dev/null @@ -1,2502 +0,0 @@ -#pragma once - -#define vulkan_load_function_generic(fn, load_fn, context) fn = (PFN_ ## fn) load_fn(context, #fn) -#define vulkan_load_instance_function(instance, fn) vulkan_load_function_generic(fn, vkGetInstanceProcAddr, instance) -#define vulkan_load_device_function(device, fn) vulkan_load_function_generic(fn, vkGetDeviceProcAddr, device) - -global_variable OSLibrary vulkan_library; - -#define MAX_SWAPCHAIN_IMAGE_COUNT (16) -#define MAX_FRAME_COUNT (2) -#define MAX_DESCRIPTOR_SET_COUNT (16) -#define MAX_PUSH_CONSTANT_RANGE_COUNT (16) -#define MAX_SHADER_MODULE_COUNT_PER_PIPELINE (16) -#define MAX_DESCRIPTOR_SET_LAYOUT_COUNT (16) -#define MAX_DESCRIPTOR_SET_LAYOUT_BINDING_COUNT (16) -#define MAX_TEXTURE_COUNT (16) -#define MAX_TEXTURE_UPDATE_COUNT (32) -#define MAX_DESCRIPTOR_SET_UPDATE_COUNT (16) -#define MAX_LOCAL_BUFFER_COPY_COUNT (16) - -#define vkok(call) do {\ - VkResult _r_e_s_u_l_t_ = call; \ - if (unlikely(_r_e_s_u_l_t_ != VK_SUCCESS)) wrong_vulkan_result(_r_e_s_u_l_t_, strlit(#call), strlit(__FILE__), __LINE__); \ -} while(0) - -STRUCT(VulkanImageCreate) -{ - u32 width; - u32 height; - u32 mip_levels; - VkFormat format; - VkImageUsageFlags usage; -}; - -STRUCT(GPUMemory) -{ - VkDeviceMemory handle; - u64 size; -}; - -STRUCT(VulkanImage) -{ - VkImage handle; - VkImageView view; - GPUMemory memory; - VkFormat format; -}; - -STRUCT(GPUDrawPushConstants) -{ - u64 vertex_buffer; - f32 width; - f32 height; -}; - -STRUCT(DescriptorSetLayoutBindings) -{ - VkDescriptorSetLayoutBinding buffer[MAX_DESCRIPTOR_SET_LAYOUT_BINDING_COUNT]; - u32 count; -}; - -STRUCT(Pipeline) -{ - VkPipeline handle; - VkPipelineLayout layout; - u32 descriptor_set_count; - u32 push_constant_range_count; - DescriptorSetLayoutBindings descriptor_set_layout_bindings[MAX_DESCRIPTOR_SET_COUNT]; - VkDescriptorSetLayout descriptor_set_layouts[MAX_DESCRIPTOR_SET_COUNT]; - VkPushConstantRange push_constant_ranges[MAX_PUSH_CONSTANT_RANGE_COUNT]; -}; - -STRUCT(RectPipeline) -{ - Pipeline pipeline; -}; - -STRUCT(ImmediateContext) -{ - VkDevice device; - VkFence fence; - VkCommandBuffer command_buffer; - VkCommandPool command_pool; - VkQueue queue; -}; - -STRUCT(VulkanBuffer) -{ - VkBuffer handle; - GPUMemory memory; - u64 address; - VkDeviceSize size; - BufferType type; -}; - -STRUCT(LocalBufferCopy) -{ - VulkanBuffer destination; - VulkanBuffer source; - Slice(LocalBufferCopyRegion) regions; -}; -declare_slice(LocalBufferCopy); - -STRUCT(VertexBuffer) -{ - VulkanBuffer gpu; - VirtualBuffer(u8) cpu; - u32 count; -}; - -STRUCT(IndexBuffer) -{ - VulkanBuffer gpu; - VirtualBuffer(u32) cpu; -}; - -STRUCT(Renderer) -{ - VkAllocationCallbacks* allocator; - VkPhysicalDevice physical_device; - VkDevice device; - VkQueue graphics_queue; - u32 graphics_queue_family_index; - VkSampler sampler; - ImmediateContext immediate; - VkPhysicalDeviceMemoryProperties memory_properties; - Pipeline pipelines[BB_PIPELINE_COUNT]; - TextureAtlas fonts[RENDER_FONT_TYPE_COUNT]; -}; - -STRUCT(PipelineInstantiation) -{ - VkWriteDescriptorSet descriptor_set_update; - VkDescriptorSet descriptor_sets[MAX_DESCRIPTOR_SET_COUNT]; - VkDescriptorImageInfo texture_descriptors[MAX_TEXTURE_UPDATE_COUNT]; -}; - -STRUCT(FramePipelineInstantiation) -{ - VertexBuffer vertex_buffer; - IndexBuffer index_buffer; - VulkanBuffer transient_buffer; -}; - -STRUCT(WindowFrame) -{ - VkCommandPool command_pool; - VkCommandBuffer command_buffer; - VkSemaphore swapchain_semaphore; - VkSemaphore render_semaphore; - VkFence render_fence; - BBPipeline bound_pipeline; - VkBuffer index_buffer; - GPUDrawPushConstants push_constants; - FramePipelineInstantiation pipeline_instantiations[BB_PIPELINE_COUNT]; -}; - -STRUCT(RenderWindow) -{ - VkSwapchainKHR swapchain; - VkSurfaceKHR surface; - VkFormat swapchain_image_format; - u32 width; - u32 height; - u32 last_width; - u32 last_height; - u32 frame_index; - u32 swapchain_image_index; - u32 swapchain_image_count; - VulkanImage render_image; - VkImage swapchain_images[MAX_SWAPCHAIN_IMAGE_COUNT]; - VkImageView swapchain_image_views[MAX_SWAPCHAIN_IMAGE_COUNT]; - WindowFrame frames[MAX_FRAME_COUNT]; - PipelineInstantiation pipeline_instantiations[BB_PIPELINE_COUNT]; -}; - -STRUCT(VulkanTexture) -{ - VulkanImage image; - VkSampler sampler; -}; - -STRUCT(VulkanCopyImage) -{ - VkImage handle; - VkExtent2D extent; -}; - -STRUCT(VulkanCopyImageArgs) -{ - VulkanCopyImage source; - VulkanCopyImage destination; -}; - -global_variable Renderer renderer_memory; -global_variable RenderWindow renderer_window_memory; -global_variable VulkanTexture textures[MAX_TEXTURE_COUNT]; -global_variable u32 texture_count; -global_variable VkInstance instance; - -fn String vulkan_result_to_string(VkResult result) -{ - switch (result) - { - case_to_name(VK_, SUCCESS); - case_to_name(VK_, NOT_READY); - case_to_name(VK_, TIMEOUT); - case_to_name(VK_, EVENT_SET); - case_to_name(VK_, EVENT_RESET); - case_to_name(VK_, INCOMPLETE); - case_to_name(VK_, ERROR_OUT_OF_HOST_MEMORY); - case_to_name(VK_, ERROR_OUT_OF_DEVICE_MEMORY); - case_to_name(VK_, ERROR_INITIALIZATION_FAILED); - case_to_name(VK_, ERROR_DEVICE_LOST); - case_to_name(VK_, ERROR_MEMORY_MAP_FAILED); - case_to_name(VK_, ERROR_LAYER_NOT_PRESENT); - case_to_name(VK_, ERROR_EXTENSION_NOT_PRESENT); - case_to_name(VK_, ERROR_FEATURE_NOT_PRESENT); - case_to_name(VK_, ERROR_INCOMPATIBLE_DRIVER); - case_to_name(VK_, ERROR_TOO_MANY_OBJECTS); - case_to_name(VK_, ERROR_FORMAT_NOT_SUPPORTED); - case_to_name(VK_, ERROR_FRAGMENTED_POOL); - case_to_name(VK_, ERROR_UNKNOWN); - case_to_name(VK_, ERROR_OUT_OF_POOL_MEMORY); - case_to_name(VK_, ERROR_INVALID_EXTERNAL_HANDLE); - case_to_name(VK_, ERROR_FRAGMENTATION); - case_to_name(VK_, ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS); - case_to_name(VK_, PIPELINE_COMPILE_REQUIRED); - case_to_name(VK_, ERROR_SURFACE_LOST_KHR); - case_to_name(VK_, ERROR_NATIVE_WINDOW_IN_USE_KHR); - case_to_name(VK_, SUBOPTIMAL_KHR); - case_to_name(VK_, ERROR_OUT_OF_DATE_KHR); - case_to_name(VK_, ERROR_INCOMPATIBLE_DISPLAY_KHR); - case_to_name(VK_, ERROR_VALIDATION_FAILED_EXT); - case_to_name(VK_, ERROR_INVALID_SHADER_NV); - case_to_name(VK_, ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT); - case_to_name(VK_, ERROR_NOT_PERMITTED_KHR); - case_to_name(VK_, ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT); - case_to_name(VK_, THREAD_IDLE_KHR); - case_to_name(VK_, THREAD_DONE_KHR); - case_to_name(VK_, OPERATION_DEFERRED_KHR); - case_to_name(VK_, OPERATION_NOT_DEFERRED_KHR); - case_to_name(VK_, ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR); - case_to_name(VK_, ERROR_COMPRESSION_EXHAUSTED_EXT); - //case_to_name(VK_, INCOMPATIBLE_SHADER_BINARY_EXT); - //case_to_name(VK_, PIPELINE_BINARY_MISSING_KHR); - //case_to_name(VK_, ERROR_NOT_ENOUGH_SPACE_KHR); - default: unreachable(); - } -} - -BB_NORETURN BB_COLD fn void wrong_vulkan_result(VkResult result, String call_string, String file, int line) -{ - unused(result); - unused(call_string); - unused(file); - unused(line); - - String result_name = vulkan_result_to_string(result); - panic("Wrong Vulkan result {s} at \"{s}\" {s}:{u32}\n", result_name, call_string, file, line); -} - -fn void buffer_copy_to_local_command(VkCommandBuffer command_buffer, Slice(LocalBufferCopy) copies) -{ - for (u64 i = 0; i < copies.length; i += 1) - { - let(copy, copies.pointer[i]); - let(source_buffer, ©.source); - let(destination_buffer, ©.destination); - - VkBufferCopy2 buffer_copies[MAX_LOCAL_BUFFER_COPY_COUNT]; - - for (u64 i = 0; i < copy.regions.length; i += 1) - { - let(copy_region, copy.regions.pointer[i]); - buffer_copies[i] = (VkBufferCopy2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2, - .pNext = 0, - .srcOffset = copy_region.source_offset, - .dstOffset = copy_region.destination_offset, - .size = copy_region.size, - }; - } - - VkCopyBufferInfo2 info = { - .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, - .pNext = 0, - .srcBuffer = source_buffer->handle, - .dstBuffer = destination_buffer->handle, - .regionCount = copy.regions.length, - .pRegions = buffer_copies, - }; - - vkCmdCopyBuffer2(command_buffer, &info); - } -} - -fn void buffer_copy_to_host(VulkanBuffer buffer, Slice(HostBufferCopy) regions) -{ - assert(buffer.type == BUFFER_TYPE_STAGING); - - let(buffer_pointer, (u8*)buffer.address); - - for (u64 i = 0; i < regions.length; i += 1) - { - let(region, regions.pointer[i]); - let(destination, buffer_pointer + region.destination_offset); - assert(destination + region.source.length <= (u8*)buffer.address + buffer.size); -#if USE_MEMCPY - memcpy(destination, region.source.pointer, region.source.length); -#else - for (u64 i = 0; i < region.source.length; i += 1) - { - destination[i] = region.source.pointer[i]; - } -#endif - } -} - -fn VkShaderStageFlags vulkan_shader_stage_from_path(String shader_binary_path) -{ - VkShaderStageFlags shader_stage; - if (string_ends_with(shader_binary_path, strlit(".vert.spv"))) - { - shader_stage = VK_SHADER_STAGE_VERTEX_BIT; - } - else if (string_ends_with(shader_binary_path, strlit(".frag.spv"))) - { - shader_stage = VK_SHADER_STAGE_FRAGMENT_BIT; - } - else - { - failed_execution(); - } - - return shader_stage; -} - -fn VkShaderStageFlags vulkan_shader_stage(ShaderStage shader_stage) -{ - VkShaderStageFlags result; - - switch (shader_stage) - { - case SHADER_STAGE_VERTEX: - result = VK_SHADER_STAGE_VERTEX_BIT; - break; - case SHADER_STAGE_FRAGMENT: - result = VK_SHADER_STAGE_FRAGMENT_BIT; - break; - } - - return result; -} - -fn VkDescriptorType vulkan_descriptor_type(DescriptorType type) -{ - VkDescriptorType result; - - switch (type) - { - case DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER: - result = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - break; - case DESCRIPTOR_TYPE_COUNT: - unreachable(); - } - - return result; -} - -fn DescriptorType descriptor_type_from_vulkan(VkDescriptorType descriptor_type) -{ - DescriptorType result; - - switch (descriptor_type) - { - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - result = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER; - break; - default: unreachable(); - } - - return result; -} - -fn GPUMemory vk_allocate_memory(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties memory_properties, VkMemoryRequirements memory_requirements, VkMemoryPropertyFlags flags, u8 use_device_address_bit) -{ - u32 memory_type_index; - for (memory_type_index = 0; memory_type_index < memory_properties.memoryTypeCount; memory_type_index += 1) - { - let(memory_type, memory_properties.memoryTypes[memory_type_index]); - - if ((memory_requirements.memoryTypeBits & (1 << memory_type_index)) != 0 && (memory_type.propertyFlags & flags) == flags) - { - break; - } - } - - if (memory_type_index == memory_properties.memoryTypeCount) - { - failed_execution(); - } - - VkMemoryAllocateInfo allocate_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .pNext = 0, - .allocationSize = memory_requirements.size, - .memoryTypeIndex = memory_type_index, - }; - - VkMemoryAllocateFlagsInfo flags_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, - .pNext = 0, - .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, - .deviceMask = 1, - }; - - if (use_device_address_bit) - { - allocate_info.pNext = &flags_info; - } - - VkDeviceMemory memory = 0; - vkok(vkAllocateMemory(device, &allocate_info, allocation_callbacks, &memory)); - - return (GPUMemory) { .handle = memory, .size = allocate_info.allocationSize }; -} - -fn VulkanBuffer vk_buffer_create(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties physical_device_memory_properties, VkDeviceSize buffer_size, VkBufferUsageFlags usage_flags, VkMemoryPropertyFlags memory_flags) -{ - VulkanBuffer result = { - .size = buffer_size, - }; - - VkBufferCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .pNext = 0, - .flags = 0, - .size = buffer_size, - .usage = usage_flags, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - .queueFamilyIndexCount = 0, - .pQueueFamilyIndices = 0, - }; - vkok(vkCreateBuffer(device, &create_info, allocation_callbacks, &result.handle)); - - VkMemoryRequirements memory_requirements; - vkGetBufferMemoryRequirements(device, result.handle, &memory_requirements); - - u8 use_device_address_bit = !!(create_info.usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); - result.memory = vk_allocate_memory(device, allocation_callbacks, physical_device_memory_properties, memory_requirements, memory_flags, use_device_address_bit); - - VkDeviceSize memory_offset = 0; - vkok(vkBindBufferMemory(device, result.handle, result.memory.handle, memory_offset)); - - u8 map_memory = !!(memory_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - assert(((map_memory | use_device_address_bit) == 0) | (map_memory == !use_device_address_bit)); - if (map_memory) - { - void* data = 0; - VkDeviceSize offset = 0; - VkMemoryMapFlags map_flags = 0; - vkok(vkMapMemory(device, result.memory.handle, offset, memory_requirements.size, map_flags, &data)); - result.address = (u64)data; - } - - if (use_device_address_bit) - { - VkBufferDeviceAddressInfo device_address_info = { - .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, - .pNext = 0, - .buffer = result.handle, - }; - result.address = vkGetBufferDeviceAddress(device, &device_address_info); - } - - return result; -} - -fn VulkanBuffer buffer_create(Renderer* renderer, u64 size, BufferType type) -{ - u8 is_dst = (type == BUFFER_TYPE_VERTEX) | (type == BUFFER_TYPE_INDEX); - u8 is_src = type == BUFFER_TYPE_STAGING; - - VkBufferUsageFlags usage = - (VK_BUFFER_USAGE_TRANSFER_DST_BIT * is_dst) | - (VK_BUFFER_USAGE_TRANSFER_SRC_BIT * is_src) | - ((VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) * (type == BUFFER_TYPE_VERTEX)) | - (VK_BUFFER_USAGE_INDEX_BUFFER_BIT * (type == BUFFER_TYPE_INDEX)); - VkMemoryPropertyFlags memory_flags = - (VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT * is_dst) | - ((VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) * is_src); - let(result, vk_buffer_create(renderer->device, renderer->allocator, renderer->memory_properties, size, usage, memory_flags)); - result.type = type; - return result; -} - -fn u8 vk_layer_is_supported(String layer_name) -{ - assert(layer_name.pointer[layer_name.length] == 0); - - VkLayerProperties layers[256]; - u32 layer_count; - - vkok(vkEnumerateInstanceLayerProperties(&layer_count, 0)); - - if (layer_count > array_length(layers)) - { - failed_execution(); - } - - vkok(vkEnumerateInstanceLayerProperties(&layer_count, layers)); - - u8 supported = 0; - for (u32 i = 0; i < layer_count; i += 1) - { - VkLayerProperties* properties = &layers[i]; - - let(candidate_layer_name, cstr(properties->layerName)); - if (s_equal(candidate_layer_name, layer_name)) - { - supported = 1; - break; - } - } - - return supported; -} - -#if BB_DEBUG - -fn String message_severity_to_string(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity) -{ - switch (message_severity) - { - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: - return strlit("VERBOSE"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: - return strlit("INFO"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: - return strlit("WARNING"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: - return strlit("ERROR"); - default: - unreachable(); - } -} - -fn String message_type_to_string(VkDebugUtilsMessageTypeFlagBitsEXT message_type) -{ - switch (message_type) - { - case VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT: - return strlit("GENERAL"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT: - return strlit("VALIDATION"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT: - return strlit("PERFORMANCE"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT: - return strlit("DEVICE_ADDRESS_BINDING"); - default: - unreachable(); - } - -} - -fn VkBool32 VKAPI_CALL debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) -{ - unused(user_data); - - if (callback_data->pMessage) - { - print("Validation message ({s}) ({s}) ({cstr}): {cstr}\n", message_severity_to_string(message_severity), message_type_to_string(message_type), callback_data->pMessageIdName ? callback_data->pMessageIdName : "ID_NONE", callback_data->pMessage); - } - - if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) - { - failed_execution(); - } - - return VK_FALSE; -} - -#endif - -fn void immediate_start(ImmediateContext context) -{ - VkFence fences[] = { context.fence }; - VkCommandBufferResetFlags reset_flags = 0; - - vkok(vkResetFences(context.device, array_length(fences), fences)); - vkok(vkResetCommandBuffer(context.command_buffer, reset_flags)); - - VkCommandBufferBeginInfo command_buffer_begin_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, - }; - vkok(vkBeginCommandBuffer(context.command_buffer, &command_buffer_begin_info)); -} - -fn void immediate_end(ImmediateContext context) -{ - VkFence fences[] = { context.fence }; - - vkok(vkEndCommandBuffer(context.command_buffer)); - - VkCommandBufferSubmitInfo command_buffer_submit_infos[] = { - { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, - .pNext = 0, - .deviceMask = 0, - .commandBuffer = context.command_buffer, - } - }; - - VkSubmitFlags submit_flags = 0; - - VkSubmitInfo2 submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, - .pNext = 0, - .flags = submit_flags, - .waitSemaphoreInfoCount = 0, - .pWaitSemaphoreInfos = 0, - .commandBufferInfoCount = array_length(command_buffer_submit_infos), - .pCommandBufferInfos = command_buffer_submit_infos, - .signalSemaphoreInfoCount = 0, - .pSignalSemaphoreInfos = 0, - } - }; - - vkok(vkQueueSubmit2(context.queue, array_length(submit_info), submit_info, context.fence)); - VkBool32 wait_all = 1; - let(timeout, ~(u64)0); - vkok(vkWaitForFences(context.device, array_length(fences), fences, wait_all, timeout)); -} - -fn VulkanImage vk_image_create(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties memory_properties, VulkanImageCreate create) -{ - assert(create.width); - assert(create.height); - VulkanImage result = {}; - result.format = create.format; - - VkImageCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .imageType = VK_IMAGE_TYPE_2D, - .format = create.format, - .extent = { - .width = create.width, - .height = create.height, - .depth = 1, - }, - .mipLevels = create.mip_levels, - .arrayLayers = 1, - .samples = VK_SAMPLE_COUNT_1_BIT, - .tiling = VK_IMAGE_TILING_OPTIMAL, - .usage = create.usage, - .sharingMode = 0, - .queueFamilyIndexCount = 0, - .pQueueFamilyIndices = 0, - .initialLayout = 0, - }; - vkok(vkCreateImage(device, &create_info, allocation_callbacks, &result.handle)); - - VkMemoryRequirements memory_requirements; - vkGetImageMemoryRequirements(device, result.handle, &memory_requirements); - - VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - u8 use_device_address_bit = 0; - result.memory = vk_allocate_memory(device, allocation_callbacks, memory_properties, memory_requirements, flags, use_device_address_bit); - - VkDeviceSize memory_offset = 0; - vkok(vkBindImageMemory(device, result.handle, result.memory.handle, memory_offset)); - - VkImageViewCreateInfo view_create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .image = result.handle, - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = create_info.format, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = create.mip_levels, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }; - - vkok(vkCreateImageView(device, &view_create_info, allocation_callbacks, &result.view)); - return result; -} - -fn void vk_image_transition(VkCommandBuffer command_buffer, VkImage image, VkImageLayout old_layout, VkImageLayout new_layout) -{ - VkImageMemoryBarrier2 image_barrier = { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, - .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, - .srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT, - .dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, - .dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT, - .oldLayout = old_layout, - .newLayout = new_layout, - .image = image, - .subresourceRange = { - .aspectMask = (new_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = VK_REMAINING_MIP_LEVELS, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, - }; - - VkDependencyInfo dependency_info = { - .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &image_barrier, - }; - - vkCmdPipelineBarrier2(command_buffer, &dependency_info); -} - -fn void vk_image_copy(VkCommandBuffer command_buffer, VulkanCopyImageArgs args) -{ - VkImageSubresourceLayers subresource_layers = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .baseArrayLayer = 0, - .layerCount = 1, - }; - VkImageBlit2 blit_regions[] = { - { - .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2, - .pNext = 0, - .srcSubresource = subresource_layers, - .srcOffsets = { - [1] = { - .x = args.source.extent.width, - .y = args.source.extent.height, - .z = 1, - }, - }, - .dstSubresource = subresource_layers, - .dstOffsets = { - [1] = { - .x = args.destination.extent.width, - .y = args.destination.extent.height, - .z = 1, - }, - }, - }, - }; - - VkBlitImageInfo2 blit_info = { - .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2, - .pNext = 0, - .srcImage = args.source.handle, - .srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - .dstImage = args.destination.handle, - .dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - .regionCount = array_length(blit_regions), - .pRegions = blit_regions, - .filter = VK_FILTER_LINEAR, - }; - - vkCmdBlitImage2(command_buffer, &blit_info); -} - -fn Renderer* rendering_initialize(Arena* arena) -{ - Renderer* renderer = &renderer_memory; - -#ifdef __linux__ - vulkan_library = os_library_load("libvulkan.so.1"); -#elif _WIN32 - vulkan_library = os_library_load("vulkan-1.dll"); -#elif __APPLE__ - vulkan_library = os_library_load("libvulkan.dylib"); - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("libvulkan.1.dylib"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("libMoltenVK.dylib"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("vulkan.framework/vulkan"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("MoltenVK.framework/MoltenVK"); - } -#endif - - if (!os_library_is_valid(vulkan_library)) - { - failed_execution(); - } - - vkGetInstanceProcAddr = os_symbol_load(vulkan_library, "vkGetInstanceProcAddr"); - if (!vkGetInstanceProcAddr) - { - failed_execution(); - } - - vulkan_load_instance_function(0, vkEnumerateInstanceVersion); - vulkan_load_instance_function(0, vkCreateInstance); - - u32 api_version = 0; - if (vkEnumerateInstanceVersion) - { - vkok(vkEnumerateInstanceVersion(&api_version)); - } - - if (!api_version) - { - if (vkCreateInstance) - { - api_version = VK_API_VERSION_1_0; - } - } - - if (!api_version) - { - failed_execution(); - } - - if (api_version < VK_API_VERSION_1_3) - { - failed_execution(); - } - - // Proceed to load Vulkan instance-level functions - vulkan_load_instance_function(0, vkEnumerateInstanceLayerProperties); - - { -#if BB_DEBUG - let(debug_layer, strlit("VK_LAYER_KHRONOS_validation")); - if (!vk_layer_is_supported(debug_layer)) - { - failed_execution(); - } - const char* layers[] = - { - string_to_c(debug_layer), - }; - let(layer_count, array_length(layers)); -#else - const char** layers = 0; - u32 layer_count = 0; -#endif - - const char* extensions[] = { -#if BB_DEBUG - VK_EXT_DEBUG_UTILS_EXTENSION_NAME, -#endif - VK_KHR_SURFACE_EXTENSION_NAME, -#ifdef VK_USE_PLATFORM_WIN32_KHR - VK_KHR_WIN32_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_XLIB_KHR - VK_KHR_XLIB_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_XCB_KHR - VK_KHR_XCB_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_METAL_EXT - VK_EXT_METAL_SURFACE_EXTENSION_NAME, - VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, -#endif - }; - -#if BB_DEBUG - VkValidationFeatureEnableEXT enabled_validation_features[] = - { - VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT, - }; - - VkDebugUtilsMessengerCreateInfoEXT msg_ci = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .pNext = 0, - .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, - .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT, - .pfnUserCallback = debug_callback, - .pUserData = 0, - }; - - u8 enable_shader_debug_printf = BB_DEBUG; - - VkValidationFeaturesEXT validation_features = { - .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, - .enabledValidationFeatureCount = array_length(enabled_validation_features), - .pEnabledValidationFeatures = enabled_validation_features, - .pNext = &msg_ci, - }; - -#endif -#if BB_DEBUG - let(pNext, enable_shader_debug_printf ? (void*)&validation_features : (void*)&msg_ci); -#else - void* pNext = 0; -#endif - VkApplicationInfo app_info = { - .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, - .apiVersion = api_version, - }; - VkInstanceCreateInfo ci = { - .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, - .pNext = pNext, -#if __APPLE__ - .flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR, -#else - .flags = 0, -#endif - .pApplicationInfo = &app_info, - .ppEnabledLayerNames = layers, - .enabledLayerCount = layer_count, - .ppEnabledExtensionNames = extensions, - .enabledExtensionCount = array_length(extensions), - }; - - vkok(vkCreateInstance(&ci, renderer->allocator, &instance)); - -#if BB_DEBUG - vulkan_load_instance_function(instance, vkCreateDebugUtilsMessengerEXT); - VkDebugUtilsMessengerEXT messenger; - vkok(vkCreateDebugUtilsMessengerEXT(instance, &msg_ci, renderer->allocator, &messenger)); -#endif - } - - vulkan_load_instance_function(instance, vkGetDeviceProcAddr); - vulkan_load_instance_function(instance, vkEnumeratePhysicalDevices); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceMemoryProperties); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceProperties); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceQueueFamilyProperties); - vulkan_load_instance_function(instance, vkCreateDevice); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceSurfaceCapabilitiesKHR); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceSurfacePresentModesKHR); -#ifdef VK_USE_PLATFORM_XCB_KHR - vulkan_load_instance_function(instance, vkCreateXcbSurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_WIN32_KHR - vulkan_load_instance_function(instance, vkCreateWin32SurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_WIN32_KHR - vulkan_load_instance_function(instance, vkCreateWin32SurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_METAL_EXT - vulkan_load_instance_function(instance, vkCreateMetalSurfaceEXT); -#endif - - { - u32 physical_device_count; - VkPhysicalDevice physical_devices[256]; - vkok(vkEnumeratePhysicalDevices(instance, &physical_device_count, 0)); - - if (physical_device_count == 0) - { - failed_execution(); - } - - if (physical_device_count > array_length(physical_devices)) - { - failed_execution(); - } - - vkok(vkEnumeratePhysicalDevices(instance, &physical_device_count, physical_devices)); - - renderer->physical_device = physical_devices[0]; - } - - vkGetPhysicalDeviceMemoryProperties(renderer->physical_device, &renderer->memory_properties); - - u32 graphics_queue_family_index; - { - u32 present_queue_family_index; - VkPhysicalDeviceProperties properties; - vkGetPhysicalDeviceProperties(renderer->physical_device, &properties); - - u32 queue_count; - vkGetPhysicalDeviceQueueFamilyProperties(renderer->physical_device, &queue_count, 0); - - VkQueueFamilyProperties queue_properties[64]; - if (queue_count > array_length(queue_properties)) - { - failed_execution(); - } - - vkGetPhysicalDeviceQueueFamilyProperties(renderer->physical_device, &queue_count, queue_properties); - - for (graphics_queue_family_index = 0; graphics_queue_family_index < queue_count; graphics_queue_family_index += 1) - { - VkQueueFamilyProperties* properties = &queue_properties[graphics_queue_family_index]; - if (properties->queueFlags & VK_QUEUE_GRAPHICS_BIT) - { - break; - } - } - - if (graphics_queue_family_index == queue_count) - { - failed_execution(); - } - - present_queue_family_index = 0; - - // for (present_queue_family_index = 0; present_queue_family_index < queue_count; present_queue_family_index += 1) - // { - // VkBool32 support; - // vkok(vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, present_queue_family_index, surface, &support)); - // if (support) - // { - // break; - // } - // } - - if (present_queue_family_index == queue_count) - { - failed_execution(); - } - - if (present_queue_family_index != graphics_queue_family_index) - { - failed_execution(); - } - - f32 queue_priorities[] = { 1.0f }; - VkDeviceQueueCreateInfo queue_create_infos[] = { - { - .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, - .queueFamilyIndex = graphics_queue_family_index, - .queueCount = array_length(queue_priorities), - .pQueuePriorities = queue_priorities, - }, - }; - - const char* extensions[] = - { - VK_KHR_SWAPCHAIN_EXTENSION_NAME, -#ifdef __APPLE__ - "VK_KHR_portability_subset", - VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, -#endif - }; - -#ifdef __APPLE__ - VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering_features = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, - .pNext = 0, - .dynamicRendering = VK_TRUE, - }; -#else - VkPhysicalDeviceVulkan13Features features13 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, - .dynamicRendering = 1, - .synchronization2 = 1, - }; -#endif - - VkPhysicalDeviceVulkan12Features features12 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .bufferDeviceAddress = 1, - .descriptorIndexing = 1, - .runtimeDescriptorArray = 1, - .shaderSampledImageArrayNonUniformIndexing = 1, -#ifdef __APPLE__ - .pNext = &dynamic_rendering_features, -#else - .pNext = &features13, -#endif - }; - - VkPhysicalDeviceFeatures2 features = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, - .features = { - }, - .pNext = &features12, - }; - - VkDeviceCreateInfo ci = { - .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, - .ppEnabledExtensionNames = extensions, - .enabledExtensionCount = array_length(extensions), - .pQueueCreateInfos = queue_create_infos, - .queueCreateInfoCount = array_length(queue_create_infos), - .pNext = &features, - }; - - vkok(vkCreateDevice(renderer->physical_device, &ci, renderer->allocator, &renderer->device)); - } - - // Load device table - vulkan_load_device_function(renderer->device, vkCreateSwapchainKHR); - vulkan_load_device_function(renderer->device, vkDestroySwapchainKHR); - vulkan_load_device_function(renderer->device, vkGetSwapchainImagesKHR); - vulkan_load_device_function(renderer->device, vkGetImageMemoryRequirements); - vulkan_load_device_function(renderer->device, vkGetBufferMemoryRequirements); - vulkan_load_device_function(renderer->device, vkMapMemory); - vulkan_load_device_function(renderer->device, vkUnmapMemory); - vulkan_load_device_function(renderer->device, vkAllocateMemory); - vulkan_load_device_function(renderer->device, vkBindImageMemory); - vulkan_load_device_function(renderer->device, vkBindBufferMemory); - vulkan_load_device_function(renderer->device, vkBindBufferMemory); - vulkan_load_device_function(renderer->device, vkGetDeviceQueue); - vulkan_load_device_function(renderer->device, vkCreateCommandPool); - vulkan_load_device_function(renderer->device, vkAllocateCommandBuffers); - vulkan_load_device_function(renderer->device, vkCreateFence); - vulkan_load_device_function(renderer->device, vkCreateSemaphore); - vulkan_load_device_function(renderer->device, vkCreateSampler); - vulkan_load_device_function(renderer->device, vkCreateShaderModule); - vulkan_load_device_function(renderer->device, vkCreateDescriptorSetLayout); - vulkan_load_device_function(renderer->device, vkCreatePipelineLayout); - vulkan_load_device_function(renderer->device, vkCreateGraphicsPipelines); - vulkan_load_device_function(renderer->device, vkCreateImage); - vulkan_load_device_function(renderer->device, vkCreateImageView); - vulkan_load_device_function(renderer->device, vkCreateBuffer); - vulkan_load_device_function(renderer->device, vkCreateDescriptorPool); - vulkan_load_device_function(renderer->device, vkAllocateDescriptorSets); - vulkan_load_device_function(renderer->device, vkResetFences); - vulkan_load_device_function(renderer->device, vkResetCommandBuffer); - vulkan_load_device_function(renderer->device, vkBeginCommandBuffer); - vulkan_load_device_function(renderer->device, vkCmdPipelineBarrier2); - vulkan_load_device_function(renderer->device, vkCmdCopyBufferToImage); - vulkan_load_device_function(renderer->device, vkEndCommandBuffer); - vulkan_load_device_function(renderer->device, vkQueueSubmit2); - vulkan_load_device_function(renderer->device, vkWaitForFences); - vulkan_load_device_function(renderer->device, vkUpdateDescriptorSets); - vulkan_load_device_function(renderer->device, vkAcquireNextImageKHR); - vulkan_load_device_function(renderer->device, vkGetBufferDeviceAddress); - vulkan_load_device_function(renderer->device, vkCmdCopyBuffer2); - vulkan_load_device_function(renderer->device, vkCmdSetViewport); - vulkan_load_device_function(renderer->device, vkCmdSetScissor); - vulkan_load_device_function(renderer->device, vkCmdBeginRendering); - vulkan_load_device_function(renderer->device, vkCmdEndRendering); - vulkan_load_device_function(renderer->device, vkCmdBindPipeline); - vulkan_load_device_function(renderer->device, vkCmdBindDescriptorSets); - vulkan_load_device_function(renderer->device, vkCmdBindIndexBuffer); - vulkan_load_device_function(renderer->device, vkCmdPushConstants); - vulkan_load_device_function(renderer->device, vkCmdDrawIndexed); - vulkan_load_device_function(renderer->device, vkCmdBlitImage2); - vulkan_load_device_function(renderer->device, vkQueuePresentKHR); - vulkan_load_device_function(renderer->device, vkDeviceWaitIdle); - vulkan_load_device_function(renderer->device, vkDestroyImageView); - vulkan_load_device_function(renderer->device, vkDestroyImage); - vulkan_load_device_function(renderer->device, vkFreeMemory); - - vkGetDeviceQueue(renderer->device, graphics_queue_family_index, 0, &renderer->graphics_queue); - - renderer->immediate.device = renderer->device; - renderer->immediate.queue = renderer->graphics_queue; - - VkCommandPoolCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, - .queueFamilyIndex = graphics_queue_family_index, - }; - vkok(vkCreateCommandPool(renderer->device, &create_info, renderer->allocator, &renderer->immediate.command_pool)); - - VkCommandBufferAllocateInfo command_buffer_allocate_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = renderer->immediate.command_pool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1, - }; - - vkok(vkAllocateCommandBuffers(renderer->device, &command_buffer_allocate_info, &renderer->immediate.command_buffer)); - VkFenceCreateInfo fence_create_info = { - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .flags = VK_FENCE_CREATE_SIGNALED_BIT, - }; - vkok(vkCreateFence(renderer->device, &fence_create_info, renderer->allocator, &renderer->immediate.fence)); - - { - VkFilter sampler_filter = VK_FILTER_LINEAR; - VkSamplerCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, - .pNext = 0, - .flags = 0, - .magFilter = sampler_filter, - .minFilter = sampler_filter, - .mipmapMode = 0, - .addressModeU = 0, - .addressModeV = 0, - .addressModeW = 0, - .mipLodBias = 0, - .anisotropyEnable = 0, - .maxAnisotropy = 0, - .compareEnable = 0, - .compareOp = 0, - .minLod = 0, - .maxLod = 0, - .borderColor = 0, - .unnormalizedCoordinates = 0, - }; - - vkok(vkCreateSampler(renderer->device, &create_info, renderer->allocator, &renderer->sampler)); - } - - String shader_binaries[] = { - strlit(BUILD_DIR "/" "rect.vert.spv"), - strlit(BUILD_DIR "/" "rect.frag.spv"), - }; - - PipelineLayoutCreate pipeline_layouts[] = { - (PipelineLayoutCreate) { - .push_constant_ranges = array_to_slice(((PushConstantRange[]){ - (PushConstantRange) { - .offset = 0, - .size = sizeof(GPUDrawPushConstants), - .stage = SHADER_STAGE_VERTEX, - }, - })), - .descriptor_set_layouts = array_to_slice(((DescriptorSetLayoutCreate[]){ - (DescriptorSetLayoutCreate) { - .bindings = array_to_slice(((DescriptorSetLayoutBinding[]) { - { - .binding = 0, - .type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER, - .stage = SHADER_STAGE_FRAGMENT, - .count = RECT_TEXTURE_SLOT_COUNT, - }, - })), - }, - })), - }, - }; - PipelineCreate pipeline_create[] = { - (PipelineCreate) { - .shader_source_indices = array_to_slice(((u16[]){0, 1})), - .layout_index = 0, - }, - }; - GraphicsPipelinesCreate create_data = { - .layouts = array_to_slice(pipeline_layouts), - .pipelines = array_to_slice(pipeline_create), - .shader_binaries = array_to_slice(shader_binaries), - }; - let(graphics_pipeline_count, create_data.pipelines.length); - assert(graphics_pipeline_count); - let(pipeline_layout_count, create_data.layouts.length); - assert(pipeline_layout_count); - assert(pipeline_layout_count <= graphics_pipeline_count); - let(shader_count, create_data.shader_binaries.length); - - VkPipeline pipeline_handles[BB_PIPELINE_COUNT]; - VkPipelineShaderStageCreateInfo shader_create_infos[MAX_SHADER_MODULE_COUNT_PER_PIPELINE]; - VkGraphicsPipelineCreateInfo graphics_pipeline_create_infos[BB_PIPELINE_COUNT]; - - VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .vertexBindingDescriptionCount = 0, - .pVertexBindingDescriptions = 0, - .vertexAttributeDescriptionCount = 0, - .pVertexAttributeDescriptions = 0, - }; - - VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - .primitiveRestartEnable = VK_FALSE, - }; - - VkPipelineViewportStateCreateInfo viewport_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, - .pNext = 0, - .viewportCount = 1, - .scissorCount = 1, - }; - - VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .depthClampEnable = 0, - .rasterizerDiscardEnable = 0, - .polygonMode = VK_POLYGON_MODE_FILL, - .cullMode = VK_CULL_MODE_NONE, - .frontFace = VK_FRONT_FACE_CLOCKWISE, - .depthBiasEnable = 0, - .depthBiasConstantFactor = 0, - .depthBiasClamp = 0, - .depthBiasSlopeFactor = 0, - .lineWidth = 1.0f, - }; - - VkPipelineMultisampleStateCreateInfo multisample_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, - .sampleShadingEnable = 0, - .minSampleShading = 1.0f, - .pSampleMask = 0, - .alphaToCoverageEnable = 0, - .alphaToOneEnable = 0, - }; - - VkPipelineDepthStencilStateCreateInfo depth_stencil_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .depthTestEnable = 0, - .depthWriteEnable = 0, - .depthCompareOp = VK_COMPARE_OP_NEVER, - .depthBoundsTestEnable = 0, - .stencilTestEnable = 0, - .front = {}, - .back = {}, - .minDepthBounds = 0.0f, - .maxDepthBounds = 1.0f, - }; - - VkPipelineColorBlendAttachmentState attachments[] = { - { - .blendEnable = 1, - .srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA, - .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, - .colorBlendOp = VK_BLEND_OP_ADD, - .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, - .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, - .alphaBlendOp = VK_BLEND_OP_ADD, - .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - }, - }; - - VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .logicOpEnable = VK_FALSE, - .logicOp = VK_LOGIC_OP_COPY, - .attachmentCount = array_length(attachments), - .pAttachments = attachments, - .blendConstants = {}, - }; - - VkDynamicState states[] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR }; - - VkPipelineDynamicStateCreateInfo dynamic_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .dynamicStateCount = array_length(states), - .pDynamicStates = states, - }; - - // TODO: abstract away - VkFormat common_image_format = VK_FORMAT_B8G8R8A8_UNORM; - VkFormat color_attachment_formats[] = { - common_image_format, - }; - - VkPipelineRenderingCreateInfo rendering_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, - .pNext = 0, - .viewMask = 0, - .colorAttachmentCount = array_length(color_attachment_formats), - .pColorAttachmentFormats = color_attachment_formats, - .depthAttachmentFormat = 0, - .stencilAttachmentFormat = 0, - }; - - let(shader_modules, arena_allocate(arena, VkShaderModule, shader_count)); - - for (u64 i = 0; i < shader_count; i += 1) - { - String shader_binary_path = create_data.shader_binaries.pointer[i]; - - let(binary, file_read(arena, shader_binary_path)); - - VkShaderModuleCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, - .codeSize = binary.length, - .pCode = (u32*)binary.pointer, - }; - - vkok(vkCreateShaderModule(renderer->device, &create_info, renderer->allocator, &shader_modules[i])); - } - - for (u64 pipeline_index = 0; pipeline_index < pipeline_layout_count; pipeline_index += 1) - { - let(create, create_data.layouts.pointer[pipeline_index]); - let(descriptor_set_layout_count, create.descriptor_set_layouts.length); - let(push_constant_range_count, create.push_constant_ranges.length); - let(pipeline, &renderer->pipelines[pipeline_index]); - pipeline->descriptor_set_count = descriptor_set_layout_count; - pipeline->push_constant_range_count = push_constant_range_count; - - if (descriptor_set_layout_count > MAX_DESCRIPTOR_SET_LAYOUT_COUNT) - { - failed_execution(); - } - - // u16 descriptor_type_counter[DESCRIPTOR_TYPE_COUNT] = {}; - - for (u64 descriptor_set_layout_index = 0; descriptor_set_layout_index < descriptor_set_layout_count; descriptor_set_layout_index += 1) - { - let(set_layout_create, create.descriptor_set_layouts.pointer[descriptor_set_layout_index]); - let(binding_count, set_layout_create.bindings.length); - let(descriptor_set_layout_bindings, &pipeline->descriptor_set_layout_bindings[descriptor_set_layout_index]); - descriptor_set_layout_bindings->count = binding_count; - - for (u64 binding_index = 0; binding_index < binding_count; binding_index += 1) - { - let(binding_descriptor, set_layout_create.bindings.pointer[binding_index]); - - VkDescriptorType descriptor_type = vulkan_descriptor_type(binding_descriptor.type); - - VkShaderStageFlags shader_stage = vulkan_shader_stage(binding_descriptor.stage); - - descriptor_set_layout_bindings->buffer[binding_index] = (VkDescriptorSetLayoutBinding) { - .binding = binding_descriptor.binding, - .descriptorType = descriptor_type, - .descriptorCount = binding_descriptor.count, - .stageFlags = shader_stage, - .pImmutableSamplers = 0, - }; - } - - VkDescriptorSetLayoutCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .pNext = 0, - .flags = 0, - .bindingCount = binding_count, - .pBindings = descriptor_set_layout_bindings->buffer, - }; - - vkok(vkCreateDescriptorSetLayout(renderer->device, &create_info, renderer->allocator, &pipeline->descriptor_set_layouts[descriptor_set_layout_index])); - } - - if (push_constant_range_count > MAX_PUSH_CONSTANT_RANGE_COUNT) - { - failed_execution(); - } - - for (u64 push_constant_index = 0; push_constant_index < push_constant_range_count; push_constant_index += 1) - { - let(push_constant_descriptor, create.push_constant_ranges.pointer[push_constant_index]); - pipeline->push_constant_ranges[push_constant_index] = (VkPushConstantRange) { - .stageFlags = vulkan_shader_stage(push_constant_descriptor.stage), - .offset = push_constant_descriptor.offset, - .size = push_constant_descriptor.size, - }; - } - - VkPipelineLayoutCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .pNext = 0, - .flags = 0, - .setLayoutCount = descriptor_set_layout_count, - .pSetLayouts = pipeline->descriptor_set_layouts, - .pushConstantRangeCount = push_constant_range_count, - .pPushConstantRanges = pipeline->push_constant_ranges, - }; - - vkok(vkCreatePipelineLayout(renderer->device, &create_info, renderer->allocator, &pipeline->layout)); - } - - for (u64 i = 0; i < graphics_pipeline_count; i += 1) - { - let(create, create_data.pipelines.pointer[i]); - let(pipeline_shader_count, create.shader_source_indices.length); - if (pipeline_shader_count > MAX_SHADER_MODULE_COUNT_PER_PIPELINE) - { - failed_execution(); - } - - for (u64 i = 0; i < pipeline_shader_count; i += 1) - { - let(shader_index, create.shader_source_indices.pointer[i]); - let(shader_source_path, create_data.shader_binaries.pointer[shader_index]); - - shader_create_infos[i] = (VkPipelineShaderStageCreateInfo) { - .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .stage = vulkan_shader_stage_from_path(shader_source_path), - .module = shader_modules[i], - .pName = "main", - .pSpecializationInfo = 0, - }; - } - - graphics_pipeline_create_infos[i] = (VkGraphicsPipelineCreateInfo) - { - .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, - .pNext = &rendering_create_info, - .flags = 0, - .stageCount = shader_count, - .pStages = shader_create_infos, - .pVertexInputState = &vertex_input_state_create_info, - .pInputAssemblyState = &input_assembly_state_create_info, - .pTessellationState = 0, - .pViewportState = &viewport_state_create_info, - .pRasterizationState = &rasterization_state_create_info, - .pMultisampleState = &multisample_state_create_info, - .pDepthStencilState = &depth_stencil_state_create_info, - .pColorBlendState = &color_blend_state_create_info, - .pDynamicState = &dynamic_state_create_info, - .layout = renderer->pipelines[i].layout, - .renderPass = 0, - .subpass = 0, - .basePipelineHandle = 0, - .basePipelineIndex = 0, - }; - } - - VkPipelineCache pipeline_cache = 0; - vkok(vkCreateGraphicsPipelines(renderer->device, pipeline_cache, graphics_pipeline_count, graphics_pipeline_create_infos, renderer->allocator, pipeline_handles)); - - for (u32 i = 0; i < graphics_pipeline_count; i += 1) - { - renderer->pipelines[i].handle = pipeline_handles[i]; - } - - return renderer; -} - -fn void destroy_image(Renderer* renderer, VulkanImage image) -{ - vkDestroyImageView(renderer->device, image.view, renderer->allocator); - vkDestroyImage(renderer->device, image.handle, renderer->allocator); - vkFreeMemory(renderer->device, image.memory.handle, renderer->allocator); -} - -fn void swapchain_recreate(Renderer* renderer, RenderWindow* window) -{ - VkSurfaceCapabilitiesKHR surface_capabilities; - vkok(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(renderer->physical_device, window->surface, &surface_capabilities)); - - VkSwapchainKHR old_swapchain = window->swapchain; - VkImageView old_swapchain_image_views[MAX_SWAPCHAIN_IMAGE_COUNT]; - - if (old_swapchain) - { - vkok(vkDeviceWaitIdle(renderer->device)); - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - old_swapchain_image_views[i] = window->swapchain_image_views[i]; - } - } - - u32 queue_family_indices[] = { renderer->graphics_queue_family_index }; - VkImageUsageFlags swapchain_image_usage_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; - window->swapchain_image_format = VK_FORMAT_B8G8R8A8_UNORM; - window->last_width = window->width; - window->last_height = window->height; - window->width = surface_capabilities.currentExtent.width; - window->height = surface_capabilities.currentExtent.height; - - VkPresentModeKHR preferred_present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR; - VkPresentModeKHR present_modes[16]; - u32 present_mode_count = array_length(present_modes); - vkok(vkGetPhysicalDeviceSurfacePresentModesKHR(renderer->physical_device, window->surface, &present_mode_count, present_modes)); - - for (u32 i = 0; i < present_mode_count; i += 1) - { - if (present_modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) - { - preferred_present_mode = VK_PRESENT_MODE_MAILBOX_KHR; - break; - } - } - - VkSwapchainCreateInfoKHR swapchain_create_info = { - .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .surface = window->surface, - .minImageCount = surface_capabilities.minImageCount, - .imageFormat = window->swapchain_image_format, - .imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, - .imageExtent = surface_capabilities.currentExtent, - .imageArrayLayers = 1, - .imageUsage = swapchain_image_usage_flags, - .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, - .queueFamilyIndexCount = array_length(queue_family_indices), - .pQueueFamilyIndices = queue_family_indices, - .preTransform = surface_capabilities.currentTransform, - .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, - .presentMode = preferred_present_mode, - .clipped = 0, - .oldSwapchain = window->swapchain, - }; - - vkok(vkCreateSwapchainKHR(renderer->device, &swapchain_create_info, renderer->allocator, &window->swapchain)); - - assert(window->swapchain != old_swapchain); - - if (old_swapchain) - { - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - vkDestroyImageView(renderer->device, old_swapchain_image_views[i], renderer->allocator); - } - - vkDestroySwapchainKHR(renderer->device, old_swapchain, renderer->allocator); - - destroy_image(renderer, window->render_image); - } - - { - vkok(vkGetSwapchainImagesKHR(renderer->device, window->swapchain, &window->swapchain_image_count, 0)); - - if (window->swapchain_image_count == 0) - { - failed_execution(); - } - - if (window->swapchain_image_count > array_length(window->swapchain_images)) - { - failed_execution(); - } - - vkok(vkGetSwapchainImagesKHR(renderer->device, window->swapchain, &window->swapchain_image_count, window->swapchain_images)); - - // VkImageViewUsageCreateInfo image_view_usage_create_info = { - // .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, - // .pNext = 0, - // .usage = swapchain_create_info.imageUsage, - // }; - - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - VkImageViewCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - // .pNext = &image_view_usage_create_info, - .flags = 0, - .image = window->swapchain_images[i], - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = swapchain_create_info.imageFormat, - .components = { - .r = VK_COMPONENT_SWIZZLE_IDENTITY, - .g = VK_COMPONENT_SWIZZLE_IDENTITY, - .b = VK_COMPONENT_SWIZZLE_IDENTITY, - .a = VK_COMPONENT_SWIZZLE_IDENTITY, - }, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }; - - vkok(vkCreateImageView(renderer->device, &create_info, renderer->allocator, &window->swapchain_image_views[i])); - } - } - - window->render_image = vk_image_create(renderer->device, renderer->allocator, renderer->memory_properties, (VulkanImageCreate) { - .width = surface_capabilities.currentExtent.width, - .height = surface_capabilities.currentExtent.height, - .mip_levels = 1, - .format = window->swapchain_image_format, - .usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, - }); -} - -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window) -{ - // TODO: truly allocate - RenderWindow* render_window = &renderer_window_memory; - -#if BB_WINDOWING_BACKEND_X11 - VkXcbSurfaceCreateInfoKHR create_info = { - .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .connection = xcb_connection_get(), - .window = xcb_window_from_windowing_instance(window), - }; - vkok(vkCreateXcbSurfaceKHR(instance, &create_info, renderer->allocator, &render_window->surface)); -#endif - -#if BB_WINDOWING_BACKEND_WIN32 - VkWin32SurfaceCreateInfoKHR create_info = { - .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .hinstance = windowing_connection.instance, - .hwnd = window->handle, - }; - vkok(vkCreateWin32SurfaceKHR(instance, &create_info, renderer->allocator, &render_window->surface)); -#endif - -#if BB_WINDOWING_BACKEND_COCOA - CAMetalLayer* layer = [CAMetalLayer layer]; - layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - layer.framebufferOnly = true; - layer.frame = window.frame; - window.contentView.layer = layer; - window.opaque = true; - window.backgroundColor = nil; - - VkMetalSurfaceCreateInfoEXT create_info = { - .sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT, - .pNext = 0, - .flags = 0, - .pLayer = [CAMetalLayer layer], - }; - vkCreateMetalSurfaceEXT(instance, &create_info, renderer->allocator, &render_window->surface); -#endif - - WindowingSize window_size = windowing_get_instance_framebuffer_size(window); - - swapchain_recreate(renderer, render_window); - - for (u64 frame_index = 0; frame_index < MAX_FRAME_COUNT; frame_index += 1) - { - for (u64 pipeline_index = 0; pipeline_index < BB_PIPELINE_COUNT; pipeline_index += 1) - { - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].vertex_buffer.gpu.type = BUFFER_TYPE_VERTEX; - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].index_buffer.gpu.type = BUFFER_TYPE_INDEX; - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].transient_buffer.type = BUFFER_TYPE_STAGING; - } - } - - for (u64 pipeline_index = 0; pipeline_index < BB_PIPELINE_COUNT; pipeline_index += 1) - { - let(pipeline_descriptor, &renderer->pipelines[pipeline_index]); - let(pipeline_instantiation, &render_window->pipeline_instantiations[pipeline_index]); - - u16 descriptor_type_counter[DESCRIPTOR_TYPE_COUNT] = {}; - - for (u64 descriptor_index = 0; descriptor_index < pipeline_descriptor->descriptor_set_count; descriptor_index += 1) - { - let(descriptor_set_layout_bindings, &pipeline_descriptor->descriptor_set_layout_bindings[descriptor_index]); - - for (u64 binding_index = 0; binding_index < descriptor_set_layout_bindings->count; binding_index += 1) - { - let(binding_descriptor, &descriptor_set_layout_bindings->buffer[binding_index]); - let(descriptor_type, descriptor_type_from_vulkan(binding_descriptor->descriptorType)); - let(counter_ptr, &descriptor_type_counter[descriptor_type]); - let(old_counter, *counter_ptr); - *counter_ptr = old_counter + binding_descriptor->descriptorCount; - } - } - - VkDescriptorPoolSize pool_sizes[DESCRIPTOR_TYPE_COUNT]; - u32 pool_size_count = 0; - - for (DescriptorType i = 0; i < DESCRIPTOR_TYPE_COUNT; i += 1) - { - let(count, descriptor_type_counter[i]); - if (count) - { - let(pool_size, &pool_sizes[pool_size_count]); - pool_size_count += 1; - - *pool_size = (VkDescriptorPoolSize) { - .type = vulkan_descriptor_type(i), - .descriptorCount = count, - }; - } - } - - VkDescriptorPoolCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .pNext = 0, - .flags = 0, - .maxSets = pipeline_descriptor->descriptor_set_count, - .poolSizeCount = pool_size_count, - .pPoolSizes = pool_sizes, - }; - - VkDescriptorPool descriptor_pool; - vkok(vkCreateDescriptorPool(renderer->device, &create_info, renderer->allocator, &descriptor_pool)); - - VkDescriptorSetAllocateInfo allocate_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, - .pNext = 0, - .descriptorPool = descriptor_pool, - .descriptorSetCount = pipeline_descriptor->descriptor_set_count, - .pSetLayouts = pipeline_descriptor->descriptor_set_layouts, - }; - - vkok(vkAllocateDescriptorSets(renderer->device, &allocate_info, pipeline_instantiation->descriptor_sets)); - } - - for (u32 i = 0; i < MAX_FRAME_COUNT; i += 1) - { - VkCommandPoolCreateInfo command_pool_create_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, - .queueFamilyIndex = renderer->graphics_queue_family_index, - }; - - VkFenceCreateInfo fence_create_info = { - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .flags = VK_FENCE_CREATE_SIGNALED_BIT, - }; - - VkSemaphoreCreateInfo semaphore_create_info = { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, - .flags = 0, - }; - - WindowFrame* frame = &render_window->frames[i]; - vkok(vkCreateCommandPool(renderer->device, &command_pool_create_info, renderer->allocator, &frame->command_pool)); - - VkCommandBufferAllocateInfo command_buffer_allocate_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = frame->command_pool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1, - }; - - vkok(vkAllocateCommandBuffers(renderer->device, &command_buffer_allocate_info, &frame->command_buffer)); - vkok(vkCreateFence(renderer->device, &fence_create_info, renderer->allocator, &frame->render_fence)); - vkok(vkCreateSemaphore(renderer->device, &semaphore_create_info, renderer->allocator, &frame->render_semaphore)); - vkok(vkCreateSemaphore(renderer->device, &semaphore_create_info, renderer->allocator, &frame->swapchain_semaphore)); - frame->bound_pipeline = BB_PIPELINE_COUNT; - } - - return render_window; -} - -fn WindowFrame* window_frame(RenderWindow* window) -{ - return &window->frames[window->frame_index % MAX_FRAME_COUNT]; -} - -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window) -{ - let(frame, window_frame(window)); - let(timeout, ~(u64)0); - - u32 fence_count = 1; - VkBool32 wait_all = 1; - vkok(vkWaitForFences(renderer->device, fence_count, &frame->render_fence, wait_all, timeout)); - VkFence image_fence = 0; - VkResult next_image_result = vkAcquireNextImageKHR(renderer->device, window->swapchain, timeout, frame->swapchain_semaphore, image_fence, &window->swapchain_image_index); - if (next_image_result == VK_ERROR_OUT_OF_DATE_KHR) - { - swapchain_recreate(renderer, window); - } - else if (next_image_result != VK_SUCCESS && next_image_result != VK_SUBOPTIMAL_KHR) - { - vkok(next_image_result); - } - - vkok(vkResetFences(renderer->device, fence_count, &frame->render_fence)); - - VkCommandBufferResetFlags reset_flags = 0; - vkok(vkResetCommandBuffer(frame->command_buffer, reset_flags)); - - // Reset frame data - for (u32 i = 0; i < array_length(window->pipeline_instantiations); i += 1) - { - let(pipeline_instantiation, &frame->pipeline_instantiations[i]); - pipeline_instantiation->vertex_buffer.cpu.length = 0; - pipeline_instantiation->vertex_buffer.count = 0; - pipeline_instantiation->index_buffer.cpu.length = 0; - } -} - -fn void buffer_destroy(Renderer* renderer, VulkanBuffer buffer) -{ - if (buffer.handle) - { - vkDestroyBuffer(renderer->device, buffer.handle, renderer->allocator); - } - - if (buffer.memory.handle) - { - if (buffer.type == BUFFER_TYPE_STAGING) - { - vkUnmapMemory(renderer->device, buffer.memory.handle); - } - - vkFreeMemory(renderer->device, buffer.memory.handle, renderer->allocator); - } -} - -fn void buffer_ensure_capacity(Renderer* renderer, VulkanBuffer* buffer, u64 needed_size) -{ - if (unlikely(needed_size > buffer->memory.size)) - { - buffer_destroy(renderer, *buffer); - *buffer = buffer_create(renderer, needed_size, buffer->type); - } -} - -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window) -{ - let(frame, window_frame(window)); - - VkCommandBufferBeginInfo command_buffer_begin_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, - }; - vkok(vkBeginCommandBuffer(frame->command_buffer, &command_buffer_begin_info)); - - for (u32 i = 0; i < BB_PIPELINE_COUNT; i += 1) - { - let(frame_pipeline_instantiation, &frame->pipeline_instantiations[i]); - - if (likely(frame_pipeline_instantiation->vertex_buffer.cpu.length)) - { - let(new_vertex_buffer_size, frame_pipeline_instantiation->vertex_buffer.cpu.length * sizeof(*frame_pipeline_instantiation->vertex_buffer.cpu.pointer)); - let(new_index_buffer_size, frame_pipeline_instantiation->index_buffer.cpu.length * sizeof(*frame_pipeline_instantiation->index_buffer.cpu.pointer)); - let(new_transient_buffer_size, new_vertex_buffer_size + new_index_buffer_size); - - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->transient_buffer, new_transient_buffer_size); - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->vertex_buffer.gpu, new_vertex_buffer_size); - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->index_buffer.gpu, new_index_buffer_size); - - buffer_copy_to_host(frame_pipeline_instantiation->transient_buffer, (Slice(HostBufferCopy)) array_to_slice(((HostBufferCopy[]) { - (HostBufferCopy) { - .source = (String) { - .pointer = (u8*)frame_pipeline_instantiation->vertex_buffer.cpu.pointer, - .length = new_vertex_buffer_size, - }, - .destination_offset = 0, - }, - (HostBufferCopy) { - .source = (String) { - .pointer = (u8*)frame_pipeline_instantiation->index_buffer.cpu.pointer, - .length = new_index_buffer_size, - }, - .destination_offset = new_vertex_buffer_size, - }, - }))); - - buffer_copy_to_local_command(frame->command_buffer, (Slice(LocalBufferCopy)) array_to_slice(((LocalBufferCopy[]) { - { - .destination = frame_pipeline_instantiation->vertex_buffer.gpu, - .source = frame_pipeline_instantiation->transient_buffer, - .regions = array_to_slice(((LocalBufferCopyRegion[]) { - { - .source_offset = 0, - .destination_offset = 0, - .size = new_vertex_buffer_size, - }, - })), - }, - { - .destination = frame_pipeline_instantiation->index_buffer.gpu, - .source = frame_pipeline_instantiation->transient_buffer, - .regions = array_to_slice(((LocalBufferCopyRegion[]) { - { - .source_offset = new_vertex_buffer_size, - .destination_offset = 0, - .size = new_index_buffer_size, - }, - })), - }, - }))); - } - } - - vk_image_transition(frame->command_buffer, window->render_image.handle, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - - VkViewport viewports[] = { - { - .x = 0, - .y = 0, - .width = window->width, - .height = window->height, - .minDepth = 0.0f, - .maxDepth = 1.0f, - } - }; - - u32 first_viewport = 0; - vkCmdSetViewport(frame->command_buffer, first_viewport, array_length(viewports), viewports); - - VkRect2D scissors[] = { - { - .offset = { - .x = 0, - .y = 0, - }, - .extent = { - .width = window->width, - .height = window->height, - }, - } - }; - - u32 first_scissor = 0; - vkCmdSetScissor(frame->command_buffer, first_scissor, array_length(scissors), scissors); - - VkRenderingAttachmentInfo color_attachments[] = { - { - .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, - .imageView = window->render_image.view, - .imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, - .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - .clearValue = { .color = { .float32 = { 255.0f, 0.0f, 255.0f, 1.0f } } }, - }, - }; - - VkRenderingInfo rendering_info = { - .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, - .renderArea = { - .extent = { - .width = window->width, - .height = window->height, - }, - }, - .layerCount = 1, - .colorAttachmentCount = array_length(color_attachments), - .pColorAttachments = color_attachments, - }; - - vkCmdBeginRendering(frame->command_buffer, &rendering_info); - - for (u32 i = 0; i < BB_PIPELINE_COUNT; i += 1) - { - let(pipeline, &renderer->pipelines[i]); - let(pipeline_instantiation, &window->pipeline_instantiations[i]); - let(frame_pipeline_instantiation, &frame->pipeline_instantiations[i]); - - if (likely(frame_pipeline_instantiation->vertex_buffer.cpu.length)) - { - // Bind pipeline and descriptor sets - { - vkCmdBindPipeline(frame->command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->handle); - // print("Binding pipeline: 0x{u64}\n", pipeline->handle); - u32 dynamic_offset_count = 0; - u32* dynamic_offsets = 0; - u32 first_set = 0; - vkCmdBindDescriptorSets(frame->command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->layout, first_set, pipeline->descriptor_set_count, pipeline_instantiation->descriptor_sets, dynamic_offset_count, dynamic_offsets); - // print("Binding descriptor sets: 0x{u64}\n", pipeline_instantiation->descriptor_sets); - frame->bound_pipeline = i; - } - - // Bind index buffer - { - vkCmdBindIndexBuffer(frame->command_buffer, frame_pipeline_instantiation->index_buffer.gpu.handle, 0, VK_INDEX_TYPE_UINT32); - frame->index_buffer = frame_pipeline_instantiation->index_buffer.gpu.handle; - // print("Binding descriptor sets: 0x{u64}\n", frame->index_buffer); - } - - // Send vertex buffer and screen dimensions to the shader - GPUDrawPushConstants push_constants = { - .vertex_buffer = frame_pipeline_instantiation->vertex_buffer.gpu.address, - .width = window->width, - .height = window->height, - }; - - { - let(push_constant_range, pipeline->push_constant_ranges[0]); - vkCmdPushConstants(frame->command_buffer, pipeline->layout, push_constant_range.stageFlags, push_constant_range.offset, push_constant_range.size, &push_constants); - frame->push_constants = push_constants; - } - - vkCmdDrawIndexed(frame->command_buffer, frame_pipeline_instantiation->index_buffer.cpu.length, 1, 0, 0, 0); - } - } - - vkCmdEndRendering(frame->command_buffer); - - vk_image_transition(frame->command_buffer, window->render_image.handle, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - - VkImage swapchain_image = window->swapchain_images[window->swapchain_image_index]; - vk_image_transition(frame->command_buffer, swapchain_image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - vk_image_copy(frame->command_buffer, (VulkanCopyImageArgs) { - .source = { - .handle = window->render_image.handle, - .extent = { - .width = window->width, - .height = window->height, - }, - }, - .destination = { - .handle = swapchain_image, - .extent = { - .width = window->width, - .height = window->height, - }, - }, - }); - - vk_image_transition(frame->command_buffer, swapchain_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - - vkok(vkEndCommandBuffer(frame->command_buffer)); - - VkCommandBufferSubmitInfo command_buffer_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, - .commandBuffer = frame->command_buffer, - .deviceMask = 0, - }, - }; - - VkSemaphoreSubmitInfo wait_semaphore_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, - .semaphore = frame->swapchain_semaphore, - .stageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, - .deviceIndex = 0, - .value = 1, - }, - }; - - VkSemaphoreSubmitInfo signal_semaphore_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, - .semaphore = frame->render_semaphore, - .stageMask = VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT, - .deviceIndex = 0, - .value = 1, - }, - }; - - VkSubmitInfo2 submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, - .flags = 0, - .waitSemaphoreInfoCount = array_length(wait_semaphore_submit_info), - .pWaitSemaphoreInfos = wait_semaphore_submit_info, - .signalSemaphoreInfoCount = array_length(signal_semaphore_submit_info), - .pSignalSemaphoreInfos = signal_semaphore_submit_info, - .commandBufferInfoCount = array_length(command_buffer_submit_info), - .pCommandBufferInfos = command_buffer_submit_info, - }, - }; - - vkok(vkQueueSubmit2(renderer->graphics_queue, array_length(submit_info), submit_info, frame->render_fence)); - - const VkSwapchainKHR swapchains[] = { window->swapchain }; - const u32 swapchain_image_indices[] = { window->swapchain_image_index }; - const VkSemaphore wait_semaphores[] = { frame->render_semaphore }; - VkResult results[array_length(swapchains)]; - - VkPresentInfoKHR present_info = { - .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, - .waitSemaphoreCount = array_length(wait_semaphores), - .pWaitSemaphores = wait_semaphores, - .swapchainCount = array_length(swapchains), - .pSwapchains = swapchains, - .pImageIndices = swapchain_image_indices, - .pResults = results, - }; - - VkResult present_result = vkQueuePresentKHR(renderer->graphics_queue, &present_info); - - if (present_result == VK_SUCCESS) - { - for (u32 i = 0; i < array_length(results); i += 1) - { - vkok(results[i]); - } - } - else if (present_result == VK_ERROR_OUT_OF_DATE_KHR || present_result == VK_SUBOPTIMAL_KHR) - { - swapchain_recreate(renderer, window); - } - else - { - vkok(present_result); - } - - window->frame_index += 1; -} - -fn VkFormat vk_texture_format(TextureFormat format) -{ - VkFormat result; - switch (format) - { - case TEXTURE_FORMAT_R8_UNORM: - result = VK_FORMAT_R8_UNORM; - break; - case TEXTURE_FORMAT_R8G8B8A8_SRGB: - result = VK_FORMAT_R8G8B8A8_SRGB; - break; - } - - return result; -} - -fn u32 format_channel_count(TextureFormat format) -{ - switch (format) - { - case TEXTURE_FORMAT_R8_UNORM: - return 1; - case TEXTURE_FORMAT_R8G8B8A8_SRGB: - return 4; - } - - unreachable(); -} - -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory) -{ - assert(texture_memory.depth == 1); - - let(texture_index, texture_count); - texture_count += 1; - let(texture, &textures[texture_index]); - texture->image = vk_image_create(renderer->device, renderer->allocator, renderer->memory_properties, (VulkanImageCreate) { - .width = texture_memory.width, - .height = texture_memory.height, - .mip_levels = 1, - .format = vk_texture_format(texture_memory.format), - .usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, - }); - texture->sampler = renderer->sampler; - - let(image_size, (u64)texture_memory.depth * texture_memory.width * texture_memory.height * format_channel_count(texture_memory.format)); - VkBufferUsageFlags buffer_usage_flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - VkMemoryPropertyFlags buffer_memory_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - let(transfer_buffer, vk_buffer_create(renderer->device, renderer->allocator, renderer->memory_properties, image_size, buffer_usage_flags, buffer_memory_flags)); - memcpy((void*)transfer_buffer.address, texture_memory.pointer, image_size); - - immediate_start(renderer->immediate); - - vk_image_transition(renderer->immediate.command_buffer, texture->image.handle, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - VkBufferImageCopy copy_regions[] = { - { - .bufferOffset = 0, - .bufferRowLength = 0, - .bufferImageHeight = 0, - .imageSubresource = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .baseArrayLayer = 0, - .layerCount = 1, - }, - .imageOffset = { - .x = 0, - .y = 0, - .z = 0, - }, - .imageExtent = { - .width = texture_memory.width, - .height = texture_memory.height, - .depth = texture_memory.depth, - }, - } - }; - - vkCmdCopyBufferToImage(renderer->immediate.command_buffer, transfer_buffer.handle, texture->image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, array_length(copy_regions), copy_regions); - - vk_image_transition(renderer->immediate.command_buffer, texture->image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - immediate_end(renderer->immediate); - - return (TextureIndex) { .value = texture_index }; -} - -fn void window_draw_indexed(RenderWindow* window, u32 index_count, u32 instance_count, u32 first_index, s32 vertex_offset, u32 first_instance) -{ - let(frame, window_frame(window)); - vkCmdDrawIndexed(frame->command_buffer, index_count, instance_count, first_index, vertex_offset, first_instance); -} - -fn void window_texture_update_begin(RenderWindow* window, BBPipeline pipeline_index, u32 descriptor_count) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - assert(descriptor_count <= array_length(pipeline_instantiation->texture_descriptors)); - - pipeline_instantiation->descriptor_set_update = (VkWriteDescriptorSet) { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .pNext = 0, - .dstSet = pipeline_instantiation->descriptor_sets[0], - .dstBinding = 0, - .dstArrayElement = 0, - .descriptorCount = descriptor_count, - .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .pImageInfo = pipeline_instantiation->texture_descriptors, - .pBufferInfo = 0, - .pTexelBufferView = 0, - }; -} - -fn void window_rect_texture_update_begin(RenderWindow* window) -{ - window_texture_update_begin(window, BB_PIPELINE_RECT, RECT_TEXTURE_SLOT_COUNT); -} - -fn void window_queue_pipeline_texture_update(RenderWindow* window, BBPipeline pipeline_index, u32 resource_slot, TextureIndex texture_index) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - VkDescriptorImageInfo* descriptor_image = &pipeline_instantiation->texture_descriptors[resource_slot]; - VulkanTexture* texture = &textures[texture_index.value]; - *descriptor_image = (VkDescriptorImageInfo) { - .sampler = texture->sampler, - .imageView = texture->image.view, - .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // TODO: specify - }; -} - -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index) -{ - window_queue_pipeline_texture_update(window, BB_PIPELINE_RECT, slot, texture_index); -} - -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas) -{ - static_assert(RECT_TEXTURE_SLOT_MONOSPACE_FONT < RECT_TEXTURE_SLOT_PROPORTIONAL_FONT); - let(slot, RECT_TEXTURE_SLOT_MONOSPACE_FONT + type); - window_queue_rect_texture_update(window, slot, atlas.texture); - renderer->fonts[type] = atlas; -} - -fn void window_texture_update_end(Renderer* renderer, RenderWindow* window, BBPipeline pipeline_index) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - u32 descriptor_copy_count = 0; - VkCopyDescriptorSet* descriptor_copies = 0; - VkWriteDescriptorSet descriptor_set_writes[] = { - pipeline_instantiation->descriptor_set_update, - }; - vkUpdateDescriptorSets(renderer->device, array_length(descriptor_set_writes), descriptor_set_writes, descriptor_copy_count, descriptor_copies); -} - -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window) -{ - window_texture_update_end(renderer, window, BB_PIPELINE_RECT); -} - -fn u32 window_pipeline_add_vertices(RenderWindow* window, BBPipeline pipeline_index, String vertex_memory, u32 vertex_count) -{ - let(frame, window_frame(window)); - let(vertex_buffer, &frame->pipeline_instantiations[pipeline_index].vertex_buffer); - vb_copy_string(&vertex_buffer->cpu, vertex_memory); - let(vertex_offset, vertex_buffer->count); - vertex_buffer->count = vertex_offset + vertex_count; - return vertex_offset; -} - -fn void window_pipeline_add_indices(RenderWindow* window, BBPipeline pipeline_index, Slice(u32) indices) -{ - let(frame, window_frame(window)); - let(index_pointer, vb_add(&frame->pipeline_instantiations[pipeline_index].index_buffer.cpu, indices.length)); - memcpy(index_pointer, indices.pointer, indices.length * sizeof(*indices.pointer)); -} - -fn void window_render_rect(RenderWindow* window, RectDraw draw) -{ - let(p0, draw.vertex.p0); - let(uv0, draw.texture.p0); - if (draw.texture.p1.x != 0) - { - assert(draw.texture.p1.x - draw.texture.p0.x == draw.vertex.p1.x - draw.vertex.p0.x); - assert(draw.texture.p1.y - draw.texture.p0.y == draw.vertex.p1.y - draw.vertex.p0.y); - } - - let(corner_radius, 5.0f); - - let(extent, float2_sub(draw.vertex.p1, p0)); - RectVertex vertices[] = { - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - }; - - let(vertex_offset, window_pipeline_add_vertices(window, BB_PIPELINE_RECT, (String)array_to_bytes(vertices), array_length(vertices))); - - u32 indices[] = { - vertex_offset + 0, - vertex_offset + 1, - vertex_offset + 2, - vertex_offset + 1, - vertex_offset + 3, - vertex_offset + 2, - }; - - window_pipeline_add_indices(window, BB_PIPELINE_RECT, (Slice(u32))array_to_slice(indices)); -} - -// TODO: support gradient -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset) -{ - let(texture_atlas, &renderer->fonts[font_type]); - let(height, texture_atlas->ascent - texture_atlas->descent); - let(texture_index, texture_atlas->texture.value); - - for (u64 i = 0; i < string.length; i += 1) - { - let(ch, string.pointer[i]); - let(character, &texture_atlas->characters[ch]); - - let(uv_x, character->x); - let(uv_y, character->y); - - let(char_width, character->width); - let(char_height, character->height); - - let(pos_x, x_offset); - let(pos_y, y_offset + character->y_offset + height + texture_atlas->descent); // Offset of the height to render the character from the bottom (y + height) up (y) - vec2 p0 = { pos_x, pos_y }; - vec2 uv0 = { uv_x, uv_y }; - vec2 extent = { char_width, char_height }; - // print("P0: ({u32}, {u32}). P1: ({u32}, {u32})\n", (u32)p0.x, (u32)p0.y, (u32)p1.x, (u32)p1.y); - - RectVertex vertices[] = { - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .colors = { color, color, color, color }, - .texture_index = texture_index, - .softness = 1.0, - }, - }; - - let(vertex_offset, window_pipeline_add_vertices(window, BB_PIPELINE_RECT, (String)array_to_bytes(vertices), array_length(vertices))); - - u32 indices[] = { - vertex_offset + 0, - vertex_offset + 1, - vertex_offset + 2, - vertex_offset + 1, - vertex_offset + 3, - vertex_offset + 2, - }; - - window_pipeline_add_indices(window, BB_PIPELINE_RECT, (Slice(u32))array_to_slice(indices)); - - u32 kerning = (texture_atlas->kerning_tables + ch * 256)[string.pointer[i + 1]]; - x_offset += character->advance + kerning; - } -} diff --git a/bootstrap/std/vulkan_rendering.h b/bootstrap/std/vulkan_rendering.h deleted file mode 100644 index c5a6893..0000000 --- a/bootstrap/std/vulkan_rendering.h +++ /dev/null @@ -1,130 +0,0 @@ -#pragma once - -#if BB_WINDOWING_BACKEND_X11 -#define VK_USE_PLATFORM_XCB_KHR -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#define VK_USE_PLATFORM_METAL_EXT -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#define VK_USE_PLATFORM_WIN32_KHR -#endif - -// Code from Volk -#ifndef VK_NO_PROTOTYPES -#define VK_NO_PROTOTYPES -#endif - -#ifndef VULKAN_H_ -#if defined(VK_USE_PLATFORM_WIN32_KHR) -#include -#include - -/* When VK_USE_PLATFORM_WIN32_KHR is defined, instead of including vulkan.h directly, we include individual parts of the SDK -* This is necessary to avoid including which is very heavy - it takes 200ms to parse without WIN32_LEAN_AND_MEAN -* and 100ms to parse with it. vulkan_win32.h only needs a few symbols that are easy to redefine ourselves. -*/ -typedef unsigned long DWORD; -typedef const wchar_t* LPCWSTR; -typedef void* HANDLE; -typedef struct HINSTANCE__* HINSTANCE; -typedef struct HWND__* HWND; -typedef struct HMONITOR__* HMONITOR; -typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES; - -#include - -#ifdef VK_ENABLE_BETA_EXTENSIONS -#include -#endif -#else -#include -#endif -#endif - -#define vulkan_function_pointer(n) PFN_ ## n n -#define vulkan_global_function_pointer(n) global_variable vulkan_function_pointer(n) -// INSTANCE FUNCTIONS START -// These functions require no instance -vulkan_global_function_pointer(vkGetInstanceProcAddr); -vulkan_global_function_pointer(vkEnumerateInstanceVersion); -vulkan_global_function_pointer(vkEnumerateInstanceLayerProperties); -vulkan_global_function_pointer(vkCreateInstance); - -// These functions require an instance as a parameter -vulkan_global_function_pointer(vkGetDeviceProcAddr); -vulkan_global_function_pointer(vkCreateDebugUtilsMessengerEXT); -vulkan_global_function_pointer(vkEnumeratePhysicalDevices); -vulkan_global_function_pointer(vkGetPhysicalDeviceMemoryProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceQueueFamilyProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); -vulkan_global_function_pointer(vkGetPhysicalDeviceSurfacePresentModesKHR); -vulkan_global_function_pointer(vkCreateDevice); - -#if defined(VK_KHR_xcb_surface) -vulkan_global_function_pointer(vkCreateXcbSurfaceKHR); -#endif -#if defined(VK_KHR_win32_surface) -vulkan_global_function_pointer(vkCreateWin32SurfaceKHR); -#endif -#if defined(VK_EXT_metal_surface) -vulkan_global_function_pointer(vkCreateMetalSurfaceEXT); -#endif -// INSTANCE FUNCTIONS END - -vulkan_global_function_pointer(vkCreateSwapchainKHR); -vulkan_global_function_pointer(vkCmdCopyBuffer2); -vulkan_global_function_pointer(vkAllocateMemory); -vulkan_global_function_pointer(vkCreateBuffer); -vulkan_global_function_pointer(vkGetBufferMemoryRequirements); -vulkan_global_function_pointer(vkBindBufferMemory); -vulkan_global_function_pointer(vkMapMemory); -vulkan_global_function_pointer(vkGetBufferDeviceAddress); -vulkan_global_function_pointer(vkResetFences); -vulkan_global_function_pointer(vkResetCommandBuffer); -vulkan_global_function_pointer(vkBeginCommandBuffer); -vulkan_global_function_pointer(vkEndCommandBuffer); -vulkan_global_function_pointer(vkQueueSubmit2); -vulkan_global_function_pointer(vkWaitForFences); -vulkan_global_function_pointer(vkCreateImage); -vulkan_global_function_pointer(vkGetImageMemoryRequirements); -vulkan_global_function_pointer(vkBindImageMemory); -vulkan_global_function_pointer(vkCreateImageView); -vulkan_global_function_pointer(vkCmdPipelineBarrier2); -vulkan_global_function_pointer(vkCmdBlitImage2); -vulkan_global_function_pointer(vkGetDeviceQueue); -vulkan_global_function_pointer(vkCreateCommandPool); -vulkan_global_function_pointer(vkAllocateCommandBuffers); -vulkan_global_function_pointer(vkCreateFence); -vulkan_global_function_pointer(vkCreateSampler); -vulkan_global_function_pointer(vkCreateShaderModule); -vulkan_global_function_pointer(vkCreateDescriptorSetLayout); -vulkan_global_function_pointer(vkCreatePipelineLayout); -vulkan_global_function_pointer(vkCreateGraphicsPipelines); -vulkan_global_function_pointer(vkDestroyImageView); -vulkan_global_function_pointer(vkDestroyImage); -vulkan_global_function_pointer(vkFreeMemory); -vulkan_global_function_pointer(vkDeviceWaitIdle); -vulkan_global_function_pointer(vkDestroySwapchainKHR); -vulkan_global_function_pointer(vkGetSwapchainImagesKHR); -vulkan_global_function_pointer(vkCreateDescriptorPool); -vulkan_global_function_pointer(vkAllocateDescriptorSets); -vulkan_global_function_pointer(vkCreateSemaphore); -vulkan_global_function_pointer(vkAcquireNextImageKHR); -vulkan_global_function_pointer(vkDestroyBuffer); -vulkan_global_function_pointer(vkUnmapMemory); -vulkan_global_function_pointer(vkCmdSetViewport); -vulkan_global_function_pointer(vkCmdSetScissor); -vulkan_global_function_pointer(vkCmdBeginRendering); -vulkan_global_function_pointer(vkCmdBindPipeline); -vulkan_global_function_pointer(vkCmdBindDescriptorSets); -vulkan_global_function_pointer(vkCmdBindIndexBuffer); -vulkan_global_function_pointer(vkCmdPushConstants); -vulkan_global_function_pointer(vkCmdDrawIndexed); -vulkan_global_function_pointer(vkCmdEndRendering); -vulkan_global_function_pointer(vkQueuePresentKHR); -vulkan_global_function_pointer(vkCmdCopyBufferToImage); -vulkan_global_function_pointer(vkUpdateDescriptorSets); diff --git a/bootstrap/std/wayland_windowing.c b/bootstrap/std/wayland_windowing.c deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/wayland_windowing.c +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/wayland_windowing.h b/bootstrap/std/wayland_windowing.h deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/wayland_windowing.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/win32_windowing.c b/bootstrap/std/win32_windowing.c deleted file mode 100644 index a69b074..0000000 --- a/bootstrap/std/win32_windowing.c +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#pragma comment(lib, "user32") - -fn LRESULT window_callback(HWND window, UINT message, WPARAM w_parameter, LPARAM l_parameter) -{ - return DefWindowProcW(window, message, w_parameter, l_parameter); -} - -fn u8 windowing_initialize() -{ - HINSTANCE instance = GetModuleHandleW(0); - windowing_connection.instance = instance; - WNDCLASSEXW window_class = { - .cbSize = sizeof(window_class), - .lpfnWndProc = window_callback, - .hInstance = instance, - .lpszClassName = L"window", - .hCursor = LoadCursorA(0, IDC_ARROW), - .hIcon = LoadIcon(instance, MAKEINTRESOURCE(1)), - .style = CS_VREDRAW|CS_HREDRAW, - }; - RegisterClassExW(&window_class); - windowing_connection.window_class = window_class; - return 1; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate) -{ - // TODO: - WindowingInstance* window = &windowing_instances[0]; - window->handle = CreateWindowExW(WS_EX_APPWINDOW, L"window", L"Bloat Buster", WS_OVERLAPPEDWINDOW | WS_SIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, instantiate.size.width, instantiate.size.height, 0, 0, windowing_connection.instance, 0); - ShowWindow(window->handle, SW_SHOW); - return window; -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - RECT area; - GetClientRect(instance->handle, &area); - WindowingSize size = { - .width = area.right, - .height = area.bottom, - }; - - return size; -} - -fn void windowing_poll_events() -{ - MSG msg; - HWND handle; - - while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } -} diff --git a/bootstrap/std/win32_windowing.h b/bootstrap/std/win32_windowing.h deleted file mode 100644 index c85f335..0000000 --- a/bootstrap/std/win32_windowing.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -STRUCT(WindowingConnection) -{ - HINSTANCE instance; - WNDCLASSEXW window_class; -}; - -STRUCT(WindowingInstance) -{ - HWND handle; -}; - diff --git a/bootstrap/std/windowing.c b/bootstrap/std/windowing.c deleted file mode 100644 index 66ba161..0000000 --- a/bootstrap/std/windowing.c +++ /dev/null @@ -1,15 +0,0 @@ -#if BB_WINDOWING_BACKEND_X11 -#include -#endif - -#if BB_WINDOWING_BACKEND_WAYLAND -#include -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#include -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#include -#endif diff --git a/bootstrap/std/windowing.h b/bootstrap/std/windowing.h deleted file mode 100644 index c8ec249..0000000 --- a/bootstrap/std/windowing.h +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once - -#if BB_WINDOWING_BACKEND_X11 -#include -#endif - -#if BB_WINDOWING_BACKEND_WAYLAND -#include -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#include -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#include -#endif - -typedef enum WindowingEventType -{ - WINDOWING_EVENT_TYPE_MOUSE_BUTTON, - WINDOWING_EVENT_TYPE_CURSOR_POSITION, - WINDOWING_EVENT_TYPE_CURSOR_ENTER, - WINDOWING_EVENT_TYPE_WINDOW_FOCUS, - WINDOWING_EVENT_TYPE_WINDOW_POSITION, - WINDOWING_EVENT_TYPE_WINDOW_CLOSE, -} WindowingEventType; - -STRUCT(WindowingEventDescriptor) -{ - u32 index:24; - WindowingEventType type:8; -}; -static_assert(sizeof(WindowingEventDescriptor) == 4); -decl_vb(WindowingEventDescriptor); - -ENUM_START(WindowingEventMouseButtonKind, u8) -{ - WINDOWING_EVENT_MOUSE_BUTTON_1 = 0, - WINDOWING_EVENT_MOUSE_BUTTON_2 = 1, - WINDOWING_EVENT_MOUSE_BUTTON_3 = 2, - WINDOWING_EVENT_MOUSE_BUTTON_4 = 3, - WINDOWING_EVENT_MOUSE_BUTTON_5 = 4, - WINDOWING_EVENT_MOUSE_BUTTON_6 = 5, - WINDOWING_EVENT_MOUSE_BUTTON_7 = 6, - WINDOWING_EVENT_MOUSE_BUTTON_8 = 7, - WINDOWING_EVENT_MOUSE_LEFT = WINDOWING_EVENT_MOUSE_BUTTON_1, - WINDOWING_EVENT_MOUSE_RIGHT = WINDOWING_EVENT_MOUSE_BUTTON_2, - WINDOWING_EVENT_MOUSE_MIDDLE = WINDOWING_EVENT_MOUSE_BUTTON_3, -} -ENUM_END(WindowingEventMouseButtonKind); -#define WINDOWING_EVENT_MOUSE_BUTTON_COUNT (WINDOWING_EVENT_MOUSE_BUTTON_8 + 1) - -ENUM_START(WindowingEventMouseButtonAction, u8) -{ - WINDOWING_EVENT_MOUSE_RELAX = 0, - WINDOWING_EVENT_MOUSE_RELEASE = 1, - WINDOWING_EVENT_MOUSE_PRESS = 2, - WINDOWING_EVENT_MOUSE_REPEAT = 3, -} ENUM_END(WindowingEventMouseButtonAction); - -STRUCT(WindowingEventMouseButtonEvent) -{ - WindowingEventMouseButtonAction action:2; - u8 mod_shift:1; - u8 mod_control:1; - u8 mod_alt:1; - u8 mod_super:1; - u8 mod_caps_lock:1; - u8 mod_num_lock:1; -}; - -STRUCT(WindowingEventMouseButton) -{ - WindowingEventMouseButtonKind button:3; - u8 reserved:5; - WindowingEventMouseButtonEvent event; -}; -static_assert(sizeof(WindowingEventMouseButton) == sizeof(u16)); -decl_vb(WindowingEventMouseButton); - -#define WINDOWING_EVENT_BITSET_SIZE (64) -STRUCT(WindowingEventBitset) -{ - u64 value; -}; -decl_vb(WindowingEventBitset); - -STRUCT(WindowingEventCursorPosition) -{ - f64 x; - f64 y; -}; -decl_vb(WindowingEventCursorPosition); - -STRUCT(WindowingEventWindowPosition) -{ - u32 x; - u32 y; -}; -decl_vb(WindowingEventWindowPosition); - -STRUCT(WindowingEventQueue) -{ - VirtualBuffer(WindowingEventDescriptor) descriptors; - VirtualBuffer(WindowingEventMouseButton) mouse_buttons; - VirtualBuffer(WindowingEventBitset) window_focuses; - u32 window_focuses_count; - u32 cursor_enter_count; - VirtualBuffer(WindowingEventBitset) cursor_enters; - VirtualBuffer(WindowingEventCursorPosition) cursor_positions; - VirtualBuffer(WindowingEventWindowPosition) window_positions; -}; - -// typedef void OSFramebufferResize(OSWindow window, void* context, u32 width, u32 height); -// typedef void OSWindowResize(OSWindow window, void* context, u32 width, u32 height); -// typedef void OSWindowRefresh(OSWindow window, void* context); -// typedef void OSWindowPosition(OSWindow window, void* context, u32 x, u32 y); -// typedef void OSWindowClose(OSWindow window, void* context); -// typedef void OSWindowFocus(OSWindow window, void* context, u8 focused); -// typedef void OSWindowIconify(OSWindow window, void* context, u8 iconified); -// typedef void OSWindowMaximize(OSWindow window, void* context, u8 maximized); -// typedef void OSWindowContentScale(OSWindow window, void* context, f32 x, f32 y); -// typedef void OSWindowKey(OSWindow window, void* context, s32 key, s32 scancode, s32 action, s32 mods); -// typedef void OSWindowCharacter(OSWindow window, void* context, u32 codepoint); -// typedef void OSWindowCharacterModifier(OSWindow window, void* context, u32 codepoint, s32 mods); -// typedef void OSWindowMouseButton(OSWindow window, void* context, s32 button, s32 action, s32 mods); -// typedef void OSWindowCursorPosition(OSWindow window, void* context, f64 x, f64 y); -// typedef void OSWindowCursorEnter(OSWindow window, void* context, u8 entered); -// typedef void OSWindowScroll(OSWindow window, void* context, f64 x, f64 y); -// typedef void OSWindowDrop(OSWindow window, void* context, CStringSlice paths); - -// STRUCT(OSWindowingCallbacks) -// { -// // OSFramebufferResize* framebuffer_resize; -// // OSWindowResize* window_resize; -// // OSWindowRefresh* window_refresh; -// // OSWindowPosition* window_position; -// // OSWindowClose* window_close; -// // OSWindowFocus* window_focus; -// // OSWindowIconify* window_iconify; -// // OSWindowMaximize* window_maximize; -// // OSWindowContentScale* window_content_scale; -// // OSWindowKey* window_key; -// // OSWindowCharacter* window_character; -// // OSWindowCharacterModifier* window_character_modifier; -// // OSWindowMouseButton* window_mouse_button; -// // OSWindowCursorPosition* window_cursor_position; -// // OSWindowCursorEnter* window_cursor_enter; -// // OSWindowScroll* window_scroll; -// // OSWindowDrop* window_drop; -// }; - -// STRUCT(OSWindowCreate) -// { -// String name; -// OSWindowSize size; -// void* context; -// // OSWindowResize* resize_callback; -// // OSWindowRefresh* refresh_callback; -// }; - -STRUCT(WindowingCursorPosition) -{ - f64 x; - f64 y; -}; - -// NEW API START -STRUCT(WindowingOffset) -{ - u32 x; - u32 y; -}; - -STRUCT(WindowingSize) -{ - u32 width; - u32 height; -}; - -STRUCT(WindowingInstantiate) -{ - String name; - WindowingOffset offset; - WindowingSize size; - void* context; -}; - -fn u8 windowing_initialize(); -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate); -fn void windowing_poll_events(); -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* window); -// NEW API END - - -// fn OSWindow os_window_create(OSWindowCreate create); -// fn u8 os_window_should_close(OSWindow window); -// fn OSCursorPosition os_window_cursor_position_get(OSWindow window); -// -// fn u8 os_event_queue_get_window_focus(OSEventQueue* queue, u32 index); - -#ifndef __APPLE__ -global_variable WindowingConnection windowing_connection; -global_variable WindowingInstance windowing_instances[256]; -#endif diff --git a/bootstrap/std/x11_windowing.c b/bootstrap/std/x11_windowing.c deleted file mode 100644 index 85b2718..0000000 --- a/bootstrap/std/x11_windowing.c +++ /dev/null @@ -1,197 +0,0 @@ -#pragma once - -global_variable xcb_window_t windowing_instance_handles[256]; - -typedef enum WindowingEvent : u32 -{ - WINDOWING_EVENT_CLOSE, - WINDOWING_EVENT_COUNT, -} WindowingEvent; - -fn xcb_connection_t* xcb_connection_get() -{ - return windowing_connection.handle; -} - -fn xcb_window_t xcb_window_from_windowing_instance(WindowingInstance* instance) -{ - return instance->handle; -} - -fn void x11_intern_atoms(u32 atom_count, String* names, xcb_intern_atom_cookie_t* cookies, xcb_intern_atom_reply_t** replies) -{ - xcb_connection_t* connection = windowing_connection.handle; - - for (u64 i = 0; i < atom_count; i += 1) - { - String atom_name = names[i]; - - cookies[i] = xcb_intern_atom(connection, 0, atom_name.length, string_to_c(atom_name)); - } - - for (u64 i = 0; i < atom_count; i += 1) - { - replies[i] = xcb_intern_atom_reply(connection, cookies[i], 0); - } -} - -typedef enum X11Atom -{ - X11_ATOM_WM_PROTOCOLS, - X11_ATOM_WM_DELETE_WINDOW, - X11_ATOM_COUNT, -} X11Atom; - -global_variable String atom_names[X11_ATOM_COUNT] = { - strlit("WM_PROTOCOLS"), - strlit("WM_DELETE_WINDOW"), -}; -global_variable xcb_intern_atom_reply_t* atom_replies[array_length(atom_names)]; -global_variable xcb_intern_atom_cookie_t atom_cookies[array_length(atom_names)]; - -fn u8 windowing_initialize() -{ - u8 result = 0; - - windowing_connection.handle = xcb_connect(0, 0); - if (windowing_connection.handle) - { - if (!xcb_connection_has_error(windowing_connection.handle)) - { - windowing_connection.setup = xcb_get_setup(windowing_connection.handle); - - if (windowing_connection.setup) - { - x11_intern_atoms(array_length(atom_names), atom_names, atom_cookies, atom_replies); - - if (atom_replies[X11_ATOM_WM_PROTOCOLS]) - { - if (atom_replies[X11_ATOM_WM_DELETE_WINDOW]) - { - result = 1; - } - } - } - } - } - - return result; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate create) -{ - xcb_connection_t* connection = windowing_connection.handle; - xcb_screen_iterator_t iter = xcb_setup_roots_iterator(windowing_connection.setup); - xcb_screen_t *screen = iter.data; - - /* Create a window */ - xcb_window_t window_handle = xcb_generate_id(connection); - - u32 i; - for (i = 0; i < array_length(windowing_instance_handles); i += 1) - { - xcb_window_t* window_handle_pointer = &windowing_instance_handles[i]; - if (!*window_handle_pointer) - { - *window_handle_pointer = window_handle; - break; - } - } - - WindowingInstance* window = &windowing_instances[i]; - window->handle = window_handle; - - u32 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; - u32 value_list[] = { - screen->black_pixel, - XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY - }; - - xcb_create_window( - connection, /* Connection */ - XCB_COPY_FROM_PARENT, /* Depth (same as parent) */ - window_handle, /* Window ID */ - screen->root, /* Parent window (root) */ - create.offset.x, create.offset.y, /* X, Y */ - create.size.width, create.size.height, - 10, /* Border width */ - XCB_WINDOW_CLASS_INPUT_OUTPUT, /* Class */ - screen->root_visual, /* Visual */ - value_mask, /* Value mask */ - value_list /* Value list */ - ); - - xcb_change_property(connection, XCB_PROP_MODE_REPLACE, window_handle, atom_replies[X11_ATOM_WM_PROTOCOLS]->atom, XCB_ATOM_ATOM, 32, 1, &atom_replies[X11_ATOM_WM_DELETE_WINDOW]->atom); - - xcb_map_window(connection, window_handle); - - /* Flush requests to the X server */ - xcb_flush(connection); - - return window; -} - -fn void windowing_poll_events() -{ - xcb_generic_event_t *event; - xcb_connection_t* connection = windowing_connection.handle; - - while ((event = xcb_poll_for_event(connection))) - { - switch (event->response_type & ~0x80) { - case XCB_EXPOSE: - break; - case XCB_KEY_PRESS: - break; - case XCB_CLIENT_MESSAGE: - { - let_pointer_cast(xcb_client_message_event_t, client_message_event, event); - if (client_message_event->data.data32[0] == atom_replies[X11_ATOM_WM_DELETE_WINDOW]->atom) - { - xcb_window_t window_handle = client_message_event->window; - u32 i; - u32 window_handle_count = array_length(windowing_instance_handles); - for (i = 0; i < window_handle_count; i += 1) - { - xcb_window_t* window_handle_pointer = &windowing_instance_handles[i]; - if (window_handle == *window_handle_pointer) - { - windowing_instances[i].handle = 0; - *window_handle_pointer = 0; - // TODO: For now do this - os_exit(0); - break; - } - } - - if (i == window_handle_count) - { - os_exit(1); - } - } - else - { - trap(); - } - } break; - case XCB_DESTROY_NOTIFY: - trap(); - default: - break; - } - os_free(event); - } -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - WindowingSize result = {}; - xcb_connection_t* connection = windowing_connection.handle; - xcb_window_t window = instance->handle; - xcb_get_geometry_cookie_t cookie = xcb_get_geometry(connection, window); - xcb_get_geometry_reply_t* reply = xcb_get_geometry_reply(connection, cookie, 0); - result.width = reply->width; - result.height = reply->height; - os_free(reply); - return result; -} diff --git a/bootstrap/std/x11_windowing.h b/bootstrap/std/x11_windowing.h deleted file mode 100644 index 8369115..0000000 --- a/bootstrap/std/x11_windowing.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include - -STRUCT(WindowingConnection) -{ - xcb_connection_t* handle; - const xcb_setup_t* setup; -}; - -STRUCT(WindowingInstance) -{ - xcb_window_t handle; -}; - -fn xcb_connection_t* xcb_connection_get(); -fn xcb_window_t xcb_window_from_windowing_instance(WindowingInstance* instance); diff --git a/build.c b/build.c deleted file mode 100644 index 94bbd62..0000000 --- a/build.c +++ /dev/null @@ -1,2656 +0,0 @@ -#include -#include -#include - -#include -#include - -typedef enum C_Compiler -{ - C_COMPILER_GCC, - C_COMPILER_CLANG, - C_COMPILER_MSVC, - C_COMPILER_TCC, - C_COMPILER_COUNT, -} C_Compiler; - -global_variable char* c_compiler_names[] = { - "gcc", - "clang", - "cl", - "tcc", -}; - -typedef enum CompilerArgumentStyle -{ - COMPILER_ARGUMENT_STYLE_GNU, - COMPILER_ARGUMENT_STYLE_MSVC, - COMPILER_ARGUMENT_STYLE_COUNT, -} CompilerArgumentStyle; - -global_variable C_Compiler preferred_c_compiler = C_COMPILER_COUNT; -global_variable char** environment_pointer; - -typedef enum BuildType -{ - BUILD_TYPE_DEBUG, - BUILD_TYPE_RELEASE_SAFE, - BUILD_TYPE_RELEASE_FAST, - BUILD_TYPE_RELEASE_SMALL, - BUILD_TYPE_COUNT, -} BuildType; - -const char* build_type_strings[BUILD_TYPE_COUNT] = { - "debug", - "release_safe", - "release_fast", - "release_small", -}; - -char* optimization_switches[COMPILER_ARGUMENT_STYLE_COUNT][BUILD_TYPE_COUNT] = { - [COMPILER_ARGUMENT_STYLE_GNU] = { - [BUILD_TYPE_DEBUG] = "-O0", - [BUILD_TYPE_RELEASE_SAFE] = "-O2", - [BUILD_TYPE_RELEASE_FAST] = "-O3", - [BUILD_TYPE_RELEASE_SMALL] = "-Oz", - }, - [COMPILER_ARGUMENT_STYLE_MSVC] = { - [BUILD_TYPE_DEBUG] = "/Od", - [BUILD_TYPE_RELEASE_SAFE] = "/Ox", - [BUILD_TYPE_RELEASE_FAST] = "/O2", - [BUILD_TYPE_RELEASE_SMALL] = "/O1", - }, -}; - -STRUCT(CompileFlags) -{ - u64 colored_output:1; - u64 debug:1; - u64 error_limit:1; - u64 time_trace:1; -}; - -STRUCT(CompileOptions) -{ - String source_path; - String output_path; - String compiler_path; - RenderingBackend rendering_backend; - WindowingBackend windowing_backend; - BuildType build_type; - CompileFlags flags; -}; - -typedef enum CompilerSwitch -{ - COMPILER_SWITCH_DEBUG_INFO, - COMPILER_SWITCH_COUNT, -} CompilerSwitch; - - -global_variable char* compiler_switches[COMPILER_ARGUMENT_STYLE_COUNT][COMPILER_SWITCH_COUNT] = { - [COMPILER_ARGUMENT_STYLE_GNU] = { - [COMPILER_SWITCH_DEBUG_INFO] = "-g", - }, - [COMPILER_ARGUMENT_STYLE_MSVC] = { - [COMPILER_SWITCH_DEBUG_INFO] = "/Zi", - }, -}; - -fn C_Compiler c_compiler_from_path(String path) -{ - C_Compiler result = C_COMPILER_COUNT; - let(last_ch_slash, string_last_ch(path, '/')); - let(start, last_ch_slash); -#if _WIN32 - let(last_ch_backslash, string_last_ch(path, '\\')); - start = MIN(last_ch_slash, last_ch_backslash); -#endif - assert(start != STRING_NO_MATCH); // This ensures us the path is not just the executable name - let(compiler_name, s_get_slice(u8, path, start + 1, path.length)); - - for (C_Compiler i = 0; i < C_COMPILER_COUNT; i += 1) - { - let(candidate_compiler_name, cstr(c_compiler_names[i])); - if (string_contains(compiler_name, candidate_compiler_name)) - { - result = i; - break; - } - } - - return result; -} - -fn u8 c_compiler_is_supported_by_os(C_Compiler compiler) -{ -#ifdef __linux__ - switch (compiler) - { - case C_COMPILER_TCC: case C_COMPILER_GCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_MSVC: return 0; - case C_COMPILER_COUNT: unreachable(); - } -#elif __APPLE__ - switch (compiler) - { - case C_COMPILER_TCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_MSVC: case C_COMPILER_GCC: return 0; - case C_COMPILER_COUNT: unreachable(); - } -#elif _WIN32 - switch (compiler) - { - case C_COMPILER_MSVC: case C_COMPILER_TCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_GCC: return 0; - } -#endif - unreachable(); -} - -fn String c_compiler_to_string(C_Compiler c_compiler) -{ - switch (c_compiler) - { - case C_COMPILER_GCC: return strlit("gcc"); - case C_COMPILER_MSVC: return strlit("MSVC"); - case C_COMPILER_CLANG: return strlit("clang"); - case C_COMPILER_TCC: return strlit("tcc"); - default: unreachable(); - } -} - -// Returns the absolute path of a C compiler -fn String get_c_compiler_path(Arena* arena, BuildType build_type) -{ - String cc_path = {}; - String cc_env = os_get_environment_variable("CC"); - String path_env = os_get_environment_variable("PATH"); - String extension = {}; -#if _WIN32 - extension = strlit(".exe"); -#endif - if (cc_env.pointer) - { - cc_path = cc_env; - } - - if (!cc_path.pointer) - { -#if _WIN32 - cc_path = strlit("cl"); -#elif defined(__APPLE__) - cc_path = strlit("clang"); -#elif defined(__linux__) - cc_path = strlit("clang"); -#else -#error "Operating system not supported" -#endif - } - - let(no_path_sep, string_first_ch(cc_path, '/') == STRING_NO_MATCH); -#ifdef _WIN32 - no_path_sep = no_path_sep && string_first_ch(cc_path, '\\') == STRING_NO_MATCH; -#endif - if (no_path_sep) - { - cc_path = file_find_in_path(arena, cc_path, path_env, extension); - } - -#ifndef _WIN32 - if (cc_path.pointer) - { - u8 buffer[4096]; - let(realpath, os_realpath(cc_path, (String)array_to_slice(buffer))); - if (!s_equal(realpath, cc_path)) - { - cc_path.pointer = arena_allocate(arena, u8, realpath.length + 1); - cc_path.length = realpath.length; - memcpy(cc_path.pointer, realpath.pointer, realpath.length); - cc_path.pointer[cc_path.length] = 0; - } - } -#endif - -#if __APPLE__ - if (s_equal(cc_path, strlit("/usr/bin/cc"))) - { - cc_path = strlit("/usr/bin/clang"); - } -#endif - - if (preferred_c_compiler != C_COMPILER_COUNT && c_compiler_is_supported_by_os(preferred_c_compiler)) - { - String find_result = file_find_in_path(arena, c_compiler_to_string(preferred_c_compiler), path_env, extension); - if (find_result.pointer) - { - cc_path = find_result; - } - } - - if (!BB_CI) - { - if (build_type != BUILD_TYPE_DEBUG) - { - return strlit("/usr/lib/llvm18/bin/clang-18"); - } - } - - return cc_path; -} - -fn u8 c_compiler_supports_colored_output(C_Compiler compiler) -{ - // TODO: fix - switch (compiler) - { - case C_COMPILER_GCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_TCC: case C_COMPILER_MSVC: return 0; - default: unreachable(); - } -} - -fn char* c_compiler_get_error_limit_switch(C_Compiler compiler) -{ - // TODO: fix - switch (compiler) - { - case C_COMPILER_CLANG: return "-ferror-limit=1"; - case C_COMPILER_GCC: return "-fmax-errors=1"; - case C_COMPILER_MSVC: case C_COMPILER_TCC: return 0; - default: unreachable(); - } -} - -fn char* c_compiler_get_highest_c_standard_flag(C_Compiler compiler) -{ - switch (compiler) - { - case C_COMPILER_CLANG: case C_COMPILER_GCC: return "-std=gnu2x"; - case C_COMPILER_MSVC: return "/std:clatest"; - case C_COMPILER_TCC: return "-std=gnu2x"; // TODO: does it do anything in TCC? - default: unreachable(); - } -} - -fn RenderingBackend rendering_backend_parse_env(String env) -{ - unused(env); - todo(); -} - -fn RenderingBackend rendering_backend_pick() -{ - RenderingBackend rendering_backend = RENDERING_BACKEND_COUNT; -#if BB_CI - rendering_backend = RENDERING_BACKEND_NONE; -#else - char* env = getenv("BB_RENDERING_BACKEND"); - if (env) - { - rendering_backend = rendering_backend_parse_env(cstr(env)); - } - - if (!rendering_backend_is_valid(rendering_backend)) - { -#ifdef __linux__ - rendering_backend = RENDERING_BACKEND_VULKAN; -#elif defined(__APPLE__) - rendering_backend = RENDERING_BACKEND_METAL; -#elif _WIN32 - rendering_backend = RENDERING_BACKEND_VULKAN; -#endif - } -#endif - - return rendering_backend; -} - -fn WindowingBackend windowing_backend_parse_env(String env) -{ - unused(env); - todo(); -} - -fn WindowingBackend windowing_backend_pick() -{ - WindowingBackend windowing_backend = WINDOWING_BACKEND_COUNT; -#if BB_CI - windowing_backend = WINDOWING_BACKEND_NONE; -#else - // Only done for Linux because it is the only operating system in which two windowing backends officially coexist -#ifdef __linux__ - char* env = getenv("BB_WINDOWING_BACKEND"); - if (env) - { - windowing_backend = windowing_backend_parse_env(cstr(env)); - } -#endif - - if (!windowing_backend_is_valid(windowing_backend)) - { -#ifdef __linux__ - // Prefer X11 over Wayland because: - // 1) It works both on Wayland and on X11 desktops - // 2) It works with debugging tools like RenderDoc - windowing_backend = WINDOWING_BACKEND_X11; -#elif _WIN32 - windowing_backend = WINDOWING_BACKEND_WIN32; -#elif __APPLE__ - windowing_backend = WINDOWING_BACKEND_COCOA; -#endif - } -#endif - - return windowing_backend; -} - -fn u8 c_compiler_supports_time_trace(C_Compiler compiler) -{ - switch (compiler) - { - case C_COMPILER_CLANG: return 1; - default: return 0; - case C_COMPILER_COUNT: unreachable(); - } -} - -fn BuildType build_type_pick() -{ - String build_type_string = strlit(BB_BUILD_TYPE); - BuildType build_type; - - for (build_type = 0; build_type < BUILD_TYPE_COUNT; build_type += 1) - { - if (s_equal(build_type_string, cstr(build_type_strings[build_type]))) - { - break; - } - } - - return build_type; -} - -fn void compile_program(Arena* arena, CompileOptions options) -{ - if (!options.compiler_path.pointer) - { - char* cc_env = getenv("CC"); - if (options.flags.debug) - { - print("Could not find a valid compiler for CC: \"{cstr}\"\n", cc_env ? cc_env : ""); - print("PATH: {cstr}\n", getenv("PATH")); - } - - failed_execution(); - } - - if (options.flags.debug) - { - print("C compiler path: {s}\n", options.compiler_path); - } - - C_Compiler c_compiler = c_compiler_from_path(options.compiler_path); - if (c_compiler != C_COMPILER_COUNT) - { - String compiler_name = c_compiler_to_string(c_compiler); - if (options.flags.debug) - { - print("Identified compiler as {s}\n", compiler_name); - } - } - else - { - print("Unrecognized C compiler: {s}\n", options.compiler_path); - os_exit(1); - } - char* args[4096]; - u64 arg_i = 0; -#define add_arg(arg) args[arg_i++] = (arg) - add_arg(string_to_c(options.compiler_path)); - - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/nologo"); - } - - u8 llvm_mca = 0; - if (llvm_mca) - { - add_arg("-S"); - add_arg("-masm=intel"); - } - -#if __APPLE__ - add_arg("-x"); - add_arg("objective-c"); -#endif - - add_arg(string_to_c(options.source_path)); - - switch (c_compiler) - { - case C_COMPILER_MSVC: - { - String strings[] = { - strlit("/Fe"), - options.output_path, - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - - add_arg("/Fo" BUILD_DIR "\\"); - add_arg("/Fd" BUILD_DIR "\\"); - } break; - case C_COMPILER_GCC: - { - } break; - case C_COMPILER_CLANG: - { - // add_arg("-working-directory"); - // add_arg(BUILD_DIR); - // add_arg("-save-temps"); - } break; - default: break; - } - - if (c_compiler != C_COMPILER_MSVC) - { - add_arg("-o"); - add_arg(string_to_c(options.output_path)); - } - -#ifdef __linux__ - add_arg("-fuse-ld=mold"); -#endif - - add_arg("-Ibootstrap"); - add_arg("-Idependencies/stb"); - add_arg("-I" BUILD_DIR); // Include the build dir for generated files - - char* c_include_path = getenv("C_INCLUDE_PATH"); - if (c_include_path) - { - String c_include_path_string = cstr(c_include_path); - - u64 previous_i = 0; - for (u64 i = 0; i < c_include_path_string.length; i += 1) - { - u8 ch = c_include_path_string.pointer[i]; - if (ch == ':') - { - todo(); - } - } - - String strings[] = { - strlit("-I"), - s_get_slice(u8, c_include_path_string, previous_i, c_include_path_string.length), - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - } - - let(debug_info, options.build_type != BUILD_TYPE_RELEASE_SMALL && !llvm_mca); - if (debug_info) - { - add_arg(compiler_switches[c_compiler == C_COMPILER_MSVC][COMPILER_SWITCH_DEBUG_INFO]); - } - - if (c_compiler != C_COMPILER_TCC) - { - add_arg(optimization_switches[c_compiler == C_COMPILER_MSVC][options.build_type]); - } - - switch (options.build_type) - { - case BUILD_TYPE_COUNT: unreachable(); - case BUILD_TYPE_DEBUG: - case BUILD_TYPE_RELEASE_SAFE: - { - add_arg("-DBB_DEBUG=1"); - add_arg("-D_DEBUG=1"); - } break; - case BUILD_TYPE_RELEASE_FAST: - case BUILD_TYPE_RELEASE_SMALL: - { - add_arg("-DBB_DEBUG=0"); - add_arg("-DNDEBUG=1"); - if (c_compiler != C_COMPILER_MSVC) - { - add_arg("-fno-stack-protector"); - } - } break; - } - - if (BB_CI) - { - add_arg("-DBB_CI=1"); - } - else - { - add_arg("-DBB_CI=0"); - } - - // TODO: careful. If handing binaries built by CI to people, we need to be specially careful about this - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/arch:AVX512"); - } - else - { - add_arg("-march=native"); - } - - // Immutable options - switch (c_compiler) - { - case C_COMPILER_MSVC: - { - add_arg("/Wall"); -#if BB_ERROR_ON_WARNINGS - add_arg("/WX"); -#endif - add_arg("/wd4255"); - add_arg("/J"); - } break; - default: - { - add_arg("-pedantic"); - add_arg("-Wall"); - add_arg("-Wextra"); - add_arg("-Wpedantic"); - add_arg("-Wno-unused-function"); - add_arg("-Wno-nested-anon-types"); - add_arg("-Wno-keyword-macro"); - add_arg("-Wno-gnu-auto-type"); - add_arg("-Wno-gnu-binary-literal"); -#ifndef __APPLE__ - add_arg("-Wno-auto-decl-extensions"); -#endif - add_arg("-Wno-gnu-empty-initializer"); - add_arg("-Wno-fixed-enum-extension"); - add_arg("-Wno-overlength-strings"); - add_arg("-Wno-gnu-zero-variadic-macro-arguments"); -#if BB_ERROR_ON_WARNINGS - add_arg("-Werror"); -#endif - - add_arg("-fno-signed-char"); - add_arg("-fno-strict-aliasing"); - add_arg("-fwrapv"); - } break; - } - - if (options.flags.colored_output && c_compiler_supports_colored_output(c_compiler)) - { - add_arg("-fdiagnostics-color=auto"); - } - - if (options.flags.error_limit) - { - char* error_limit = c_compiler_get_error_limit_switch(c_compiler); - if (error_limit) - { - add_arg(error_limit); - } - } - - if (options.flags.time_trace && c_compiler_supports_time_trace(c_compiler)) - { - add_arg("-ftime-trace"); - } - - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/diagnostics:caret"); - } - else - { - add_arg("-fdiagnostics-show-option"); - } - - add_arg(c_compiler_get_highest_c_standard_flag(c_compiler)); - - switch (options.windowing_backend) - { - case WINDOWING_BACKEND_NONE: - { - add_arg("-DBB_WINDOWING_BACKEND_NONE=1"); - } break; - case WINDOWING_BACKEND_WIN32: - { - add_arg("-DBB_WINDOWING_BACKEND_WIN32=1"); - } break; - case WINDOWING_BACKEND_COCOA: - { - add_arg("-DBB_WINDOWING_BACKEND_COCOA=1"); - } break; - case WINDOWING_BACKEND_X11: - { - add_arg("-DBB_WINDOWING_BACKEND_X11=1"); - } break; - case WINDOWING_BACKEND_WAYLAND: - { - add_arg("-DBB_WINDOWING_BACKEND_WAYLAND=1"); - } break; - case WINDOWING_BACKEND_COUNT: unreachable(); - } - - switch (options.rendering_backend) - { - case RENDERING_BACKEND_NONE: - { - add_arg("-DBB_RENDERING_BACKEND_NONE=1"); - } break; - case RENDERING_BACKEND_METAL: - { - add_arg("-DBB_RENDERING_BACKEND_METAL=1"); - } break; - case RENDERING_BACKEND_DIRECTX12: - { - add_arg("-DBB_RENDERING_BACKEND_DIRECTX12=1"); - } break; - case RENDERING_BACKEND_VULKAN: - { - add_arg("-DBB_RENDERING_BACKEND_VULKAN=1"); -#if _WIN32 - char* vk_sdk_path = getenv("VK_SDK_PATH"); - if (vk_sdk_path) - { - if (c_compiler == C_COMPILER_MSVC) - { - String strings[] = { - strlit("-I"), - cstr(vk_sdk_path), - strlit("\\Include"), - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - } - else - { - todo(); - } - } - else - { - print("VK_SDK_PATH environment variable not found\n"); - } -#endif - } break; - case RENDERING_BACKEND_COUNT: unreachable(); - } - -#ifndef _WIN32 - add_arg("-lm"); - - String path_env = cstr(getenv("PATH")); - String llvm_config_path = executable_find_in_path(arena, strlit("llvm-config"), path_env); - u8 buffer[16*1024]; - u32 length = 0; - char* llvm_config_c = string_to_c(llvm_config_path); - { - char* arguments[] = { - llvm_config_c, - "--components", - 0, - }; - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = buffer, - .length = &length, - .capacity = sizeof(buffer), - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - .debug = options.flags.debug, - }; - RunCommandResult result = run_command(arena, (CStringSlice)array_to_slice(arguments), environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - } - - { - char* argv_buffer[4096]; - argv_buffer[0] = llvm_config_c; - argv_buffer[1] = "--libs"; - u32 local_arg_i = 2; - - String llvm_components = { .pointer = buffer, .length = length }; - u32 i = 0; - while (i < length) - { - String slice = s_get_slice(u8, llvm_components, i, llvm_components.length); - u64 space_index = string_first_ch(slice, ' '); - u8 there_is_space = space_index != STRING_NO_MATCH; - u64 argument_length = unlikely(there_is_space) ? space_index : slice.length; - - String argument_slice = s_get_slice(u8, slice, 0, argument_length - !there_is_space); - argv_buffer[local_arg_i] = string_to_c(arena_duplicate_string(arena, argument_slice)); - local_arg_i += 1; - - i += argument_length + there_is_space; - } - - argv_buffer[local_arg_i] = 0; - local_arg_i += 1; - - length = 0; - - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = buffer, - .length = &length, - .capacity = sizeof(buffer), - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - .debug = options.flags.debug, - }; - CStringSlice arguments = { .pointer = argv_buffer, .length = local_arg_i }; - RunCommandResult result = run_command(arena, arguments, environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - - i = 0; - - String llvm_libraries = { .pointer = buffer, .length = length }; - while (i < length) - { - String slice = s_get_slice(u8, llvm_libraries, i, llvm_libraries.length); - u64 space_index = string_first_ch(slice, ' '); - u8 there_is_space = space_index != STRING_NO_MATCH; - u64 argument_length = unlikely(there_is_space) ? space_index : slice.length; - - String argument_slice = s_get_slice(u8, slice, 0, argument_length - !there_is_space); - add_arg(string_to_c(arena_duplicate_string(arena, argument_slice))); - - i += argument_length + there_is_space; - } - } -#endif - - switch (options.windowing_backend) - { - case WINDOWING_BACKEND_NONE: - { - } break; - case WINDOWING_BACKEND_WIN32: - { - } break; - case WINDOWING_BACKEND_COCOA: - { - add_arg("-framework"); - add_arg("AppKit"); - } break; - case WINDOWING_BACKEND_X11: - { - add_arg("-lxcb"); - } break; - case WINDOWING_BACKEND_WAYLAND: - { - } break; - case WINDOWING_BACKEND_COUNT: unreachable(); - } - - switch (options.rendering_backend) - { - case RENDERING_BACKEND_NONE: - { - } break; - case RENDERING_BACKEND_METAL: - { - add_arg("-framework"); - add_arg("Metal"); - add_arg("-framework"); - add_arg("QuartzCore"); - } break; - case RENDERING_BACKEND_DIRECTX12: - { - } break; - case RENDERING_BACKEND_VULKAN: - { -#if __APPLE__ - add_arg("-framework"); - add_arg("QuartzCore"); -#endif - } break; - case RENDERING_BACKEND_COUNT: unreachable(); - } - - add_arg(0); - CStringSlice arguments = { .pointer = args, .length = arg_i }; - RunCommandOptions run_options = { - .debug = options.flags.debug, - }; - RunCommandResult result = run_command(arena, arguments, environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } -} - -STRUCT(Load) -{ - u64 mask; - u8 index; - u8 size; -}; -decl_vb(Load); -declare_slice(Load); - -STRUCT(Combine) -{ - Slice(Load) loads; - u64 size; -}; - -STRUCT(Merge) -{ - Load values[2]; - u8 is_valid[2]; -}; - -typedef enum ProgramId -{ - PROGRAM_MERGE, - PROGRAM_COMBINE, - PROGRAM_LOAD, -} ProgramId; - -STRUCT(Program) -{ - union - { - Combine combine; - Load load; - Merge merge; - }; - ProgramId id; -}; - -STRUCT(Lookup) -{ - Slice(s32) indices; - SliceP(u8) words; -}; - -declare_slice(SliceP(u8)); -declare_slice(SliceP(void)); - -fn u64 pext(u64 w, u64 m) -{ - u64 result = 0; - u64 bit = 1; - - while (w != 0) - { - if ((m & 1) == 1) - { - if ((w & 1) == 1) - { - result |= bit; - } - - bit <<= 1; - } - - w >>= 1; - m >>= 1; - } - - return result; -} - -fn void n_word_mask(SliceP(u8) words, u8* mask, u8 length) -{ - for (u8 i = 0; i < length; i += 1) - { - mask[i] = 0xff; - } - - for (u8 byte = 0; byte < length; byte += 1) - { - for (u8 bit = 0; bit < 8; bit += 1) - { - u8 old = mask[byte]; - mask[byte] &= ~(u8)(1 << bit); - - u8 map[16*16][16] = {}; - u32 map_item_count = 0; - u8 candidate[16] = {}; - - for (u64 word_index = 0; word_index < words.length; word_index += 1) - { - let(word, words.pointer[word_index]); - for (u8 mask_index = 0; mask_index < length; mask_index += 1) - { - candidate[mask_index] = word[mask_index] & mask[mask_index]; - } - - u8 map_index; - for (map_index = 0; map_index < map_item_count; map_index += 1) - { - if (memcmp(map[map_index], candidate, length) == 0) - { - break; - } - } - - if (map_index != map_item_count) - { - mask[byte] = old; - break; - } - - memcpy(map[map_item_count], candidate, length); - map_item_count += 1; - } - } - } -} - -fn u64 program_lookup_size(Program program) -{ - u64 n = 0; - - switch (program.id) - { - case PROGRAM_COMBINE: - { - for (u64 i = 0; i < program.combine.loads.length; i += 1) - { - n += __builtin_popcountll(program.combine.loads.pointer[i].mask); - } - } break; - case PROGRAM_LOAD: - { - n = __builtin_popcountll(program.load.mask); - } break; - case PROGRAM_MERGE: todo(); - } - - return n; -} - -fn u64 load_load(Load load, u8* word) -{ - u64 result; - - switch (load.size) - { - case 1: result = word[load.index]; break; - case 2: result = *(u16*)&word[load.index]; break; - case 4: result = *(u32*)&word[load.index]; break; - case 8: result = *(u64*)&word[load.index]; break; - default: unreachable(); - } - - return result; -} - -fn u64 program_evaluate(Program program, u8* word) -{ - u64 result; - - switch (program.id) - { - case PROGRAM_COMBINE: - { - u64 q = 0; - u64 m = 0; - u64 shift = 0; - - for (u64 i = 0; i < program.combine.loads.length; i += 1) - { - Load load = program.combine.loads.pointer[i]; - let(qi, load_load(load, word)); - let(mi, load.mask); - - q |= qi << shift; - m |= mi << shift; - - shift += 8 * load.size; - } - - result = pext(q, m); - } break; - case PROGRAM_LOAD: - { - let(q, load_load(program.load, word)); - result = pext(q, program.load.mask); - } break; - case PROGRAM_MERGE: todo(); - } - - return result; -} - -fn Slice(s32) pdep_lookup(Arena* arena, Program program, SliceP(u8) words) -{ - let(length, 1 << program_lookup_size(program)); - let(result, arena_allocate(arena, s32, length)); - for (u64 i = 0; i < length; i += 1) - { - result[i] = -1; - } - - for (u64 i = 0; i < words.length; i += 1) - { - let(value, program_evaluate(program, words.pointer[i])); - result[value] = i; - } - - return (Slice(s32)) { .pointer = result, .length = length }; -} - -fn u8 load_trim(Load in, Load* out) -{ - u8 result = 0; - Load l; - switch (in.size) - { - case 8: - { - todo(); - } break; - case 4: - { - if ((in.mask & 0xffff) == 0) - { - l = (Load) { - .index = in.index + 4, - .size = 4, - .mask = in.mask >> 32, - }; - } - } break; - case 2: - { - if ((in.mask & 0xff) == 0) - { - todo(); - } - } break; - } - - if (result) - { - *out = l; - } - - return result; -} - -fn u8 can_merge(Load* load, u8* is_valid) -{ - if (!is_valid[0] || !is_valid[1]) - { - return 0; - } - - if ((load[0].mask & load[1].mask) == 0) - { - return 1; - } - - return 0; -} - -fn u8 new_merge(Load* loads, u8* is_valid, Merge* out) -{ - u8 result = 0; - - if (can_merge(loads, is_valid)) - { - result = 1; - *out = (Merge) - { - .values = { loads[0], loads[1] }, - .is_valid = { is_valid[0], is_valid[1] }, - }; - } - - return result; -} - -fn Program compile_mask(u8* mask, u8 mask_length) -{ - Program result = {}; - VirtualBuffer(Load) loads = {}; - const u8 load_sizes[] = {8, 4, 2, 1}; - - while (1) - { - u32 active = 0; - for (u8 i = 0; i < mask_length; i += 1) - { - active += mask[i] != 0; - } - - if (active == 0) - { - break; - } - - if (active == 1) - { - for (u8 i = 0; i < mask_length; i += 1) - { - u8 mask_byte = mask[i]; - if (mask_byte != 0) - { - *vb_add(&loads, 1) = (Load) { - .index = i, - .size = 1, - .mask = mask_byte, - }; - break; - } - } - - break; - } - - for (u8 size_index = 0; size_index < array_length(load_sizes); size_index += 1) - { - u8 size = load_sizes[size_index]; - if (size > mask_length) - { - continue; - } - - u8 best_count = 0; - u8 best_index = 0; - - for (u8 i = 0; i < mask_length - size + 1; i += 1) - { - u8 k = 0; - for (u8 mask_i = 0; mask_i < size; mask_i += 1) - { - k += mask[mask_i + i] != 0; - } - - if (k > best_count) - { - best_count = k; - best_index = i; - } - } - - if (best_count > 0) - { - Load load = { - .index = best_index, - .size = size, - }; - - for (u8 i = 0; i < size; i += 1) - { - load.mask |= (u64)mask[best_index + i] << (i * 8); - } - - *vb_add(&loads, 1) = load; - - for (u8 i = 0; i < size; i += 1) - { - mask[best_index + i] = 0; - } - - break; - } - } - } - - if (loads.length == 1) - { - while (1) - { - Load l; - if (!load_trim(loads.pointer[0], &l)) - { - break; - } - - loads.pointer[0] = l; - } - - return (Program) { - .load = loads.pointer[0], - .id = PROGRAM_LOAD, - }; - } - else if (loads.length == 2) - { - let(first, loads.pointer[0]); - let(second, loads.pointer[1]); - - let(trimmed, first); - u8 trimmed_is_valid = 1; - Merge merge_memory; - Load load_memory; - Merge merge = {}; - u8 merge_is_valid = 0; - - while (trimmed_is_valid) - { - Load merge_loads[2] = { trimmed, second }; - u8 is_valid[2] = { 1, 1 }; - Merge merge_candidate = {}; - if (new_merge(merge_loads, is_valid, &merge_candidate)) - { - merge = merge_candidate; - } - - trimmed_is_valid = load_trim(trimmed, &load_memory); - if (trimmed_is_valid) - { - trimmed = load_memory; - } - } - - if (merge_is_valid) - { - todo(); - } - } - - u64 total = 0; - for (u64 i = 0; i < loads.length; i += 1) - { - total += loads.pointer[i].size; - } - - u64 size = total < 4 ? 4 : 8; - result = (Program) { - .combine = { - .loads = { .pointer = loads.pointer, .length = loads.length }, - .size = size, - }, - .id = PROGRAM_COMBINE, - }; - return result; -} - -typedef enum TypeKind -{ - TYPE_KIND_U16, -} TypeKind; - -STRUCT(PerfectHashArguments) -{ - VirtualBuffer(u8)* file_h; - VirtualBuffer(u8)* file_c; - Slice_SliceP_u8 words_by_length; - u8* mask; - Lookup* lookups; - Program* programs; - Arena* arena; - String kind; - void** values_by_length; - TypeKind value_type; -}; - -fn void vb_indent(VirtualBuffer(u8)* buffer, u32 indentation_level) -{ - if (likely(indentation_level > 0)) - { - vb_copy_byte_repeatedly(buffer, ' ', 4 * indentation_level); - } -} - -fn String type_from_size(u8 size) -{ - String type; - switch (size) - { - case 8: type = strlit("u64"); break; - case 4: type = strlit("u32"); break; - case 2: type = strlit("u16"); break; - case 1: type = strlit("u8"); break; - default: unreachable(); - } - - return type; -} - -fn void load_write(Load load, VirtualBuffer(u8)* buffer, u32 load_name_index, u32 indentation_level, u32 length) -{ - String load_type = type_from_size(load.size); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "{s} v{u32}_{u32};\n", load_type, load_name_index, length); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "memcpy(&v{u32}_{u32}, &string_pointer[{u32}], {u32});\n", load_name_index, length, load.index, load.size); -} - -fn void program_write(VirtualBuffer(u8)* buffer, Program program, u32 indentation_level, u32 length) -{ - switch (program.id) - { - case PROGRAM_LOAD: - { - // Write the load - Load load = program.load; - u32 load_name_index = 0; - - load_write(load, buffer, load_name_index, indentation_level, length); - - // Write result - vb_indent(buffer, indentation_level); - vb_format(buffer, "u64 index_{u32} = _pext_u64(v{u32}_{u32}, 0x{u64:x});\n", length, load_name_index, length, load.mask); - } break; - case PROGRAM_COMBINE: - { - Combine combine = program.combine; - String combine_type_string = type_from_size(combine.size); - vb_indent(buffer, indentation_level); - vb_format(buffer, "{s} v_{u32} = 0;\n", combine_type_string, length); - - u64 shift = 0; - u64 mask = 0; - - for (u64 i = 0; i < combine.loads.length; i += 1) - { - Load load = combine.loads.pointer[i]; - mask |= load.mask << shift; - - load_write(load, buffer, (u32)i, indentation_level, length); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "v_{u32} |= ({s})(v{u64}_{u32}) << {u64};\n", length, combine_type_string, i, length, shift); - - shift += 8 * load.size; - } - - // Write result - vb_indent(buffer, indentation_level); - vb_format(buffer, "u64 index_{u32} = _pext_u64(v_{u32}, 0x{u64:x});\n", length, length, mask); - } break; - case PROGRAM_MERGE: - { - todo(); - } break; - } - - // vb_indent(buffer, indentation_level); - // vb_format(buffer, "const char* word_{u32} = words_{u32}[index_{u32}];\n", length, length, length); - // vb_indent(buffer, indentation_level); - // vb_format(buffer, "let(value_{u32}, values_{u32}[index_{u32}]);\n", length, length, length); -} - -fn void perfect_hash_generate(PerfectHashArguments arguments) -{ - VirtualBuffer(u8)* h = arguments.file_h; - VirtualBuffer(u8)* c = arguments.file_c; - - String type_string; - switch (arguments.value_type) - { - case TYPE_KIND_U16: type_string = strlit("u16"); break; - } - - u64 word_character_count; - u64 value_count; - - { - u64 word_character_offset = 0; - u64 value_offset = 0; - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - n_word_mask(words, arguments.mask, length); - Program program = compile_mask(arguments.mask, length); - arguments.programs[length] = program; - arguments.lookups[length].indices = pdep_lookup(arguments.arena, program, words); - arguments.lookups[length].words = words; - value_offset += arguments.lookups[length].indices.length; - word_character_offset += arguments.lookups[length].indices.length * length; - } - - word_character_count = word_character_offset; - value_count = value_offset; - } - - u32 indentation_level = 0; - vb_indent(h, indentation_level); - vb_format(h, "global_variable const {s} {s}_value_lut[] = {\n", type_string, arguments.kind); - - indentation_level += 1; - - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - Lookup lookup = arguments.lookups[length]; - let(generic_values_by_length, arguments.values_by_length[length]); - - vb_indent(h, indentation_level); - vb_format(h, "// Values [{u64}]\n", length); - - if (words.length > 0) - { - for (u64 i = 0; i < lookup.indices.length; i += 1) - { - let(index, lookup.indices.pointer[i]); - vb_indent(h, indentation_level); - - if (index == -1) - { - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_copy_string(h, strlit("0xffff,\n")); - } break; - } - } - else - { - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - let(value, ((u16*)generic_values_by_length)[index]); - String word = { .pointer = words.pointer[index], .length = length }; - vb_format(h, "0x{u32:x,w=4}, // {s}\n", value, word); - } break; - } - } - } - } - else - { - vb_indent(h, indentation_level); - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_copy_string(h, strlit("0xffff,\n")); - } break; - } - } - } - - indentation_level -= 1; - - vb_indent(h, indentation_level); - vb_copy_string(h, strlit("};\n")); - - vb_indent(h, indentation_level); - vb_format(h, "static_assert(array_length({s}_value_lut) == {u64});\n", arguments.kind, value_count); - - assert(is_power_of_two_u64(arguments.words_by_length.length)); - u64 epi = 512 / arguments.words_by_length.length; - - String upper_names_by_batch_flag[] = { strlit("Single"), strlit("Batch") }; - String lower_names_by_batch_flag[] = { strlit("single"), strlit("batch") }; - - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_format(h, "STRUCT(PextLookup{s}Result_{s})\n{\n __m512i v[2];\n};\n", upper_names_by_batch_flag[1], arguments.kind); - } break; - } - - for (u8 is_batch = 0; is_batch < 2; is_batch += 1) - { - u64 signature_length; - u8 result_type_buffer[256]; - String result_type_string; - if (is_batch) - { - result_type_string = format_string((String)array_to_slice(result_type_buffer), "PextLookupBatchResult_{s}", arguments.kind); - } - else - { - result_type_string = type_string; - } - - if (is_batch) - { - signature_length = vb_format(h, "fn {s} pext_lookup_{s}_{s}(const u8* const restrict string_base, const u32* const restrict string_offsets, const u32* const restrict string_lengths)", result_type_string, arguments.kind, lower_names_by_batch_flag[is_batch], type_string); - } - else - { - signature_length = vb_format(h, "fn {s} pext_lookup_{s}_{s}(const u8* const restrict string_pointer, u8 string_length)", result_type_string, arguments.kind, lower_names_by_batch_flag[is_batch], type_string); - } - - vb_copy_string(c, (String) { h->pointer + h->length - signature_length, .length = signature_length, }); - - vb_copy_string(h, strlit(";\n")); - - vb_copy_string(c, strlit("\n{\n")); - u32 indentation_level = 1; - - vb_indent(c, indentation_level); - if (is_batch) - { - vb_format(c, "PextLookupBatchResult_{s} result = {};\n", arguments.kind); - } - - assert(is_power_of_two_u64(arguments.words_by_length.length)); - { - vb_indent(c, indentation_level); - vb_format(c, "__m512i lengths = _mm512_set_epi{u64}(", epi); - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - vb_format(c, "{u64}, ", length); - } - - c->length -= 2; - - vb_copy_string(c, strlit(");\n")); - - { - vb_indent(c, indentation_level); - assert(is_power_of_two_u64(arguments.words_by_length.length)); - vb_format(c, "__m512i raw_value_offsets = _mm512_set_epi{u64}(", epi); - let(value_offset, value_count); - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - value_offset -= arguments.lookups[length].indices.length; - vb_format(c, "{u64}, ", value_offset); - } - c->length -= 2; - vb_copy_string(c, strlit(");\n")); - } - -#if 0 - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("global_variable const char words[] = {\n")); - // - // indentation_level += 1; - // - // for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - // { - // Lookup lookup = arguments.lookups[length]; - // SliceP(u8) words = arguments.words_by_length.pointer[length]; - // - // vb_indent(c, indentation_level); - // vb_format(c, "// Words [{u64}]\n", length); - // - // if (words.length > 0) - // { - // for (u64 i = 0; i < lookup.indices.length; i += 1) - // { - // let(index, lookup.indices.pointer[i]); - // - // vb_indent(c, indentation_level); - // - // if (index == -1) - // { - // *vb_add(c, 1) = '\"'; - // for (u64 i = 0; i < length; i += 1) - // { - // vb_copy_string(c, strlit("\\x00")); - // } - // - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // else - // { - // String word = { .pointer = words.pointer[index], .length = length }; - // *vb_add(c, 1) = '\"'; - // vb_copy_string(c, word); - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // } - // } - // else - // { - // vb_indent(c, indentation_level); - // *vb_add(c, 1) = '\"'; - // for (u64 i = 0; i < length; i += 1) - // { - // vb_copy_string(c, strlit("\\x00")); - // } - // - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // } - // - // indentation_level -= 1; - // - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("};\n")); - // - // vb_indent(c, indentation_level); - // vb_format(c, "static_assert(array_length(words) == {u64} + 1);\n", word_character_count); -#endif - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("u64 error_mask = 0;\n")); - - if (is_batch) - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("for (u32 string_index = 0; string_index < 64; string_index += 1)\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("{\n")); - - indentation_level += 1; - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("const u8* const restrict string_pointer = string_base + string_offsets[string_index];\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("u32 string_length = string_lengths[string_index];\n")); - } - - vb_indent(c, indentation_level); - vb_format(c, "__mmask{u64} length_compare_mask = _mm512_cmpeq_epi{u64}_mask(_mm512_set1_epi{u64}(string_length), lengths);\n", arguments.words_by_length.length, epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__mmask64 length_mask = _cvtu64_mask64(_cvtmask16_u32(length_compare_mask) - 1);\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i word_offsets = _mm512_permutexvar_epi32(_mm512_setzero(), _mm512_maskz_compress_epi32(length_compare_mask, raw_word_offsets));\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i value_offsets = _mm512_permutexvar_epi{u64}(_mm512_setzero(), _mm512_maskz_compress_epi{u64}(length_compare_mask, raw_value_offsets));\n", epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i candidate_string_in_memory = _mm512_maskz_loadu_epi8(length_mask, &string_pointer[0]);\n")); - } - - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - - if (words.length != 0) - { - program_write(c, arguments.programs[length], indentation_level, length); - - *vb_add(c, 1) = '\n'; - } - } - - vb_indent(c, indentation_level); - assert(is_power_of_two_u64(arguments.words_by_length.length)); - vb_format(c, "__m512i raw_indices = _mm512_set_epi{u64}(", epi); - - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - if (words.length != 0) - { - vb_format(c, "index_{u64}, ", length); - } - else - { - vb_copy_string(c, strlit("0, ")); - } - } - - c->length -= 2; - vb_copy_string(c, strlit(");\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i indices = _mm512_permutexvar_epi{u64}(_mm512_setzero(), _mm512_maskz_compress_epi{u64}(length_compare_mask, raw_indices));\n", epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i word_indices = _mm512_add_epi32(word_offsets, indices);\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i value_indices = _mm512_add_epi{u64}(value_offsets, indices);\n", epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("let(word_index, _mm_extract_epi32(_mm512_extracti32x4_epi32(word_indices, 0), 0));\n")); - - vb_indent(c, indentation_level); - vb_format(c, "let(value_index, _mm_extract_epi{u64}(_mm512_extracti{u64}x{u64}_epi{u64}(value_indices, 0), 0));\n", epi, epi, (512 / 4) / epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i string_in_memory = _mm512_maskz_loadu_epi8(length_mask, &words[word_index]);\n")); - - vb_indent(c, indentation_level); - vb_format(c, "{s} value = {s}_value_lut[value_index];\n", type_string, arguments.kind); - - if (is_batch) - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("__mmask32 index_mask = _cvtu32_mask32(1 << string_index);\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("result.v[string_index > 31] = _mm512_mask_blend_epi16(index_mask, result.v[string_index > 31], _mm512_set1_epi16(value));\n")); - - indentation_level -= 1; - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("}\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("return result;\n")); - } - else - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("return value;\n")); - } - // vb_copy_string(c, strlit("u16 asd[32];\nif (string_index == 31) { _mm512_storeu_epi16(asd, result.v[0]); breakpoint(); }\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("out_values[value_index] = value;\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__mmask64 string_compare_mask = _mm512_cmpeq_epi8_mask(candidate_string_in_memory, string_in_memory);\n")); - // - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("error_mask |= (_cvtmask64_u64(_knot_mask64(string_compare_mask)) != 0) << string_index;\n")); - - - vb_copy_string(c, strlit("}\n")); - } -} - -STRUCT(x86_64_Register) -{ - String name; - u16 value; -}; - -typedef enum x86_64_RegisterClass : u8 -{ - REGISTER_CLASS_GPR, - REGISTER_CLASS_VECTOR, - REGISTER_CLASS_CONTROL, - REGISTER_CLASS_DEBUG, -} x86_64_RegisterClass; - -STRUCT(RegisterSpec) -{ - String name; - x86_64_RegisterClass class; - u8 raw_value; - u8 is_high:1; - u8 size; -}; - -fn x86_64_Register define_register(RegisterSpec spec) -{ - x86_64_Register reg = { - .name = spec.name, - .value = spec.raw_value, - }; - return reg; -} - -fn void metaprogram(Arena* arena) -{ - let(file, file_read(arena, strlit("bootstrap/bloat-buster/data/x86_mnemonic.dat"))); - String enum_prefix = strlit("MNEMONIC_x86_64_"); - String it = file; - VirtualBuffer(u8) generated_h = {}; - VirtualBuffer(u8) generated_c = {}; - - vb_copy_string(&generated_h, strlit("#pragma once\n\n")); - vb_copy_string(&generated_c, strlit("#pragma once\n\n")); - - vb_copy_string(&generated_h, strlit("#if defined(__x86_64__)\n")); - vb_copy_string(&generated_h, strlit("#include \n")); - vb_copy_string(&generated_h, strlit("#endif\n\n")); - - { - - STRUCT(BitsetComponent) - { - String name; - u64 bit_count; - }; - - STRUCT(ByteComponent) - { - String type_name; - String field_name; - u8 array_length; - u8 type_size; - u8 type_alignment; - u8 bit_count; - }; - - BitsetComponent bitset_components[] = { - { strlit("is_rm_register"), 1 }, - { strlit("is_reg_register"), 1 }, - { strlit("implicit_register"), 1 }, - { strlit("is_immediate"), 1 }, - { strlit("immediate_size"), 2 }, - { strlit("is_displacement"), 1 }, - { strlit("is_relative"), 1 }, - { strlit("displacement_size"), 1 }, - { strlit("rex_w"), 1 }, - { strlit("opcode_plus_register"), 1 }, - { strlit("opcode_extension"), 3 }, - { strlit("prefix_0f"), 1 }, - }; - - ByteComponent byte_components[] = { - // TODO: opcode, length -> 1 byte - { .type_name = strlit("u8"), .type_size = sizeof(u8), .type_alignment = alignof(u8), .field_name = strlit("opcode"), .array_length = 2, }, - }; - - u8 bit_offsets[array_length(bitset_components)]; - - u64 total_bit_count = 0; - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - bit_offsets[i] = total_bit_count; - total_bit_count += bitset_components[i].bit_count; - } - - u64 aligned_bit_count = next_power_of_two(total_bit_count); - if (aligned_bit_count < 8 || aligned_bit_count > 16) - { - os_exit(1); - } - - u64 alignment = aligned_bit_count / 8; - u64 bit_remainder = aligned_bit_count - total_bit_count; - - assert(aligned_bit_count % 8 == 0); - u64 total_size = aligned_bit_count / 8; - for (u64 i = 0; i < array_length(byte_components); i += 1) - { - alignment = MAX(byte_components[i].type_alignment, alignment); - total_size += byte_components[i].type_size * byte_components[i].array_length ? byte_components[i].array_length : 1; - } - - u64 aligned_total_size = next_power_of_two(align_forward_u64(total_size, alignment)); - u64 padding_bytes = aligned_total_size - total_size; - - vb_copy_string(&generated_h, strlit("STRUCT(EncodingInvariantData)\n{\n")); - - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - BitsetComponent component = bitset_components[i]; - vb_format(&generated_h, " u{u64} {s}:{u32};\n", aligned_bit_count, component.name, (u32)component.bit_count); - } - - if (bit_remainder) - { - vb_format(&generated_h, " u{u64} bit_reserved:{u64};\n", aligned_bit_count, bit_remainder); - } - - for (u64 i = 0; i < array_length(byte_components); i += 1) - { - ByteComponent component = byte_components[i]; - if (component.bit_count) - { - vb_format(&generated_h, " {s} {s}:{u32};\n", component.type_name, component.field_name, (u32)component.bit_count); - } - else if (component.array_length) - { - vb_format(&generated_h, " {s} {s}[{u32}];\n", component.type_name, component.field_name, (u32)component.array_length); - } - else - { - vb_format(&generated_h, " {s} {s};\n", component.type_name, component.field_name); - } - } - - if (padding_bytes) - { - vb_format(&generated_h, " u8 byte_reserved[{u64}];\n", padding_bytes); - } - - vb_copy_string(&generated_h, strlit("};\n\nstatic_assert(sizeof(EncodingInvariantData) <= sizeof(u64));\n\n")); - - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - vb_format(&generated_h, "#define {s}_bit_offset ({u64})\n", bitset_components[i].name, (u64)bit_offsets[i]); - } - - *vb_add(&generated_h, 1) = '\n'; - } - - vb_copy_string(&generated_h, strlit("typedef enum Mnemonic_x86_64\n{\n")); - VirtualBufferP(u8) mnemonic_names_by_length_buffer[16] = {}; - VirtualBuffer(u16) mnemonic_values_by_length_buffer[array_length(mnemonic_names_by_length_buffer)] = {}; - SliceP(u8) mnemonic_names_by_length[array_length(mnemonic_names_by_length_buffer)] = {}; - void* mnemonic_values_by_length[array_length(mnemonic_names_by_length_buffer)] = {}; - vb_copy_string(&generated_c, strlit("fn String mnemonic_x86_64_to_string(Mnemonic_x86_64 mnemonic)\n{\n switch (mnemonic)\n {\n")); - - u16 mnemonic_index = 0; - - while (it.length) - { - let(next_eol_index, string_first_ch(it, '\n')); - if (next_eol_index == STRING_NO_MATCH) - { - todo(); - } - - String mnemonic = { .pointer = it.pointer, .length = next_eol_index }; - *vb_add(&mnemonic_names_by_length_buffer[mnemonic.length], 1) = mnemonic.pointer; - *vb_add(&mnemonic_values_by_length_buffer[mnemonic.length], 1) = mnemonic_index; - - // Generated h - vb_copy_string(&generated_h, strlit(" ")); - vb_copy_string(&generated_h, enum_prefix); - vb_copy_string(&generated_h, mnemonic); - vb_format(&generated_h, " = 0x{u32:x,w=4},\n", mnemonic_index); - mnemonic_index += 1; - - // Generated c - vb_copy_string(&generated_c, strlit(" case ")); - vb_copy_string(&generated_c, enum_prefix); - vb_copy_string(&generated_c, mnemonic); - vb_copy_string(&generated_c, strlit(": return strlit(\"")); - vb_copy_string(&generated_c, mnemonic); - vb_copy_string(&generated_c, strlit("\");\n")); - - it = s_get_slice(u8, it, next_eol_index + 1, it.length); - } - - vb_copy_string(&generated_h, strlit("} Mnemonic_x86_64;\n")); - vb_format(&generated_h, "#define mnemonic_x86_64_count ({u32})\n", mnemonic_index); - - vb_copy_string(&generated_c, strlit(" }\n}\n")); - - for (u32 i = 0; i < array_length(mnemonic_names_by_length_buffer); i += 1) - { - mnemonic_names_by_length[i] = (SliceP(u8)) { .pointer = mnemonic_names_by_length_buffer[i].pointer, .length = mnemonic_names_by_length_buffer[i].length }; - mnemonic_values_by_length[i] = mnemonic_values_by_length_buffer[i].pointer; - } - - { - { - u8 mask[array_length(mnemonic_names_by_length)]; - Lookup lookups[array_length(mnemonic_names_by_length)]; - Program programs[array_length(mnemonic_names_by_length)]; - PerfectHashArguments perfect_hash = { - .file_h = &generated_h, - .file_c = &generated_c, - .words_by_length = array_to_slice(mnemonic_names_by_length), - .values_by_length = mnemonic_values_by_length, - .value_type = TYPE_KIND_U16, - .mask = mask, - .lookups = lookups, - .programs = programs, - .arena = arena, - .kind = strlit("mnemonic"), - }; - - perfect_hash_generate(perfect_hash); - } - - { -#define reg(n, v, c, ...) define_register((RegisterSpec) { .name = strlit(n), .raw_value = (v), .class = REGISTER_CLASS_ ## c, __VA_ARGS__ }) -#define regs(n, v, c, s, ...) define_register((RegisterSpec) { .name = strlit(n), .raw_value = (v), .class = (REGISTER_CLASS_ ## c), .size = (s), __VA_ARGS__ }) - x86_64_Register gpr_registers[] = { - regs("al", 0b000, GPR, 0), - regs("ah", 0b000, GPR, 1, .is_high = 1), - regs("ax", 0b000, GPR, 1), - regs("eax", 0b000, GPR, 2), - regs("rax", 0b000, GPR, 3), - - regs("cl", 0b0001, GPR, 0), - regs("ch", 0b0001, GPR, 1, .is_high = 1), - regs("cx", 0b0001, GPR, 1), - regs("ecx", 0b0001, GPR, 2), - regs("rcx", 0b0001, GPR, 3), - - regs("dl", 0b0010, GPR, 0), - regs("dh", 0b0010, GPR, 1, .is_high = 1), - regs("dx", 0b0010, GPR, 1), - regs("edx", 0b0010, GPR, 2), - regs("rdx", 0b0010, GPR, 3), - - regs("bl", 0b0011, GPR, 0), - regs("bh", 0b0011, GPR, 1, .is_high = 1), - regs("bx", 0b0011, GPR, 1), - regs("ebx", 0b0011, GPR, 2), - regs("rbx", 0b0011, GPR, 3), - - regs("spl", 0b0100, GPR, 0), - regs("sp", 0b0100, GPR, 1), - regs("esp", 0b0100, GPR, 2), - regs("rsp", 0b0100, GPR, 3), - - regs("bpl", 0b0101, GPR, 0), - regs("bp", 0b0101, GPR, 1), - regs("ebp", 0b0101, GPR, 2), - regs("rbp", 0b0101, GPR, 3), - - regs("sil", 0b0110, GPR, 0), - regs("si", 0b0110, GPR, 1), - regs("esi", 0b0110, GPR, 2), - regs("rsi", 0b0110, GPR, 3), - - regs("dil", 0b0111, GPR, 0), - regs("di", 0b0111, GPR, 1), - regs("edi", 0b0111, GPR, 2), - regs("rdi", 0b0111, GPR, 3), - - regs("r8l", 0b1000, GPR, 0), - regs("r8w", 0b1000, GPR, 1), - regs("r8d", 0b1000, GPR, 2), - regs("r8", 0b1000, GPR, 3), - - regs("r9l", 0b1001, GPR, 0), - regs("r9w", 0b1001, GPR, 1), - regs("r9d", 0b1001, GPR, 2), - regs("r9", 0b1001, GPR, 3), - - regs("r10l", 0b1010, GPR, 0), - regs("r10w", 0b1010, GPR, 1), - regs("r10d", 0b1010, GPR, 2), - regs("r10", 0b1010, GPR, 3), - - regs("r11l", 0b1011, GPR, 0), - regs("r11w", 0b1011, GPR, 1), - regs("r11d", 0b1011, GPR, 2), - regs("r11", 0b1011, GPR, 3), - - regs("r12l", 0b1100, GPR, 0), - regs("r12w", 0b1100, GPR, 1), - regs("r12d", 0b1100, GPR, 2), - regs("r12", 0b1100, GPR, 3), - - regs("r13l", 0b1101, GPR, 0), - regs("r13w", 0b1101, GPR, 1), - regs("r13d", 0b1101, GPR, 2), - regs("r13", 0b1101, GPR, 3), - - regs("r14l", 0b1110, GPR, 0), - regs("r14w", 0b1110, GPR, 1), - regs("r14d", 0b1110, GPR, 2), - regs("r14", 0b1110, GPR, 3), - - regs("r15l", 0b1111, GPR, 0), - regs("r15w", 0b1111, GPR, 1), - regs("r15d", 0b1111, GPR, 2), - regs("r15", 0b1111, GPR, 3), - }; - - VirtualBufferP(u8) register_names_by_length_buffer[8] = {}; - VirtualBuffer(u16) register_values_by_length_buffer[array_length(register_names_by_length_buffer)] = {}; - SliceP(u8) register_names_by_length[array_length(register_names_by_length_buffer)] = {}; - void* register_values_by_length[array_length(register_names_by_length_buffer)] = {}; - - vb_copy_string(&generated_h, strlit("typedef enum x86_64_Register : u16\n{\n")); - - for (u32 i = 0; i < array_length(gpr_registers); i += 1) - { - x86_64_Register reg = gpr_registers[i]; - *vb_add(®ister_names_by_length_buffer[reg.name.length], 1) = reg.name.pointer; - *vb_add(®ister_values_by_length_buffer[reg.name.length], 1) = reg.value; - vb_format(&generated_h, " REGISTER_X86_64_{s} = 0x{u32:x,w=4},\n", reg.name, reg.value); - } - - u8 vector_registers[32][3][5]; - - for (u8 i = 0; i < 32; i += 1) - { - for (u8 size = 0; size < 3; size += 1) - { - u8 decimal_digit_high = i / 10; - u8 decimal_digit_low = i % 10; - u8 decimal_digit_high_character = decimal_digit_high + '0'; - u8 decimal_digit_low_character = decimal_digit_low + '0'; - - vector_registers[i][size][0] = 'x' + size; - vector_registers[i][size][1] = 'm'; - vector_registers[i][size][2] = 'm'; - vector_registers[i][size][3] = decimal_digit_high ? decimal_digit_high_character : decimal_digit_low_character; - vector_registers[i][size][4] = decimal_digit_low_character; - RegisterSpec spec = { .name = { .pointer = vector_registers[i][size], .length = 4 + (decimal_digit_high != 0) }, .raw_value = i, .class = REGISTER_CLASS_VECTOR, .size = size, }; - let(reg, define_register(spec)); - *vb_add(®ister_names_by_length_buffer[reg.name.length], 1) = reg.name.pointer; - *vb_add(®ister_values_by_length_buffer[reg.name.length], 1) = reg.value; - vb_format(&generated_h, " REGISTER_X86_64_{s} = 0x{u32:x,w=4},\n", reg.name, reg.value); - } - } - - vb_copy_string(&generated_h, strlit("} x86_64_Register;\n")); - - for (u32 i = 0; i < array_length(register_names_by_length_buffer); i += 1) - { - register_names_by_length[i] = (SliceP(u8)) { .pointer = register_names_by_length_buffer[i].pointer, .length = register_names_by_length_buffer[i].length }; - register_values_by_length[i] = register_values_by_length_buffer[i].pointer; - } - - u8 mask[array_length(register_names_by_length)]; - Lookup lookups[array_length(register_names_by_length)]; - Program programs[array_length(register_names_by_length)]; - PerfectHashArguments perfect_hash = { - .file_h = &generated_h, - .file_c = &generated_c, - .words_by_length = array_to_slice(register_names_by_length), - .values_by_length = register_values_by_length, - .value_type = TYPE_KIND_U16, - .mask = mask, - .lookups = lookups, - .programs = programs, - .arena = arena, - .kind = strlit("register"), - }; - - perfect_hash_generate(perfect_hash); - } - } - - String generated_h_slice = { .pointer = generated_h.pointer, .length = generated_h.length }; - String generated_c_slice = { .pointer = generated_c.pointer, .length = generated_c.length }; - - { - FileWriteOptions options = { - .path = strlit(BUILD_DIR "/generated.h"), - .content = generated_h_slice, - }; - file_write(options); - } - - { - FileWriteOptions options = { - .path = strlit(BUILD_DIR "/generated.c"), - .content = generated_c_slice, - }; - file_write(options); - } -} - -STRUCT(Parser) -{ - u8* pointer; - u32 length; - u32 i; -}; - -fn String parse_mnemonic(Parser* parser) -{ - u32 start = parser->i; - u8* pointer = parser->pointer; - String result = { .pointer = pointer + start }; - - while (1) - { - u32 i = parser->i; - u8 ch = pointer[i]; - u8 ch_is_alphanumeric = is_alphanumeric(ch); - parser->i = i + ch_is_alphanumeric; - if (!ch_is_alphanumeric) - { - break; - } - } - - result.length = parser->i - start; - - return result; -} - -fn String parse_identifier(Parser* parser) -{ - u32 start = parser->i; - u8* pointer = parser->pointer; - String result = { .pointer = parser->pointer + parser->i }; - - while (1) - { - u32 i = parser->i; - u8 ch = pointer[i]; - u8 is_identifier_ch = is_alphanumeric(ch) | (ch == '_'); - parser->i = i + is_identifier_ch; - if (!is_identifier_ch) - { - break; - } - } - - result.length = parser->i - start; - - return result; -} - -fn u8 consume_character(Parser* parser, u8 expected_ch) -{ - u32 i = parser->i; - u8 ch = parser->pointer[i]; - let(is_expected_ch, unlikely((ch == expected_ch) & (i < parser->length))); - let(new_parser_i, i + is_expected_ch); - parser->i = new_parser_i; - return new_parser_i - i; -} - -fn void expect_character(Parser* parser, u8 expected_ch) -{ - if (!likely(consume_character(parser, expected_ch))) - { - print("Expected character failed!\n"); - os_exit(1); - } -} - - -fn u8 get_ch(Parser* parser) -{ - assert(parser->i < parser->length); - return parser->pointer[parser->i]; -} - -fn u8 expect_decimal_digit(Parser* parser) -{ - u32 i = parser->i; - assert(i < parser->length); - u8 ch = parser->pointer[i]; - u8 is_decimal_digit = (ch >= '0') & (ch <= '9'); - parser->i = i + is_decimal_digit; - if (likely(is_decimal_digit)) - { - return ch - '0'; - } - else - { - print("Expect integer digit failed!\n"); - os_exit(1); - } -} - -fn u8 consume_hex_byte(Parser* parser, u8* hex_byte) -{ - u32 i = parser->i; - assert(i < parser->length - 1); - u8* pointer = parser->pointer; - u8 high_ch = pointer[i]; - u8 low_ch = pointer[i + 1]; - u8 is_high_digit_hex = is_hex_digit(high_ch); - u8 is_low_digit_hex = is_hex_digit(low_ch); - u8 is_hex_byte = is_high_digit_hex & is_low_digit_hex; - parser->i = i + (2 * is_hex_byte); - u8 result = is_hex_byte; - if (likely(result)) - { - u8 high_int = hex_ch_to_int(high_ch); - u8 low_int = hex_ch_to_int(low_ch); - u8 byte = (high_int << 4) | low_int; - *hex_byte = byte; - } - - return result; -} - -fn u8 expect_hex_byte(Parser* parser) -{ - u8 result; - if (!consume_hex_byte(parser, &result)) - { - print("Expect hex byte failed!\n"); - os_exit(1); - } - - return result; -} - -// TODO: this might be a perf bottleneck -fn u8 consume_tab(Parser* parser) -{ - u8 space0 = consume_character(parser, ' '); - u8 space1 = consume_character(parser, ' '); - u8 space2 = consume_character(parser, ' '); - u8 space3 = consume_character(parser, ' '); - u8 result = (space0 + space1) + (space2 + space3); - return result == 4; -} - -typedef enum InstructionClass -{ - INSTRUCTION_CLASS_BASE_ARITHMETIC, - INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG, - INSTRUCTION_CLASS_BITTEST, - INSTRUCTION_CLASS_CMOV, - INSTRUCTION_CLASS_JCC, - INSTRUCTION_CLASS_ROTATE, - INSTRUCTION_CLASS_SHIFT, - INSTRUCTION_CLASS_SETCC, -} InstructionClass; - -fn String parse_encoding_type(Parser* parser) -{ - u32 i = parser->i; - while (1) - { - u8 ch = get_ch(parser); - u8 is_valid_encoding_type_ch = is_lower(ch) | (ch == '-'); - parser->i += is_valid_encoding_type_ch; - if (is_valid_encoding_type_ch) - { - if (parser->i - i > 4) - { - todo(); - } - } - else - { - break; - } - } - - u64 length = parser->i - i; - if (length == 0) - { - todo(); - } - if (length > 4) - { - todo(); - } - - String result = { .pointer = parser->pointer + i, .length = length }; - return result; -} - -fn void parse_encoding_details(Parser* parser) -{ - expect_character(parser, '['); - String encoding_type = parse_encoding_type(parser); - expect_character(parser, ':'); - expect_character(parser, ' '); - - while (!consume_character(parser, ']')) - { - // Parser encoding atom - u8 byte; - if (consume_hex_byte(parser, &byte)) - { - u8 ch = get_ch(parser); - u8 is_plus = ch == '+'; - parser->i += is_plus; - if (unlikely(is_plus)) - { - expect_character(parser, 'r'); - } - } - else - { - String identifier = parse_identifier(parser); - if (identifier.length) - { - if (identifier.pointer[0] == 'i') - { - assert(identifier.length == 2); - u8 imm_byte = identifier.pointer[1]; - u8 is_valid_imm_byte = ((imm_byte == 'b') | (imm_byte == 'w')) | ((imm_byte == 'd') | (imm_byte == 'q')); - if (!likely(is_valid_imm_byte)) - { - print("Bad immediate value\n"); - os_exit(1); - } - } - else if (s_equal(identifier, strlit("rex"))) - { - expect_character(parser, '.'); - u8 rex_ch = get_ch(parser); - u8 is_valid_rex_ch = ((rex_ch == 'w') | (rex_ch == 'r')) | ((rex_ch == 'x') | (rex_ch == 'b')); - parser->i += is_valid_rex_ch; - if (!likely(is_valid_rex_ch)) - { - todo(); - } - } - else if (string_starts_with(identifier, strlit("rel"))) - { - // todo - } - else - { - todo(); - } - } - else - { - u8 ch = get_ch(parser); - switch (ch) - { - case '/': - { - parser->i += 1; - if (consume_character(parser, 'r')) - { - // TODO - } - else - { - expect_decimal_digit(parser); - } - } break; - default: - todo(); - } - } - } - - consume_character(parser, ' '); - } -} - -fn void parse_encoding(Parser* parser) -{ - u8 first_ch = get_ch(parser); - u32 start = parser->i; - if (first_ch != '[') - { - while (1) - { - u32 i = parser->i; - String operand = parse_mnemonic(parser); - assert(operand.length); - if (consume_character(parser, ',')) - { - expect_character(parser, ' '); - } - else - { - break; - } - } - - expect_character(parser, ' '); - } - - parse_encoding_details(parser); -} - -fn void parse_instruction_table(Arena* arena) -{ - String file = file_read(arena, strlit("bootstrap/bloat-buster/data/instructions.dat")); - Parser parser_memory = { - .pointer = file.pointer, - .length = file.length, - }; - Parser* parser = &parser_memory; - - VirtualBuffer(u8) file_memory = {}; - VirtualBuffer(u8)* f = &file_memory; - - let_cast(u32, file_length, file.length); - while (parser->i < file_length) - { - String mnemonic = parse_mnemonic(parser); - expect_character(parser, ':'); - - if (consume_character(parser, '\n')) - { - while (consume_tab(parser)) - { - parse_encoding(parser); - expect_character(parser, '\n'); - } - } - else if (consume_character(parser, ' ')) - { - u8 next_ch = get_ch(parser); - switch (next_ch) - { - case '[': - { - parse_encoding_details(parser); - } break; - default: - { - String identifier = parse_identifier(parser); - if (s_equal(identifier, strlit("class"))) - { - expect_character(parser, ' '); - String class_identifier = parse_identifier(parser); - InstructionClass instruction_class; - - if (s_equal(class_identifier, strlit("base_arithmetic"))) - { - instruction_class = INSTRUCTION_CLASS_BASE_ARITHMETIC; - } - else if (s_equal(class_identifier, strlit("unsigned_add_flag"))) - { - instruction_class = INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG; - } - else if (s_equal(class_identifier, strlit("bittest"))) - { - instruction_class = INSTRUCTION_CLASS_BITTEST; - } - else if (s_equal(class_identifier, strlit("cmov"))) - { - instruction_class = INSTRUCTION_CLASS_CMOV; - } - else if (s_equal(class_identifier, strlit("jcc"))) - { - instruction_class = INSTRUCTION_CLASS_JCC; - } - else if (s_equal(class_identifier, strlit("rotate"))) - { - instruction_class = INSTRUCTION_CLASS_ROTATE; - } - else if (s_equal(class_identifier, strlit("shift"))) - { - instruction_class = INSTRUCTION_CLASS_SHIFT; - } - else if (s_equal(class_identifier, strlit("setcc"))) - { - instruction_class = INSTRUCTION_CLASS_SETCC; - } - else - { - todo(); - } - - switch (instruction_class) - { - case INSTRUCTION_CLASS_BASE_ARITHMETIC: - { - u8 opcodes[3]; - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[0] = expect_hex_byte(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[1] = expect_hex_byte(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[2] = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG: - { - expect_character(parser, '('); - u8 opcode = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_BITTEST: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - u8 opcode = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_CMOV: - { - } break; - case INSTRUCTION_CLASS_JCC: - { - } break; - case INSTRUCTION_CLASS_ROTATE: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_SHIFT: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_SETCC: - { - } break; - } - } - else - { - parser->i -= identifier.length; - parse_encoding(parser); - } - } break; - } - - expect_character(parser, '\n'); - } - else - { - todo(); - } - } -} - -int main(int argc, char* argv[], char** envp) -{ - environment_pointer = envp; - Arena* arena = arena_initialize_default(KB(64)); - metaprogram(arena); - parse_instruction_table(arena); - BuildType build_type = build_type_pick(); - CompileOptions compile_options = { - .compiler_path = get_c_compiler_path(arena, build_type), - .source_path = strlit("bootstrap/bloat-buster/bb.c"), - .output_path = strlit("cache/bb" EXECUTABLE_EXTENSION), - .windowing_backend = windowing_backend_pick(), - .rendering_backend = rendering_backend_pick(), - .build_type = build_type, - .flags = { - .colored_output = 1, - .error_limit = BB_ERROR_LIMIT, - .debug = BB_CI, - .time_trace = BB_TIMETRACE, - }, - }; - compile_program(arena, compile_options); - return 0; -} diff --git a/dependencies/stb/.gitignore b/dependencies/stb/.gitignore deleted file mode 100644 index 8cc774f..0000000 --- a/dependencies/stb/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.o -*.obj -*.exe diff --git a/dependencies/stb/LICENSE b/dependencies/stb/LICENSE deleted file mode 100644 index a77ae91..0000000 --- a/dependencies/stb/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dependencies/stb/stb_image.h b/dependencies/stb/stb_image.h deleted file mode 100644 index 9eedabe..0000000 --- a/dependencies/stb/stb_image.h +++ /dev/null @@ -1,7988 +0,0 @@ -/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8/16-bit-per-channel - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels, 8/16 bit-per-channel) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - PNM (PPM and PGM binary only) - - Animated GIF still needs a proper API, but here's one way to do it: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.30 (2024-05-31) avoid erroneous gcc warning - 2.29 (2023-05-xx) optimizations - 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff - 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes - 2.26 (2020-07-13) many minor fixes - 2.25 (2020-02-02) fix warnings - 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically - 2.23 (2019-08-11) fix clang static analysis warning - 2.22 (2019-03-04) gif fixes, fix warnings - 2.21 (2019-02-25) fix typo in comment - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine Simon Breuss (16-bit PNM) - John-Mark Allen - Carmelo J Fdez-Aguera - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski - Phil Jordan Dave Moore Roy Eltham - Hayaki Saito Nathan Reed Won Chun - Luke Graham Johan Duparc Nick Verigakis the Horde3D community - Thomas Ruf Ronny Chevalier github:rlyeh - Janez Zemva John Bartholomew Michal Cichon github:romigrou - Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Eugene Golushkov Laurent Gomila Cort Stratton github:snagar - Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex - Cass Everitt Ryamond Barbiero github:grim210 - Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw - Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus - Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo - Julian Raschke Gregory Mullen Christian Floisand github:darealshinji - Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 - Brad Weinberger Matvey Cherevko github:mosra - Luca Sas Alexander Veselov Zack Middleton [reserved] - Ryan C. Gordon [reserved] [reserved] - DO NOT ADD YOUR NAME HERE - - Jacko Dirks - - To add your name to the credits, pick a random blank space in the middle and fill it. - 80% of merge conflicts on stb PRs are due to people adding their name at the end - of the credits. -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below for HDR usage): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data); -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *channels_in_file to see if it's trivially -// opaque because e.g. there were only 3 channels in the source image. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// To query the width, height and component count of an image without having to -// decode the full file, you can use the stbi_info family of functions: -// -// int x,y,n,ok; -// ok = stbi_info(filename, &x, &y, &n); -// // returns ok=1 and sets x, y, n if image is a supported format, -// // 0 otherwise. -// -// Note that stb_image pervasively uses ints in its public API for sizes, -// including sizes of memory buffers. This is now part of the API and thus -// hard to change without causing breakage. As a result, the various image -// loaders all have certain limits on image size; these differ somewhat -// by format but generally boil down to either just under 2GB or just under -// 1GB. When the decoded image would be larger than this, stb_image decoding -// will fail. -// -// Additionally, stb_image will reject image files that have any of their -// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, -// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, -// the only way to have an image with such dimensions load correctly -// is for it to have a rather extreme aspect ratio. Either way, the -// assumption here is that such larger images are likely to be malformed -// or malicious. If you do need to load an image with individual dimensions -// larger than that, and it still fits in the overall size limit, you can -// #define STBI_MAX_DIMENSIONS on your own to be something larger. -// -// =========================================================================== -// -// UNICODE: -// -// If compiling for Windows and you wish to use Unicode filenames, compile -// with -// #define STBI_WINDOWS_UTF8 -// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -// Windows wchar_t filenames to utf8. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy-to-use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// provide more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image supports loading HDR images in general, and currently the Radiance -// .HDR file format specifically. You can still load any file through the existing -// interface; if you attempt to load an HDR file, it will be automatically remapped -// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// iPhone PNG support: -// -// We optionally support converting iPhone-formatted PNGs (which store -// premultiplied BGRA) back to RGB, even though they're internally encoded -// differently. To enable this conversion, call -// stbi_convert_iphone_png_to_rgb(1). -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// -// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater -// than that size (in either width or height) without further processing. -// This is to let programs in the wild set an upper bound to prevent -// denial-of-service attacks on untrusted data, as one could generate a -// valid image of gigantic dimensions and force stb_image to allocate a -// huge block of memory and spend disproportionate time decoding it. By -// default this is set to (1 << 24), which is 16777216, but that's still -// very big. - -#ifndef STBI_NO_STDIO -#include -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - #endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename); -STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// on most compilers (and ALL modern mainstream compilers) this is threadsafe -STBIDEF const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit (char const *filename); -STBIDEF int stbi_is_16_bit_from_file(FILE *f); -#endif - - - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// as above, but only applies to images loaded on the thread that calls the function -// this function is only available if your compiler supports thread-local variables; -// calling it will fail to link if your compiler doesn't -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); -STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ - || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ - || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ - || defined(STBI_ONLY_ZLIB) - #ifndef STBI_ONLY_JPEG - #define STBI_NO_JPEG - #endif - #ifndef STBI_ONLY_PNG - #define STBI_NO_PNG - #endif - #ifndef STBI_ONLY_BMP - #define STBI_NO_BMP - #endif - #ifndef STBI_ONLY_PSD - #define STBI_NO_PSD - #endif - #ifndef STBI_ONLY_TGA - #define STBI_NO_TGA - #endif - #ifndef STBI_ONLY_GIF - #define STBI_NO_GIF - #endif - #ifndef STBI_ONLY_HDR - #define STBI_NO_HDR - #endif - #ifndef STBI_ONLY_PIC - #define STBI_NO_PIC - #endif - #ifndef STBI_ONLY_PNM - #define STBI_NO_PNM - #endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - -#ifndef STBI_NO_THREAD_LOCALS - #if defined(__cplusplus) && __cplusplus >= 201103L - #define STBI_THREAD_LOCAL thread_local - #elif defined(__GNUC__) && __GNUC__ < 5 - #define STBI_THREAD_LOCAL __thread - #elif defined(_MSC_VER) - #define STBI_THREAD_LOCAL __declspec(thread) - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) - #define STBI_THREAD_LOCAL _Thread_local - #endif - - #ifndef STBI_THREAD_LOCAL - #if defined(__GNUC__) - #define STBI_THREAD_LOCAL __thread - #endif - #endif -#endif - -#if defined(_MSC_VER) || defined(__SYMBIAN32__) -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -#ifdef _MSC_VER -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -#else -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -#ifndef STBI_MAX_DIMENSIONS -#define STBI_MAX_DIMENSIONS (1 << 24) -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - int callback_already_read; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - int ch; - fseek((FILE*) user, n, SEEK_CUR); - ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ - if (ch != EOF) { - ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ - } -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user) || ferror((FILE *) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__png_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__psd_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__pnm_is16(stbi__context *s); -#endif - -static -#ifdef STBI_THREAD_LOCAL -STBI_THREAD_LOCAL -#endif -const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -#ifndef STBI_NO_FAILURE_STRINGS -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} -#endif - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} -#endif - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} -#endif - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} -#endif - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} -#endif - -// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. -static int stbi__addints_valid(int a, int b) -{ - if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow - if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. - return a <= INT_MAX - b; -} - -// returns 1 if the product of two ints fits in a signed short, 0 on overflow. -static int stbi__mul2shorts_valid(int a, int b) -{ - if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow - if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid - if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN - return a >= SHRT_MIN / b; -} - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define stbi__err(x,y) stbi__err(y) -#else - #define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load_global = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_global = flag_true_if_should_flip; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global -#else -static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; - -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_local = flag_true_if_should_flip; - stbi__vertically_flip_on_load_set = 1; -} - -#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ - ? stbi__vertically_flip_on_load_local \ - : stbi__vertically_flip_on_load_global) -#endif // STBI_THREAD_LOCAL - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - // test the formats with a very explicit header first (at least a FOURCC - // or distinctive magic number first) - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); - #else - STBI_NOTUSED(bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif - - // then the formats that can end up attempting to load with just 1 or 2 - // bytes matching expectations; these are prone to false positives, so - // try them later - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - #ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); - #endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) -{ - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 8) { - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 16) { - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -#endif - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_mem(&s,buffer,len); - - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } - #endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s,f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; - #else - STBI_NOTUSED(f); - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; - #endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) -// nothing -#else -static void stbi__skip(stbi__context *s, int n) -{ - if (n == 0) return; // already there! - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) -// nothing -#else -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} -#endif - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - z += (stbi__uint32)stbi__get16le(s) << 16; - return z; -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i=0; i < x*y; ++i) { - output[i*comp + n] = data[i*comp + n]/255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - -// kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) { - for (j=0; j < count[i]; ++j) { - h->size[k++] = (stbi_uc) (i+1); - if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); - } - } - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - if(c < 0 || c >= 256) // symbol id out of bounds! - return -1; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing - - sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & (sgn - 1)); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - diff = t ? stbi__extend_receive(j, t) : 0; - - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short) (dc * (1 << j->succ_low)); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * (1 << shift)); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) * 4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0]*4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y - #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y - #define dct_rot(out0,out1, x,y,c0,c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) - #define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add - #define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub - #define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack - #define dct_bfly32o(out0, out1, a,b,bias,s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - - // 8-bit interleave step (for transposes) - #define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) - #define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - - #define dct_pass(bias,shift) \ - { \ - /* even part */ \ - dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ - dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0,row7, x0,x7,bias,shift); \ - dct_bfly32o(row1,row6, x1,x6,bias,shift); \ - dct_bfly32o(row2,row5, x2,x5,bias,shift); \ - dct_bfly32o(row3,row4, x3,x4,bias,shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ - dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ - dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ - dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ - } - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios - // and I've never seen a non-corrupted JPEG file actually use them - for (i=0; i < s->img_n; ++i) { - if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); - if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) -{ - // some JPEGs have junk at end, skip over it but if we find what looks - // like a valid marker, resume there - while (!stbi__at_eof(j->s)) { - stbi_uc x = stbi__get8(j->s); - while (x == 0xff) { // might be a marker - if (stbi__at_eof(j->s)) return STBI__MARKER_none; - x = stbi__get8(j->s); - if (x != 0x00 && x != 0xff) { - // not a stuffed zero or lead-in to another marker, looks - // like an actual marker, return it - return x; - } - // stuffed zero has x=0 now which ends the loop, meaning we go - // back to regular scan loop. - // repeated 0xff keeps trying to read the next byte of the marker. - } - } - return STBI__MARKER_none; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - j->marker = stbi__skip_jpeg_junk_at_end(j); - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - m = stbi__get_marker(j); - if (STBI__RESTART(m)) - m = stbi__get_marker(j); - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); - m = stbi__get_marker(j); - } else { - if (!stbi__process_marker(j, m)) return 1; - m = stbi__get_marker(j); - } - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // nothing to do if no components requested; check this now to avoid - // accessing uninitialized coutput[0] later - if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__errpuc("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - if (!j) return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) -#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[STBI__ZNSYMS]; - stbi__uint16 value[STBI__ZNSYMS]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - int hit_zeof_once; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static int stbi__zeof(stbi__zbuf *z) -{ - return (z->zbuffer >= z->zbuffer_end); -} - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - return stbi__zeof(z) ? 0 : *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - if (z->code_buffer >= (1U << z->num_bits)) { - z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ - return; - } - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s >= 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! - if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) { - if (stbi__zeof(a)) { - if (!a->hit_zeof_once) { - // This is the first time we hit eof, insert 16 extra padding btis - // to allow us to keep going; if we actually consume any of them - // though, that is invalid data. This is caught later. - a->hit_zeof_once = 1; - a->num_bits += 16; // add 16 implicit zero bits - } else { - // We already inserted our extra 16 padding bits and are again - // out, this stream is actually prematurely terminated. - return -1; - } - } else { - stbi__fill_bits(a); - } - } - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - unsigned int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (unsigned int) (z->zout - z->zout_start); - limit = old_limit = (unsigned) (z->zout_end - z->zout_start); - if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); - while (cur + n > limit) { - if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); - limit *= 2; - } - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static const int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static const int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - if (a->hit_zeof_once && a->num_bits < 16) { - // The first time we hit zeof, we inserted 16 extra zero bits into our bit - // buffer so the decoder can just do its speculative decoding. But if we - // actually consumed any of those bits (which is the case when num_bits < 16), - // the stream actually read past the end so it is malformed. - return stbi__err("unexpected end","Corrupt PNG"); - } - return 1; - } - if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (len > a->zout_end - zout) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - } else if (c == 18) { - c = stbi__zreceive(a,7)+11; - } else { - return stbi__err("bad codelengths", "Corrupt PNG"); - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - a->hit_zeof_once = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filter used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub -}; - -static int stbi__paeth(int a, int b, int c) -{ - // This formulation looks very different from the reference in the PNG spec, but is - // actually equivalent and has favorable data dependencies and admits straightforward - // generation of branch-free code, which helps performance significantly. - int thresh = c*3 - (a + b); - int lo = a < b ? a : b; - int hi = a < b ? b : a; - int t0 = (hi <= thresh) ? lo : c; - int t1 = (thresh <= lo) ? hi : t0; - return t1; -} - -static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// adds an extra all-255 alpha channel -// dest == src is legal -// img_n must be 1 or 3 -static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) -{ - int i; - // must process data backwards since we allow dest==src - if (img_n == 1) { - for (i=x-1; i >= 0; --i) { - dest[i*2+1] = 255; - dest[i*2+0] = src[i]; - } - } else { - STBI_ASSERT(img_n == 3); - for (i=x-1; i >= 0; --i) { - dest[i*4+3] = 255; - dest[i*4+2] = src[i*3+2]; - dest[i*4+1] = src[i*3+1]; - dest[i*4+0] = src[i*3+0]; - } - } -} - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16 ? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - stbi_uc *filter_buf; - int all_ok = 1; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - // note: error exits here don't need to clean up a->out individually, - // stbi__do_png always does on error. - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - // Allocate two scan lines worth of filter workspace buffer. - filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); - if (!filter_buf) return stbi__err("outofmem", "Out of memory"); - - // Filtering for low-bit-depth images - if (depth < 8) { - filter_bytes = 1; - width = img_width_bytes; - } - - for (j=0; j < y; ++j) { - // cur/prior filter buffers alternate - stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; - stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; - stbi_uc *dest = a->out + stride*j; - int nk = width * filter_bytes; - int filter = *raw++; - - // check filter type - if (filter > 4) { - all_ok = stbi__err("invalid filter","Corrupt PNG"); - break; - } - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // perform actual filtering - switch (filter) { - case STBI__F_none: - memcpy(cur, raw, nk); - break; - case STBI__F_sub: - memcpy(cur, raw, filter_bytes); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); - break; - case STBI__F_up: - for (k = 0; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + prior[k]); - break; - case STBI__F_avg: - for (k = 0; k < filter_bytes; ++k) - cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); - break; - case STBI__F_paeth: - for (k = 0; k < filter_bytes; ++k) - cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); - break; - case STBI__F_avg_first: - memcpy(cur, raw, filter_bytes); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); - break; - } - - raw += nk; - - // expand decoded bits in cur to dest, also adding an extra alpha channel if desired - if (depth < 8) { - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - stbi_uc *in = cur; - stbi_uc *out = dest; - stbi_uc inb = 0; - stbi__uint32 nsmp = x*img_n; - - // expand bits to bytes first - if (depth == 4) { - for (i=0; i < nsmp; ++i) { - if ((i & 1) == 0) inb = *in++; - *out++ = scale * (inb >> 4); - inb <<= 4; - } - } else if (depth == 2) { - for (i=0; i < nsmp; ++i) { - if ((i & 3) == 0) inb = *in++; - *out++ = scale * (inb >> 6); - inb <<= 2; - } - } else { - STBI_ASSERT(depth == 1); - for (i=0; i < nsmp; ++i) { - if ((i & 7) == 0) inb = *in++; - *out++ = scale * (inb >> 7); - inb <<= 1; - } - } - - // insert alpha=255 values if desired - if (img_n != out_n) - stbi__create_png_alpha_expand8(dest, dest, x, img_n); - } else if (depth == 8) { - if (img_n == out_n) - memcpy(dest, cur, x*img_n); - else - stbi__create_png_alpha_expand8(dest, cur, x, img_n); - } else if (depth == 16) { - // convert the image data from big-endian to platform-native - stbi__uint16 *dest16 = (stbi__uint16*)dest; - stbi__uint32 nsmp = x*img_n; - - if (img_n == out_n) { - for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) - *dest16 = (cur[0] << 8) | cur[1]; - } else { - STBI_ASSERT(img_n+1 == out_n); - if (img_n == 1) { - for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { - dest16[0] = (cur[0] << 8) | cur[1]; - dest16[1] = 0xffff; - } - } else { - STBI_ASSERT(img_n == 3); - for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { - dest16[0] = (cur[0] << 8) | cur[1]; - dest16[1] = (cur[2] << 8) | cur[3]; - dest16[2] = (cur[4] << 8) | cur[5]; - dest16[3] = 0xffff; - } - } - } - } - } - - STBI_FREE(filter_buf); - if (!all_ok) return 0; - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - if (!final) return stbi__err("outofmem", "Out of memory"); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load_global = 0; -static int stbi__de_iphone_flag_global = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_global = flag_true_if_should_convert; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -#define stbi__de_iphone_flag stbi__de_iphone_flag_global -#else -static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; - -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; - stbi__unpremultiply_on_load_set = 1; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_local = flag_true_if_should_convert; - stbi__de_iphone_flag_set = 1; -} - -#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ - ? stbi__unpremultiply_on_load_local \ - : stbi__unpremultiply_on_load_global) -#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ - ? stbi__de_iphone_flag_local \ - : stbi__de_iphone_flag_global) -#endif // STBI_THREAD_LOCAL - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); - s->img_y = stbi__get32be(s); - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - } - // even with SCAN_header, have to scan to see if we have a tRNS - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. - if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } - if (z->depth == 16) { - for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning - tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n && k < 3; ++k) - tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { - // header scan definitely stops at first IDAT - if (pal_img_n) - s->img_n = pal_img_n; - return 1; - } - if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); - #endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth <= 8) - ri->bits_per_channel = 8; - else if (p->depth == 16) - ri->bits_per_channel = 16; - else - return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context *s) -{ - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) { n += 16; z >>= 16; } - if (z >= 0x00100) { n += 8; z >>= 8; } - if (z >= 0x00010) { n += 4; z >>= 4; } - if (z >= 0x00004) { n += 2; z >>= 2; } - if (z >= 0x00002) { n += 1;/* >>= 1;*/ } - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) -{ - static unsigned int mul_table[9] = { - 0, - 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, - 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0,0,1,0,2,4,6,0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - STBI_ASSERT(v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; - int extra_read; -} stbi__bmp_data; - -static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) -{ - // BI_BITFIELDS specifies masks explicitly, don't override - if (compress == 3) - return 1; - - if (compress == 0) { - if (info->bpp == 16) { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } else if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - // otherwise, use defaults, which is all-0 - info->mr = info->mg = info->mb = info->ma = 0; - } - return 1; - } - return 0; // error -} - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - info->extra_read = 14; - - if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes - if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - stbi__bmp_set_mask_defaults(info, compress); - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->extra_read += 12; - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - // V4/V5 header - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs - stbi__bmp_set_mask_defaults(info, compress); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - info.extra_read - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - info.extra_read - info.hsz) >> 2; - } - if (psize == 0) { - // accept some number of extra bytes after the header, but if the offset points either to before - // the header ends or implies a large amount of extra data, reject the file as malformed - int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); - int header_limit = 1024; // max we actually read is below 256 bytes currently. - int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. - if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { - return stbi__errpuc("bad header", "Corrupt BMP"); - } - // we established that bytes_read_so_far is positive and sensible. - // the first half of this test rejects offsets that are either too small positives, or - // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn - // ensures the number computed in the second half of the test can't overflow. - if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { - return stbi__errpuc("bad offset", "Corrupt BMP"); - } else { - stbi__skip(s, info.offset - bytes_read_so_far); - } - } - - if (info.bpp == 24 && ma == 0xff000000) - s->img_n = 3; - else - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - if (info.bpp == 1) { - for (j=0; j < (int) s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i=0; i < (int) s->img_x; ++i) { - int color = (v>>bit_offset)&0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - info.extra_read - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // fallthrough - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - STBI_NOTUSED(tga_x_origin); // @TODO - STBI_NOTUSED(tga_y_origin); // @TODO - - if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - if (tga_palette_len == 0) { /* you have to have at least one entry! */ - STBI_FREE(tga_data); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - - if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - if (!result) return stbi__errpuc("outofmem", "Out of memory"); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned - stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!g) return stbi__err("outofmem", "Out of memory"); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) -{ - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *) stbi__malloc(4 * pcount); - g->background = (stbi_uc *) stbi__malloc(4 * pcount); - g->history = (stbi_uc *) stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispose of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy( g->background, g->out, 4 * g->w * g->h ); - } - - // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) -{ - STBI_FREE(g->out); - STBI_FREE(g->history); - STBI_FREE(g->background); - - if (out) STBI_FREE(out); - if (delays && *delays) STBI_FREE(*delays); - return stbi__errpuc("outofmem", "Out of memory"); -} - -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; - stbi_uc *two_back = 0; - stbi__gif g; - int stride; - int out_size = 0; - int delays_size = 0; - - STBI_NOTUSED(out_size); - STBI_NOTUSED(delays_size); - - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); - if (!tmp) - return stbi__load_gif_main_outofmem(&g, out, delays); - else { - out = (stbi_uc*) tmp; - out_size = layers * stride; - } - - if (delays) { - int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); - if (!new_delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - *delays = new_delays; - delays_size = layers * sizeof(int); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (!out) - return stbi__load_gif_main_outofmem(&g, out, delays); - out_size = layers * stride; - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - if (!*delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - delays_size = layers * sizeof(int); - } - } - memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - if (p == NULL) { - stbi__rewind( s ); - return 0; - } - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) { - if (info.bpp == 24 && info.ma == 0xff000000) - *comp = 3; - else - *comp = info.ma ? 4 : 3; - } - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy, depth; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context *s) -{ - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - STBI_NOTUSED(stbi__get32be(s)); - STBI_NOTUSED(stbi__get32be(s)); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); - if (ri->bits_per_channel == 0) - return 0; - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { - STBI_FREE(out); - return stbi__errpuc("bad PNM", "PNM file truncated"); - } - - if (req_comp && req_comp != s->img_n) { - if (ri->bits_per_channel == 16) { - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); - } else { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - } - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - if((value > 214748364) || (value == 214748364 && *c > '7')) - return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - if(*x == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - if (*y == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - if (maxv > 65535) - return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); - else if (maxv > 255) - return 16; - else - return 8; -} - -static int stbi__pnm_is16(stbi__context *s) -{ - if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) - return 1; - return 0; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; - #endif - - // test tga last because it's a crappy test! - #ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; - #endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context *s) -{ - #ifndef STBI_NO_PNG - if (stbi__png_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_is16(s)) return 1; - #endif - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE *f) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/dependencies/stb/stb_truetype.h b/dependencies/stb/stb_truetype.h deleted file mode 100644 index 2a710a7..0000000 --- a/dependencies/stb/stb_truetype.h +++ /dev/null @@ -1,5089 +0,0 @@ -// stb_truetype.h - v1.26 - public domain -// authored from 2009-2021 by Sean Barrett / RAD Game Tools -// -// ======================================================================= -// -// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES -// -// This library does no range checking of the offsets found in the file, -// meaning an attacker can use it to read arbitrary memory. -// -// ======================================================================= -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// render glyphs to one-channel SDF bitmaps (signed-distance field/function) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// Daniel Ribeiro Maciel: basic GPOS-based kerning -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// Imanol Celaya -// Daniel Ribeiro Maciel -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe -// Cass Everitt Martins Mozeiko github:aloucks -// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam -// Brian Hook Omar Cornut github:vassvik -// Walter van Niftrik Ryan Griege -// David Gow Peter LaValle -// David Given Sergey Popov -// Ivan-Assen Ivanov Giumo X. Clanjor -// Anthony Pesch Higor Euripedes -// Johan Duparc Thomas Fields -// Hou Qiming Derek Vinyard -// Rob Loach Cort Stratton -// Kenney Phillis Jr. Brian Costabile -// Ken Voskuil (kaesve) Yakov Galka -// -// VERSION HISTORY -// -// 1.26 (2021-08-28) fix broken rasterizer -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// See end of file for license information. -// -// USAGE -// -// Include this file in whatever places need to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversampling() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetFontVMetricsOS2() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// DETAILED USAGE: -// -// Scale: -// Select how high you want the font to be, in points or pixels. -// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute -// a scale factor SF that will be used by all other functions. -// -// Baseline: -// You need to select a y-coordinate that is the baseline of where -// your text will appear. Call GetFontBoundingBox to get the baseline-relative -// bounding box for all characters. SF*-y0 will be the distance in pixels -// that the worst-case character could extend above the baseline, so if -// you want the top edge of characters to appear at the top of the -// screen where y=0, then you would set the baseline to SF*-y0. -// -// Current point: -// Set the current point where the first character will appear. The -// first character could extend left of the current point; this is font -// dependent. You can either choose a current point that is the leftmost -// point and hope, or add some padding, or check the bounding box or -// left-side-bearing of the first character to be displayed and set -// the current point based on that. -// -// Displaying a character: -// Compute the bounding box of the character. It will contain signed values -// relative to . I.e. if it returns x0,y0,x1,y1, -// then the character should be displayed in the rectangle from -// to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; // leave a little padding in case the character extends left - char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype, e.g. if you don't -//// link with the C runtime library. - -#ifdef STB_TRUETYPE_IMPLEMENTATION - // #define your own (u)stbtt_int8/16/32 before including to override this - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #define STBTT_pow(x,y) pow(x,y) - #endif - - #ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) - #endif - - #ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata); // you allocate this, it's num_chars long -// if return is positive, the first unused row of the bitmap -// if return is negative, returns the negative of the number of characters that fit -// if return is 0, no characters fit and no rows were used -// This uses a very crappy packing. - -typedef struct -{ - float x0,y0,s0,t0; // top-left - float x1,y1,s1,t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); -// Query the font vertical metrics without having to create a font first. - - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -// Creates character bitmaps from the font_index'th font found in fontdata (use -// font_index=0 if you don't know what that is). It creates num_chars_in_range -// bitmaps for characters with unicode values starting at first_unicode_char_in_range -// and increasing. Data for how to render them is stored in chardata_for_range; -// pass these to stbtt_GetPackedQuad to get back renderable quads. -// -// font_size is the full height of the character from ascender to descender, -// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed -// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() -// and pass that result as 'font_size': -// ..., 20 , ... // font max minus min y is 20 pixels tall -// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar *chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -// Creates character bitmaps from multiple ranges of characters stored in -// ranges. This will usually create a better-packed bitmap than multiple -// calls to stbtt_PackFontRange. Note that you can call this multiple -// times within a single PackBegin/PackEnd. - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); -// If skip != 0, this tells stb_truetype to skip any codepoints for which -// there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, -// typically an empty box by convention. - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publicly so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; // pointer to .ttf file - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. -// Returns 0 if the character codepoint is not defined in the font. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); -// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 -// table (specific to MS/Windows TTF files). -// -// Returns 1 on success (table present), 0 on failure. - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -// as above, but takes one or more glyph indices for greater efficiency - -typedef struct stbtt_kerningentry -{ - int glyph1; // use stbtt_FindGlyphIndex - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); -// Retrieves a complete list of all of the kerning pairs provided by the font -// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. -// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values - // (we share this with other code at RAD) - #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of contours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -// frees the data allocated above - -STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); -// fills svg with the character's SVG data. -// returns data size or 0 if SVG not found. - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); -// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering -// is performed (see stbtt_PackSetOversampling) - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -// @TODO: don't expose this structure -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex *vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void *userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Signed Distance Function (or Field) rendering - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); -// frees the SDF bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -// These functions compute a discretized SDF field for a single character, suitable for storing -// in a single-channel texture, sampling with bilinear filtering, and testing against -// larger than some threshold to produce scalable fonts. -// info -- the font -// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap -// glyph/codepoint -- the character to generate the SDF for -// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), -// which allows effects like bit outlines -// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) -// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) -// if positive, > onedge_value is inside; if negative, < onedge_value is inside -// width,height -- output height & width of the SDF bitmap (including padding) -// xoff,yoff -- output origin of the character -// return value -- a 2D array of bytes 0..255, width*height in size -// -// pixel_dist_scale & onedge_value are a scale & bias that allows you to make -// optimal use of the limited 0..255 for your application, trading off precision -// and special effects. SDF values outside the range 0..255 are clamped to 0..255. -// -// Example: -// scale = stbtt_ScaleForPixelHeight(22) -// padding = 5 -// onedge_value = 180 -// pixel_dist_scale = 180/5.0 = 36.0 -// -// This will create an SDF bitmap in which the character is about 22 pixels -// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled -// shape, sample the SDF at each pixel and fill the pixel if the SDF value -// is greater than or equal to 180/255. (You'll actually want to antialias, -// which is beyond the scope of this example.) Additionally, you can compute -// offset outlines (e.g. to stroke the character border inside & outside, -// or only outside). For example, to fill outside the character up to 3 SDF -// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above -// choice of variables maps a range from 5 pixels outside the shape to -// 2 pixels inside the shape to 0..255; this is intended primarily for apply -// outside effects only (the interior range is needed to allow proper -// antialiasing of the font at *smaller* sizes) -// -// The function computes the SDF analytically at each SDF pixel, not by e.g. -// building a higher-res bitmap and approximating it. In theory the quality -// should be as high as possible for an SDF of this size & representation, but -// unclear if this is true in practice (perhaps building a higher-res bitmap -// and computing from that can allow drop-out prevention). -// -// The algorithm has not been optimized at all, so expect it to be slow -// if computing lots of characters or very large sizes. - - - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - // check the version number - if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 - if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 - if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - // if it's just a font, there's only one valid index - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - // if it's just a font, there's only one valid font - if (stbtt__isfont(font_collection)) - return 1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -// since most people won't use this, find this table the first time it's needed -static int stbtt__get_svg(stbtt_fontinfo *info) -{ - stbtt_uint32 t; - if (info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if (t) { - stbtt_uint32 offset = ttULONG(info->data + t + 2); - info->svg = t + offset; - } else { - info->svg = 0; - } - } - return info->svg; -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - // required for truetype - if (!info->loca) return 0; - } else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - // looks like a CID font - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - // now decrement to bias correctly to find smallest - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - last = ttUSHORT(data + endCount + 2*item); - if (unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - // Binary search the right group. - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - // now load x coordinates - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; // ??? - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - // now load y coordinates - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; // ??? - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - // now convert them to our format - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - // now start the new one - start_off = !(flags & 1); - if (start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - // otherwise just use the next point as our start point - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { // if it's a curve - if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours < 0) { - // Compound shapes. - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { // XY values - if (flags & 1) { // shorts - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if (flags & (1<<3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - // Find transformation scales. - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - // Transform vertices. - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1<<5); - } - } else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if (in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: // vmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: // hmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: // rlineto - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: // rcurveline - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: // rlinecurve - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // FALLTHROUGH - case 0x1D: // callgsubr - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: // flex1 - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - // push immediate - if (b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) *x0 = r ? c.min_x : 0; - if (y0) *y0 = r ? c.min_y : 0; - if (x1) *x1 = r ? c.max_x : 0; - if (y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) -{ - stbtt_uint8 *data = info->data + info->kern; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - return ttUSHORT(data+10); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) -{ - stbtt_uint8 *data = info->data + info->kern; - int k, length; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - length = ttUSHORT(data+10); - if (table_length < length) - length = table_length; - - for (k = 0; k < length; k++) - { - table[k].glyph1 = ttUSHORT(data+18+(k*6)); - table[k].glyph2 = ttUSHORT(data+20+(k*6)); - table[k].advance = ttSHORT(data+22+(k*6)); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); // note: unaligned read - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) -{ - stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); - switch (coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); - - // Binary search. - stbtt_int32 l=0, r=glyphCount-1, m; - int straw, needle=glyph; - while (l <= r) { - stbtt_uint8 *glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(glyphArray + 2 * m); - straw = glyphID; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); - stbtt_uint8 *rangeArray = coverageTable + 4; - - // Binary search. - stbtt_int32 l=0, r=rangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(rangeRecord); - strawEnd = ttUSHORT(rangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: return -1; // unsupported - } - - return -1; -} - -static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) -{ - stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); - switch (classDefFormat) - { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); - stbtt_uint8 *classDef1ValueArray = classDefTable + 6; - - if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); - stbtt_uint8 *classRangeRecords = classDefTable + 4; - - // Binary search. - stbtt_int32 l=0, r=classRangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(classRangeRecord); - strawEnd = ttUSHORT(classRangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(classRangeRecord + 4); - } - break; - } - - default: - return -1; // Unsupported definition type, return an error. - } - - // "All glyphs not assigned to a class fall into class 0". (OpenType spec) - return 0; -} - -// Define to STBTT_assert(x) if you want to break on unimplemented formats. -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint8 *lookupList; - stbtt_uint16 lookupCount; - stbtt_uint8 *data; - stbtt_int32 i, sti; - - if (!info->gpos) return 0; - - data = info->data + info->gpos; - - if (ttUSHORT(data+0) != 1) return 0; // Major version 1 - if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data+8); - lookupList = data + lookupListOffset; - lookupCount = ttUSHORT(lookupList); - - for (i=0; i= pairSetCount) return 0; - - needle=glyph2; - r=pairValueCount-1; - l=0; - - // Binary search. - while (l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint8 *pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(pairValue); - straw = secondGlyph; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(pairValue + 2); - return xAdvance; - } - } - } else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); - if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); - int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(table + 12); - stbtt_uint16 class2Count = ttUSHORT(table + 14); - stbtt_uint8 *class1Records, *class2Records; - stbtt_int16 xAdvance; - - if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed - if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(class2Records + 2 * glyph2class); - return xAdvance; - } else - return 0; - break; - } - - default: - return 0; // Unsupported position format - } - } - } - - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) -{ - int xAdvance = 0; - - if (info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if (info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if (!tab) - return 0; - if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); - if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); - if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) -{ - int i; - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); - - int numEntries = ttUSHORT(svg_doc_list); - stbtt_uint8 *svg_docs = svg_doc_list + 2; - - for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) -{ - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc; - - if (info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if (svg_doc != NULL) { - *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); - return ttULONG(svg_doc + 8); - } else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - // e.g. space character - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - // round dx down to avoid overshooting - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - // non-zero winding fill - int x0=0, w=0; - - while (e) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - // if we went to zero, we need to draw - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - // find insertion point - if (active == NULL) - active = z; - else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - { - STBTT_assert(x1 <= x+1); - } - else if (x0 == x+1) - { - STBTT_assert(x1 >= x); - } - else if (x0 <= x) - { - STBTT_assert(x1 <= x); - } - else if (x0 >= x+1) - { - STBTT_assert(x1 >= x+1); - } - else - { - STBTT_assert(x1 >= x && x1 <= x+1); - } - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if ((int) x_top == (int) x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int) x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); - scanline_fill[x] += height; // everything right of this pixel is filled - } else { - int x,x1,x2; - float y_crossing, y_final, step, sign, area; - // covers 2+ pixels - if (x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int) x_top; - x2 = (int) x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = y_top + dy * (x1+1 - x0); - - // compute intersection with y axis at x2 - y_final = y_top + dy * (x2 - x0); - - // x1 x_top x2 x_bottom - // y_top +------|-----+------------+------------+--------|---+------------+ - // | | | | | | - // | | | | | | - // sy0 | Txxxxx|............|............|............|............| - // y_crossing | *xxxxx.......|............|............|............| - // | | xxxxx..|............|............|............| - // | | /- xx*xxxx........|............|............| - // | | dy < | xxxxxx..|............|............| - // y_final | | \- | xx*xxx.........|............| - // sy1 | | | | xxxxxB...|............| - // | | | | | | - // | | | | | | - // y_bottom +------------+------------+------------+------------+------------+ - // - // goal is to measure the area covered by '.' in each pixel - - // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 - // @TODO: maybe test against sy1 rather than y_bottom? - if (y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - // area of the rectangle covered from sy0..y_crossing - area = sign * (y_crossing-sy0); - - // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) - scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); - - // check if final y_crossing is blown up; no test case for this - if (y_final > y_bottom) { - y_final = y_bottom; - dy = (y_final - y_crossing ) / (x2 - (x1+1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom - } - - // in second pixel, area covered by line segment found in first pixel - // is always a rectangle 1 wide * the height of that line segment; this - // is exactly what the variable 'area' stores. it also gets a contribution - // from the line segment within it. the THIRD pixel will get the first - // pixel's rectangle contribution, the second pixel's rectangle contribution, - // and its own contribution. the 'own contribution' is the same in every pixel except - // the leftmost and rightmost, a trapezoid that slides down in each pixel. - // the second pixel's contribution to the third pixel will be the - // rectangle 1 wide times the height change in the second pixel, which is dy. - - step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, - // which multiplied by 1-pixel-width is how much pixel area changes for each step in x - // so the area advances by 'step' every time - - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; // area of trapezoid is 1*step/2 - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down - STBTT_assert(sy1 > y_final-0.01f); - - // area covered in the last pixel is the rectangle from all the pixels to the left, - // plus the trapezoid filled by the line segment in this pixel all the way to the right edge - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); - - // the rest of the line is filled based on the total height of the line segment in this pixel - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - // note though that this does happen some of the time because - // x_top and x_bottom can be extrapolated at the top & bottom of - // the shape and actually lie outside the bounding box - int x; - for (x=0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clearly-defined pairs - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - float y1 = (x - x0) / dx + y_top; - float y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { // one segment - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - if (j == 0 && off_y != 0) { - if (z->ey < scan_y_top) { - // this can happen due to subpixel positioning and some kind of fp rounding error i think - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - // advance all the edges - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - // skip the edge if horizontal - if (p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - // versus directly drawn line - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) // 65536 segments on one curve better be enough! - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) // 65536 segments on one curve better be enough! - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -// returns number of contours -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - // count how many "moves" there are to get the contour count - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - // start the next contour - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int *winding_lengths = NULL; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - int missing_glyph_added = 0; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } else { - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - if (glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if (prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if (prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, missing_glyph = -1, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if (glyph == 0) - missing_glyph = j; - } else if (spc->skip_missing) { - return_value = 0; - } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i,j,n, return_value = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect *rects; - - // flag all characters as NOT packed - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float) i_ascent * scale; - *descent = (float) i_descent * scale; - *lineGap = (float) i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// sdf computation -// - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) -{ - float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; - float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; - float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; - float roperp = orig[1]*ray[0] - orig[0]*ray[1]; - - float a = q0perp - 2*q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if (a != 0.0) { - float discr = b*b - a*c; - if (discr > 0.0) { - float rcpna = -1 / a; - float d = (float) STBTT_sqrt(discr); - s0 = (b+d) * rcpna; - s1 = (b-d) * rcpna; - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { - if (num_s == 0) s0 = s1; - ++num_s; - } - } - } else { - // 2*b*s + c = 0 - // s = -c / (2*b) - s0 = c / (-2 * b); - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - } - - if (num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0]*rayn_x + q0[1]*rayn_y; - float q1d = q1[0]*rayn_x + q1[1]*rayn_y; - float q2d = q2[0]*rayn_x + q2[1]*rayn_y; - float rod = orig[0]*rayn_x + orig[1]*rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; - hits[0][1] = a*s0+b; - - if (num_s > 1) { - hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; - hits[1][1] = a*s1+b; - return 2; - } else { - return 1; - } - } -} - -static int equal(float *a, float *b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - // make sure y never passes through a vertex of the shape - y_frac = (float) STBTT_fmod(y, 1.0f); - if (y_frac < 0.01f) - y += 0.01f; - else if (y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - // test a ray from (-infinity,y) to (x,y) - for (i=0; i < nverts; ++i) { - if (verts[i].type == STBTT_vline) { - int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; - int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if (verts[i].type == STBTT_vcurve) { - int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; - int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; - int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; - int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); - int by = STBTT_max(y0,STBTT_max(y1,y2)); - if (y > ay && y < by && x > ax) { - float q0[2],q1[2],q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if (equal(q0,q1) || equal(q1,q2)) { - x0 = (int)verts[i-1].x; - y0 = (int)verts[i-1].y; - x1 = (int)verts[i ].x; - y1 = (int)verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if (num_hits >= 1) - if (hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if (num_hits >= 2) - if (hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot( float x ) -{ - if (x<0) - return -(float) STBTT_pow(-x,1.0f/3.0f); - else - return (float) STBTT_pow( x,1.0f/3.0f); -} - -// x^3 + a*x^2 + b*x + c = 0 -static int stbtt__solve_cubic(float a, float b, float c, float* r) -{ - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; - float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float) STBTT_cos(v); - float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? - //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); - //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0,iy0,ix1,iy1; - int w,h; - unsigned char *data; - - if (scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); - - // if empty, return NULL - if (ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if (width ) *width = w; - if (height) *height = h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - // invert for y-downwards bitmaps - scale_y = -scale_y; - - { - // distance from singular values (in the same units as the pixel grid) - const float eps = 1./1024, eps2 = eps*eps; - int x,y,i,j; - float *precompute; - stbtt_vertex *verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *) STBTT_malloc(w * h, info->userdata); - precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for (i=0,j=num_verts-1; i < num_verts; j=i++) { - if (verts[i].type == STBTT_vline) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; - float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); - precompute[i] = (dist < eps) ? 0.0f : 1.0f / dist; - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; - float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; - float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float len2 = bx*bx + by*by; - if (len2 >= eps2) - precompute[i] = 1.0f / len2; - else - precompute[i] = 0.0f; - } else - precompute[i] = 0.0f; - } - - for (y=iy0; y < iy1; ++y) { - for (x=ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float) x + 0.5f; - float sy = (float) y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path - - for (i=0; i < num_verts; ++i) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - - if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; - - float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - // coarse culling against bbox - //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && - // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) - dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; - STBTT_assert(i != 0); - if (dist < min_dist) { - // check position along line - // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) - // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) - float dx = x1-x0, dy = y1-y0; - float px = x0-sx, py = y0-sy; - // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy - // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve - float t = -(px*dx + py*dy) / (dx*dx + dy*dy); - if (t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; - float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; - float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); - float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); - float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); - float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); - // coarse culling against bbox to avoid computing cubic unnecessarily - if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { - int num=0; - float ax = x1-x0, ay = y1-y0; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = {0.f,0.f,0.f}; - float px,py,t,it,dist2; - float a_inv = precompute[i]; - if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula - float a = 3*(ax*bx + ay*by); - float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); - float c = mx*ax+my*ay; - if (STBTT_fabs(a) < eps2) { // if a is 0, it's linear - if (STBTT_fabs(b) >= eps2) { - res[num++] = -c/b; - } - } else { - float discriminant = b*b - 4*a*c; - if (discriminant < 0) - num = 0; - else { - float root = (float) STBTT_sqrt(discriminant); - res[0] = (-b - root)/(2*a); - res[1] = (-b + root)/(2*a); - num = 2; // don't bother distinguishing 1-solution case, as code below will still work - } - } - } else { - float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point - float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; - float d = (mx*ax+my*ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - } - } - } - if (winding == 0) - min_dist = -min_dist; // if outside the shape, value is negative - val = onedge_value + pixel_dist_scale * min_dist; - if (val < 0) - val = 0; - else if (val > 255) - val = 255; - data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - // convert utf16 to utf8 and compare the results while converting - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; // plus another 2 below - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - // is this a Unicode encoding? - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - // if nothing immediately following - if (matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - - -// FULL VERSION HISTORY -// -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public release -// - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/licenses/raw_pdb/LICENSE.txt b/licenses/raw_pdb/LICENSE.txt deleted file mode 100644 index 64f57fd..0000000 --- a/licenses/raw_pdb/LICENSE.txt +++ /dev/null @@ -1,27 +0,0 @@ -// This license belongs to https://github.com/MolecularMatters/raw_pdb - -BSD 2-Clause License - -Copyright 2011-2022, Molecular Matters GmbH -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/simple/LICENSE.txt b/licenses/simple/LICENSE.txt deleted file mode 100644 index 68028c0..0000000 --- a/licenses/simple/LICENSE.txt +++ /dev/null @@ -1,203 +0,0 @@ -// This license belongs to https://github.com/SeaOfNodes/Simple - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/licenses/tb/LICENSE.txt b/licenses/tb/LICENSE.txt deleted file mode 100644 index bc5f291..0000000 --- a/licenses/tb/LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -// This license belongs to https://github.com/RealNeGate/Cuik - -MIT License - -Copyright (c) 2021 Yasser Arguelles Snape - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -- 2.43.0 From 93cf5e791c067f895f6d7033d5e4030690c2a0a3 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 16:19:45 -0600 Subject: [PATCH 13/16] Fix debug compiler release --- ci/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/install.sh b/ci/install.sh index 16cd308..fa90d55 100755 --- a/ci/install.sh +++ b/ci/install.sh @@ -1,7 +1,7 @@ set -eux mkdir -p $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD) if [[ -n "${BUILD_DEBUG:-}" ]]; then - cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Debug/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug + cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Debug/cache/generic/debug_none_di/compiler/debug_none_di/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic_debug fi cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/generic/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_generic cp $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/Release/cache/native/debug_none_di/compiler/aggressively_optimize_for_speed_nodi/compiler $HOME/bloat-buster-artifacts/releases/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/compiler_native -- 2.43.0 From 8bcd41407ecd78c00f458eef935f05e73698a13b Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 16:46:22 -0600 Subject: [PATCH 14/16] Debug realpath --- src/compiler.bbb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/compiler.bbb b/src/compiler.bbb index ebc2abc..e246bf5 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -73,12 +73,26 @@ O = bits u32 _: u9, } +[extern] __errno_location = fn [cc(c)] () &u32; + +Error = enum u32 +{ + success = 0, + perm = 1, +} + +errno = fn () Error +{ + return @enum_from_int(__errno_location().&); +} + [extern] memcmp = fn [cc(c)] (a: &u8, b: &u8, byte_count: usize) int; [extern] memcpy = fn [cc(c)] (destination: &u8, source: &u8, byte_count: u64) &u8; [extern] exit = fn [cc(c)] (exit_code: int) noreturn; [extern] getenv = fn [cc(c)] (env: &u8) &u8; +[extern] getcwd = fn [cc(c)] (pointer: &u8, length: u64) &u8; [extern] realpath = fn [cc(c)] (source_path: &u8, resolved_path: &u8) &u8; [extern] mkdir = fn [cc(c)] (path: &u8, mode: mode_t) int; @@ -437,6 +451,13 @@ os_path_absolute_stack = fn (buffer: []u8, relative_file_path: &u8) []u8 result = c_string_to_slice(syscall_result); assert(result.length < buffer.length); } + else + { + >error = errno(); + >cwd = getcwd(buffer.pointer, buffer.length); + assert(cwd == buffer.pointer); + @trap(); + } return result; } -- 2.43.0 From dd577c2ce75274ad1375fab4ea0e5720ed03fbf0 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 17:37:17 -0600 Subject: [PATCH 15/16] Fix CMAKE_PREFIX_PATH value --- src/compiler.bbb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler.bbb b/src/compiler.bbb index e246bf5..09a0513 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -18398,7 +18398,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >builder: ArgumentBuilder = zero; - add_argument(&builder, arena_join_string(arena, [ CMAKE_PREFIX_PATH, "/bin/llvm-config"][..])); + add_argument(&builder, arena_join_string(arena, [ cmake_prefix_path_definition.value, "/bin/llvm-config"][..])); add_argument(&builder, "--libdir"); add_argument(&builder, "--libs"); add_argument(&builder, "--system-libs"); -- 2.43.0 From 2575d6d027c00eca4ba49f098acd36d7742c6616 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 14:23:18 -0600 Subject: [PATCH 16/16] Delete C++ implementation and dead code --- .gitea/workflows/main.yml | 6 +- .gitea/workflows/pr.yml | 10 +- CMakeLists.txt | 55 - build.sh | 8 +- ci/reproduce.sh | 4 +- generate.sh | 30 +- src/compiler.bbb | 13 +- src/compiler.cpp | 618 --- src/compiler.hpp | 2111 -------- src/emitter.cpp | 10079 ------------------------------------ src/entry_point.cpp | 13 - src/entry_point.hpp | 2 - src/lib.cpp | 233 - src/lib.hpp | 722 --- src/llvm.cpp | 316 -- src/llvm.hpp | 84 - src/parser.cpp | 4066 --------------- 17 files changed, 39 insertions(+), 18331 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100644 src/compiler.cpp delete mode 100644 src/compiler.hpp delete mode 100644 src/emitter.cpp delete mode 100644 src/entry_point.cpp delete mode 100644 src/entry_point.hpp delete mode 100644 src/lib.cpp delete mode 100644 src/lib.hpp delete mode 100644 src/llvm.cpp delete mode 100644 src/llvm.hpp delete mode 100644 src/parser.cpp diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 97de1a7..15c0301 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -10,6 +10,9 @@ on: env: BB_CI: 1 BUILD_DEBUG: 1 + LLVM_VERSION: 20.1.7 + CLANG_PATH: clang-19 + CLANGXX_PATH: clang++-19 jobs: ci: @@ -24,10 +27,7 @@ jobs: - name: Build and test (Packaged LLVM) shell: bash env: - BB_CI: 1 CMAKE_BUILD_TYPE: ${{matrix.BIRTH_CMAKE_BUILD_TYPE}} - CLANG_PATH: clang-19 - CLANGXX_PATH: clang++-19 run: | set -eux ci/reproduce.sh diff --git a/.gitea/workflows/pr.yml b/.gitea/workflows/pr.yml index b973236..055b950 100644 --- a/.gitea/workflows/pr.yml +++ b/.gitea/workflows/pr.yml @@ -5,7 +5,9 @@ on: env: BB_CI: 1 - + CLANG_PATH: clang-19 + CLANGXX_PATH: clang++-19 + LLVM_VERSION: 20.1.7 jobs: ci: strategy: @@ -19,12 +21,8 @@ jobs: - name: Build and test (Packaged LLVM) shell: bash env: - BB_CI: 1 CMAKE_BUILD_TYPE: ${{matrix.BIRTH_CMAKE_BUILD_TYPE}} - CLANG_PATH: clang-19 - CLANGXX_PATH: clang++-19 run: | set -eux ./generate.sh - ./build.sh - ./build/bb test + CMAKE_PREFIX_PATH=$HOME/dev/llvm/install/llvm_${LLVM_VERSION}_x86_64-linux-${CMAKE_BUILD_TYPE} $HOME/bloat-buster-artifacts/releases/main/compiler_generic reproduce diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index a23d9ed..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -cmake_minimum_required(VERSION 3.15) -include(CMakePrintHelpers) - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE) -endif() -# Set C++ standard -set(CMAKE_CXX_STANDARD 23) -set(CMAKE_CXX_STANDARD_REQUIRED YES) -project(bb) - -find_package(LLVM REQUIRED CONFIG) -find_package(LLD REQUIRED CONFIG) - -add_executable(bb - src/lib.cpp - src/entry_point.cpp - src/compiler.cpp - src/parser.cpp - src/emitter.cpp -) - -add_library(c_abi tests/c_abi.c) - -include_directories(src) -add_compile_definitions( - $<$:BB_DEBUG=1> - $<$>:BB_DEBUG=0> -) - -find_library(llvm_bindings NAMES libllvm_bindings.dylib libllvm_bindings.lib libllvm_bindings.a libllvm_bindingsELF.dll.a libllvm_bindingsELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_COMMON NAMES liblldCommon.dylib lldCommon.lib lldCommon.a liblldCommon.dll.a liblldCommon.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_ELF NAMES liblldELF.dylib lldELF.lib lldELF.a liblldELF.dll.a liblldELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) -find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) - -target_link_libraries(bb PUBLIC - ${LLVM_AVAILABLE_LIBS} - ${LLD_COMMON} - ${LLD_COFF} - ${LLD_ELF} - ${LLD_MACHO} - ${LLD_MINGW} - ${LLD_WASM} - ${llvm_bindings} -) - -add_compile_options(-Wall -Wextra -pedantic -Wpedantic -Werror -Wno-c99-extensions -Wno-unused-function -Wno-missing-designated-field-initializers -fno-signed-char -fwrapv -fno-strict-aliasing) -add_compile_definitions(CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}") -add_compile_definitions(BB_CI=${BB_CI}) - -# add_compile_options(-fsanitize=address) -# add_link_options(-fsanitize=address) diff --git a/build.sh b/build.sh index eead4ed..03c172b 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,6 @@ set -eu -cd build -ninja --quiet -cd .. +if [[ -z "${BOOTSTRAP_COMPILER:-}" ]]; then + BOOTSTRAP_COMPILER=$HOME/bloat-buster-artifacts/releases/main/compiler_generic +fi + +$BOOTSTRAP_COMPILER compile src/compiler.bbb diff --git a/ci/reproduce.sh b/ci/reproduce.sh index 7cd3b47..d68a9b8 100755 --- a/ci/reproduce.sh +++ b/ci/reproduce.sh @@ -1,8 +1,6 @@ set -eux rm -rf bb-cache self-hosted-bb-cache || true ./generate.sh -./build.sh -./build/bb test +CMAKE_PREFIX_PATH=$HOME/dev/llvm/install/llvm_${LLVM_VERSION}_x86_64-linux-${CMAKE_BUILD_TYPE} $HOME/bloat-buster-artifacts/releases/main/compiler_generic reproduce mkdir -p $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE mv ./self-hosted-bb-cache $HOME/bloat-buster-artifacts/$(git rev-parse --abbrev-ref HEAD)/$(git rev-parse HEAD)/$CMAKE_BUILD_TYPE/cache - diff --git a/generate.sh b/generate.sh index 94c34f3..74f4091 100755 --- a/generate.sh +++ b/generate.sh @@ -1,6 +1,10 @@ #!/usr/bin/env bash set -eux +if [[ -z "${LLVM_VERSION:-}" ]]; then + LLVM_VERSION=20.1.7 +fi + if [[ -z "${BB_CI:-}" ]]; then BB_CI=0 fi @@ -12,8 +16,6 @@ else LLVM_CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE fi -BUILD_DIR=build - BIRTH_NATIVE_OS_STRING=$OSTYPE case "$BIRTH_NATIVE_OS_STRING" in @@ -31,20 +33,22 @@ case "$BIRTH_NATIVE_ARCH_STRING" in *) exit 1 esac -case "$BIRTH_OS" in - linux) LINKER_TYPE=MOLD;; - *) LINKER_TYPE=DEFAULT;; -esac - -rm -rf $BUILD_DIR -mkdir $BUILD_DIR -cd $BUILD_DIR -LLVM_PREFIX_PATH=$HOME/dev/llvm/install/llvm_20.1.7_$BIRTH_ARCH-$BIRTH_OS-$LLVM_CMAKE_BUILD_TYPE +if [[ -z "${CMAKE_PREFIX_PATH:-}" ]]; then + CMAKE_PREFIX_PATH=$HOME/dev/llvm/install/llvm_${LLVM_VERSION}_${BIRTH_ARCH}-${BIRTH_OS}-${LLVM_CMAKE_BUILD_TYPE} +fi if [[ -z "${CLANG_PATH:-}" ]]; then CLANG_PATH=clang CLANGXX_PATH=clang++ fi -cmake .. -G Ninja -DCMAKE_C_COMPILER=$CLANG_PATH -DCMAKE_CXX_COMPILER=$CLANGXX_PATH -DCMAKE_LINKER_TYPE=$LINKER_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE%%-*} -DCMAKE_PREFIX_PATH=$LLVM_PREFIX_PATH -DCMAKE_COLOR_DIAGNOSTICS=ON -DBB_CI=$BB_CI -cd .. +OPT_ARGS="" + +case "${CMAKE_BUILD_TYPE%%-*}" in + Debug) OPT_ARGS="-O0 -g";; + Release*) OPT_ARGS="-O3";; + *) exit 1;; +esac + +mkdir -p self-hosted-bb-cache +$CLANG_PATH -c tests/c_abi.c -o self-hosted-bb-cache/c_abi.o $OPT_ARGS -std=gnu2x diff --git a/src/compiler.bbb b/src/compiler.bbb index 09a0513..650b67a 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -17151,6 +17151,10 @@ link = fn (module: &Module) void >result = lld_elf_link(linker_arguments.pointer, linker_arguments.length, 1, 0); if (!result.success) { + print(result.stdout); + print("\n"); + print(result.stderr); + print("\n"); @trap(); } } @@ -18364,7 +18368,6 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 >file_content = file_read(arena, relative_file_path); >file_path = path_absolute(arena, relative_file_path.pointer); - >c_abi_object_path = ""; // TODO >definitions: []Definition = zero; >cmake_prefix_path_definition: Definition = { @@ -18382,8 +18385,8 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 } } - >objects = [ output_object_path ][..]; - >c_abi_library = "build/libc_abi.a"; + >object_array = [ output_object_path, "self-hosted-bb-cache/c_abi.o" ]; + >objects = object_array[..1]; >library_buffer: [256][]u8 = undefined; >library_directory: []u8 = zero; @@ -18520,7 +18523,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8 } else if (string_equal(base_name, "tests")) { - library_paths = { .pointer = &c_abi_library, .length = 1 }; + objects = object_array[..]; } >options: CompileOptions = { @@ -18722,6 +18725,8 @@ names: [_][]u8 = ]; >args = arguments[..arguments.length - 1]; >execution = os_execute(arena, args, envp, zero); + print(executable_path); + print("\n"); >success = execution.termination_kind == .exit and execution.termination_code == 0; diff --git a/src/compiler.cpp b/src/compiler.cpp deleted file mode 100644 index 3474afe..0000000 --- a/src/compiler.cpp +++ /dev/null @@ -1,618 +0,0 @@ -#include - -global_variable Slice environment; - -fn void compile(Arena* arena, Options options) -{ - Module module; - auto base_allocation_type_count = i128_offset + // 64 * 2 for basic integer types - 2 + // u128, s128 - 2; // void, noreturn - auto base_type_allocation = arena_allocate(arena, base_allocation_type_count); - - auto* type_it = base_type_allocation.pointer; - - bool signs[] = {false, true}; - Type* previous = 0; - - for (bool sign: signs) - { - for (u32 bit_index = 0; bit_index < 64; bit_index += 1) - { - auto bit_count = bit_index + 1; - auto first_digit = (u8)(bit_count < 10 ? bit_count % 10 + '0' : bit_count / 10 + '0'); - auto second_digit = (u8)(bit_count > 9 ? bit_count % 10 + '0' : 0); - u8 name_buffer[] = { u8(sign ? 's' : 'u'), first_digit, second_digit }; - u64 name_length = 2 + (bit_count > 9); - auto name_stack = String{name_buffer, name_length}; - - auto name = arena_duplicate_string(arena, name_stack); - - *type_it = { - .integer = { - .bit_count = bit_count, - .is_signed = sign, - }, - .id = TypeId::integer, - .name = name, - .scope = &module.scope, - }; - if (previous) previous->next = type_it; - previous = type_it; - type_it += 1; - } - } - - for (bool sign: signs) - { - auto name = sign ? string_literal("s128") : string_literal("u128"); - *type_it = { - .integer = { - .bit_count = 128, - .is_signed = sign, - }, - .id = TypeId::integer, - .name = name, - .next = previous, - .scope = &module.scope, - }; - if (previous) previous->next = type_it; - previous = type_it; - type_it += 1; - } - - auto void_type = type_it; - type_it += 1; - auto noreturn_type = type_it; - type_it += 1; - assert((u64)(type_it - base_type_allocation.pointer) == base_allocation_type_count); - - previous->next = void_type; - *void_type = { - .id = TypeId::void_type, - .name = string_literal("void"), - .next = noreturn_type, - .scope = &module.scope, - }; - *noreturn_type = { - .id = TypeId::noreturn, - .name = string_literal("noreturn"), - .scope = &module.scope, - }; - - module = Module{ - .arena = arena, - .content = options.content, - .scope = { - .types = { - .first = base_type_allocation.pointer, - .last = noreturn_type, - }, - .kind = ScopeKind::global, - }, - .name = options.name, - .path = options.path, - .executable = options.executable, - .objects = options.objects, - .library_directories = options.library_directories, - .library_names = options.library_names, - .library_paths = options.library_paths, - .link_libcpp = options.link_libcpp, - .target = options.target, - .build_mode = options.build_mode, - .has_debug_info = options.has_debug_info, - .silent = options.silent, - }; - module.void_value = new_value(&module); - *module.void_value = { - .type = void_type, - .id = ValueId::infer_or_ignore, - }; - - for (auto definition: options.definitions) - { - auto definition_global = new_global(&module); - auto definition_value = new_value(&module); - auto definition_storage = new_value(&module); - *definition_value = { - .string_literal = definition.value, - .id = ValueId::string_literal, - }; - *definition_storage = { - .id = ValueId::global, - }; - *definition_global = Global{ - .variable = { - .storage = definition_storage, - .initial_value = definition_value, - .type = get_slice_type(&module, uint8(&module)), - .scope = &module.scope, - .name = definition.name, - }, - }; - } - - parse(&module); - emit(&module); -} - -fn String compile_file(Arena* arena, Compile options) -{ - auto relative_file_path = options.relative_file_path; - if (relative_file_path.length < 5) - { - bb_fail(); - } - - auto extension_start = string_last_character(relative_file_path, '.'); - if (extension_start == string_no_match) - { - bb_fail(); - } - - if (!relative_file_path(extension_start).equal(string_literal(".bbb"))) - { - bb_fail(); - } - - auto separator_index = string_last_character(relative_file_path, '/'); - separator_index = separator_index == string_no_match ? 0 : separator_index; - - auto base_start = separator_index + (separator_index != 0 || relative_file_path[separator_index] == '/'); - auto base_name = relative_file_path(base_start, extension_start); - - auto is_compiler = relative_file_path.equal(string_literal("src/compiler.bbb")); - - make_directory(base_cache_dir); - - String cpu_dir_parts[] = { - string_literal(base_cache_dir), - string_literal("/"), - options.host_cpu_model ? string_literal("native") : string_literal("generic"), - }; - - auto cpu_dir = arena_join_string(arena, array_to_slice(cpu_dir_parts)); - - make_directory(cstr(cpu_dir)); - - auto base_dir = cpu_dir; - - if (is_compiler) - { - String compiler_dir_parts[] = { - base_dir, - string_literal("/compiler"), - }; - base_dir = arena_join_string(arena, array_to_slice(compiler_dir_parts)); - make_directory(cstr(base_dir)); - } - - String output_path_dir_parts[] = { - base_dir, - string_literal("/"), - build_mode_to_string(options.build_mode), - string_literal("_"), - options.has_debug_info ? string_literal("di") : string_literal("nodi"), - }; - auto output_path_dir = arena_join_string(arena, array_to_slice(output_path_dir_parts)); - - make_directory(cstr(output_path_dir)); - - String output_path_base_parts[] = { - output_path_dir, - string_literal("/"), - base_name, - }; - auto output_path_base = arena_join_string(arena, array_to_slice(output_path_base_parts)); - String output_object_path_parts[] = { - output_path_base, - string_literal(".o"), - }; - auto output_object_path = arena_join_string(arena, array_to_slice(output_object_path_parts)); - auto output_executable_path = output_path_base; - - auto file_content = file_read(arena, relative_file_path); - auto file_path = path_absolute(arena, relative_file_path); - - Slice definitions = {}; - auto cmake_prefix_path = string_literal(CMAKE_PREFIX_PATH); - auto cmake_prefix_path_definition = Definition{ - .name = string_literal("CMAKE_PREFIX_PATH"), - .value = cmake_prefix_path, - }; - - if (is_compiler) - { - auto cmake_prefix_path_cstr = os_get_environment_variable("CMAKE_PREFIX_PATH"); - if (cmake_prefix_path_cstr) - { - auto cmake_prefix_path_string = c_string_to_slice(cmake_prefix_path_cstr); - cmake_prefix_path_definition.value = cmake_prefix_path_string; - } - } - - String objects[] = { - output_object_path, - }; - Slice object_slice = array_to_slice(objects); - - String c_abi_library = string_literal("build/libc_abi.a"); - String llvm_bindings_library = string_literal("build/libllvm_bindings.a"); - String library_buffer[256]; - String library_directory = {}; - - Slice library_directories = {}; - Slice library_names = {}; - Slice library_paths = {}; - - if (is_compiler) - { - definitions = { .pointer = &cmake_prefix_path_definition, .length = 1 }; - - ArgBuilder builder = {}; - String llvm_config_parts[] = { - cmake_prefix_path, - string_literal("/bin/llvm-config"), - }; - builder.add(arena, arena_join_string(arena, array_to_slice(llvm_config_parts))); - builder.add("--libdir"); - builder.add("--libs"); - builder.add("--system-libs"); - auto arguments = builder.flush(); - auto llvm_config = os_execute(arena, arguments, environment, { - .policies = { ExecuteStandardStreamPolicy::pipe, ExecuteStandardStreamPolicy::ignore }, - }); - auto success = llvm_config.termination_kind == TerminationKind::exit && llvm_config.termination_code == 0; - if (!success) - { - report_error(); - } - - auto stream = llvm_config.streams[0]; - auto line = string_first_character(stream, '\n'); - if (line == string_no_match) - { - report_error(); - } - - library_directory = stream(0, line); - library_directories = { &library_directory, 1 }; - - stream = stream(line + 1); - - line = string_first_character(stream, '\n'); - if (line == string_no_match) - { - report_error(); - } - - auto llvm_library_stream = stream(0, line); - - stream = stream(line + 1); - - u64 library_count = 0; - - while (1) - { - auto space = string_first_character(llvm_library_stream, ' '); - if (space == string_no_match) - { - auto library_argument = llvm_library_stream; - library_buffer[library_count] = library_argument(2); - library_count += 1; - break; - } - - // Omit the first two characters: "-l" - auto library_argument = llvm_library_stream(2, space); - library_buffer[library_count] = library_argument; - library_count += 1; - llvm_library_stream = llvm_library_stream(space + 1); - } - - line = string_first_character(stream, '\n'); - if (line == string_no_match) - { - report_error(); - } - assert(line == stream.length - 1); - auto system_library_stream = stream(0, line); - - while (1) - { - auto space = string_first_character(system_library_stream, ' '); - if (space == string_no_match) - { - auto library_argument = system_library_stream(2); - library_buffer[library_count] = library_argument; - library_count += 1; - break; - } - - // Omit the first two characters: "-l" - auto library_argument = system_library_stream(2, space); - library_buffer[library_count] = library_argument; - library_count += 1; - system_library_stream = system_library_stream(space + 1); - } - - library_buffer[library_count] = string_literal("gcc"); - library_count += 1; - library_buffer[library_count] = string_literal("gcc_s"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldCommon"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldCOFF"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldELF"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldMachO"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldMinGW"); - library_count += 1; - - library_buffer[library_count] = string_literal("lldWasm"); - library_count += 1; - - library_buffer[library_count] = string_literal("llvm_bindings"); - library_count += 1; - - library_names = { library_buffer, library_count }; - } - else if (base_name.equal(string_literal("tests"))) - { - library_paths = { &c_abi_library, 1 }; - } - - compile(arena, { - .content = file_content, - .path = file_path, - .executable = output_executable_path, - .name = base_name, - .definitions = definitions, - .objects = object_slice, - .library_paths = library_paths, - .library_names = library_names, - .library_directories = library_directories, - .link_libcpp = is_compiler, - .target = { - .cpu = CPUArchitecture::x86_64, - .os = OperatingSystem::linux_, - .host_cpu_model = options.host_cpu_model, - }, - .build_mode = options.build_mode, - .has_debug_info = options.has_debug_info, - .silent = options.silent, - }); - - return output_executable_path; -} - -global_variable String names[] = -{ - string_literal("tests"), -}; - -void entry_point(Slice arguments, Slice envp) -{ - environment = envp; - Arena* arena = arena_initialize_default(16 * mb); - - if (arguments.length < 2) - { - bb_fail_with_message(string_literal("error: Not enough arguments\n")); - } - - String command_string = c_string_to_slice(arguments[1]); - String command_strings[] = { - string_literal("compile"), - string_literal("test"), - }; - static_assert(array_length(command_strings) == (u64)Command::count); - - backing_type(Command) i; - for (i = 0; i < (backing_type(Command))Command::count; i += 1) - { - String candidate = command_strings[i]; - if (candidate.equal(command_string)) - { - break; - } - } - - auto command = (Command)i; - - switch (command) - { - case Command::compile: - { - if (arguments.length < 3) - { - bb_fail_with_message(string_literal("Not enough arguments for command 'compile'\n")); - } - - auto build_mode = BuildMode::debug_none; - auto has_debug_info = true; - auto is_host_cpu_model = true; - - if (arguments.length >= 4) - { - auto build_mode_string = c_string_to_slice(arguments[3]); - String build_mode_strings[] = { - string_literal("debug_none"), - string_literal("debug"), - string_literal("soft_optimize"), - string_literal("optimize_for_speed"), - string_literal("optimize_for_size"), - string_literal("aggressively_optimize_for_speed"), - string_literal("aggressively_optimize_for_size"), - }; - - backing_type(BuildMode) i; - for (i = 0; i < (backing_type(BuildMode))BuildMode::count; i += 1) - { - String candidate = build_mode_strings[i]; - if (build_mode_string.equal(candidate)) - { - break; - } - } - - build_mode = (BuildMode)i; - if (build_mode == BuildMode::count) - { - bb_fail_with_message(string_literal("Invalid build mode\n")); - } - } - - if (arguments.length >= 5) - { - auto has_debug_info_string = c_string_to_slice(arguments[4]); - if (has_debug_info_string.equal(string_literal("true"))) - { - has_debug_info = true; - } - else if (has_debug_info_string.equal(string_literal("false"))) - { - has_debug_info = false; - } - else - { - bb_fail_with_message(string_literal("Wrong value for has_debug_info\n")); - } - } - - if (arguments.length >= 6) - { - auto is_host_cpu_model_string = c_string_to_slice(arguments[5]); - if (is_host_cpu_model_string.equal(string_literal("true"))) - { - is_host_cpu_model = true; - } - else if (is_host_cpu_model_string.equal(string_literal("false"))) - { - is_host_cpu_model = false; - } - else - { - bb_fail_with_message(string_literal("Wrong value for is_host_cpu_model\n")); - } - } - - auto relative_file_path = c_string_to_slice(arguments[2]); - - compile_file(arena, { - .relative_file_path = relative_file_path, - .build_mode = build_mode, - .has_debug_info = has_debug_info, - .host_cpu_model = is_host_cpu_model, - .silent = false, - }); - } break; - case Command::test: - { - // TODO: provide more arguments - if (arguments.length != 2) - { - bb_fail_with_message(string_literal("error: 'test' command takes no arguments")); - } - - bool has_debug_info_array[] = {true, false}; - - for (auto name: names) - { - for (BuildMode build_mode = BuildMode::debug_none; build_mode < BuildMode::count; build_mode = (BuildMode)((backing_type(BuildMode))build_mode + 1)) - { - for (bool has_debug_info : has_debug_info_array) - { - auto position = arena->position; - - String relative_file_path_parts[] = { string_literal("tests/"), name, string_literal(".bbb") }; - auto relative_file_path = arena_join_string(arena, array_to_slice(relative_file_path_parts)); - - auto executable_path = compile_file(arena, { - .relative_file_path = relative_file_path, - .build_mode = build_mode, - .has_debug_info = has_debug_info, - .silent = true, - }); - - char* const arguments[] = - { - (char*)executable_path.pointer, - 0, - }; - Slice arg_slice = array_to_slice(arguments); - arg_slice.length -= 1; - auto execution = os_execute(arena, arg_slice, environment, {}); - auto success = execution.termination_kind == TerminationKind::exit && execution.termination_code == 0; - if (!success) - { - print(string_literal("Test failed: ")); - print(executable_path); - print(string_literal("\n")); - bb_fail(); - } - - arena_restore(arena, position); - } - } - } - - BuildMode compiler_build_mode = BuildMode::debug_none; - bool compiler_has_debug_info = true; - auto compiler = compile_file(arena, { - .relative_file_path = string_literal("src/compiler.bbb"), - .build_mode = compiler_build_mode, - .has_debug_info = compiler_has_debug_info, - .host_cpu_model = true, - .silent = true, - }); - - char* const compiler_arguments[] = - { - (char*)compiler.pointer, - (char*)"test", - 0, - }; - Slice arg_slice = array_to_slice(compiler_arguments); - arg_slice.length -= 1; - auto execution = os_execute(arena, arg_slice, environment, {}); - auto success = execution.termination_kind == TerminationKind::exit && execution.termination_code == 0; - if (!success) - { - print(string_literal("Self-hosted tests failed: ")); - print(build_mode_to_string(compiler_build_mode)); - print(compiler_has_debug_info ? string_literal(" with debug info\n") : string_literal(" with no debug info\n")); - bb_fail(); - } - - char* const reproduce_arguments[] = - { - (char*)compiler.pointer, - (char*)"reproduce", - 0, - }; - arg_slice = array_to_slice(reproduce_arguments); - arg_slice.length -= 1; - execution = os_execute(arena, arg_slice, environment, {}); - success = execution.termination_kind == TerminationKind::exit && execution.termination_code == 0; - if (!success) - { - print(string_literal("Self-hosted reproduction failed: ")); - print(build_mode_to_string(compiler_build_mode)); - print(compiler_has_debug_info ? string_literal(" with debug info\n") : string_literal(" with no debug info\n")); - bb_fail(); - } - } break; - case Command::count: - { - bb_fail_with_message(string_literal("error: Invalid command\n")); - } break; - } -} diff --git a/src/compiler.hpp b/src/compiler.hpp deleted file mode 100644 index 50836dd..0000000 --- a/src/compiler.hpp +++ /dev/null @@ -1,2111 +0,0 @@ -#pragma once - -#include -#include -#define report_error() trap() - -enum class Command -{ - compile, - test, - count, -}; - -enum class BuildMode -{ - debug_none, - debug, - soft_optimize, - optimize_for_speed, - optimize_for_size, - aggressively_optimize_for_speed, - aggressively_optimize_for_size, - count, -}; - -global_variable constexpr u64 build_mode_count = (u64)BuildMode::count; - -fn String build_mode_to_string(BuildMode build_mode) -{ - switch (build_mode) - { - case_to_name(BuildMode, debug_none); - case_to_name(BuildMode, debug); - case_to_name(BuildMode, soft_optimize); - case_to_name(BuildMode, optimize_for_speed); - case_to_name(BuildMode, optimize_for_size); - case_to_name(BuildMode, aggressively_optimize_for_speed); - case_to_name(BuildMode, aggressively_optimize_for_size); - case BuildMode::count: unreachable(); - } -} - -fn bool build_mode_is_optimized(BuildMode build_mode) -{ - switch (build_mode) - { - case BuildMode::debug_none: - case BuildMode::debug: - return false; - case BuildMode::soft_optimize: - case BuildMode::optimize_for_speed: - case BuildMode::optimize_for_size: - case BuildMode::aggressively_optimize_for_speed: - case BuildMode::aggressively_optimize_for_size: - return true; - case BuildMode::count: unreachable(); - } -} - -enum class ValueKind -{ - right, - left, -}; - -enum class CPUArchitecture -{ - x86_64, -}; - -enum class OperatingSystem -{ - linux_, -}; - -struct Type; -struct Value; -struct Local; -struct Global; -struct Block; -struct Statement; -struct Variable; -struct Argument; -struct Scope; -struct MacroDeclaration; - -struct DirectAttributes -{ - u32 offset; - u32 alignment; -}; - -struct IndirectAttributes -{ - u32 alignment; - u32 address_space; -}; - -enum class AbiKind : u8 -{ - ignore, - direct, - extend, - indirect, - indirect_aliased, - expand, - coerce_and_expand, - in_alloca, -}; - -struct AbiFlags -{ - AbiKind kind; - bool padding_in_reg; - bool in_alloca_sret; - bool in_alloca_indirect; - bool indirect_by_value; - bool indirect_realign; - bool sret_after_this; - bool in_reg; - bool can_be_flattened; - bool sign_extension; -}; - -struct AbiInformation -{ - Type* semantic_type; - Type* coerce_to_type; - union - { - Type* type; - Type* unpadded_coerce_and_expand_type; - } padding; - u16 padding_argument_index; - union - { - DirectAttributes direct; - IndirectAttributes indirect; - u32 alloca_field_index; - } attributes; - AbiFlags flags; - u16 abi_start; - u16 abi_count; - - inline void set_sret_after_this(bool sret_after_this) - { - assert(flags.kind == AbiKind::indirect); - flags.sret_after_this = sret_after_this; - } - - inline void set_indirect_realign(bool realign) - { - assert(flags.kind == AbiKind::indirect); - flags.indirect_realign = realign; - } - - inline void set_indirect_by_value(bool by_value) - { - assert(flags.kind == AbiKind::indirect); - flags.indirect_by_value = by_value; - } - - inline void set_indirect_align(u32 alignment) - { - assert(flags.kind == AbiKind::indirect || flags.kind == AbiKind::indirect_aliased); - attributes.indirect.alignment = alignment; - } - - inline bool can_have_coerce_to_type() - { - switch (flags.kind) - { - case AbiKind::direct: - case AbiKind::extend: - case AbiKind::coerce_and_expand: - return true; - default: - return false; - } - } - - inline void set_coerce_to_type(Type* coerce_to_type) - { - assert(can_have_coerce_to_type()); - this->coerce_to_type = coerce_to_type; - } - - inline Type* get_coerce_to_type() - { - assert(can_have_coerce_to_type()); - return coerce_to_type; - } - - inline void set_padding_type(Type* padding_type) - { - assert(can_have_padding_type()); - padding = { - .type = padding_type, - }; - } - - inline bool can_have_padding_type() - { - switch (flags.kind) - { - case AbiKind::direct: - case AbiKind::extend: - case AbiKind::indirect: - case AbiKind::indirect_aliased: - case AbiKind::expand: - return true; - default: - return false; - } - } - - inline Type* get_padding_type() - { - return can_have_padding_type() ? padding.type : 0; - } - - inline void set_direct_offset(u32 offset) - { - assert(flags.kind == AbiKind::direct || flags.kind == AbiKind::extend); - attributes.direct.offset = offset; - } - - inline void set_direct_alignment(u32 alignment) - { - assert(flags.kind == AbiKind::direct || flags.kind == AbiKind::extend); - attributes.direct.alignment = alignment; - } - - inline void set_can_be_flattened(bool can_be_flattened) - { - assert(flags.kind == AbiKind::direct); - flags.can_be_flattened = can_be_flattened; - } - - inline bool get_can_be_flattened() - { - return flags.can_be_flattened; - } -}; - -struct Target -{ - CPUArchitecture cpu; - OperatingSystem os; - bool host_cpu_model; -}; - -fn Target target_get_native() -{ - return { - .cpu = CPUArchitecture::x86_64, - .os = OperatingSystem::linux_, - }; -} - -fn bool target_compare(Target a, Target b) -{ - auto is_same_cpu = a.cpu == b.cpu; - auto is_same_os = a.os == b.os; - - return is_same_cpu && is_same_os; -} - -struct Compile -{ - String relative_file_path; - BuildMode build_mode; - bool has_debug_info; - bool host_cpu_model; - bool silent; -}; - -#define base_cache_dir "bb-cache" - -enum class CallingConvention -{ - c, - count, -}; - -enum class ResolvedCallingConvention -{ - system_v, - win64, - count, -}; - -fn ResolvedCallingConvention resolve_calling_convention(CallingConvention cc) -{ - switch (cc) - { - case CallingConvention::c: - // TODO: - return ResolvedCallingConvention::system_v; - case CallingConvention::count: unreachable(); - } -} - -enum class InlineBehavior -{ - normal, - always_inline, - no_inline, - inline_hint, -}; - -struct FunctionAttributes -{ - InlineBehavior inline_behavior; - bool naked; -}; - -enum class TypeId -{ - void_type, - noreturn, - forward_declaration, - integer, - function, - pointer, - array, - enumerator, - structure, - bits, - alias, - union_type, - unresolved, - vector, - floating_point, - enum_array, - opaque, -}; - -struct TypeInteger -{ - u64 bit_count; - bool is_signed; -}; - -struct AbiRegisterCountSystemV -{ - u32 gpr; - u32 sse; -}; - -union AbiRegisterCount -{ - AbiRegisterCountSystemV system_v; -}; - -struct TypeFunctionBase -{ - Type* semantic_return_type; - Slice semantic_argument_types; - CallingConvention calling_convention; - bool is_variable_arguments; -}; - -struct TypeFunctionAbi -{ - Slice abi_argument_types; - Type* abi_return_type; - AbiRegisterCount available_registers; - Slice argument_abis; - AbiInformation return_abi; -}; - -struct TypeFunction -{ - TypeFunctionBase base; - TypeFunctionAbi abi; - Type* next; -}; - -struct TypePointer -{ - Type* element_type; - Type* next; -}; - -struct TypeArray -{ - Type* element_type; - u64 element_count; - Type* next; -}; - -struct UnresolvedEnumField -{ - String name; - Value* value; -}; - -struct EnumField -{ - String name; - u64 value; -}; - -struct UnresolvedTypeEnum -{ - Slice fields; - Type* backing_type; - u32 line; - bool implicit_backing_type; - Type* resolved_type; -}; - -struct TypeEnum -{ - Slice fields; - Type* backing_type; - LLVMValueRef enum_to_string_function; - LLVMValueRef string_to_enum_function; - Type* string_to_enum_struct_type; - Global* name_array; - u32 line; -}; - -struct Field -{ - String name; - Type* type; - u64 offset; - u32 line; -}; - -struct TypeStruct -{ - Slice fields; - u64 byte_size; - u32 byte_alignment; - u32 line; - bool is_slice; - Type* next; -}; - -struct TypeBits -{ - Slice fields; - Type* backing_type; - u32 line; - bool is_implicit_backing_type; -}; - -struct TypeAlias -{ - Type* type; - Scope* scope; - u32 line; -}; - -struct UnionField -{ - Type* type; - String name; - u32 line; -}; - -struct TypeUnion -{ - Slice fields; - u64 byte_size; - u32 byte_alignment; - u32 line; - u32 biggest_field; -}; - -struct LLVMType -{ - LLVMTypeRef abi; - LLVMTypeRef memory; - LLVMMetadataRef debug; -}; - -struct TypeEnumArray -{ - Type* enum_type; - Type* element_type; - Type* next; -}; - -struct Type -{ - union - { - TypeInteger integer; - TypeFunction function; - TypePointer pointer; - TypeArray array; - TypeEnum enumerator; - TypeStruct structure; - TypeBits bits; - TypeAlias alias; - TypeUnion union_type; - TypeEnumArray enum_array; - }; - TypeId id; - String name; - Type* next; - Scope* scope; - LLVMType llvm; -}; - -fn u32 align_bit_count(u32 bit_count) -{ - auto aligned_bit_count = MAX(8, next_power_of_two(bit_count)); - assert(aligned_bit_count % 8 == 0); - return aligned_bit_count; -} - -fn u32 aligned_byte_count_from_bit_count(u32 bit_count) -{ - auto aligned_bit_count = align_bit_count(bit_count); - return aligned_bit_count / 8; -} - -fn u64 get_byte_size(Type* type) -{ - switch (type->id) - { - case TypeId::integer: - { - auto byte_count = aligned_byte_count_from_bit_count(type->integer.bit_count); - assert(byte_count == 1 || byte_count == 2 || byte_count == 4 || byte_count == 8 || byte_count == 16); - return byte_count; - } break; - case TypeId::pointer: - { - return 8; - } break; - case TypeId::array: - { - auto element_type = type->array.element_type; - auto element_size = get_byte_size(element_type); - auto element_count = type->array.element_count; - auto result = element_size * element_count; - return result; - } break; - case TypeId::structure: - { - auto result = type->structure.byte_size; - return result; - } break; - case TypeId::enumerator: - { - auto result = get_byte_size(type->enumerator.backing_type); - return result; - } break; - case TypeId::bits: - { - auto result = get_byte_size(type->bits.backing_type); - return result; - } break; - case TypeId::alias: - { - auto result = get_byte_size(type->alias.type); - return result; - } break; - case TypeId::union_type: - { - auto result = type->union_type.byte_size; - return result; - } break; - case TypeId::enum_array: - { - auto enum_type = type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - auto element_count = enum_type->enumerator.fields.length; - auto element_type = type->enum_array.element_type; - auto element_size = get_byte_size(element_type); - - auto result = element_size * element_count; - return result; - } break; - default: trap(); - } -} - -fn u32 get_byte_alignment(Type* type) -{ - switch (type->id) - { - case TypeId::integer: - { - auto aligned_byte_count = aligned_byte_count_from_bit_count(type->integer.bit_count); - assert(aligned_byte_count == 1 || aligned_byte_count == 2 || aligned_byte_count == 4 || aligned_byte_count == 8 || aligned_byte_count == 16); - return aligned_byte_count; - } break; - case TypeId::array: - { - auto element_type = type->array.element_type; - auto result = get_byte_alignment(element_type); - return result; - } break; - case TypeId::structure: - { - auto result = type->structure.byte_alignment; - return result; - } break; - case TypeId::enumerator: - { - auto result = get_byte_alignment(type->enumerator.backing_type); - return result; - } break; - case TypeId::pointer: - case TypeId::opaque: - { - return 8; - } break; - case TypeId::bits: - { - auto result = get_byte_alignment(type->bits.backing_type); - return result; - } break; - case TypeId::union_type: - { - return type->union_type.byte_alignment; - } break; - case TypeId::alias: - { - return get_byte_alignment(type->alias.type); - } break; - case TypeId::enum_array: - { - return get_byte_alignment(type->enum_array.element_type); - } break; - case TypeId::function: - { - return 1; - } break; - default: trap(); - } -} - -fn u64 get_bit_size(Type* type) -{ - switch (type->id) - { - case TypeId::integer: return type->integer.bit_count; - case TypeId::enumerator: return get_bit_size(type->enumerator.backing_type); - case TypeId::alias: return get_bit_size(type->alias.type); - case TypeId::array: return get_byte_size(type->array.element_type) * type->array.element_count * 8; - case TypeId::pointer: return 64; - case TypeId::structure: return type->structure.byte_size * 8; - case TypeId::union_type: return type->union_type.byte_size * 8; - case TypeId::enum_array: return get_byte_size(type->enum_array.element_type) * type->enum_array.enum_type->enumerator.fields.length * 8; - default: trap(); - } -} - -struct TypeList -{ - Type* first; - Type* last; -}; - -enum class ScopeKind -{ - global, - function, - local, - for_each, - macro_declaration, - macro_instantiation, -}; - -struct Scope -{ - TypeList types; - Scope* parent; - u32 line; - u32 column; - ScopeKind kind; - LLVMMetadataRef llvm; -}; - -struct SourceLocation -{ - Scope* scope; - u32 line; - u32 column; -}; - -enum class StatementId -{ - local, - expression, - return_st, - assignment, - if_st, - block, - while_st, - switch_st, - for_each, - break_st, - continue_st, -}; - -enum class StatementAssignmentId -{ - assign, - assign_add, - assign_sub, - assign_mul, - assign_div, - assign_rem, - assign_shift_left, - assign_shift_right, - assign_and, - assign_or, - assign_xor, -}; - -struct StatementAssignment -{ - Value* left; - Value* right; - StatementAssignmentId id; -}; - -struct StatementIf -{ - Value* condition; - Statement* if_statement; - Statement* else_statement; -}; - -struct StatementWhile -{ - Value* condition; - Block* block; -}; - -enum class ClauseDiscriminantId -{ - single, - range, -}; - -struct ClauseDiscriminant -{ - union - { - Value* single; - Value* range[2]; - }; - ClauseDiscriminantId id; -}; - -struct StatementSwitchClause -{ - Slice values; - Block* block; - LLVMBasicBlockRef basic_block; -}; - -struct StatementSwitch -{ - Value* discriminant; - Slice clauses; -}; - -enum class ForEachKind -{ - slice, - range, -}; - -struct StatementForEach -{ - Local* first_local; - Local* last_local; - Slice left_values; - Slice right_values; - Statement* predicate; - Scope scope; - ForEachKind kind; -}; - -struct Statement -{ - union - { - Local* local; - Value* expression; - Value* return_st; - StatementAssignment assignment; - StatementIf if_st; - Block* block; - StatementWhile while_st; - StatementSwitch switch_st; - StatementForEach for_each; - }; - Statement* next; - StatementId id; - u32 line; - u32 column; -}; - -struct Block -{ - Local* first_local; - Local* last_local; - Statement* first_statement; - Scope scope; -}; - -enum class ValueId -{ - infer_or_ignore, - forward_declared_function, - function, - constant_integer, - unary, - binary, - unary_type, - variable_reference, - macro_reference, - macro_instantiation, - call, - global, - array_initialization, - array_expression, - slice_expression, - enum_literal, - trap, - field_access, - string_literal, - va_start, - va_arg, - aggregate_initialization, - undefined, - unreachable, - zero, - select, - string_to_enum, - local, - argument, - build_mode, - has_debug_info, - field_parent_pointer, -}; - -struct ValueConstantInteger -{ - u64 value; - bool is_signed; -}; - -struct FunctionLLVM -{ - LLVMValueRef alloca_insertion_point; - LLVMBasicBlockRef return_block; - LLVMValueRef return_alloca; -}; - -struct ValueFunction -{ - Slice arguments; - Scope scope; - Block* block; - FunctionAttributes attributes; - FunctionLLVM llvm; -}; - -enum class UnaryId -{ - minus, - plus, - ampersand, - exclamation, - enum_name, - extend, - truncate, - pointer_cast, - int_from_enum, - int_from_pointer, - va_end, - bitwise_not, - dereference, - pointer_from_int, - enum_from_int, - leading_zeroes, - trailing_zeroes, -}; - -struct ValueUnary -{ - Value* value; - UnaryId id; -}; - -enum class UnaryTypeId -{ - align_of, - byte_size, - enum_names, - enum_values, - integer_max, -}; - -struct ValueUnaryType -{ - Type* type; - UnaryTypeId id; -}; - -enum class BinaryId -{ - add, - sub, - mul, - div, - rem, - bitwise_and, - bitwise_or, - bitwise_xor, - shift_left, - shift_right, - compare_equal, - compare_not_equal, - compare_greater, - compare_less, - compare_greater_equal, - compare_less_equal, - logical_and, - logical_or, - logical_and_shortcircuit, - logical_or_shortcircuit, - max, - min, -}; - -struct ValueBinary -{ - Value* left; - Value* right; - BinaryId id; -}; - -struct ValueCall -{ - Value* callable; - Slice arguments; - Type* function_type; -}; - -struct ValueArrayInitialization -{ - Slice values; - bool is_constant; -}; - -struct ValueArrayExpression -{ - Value* array_like; - Value* index; -}; - -struct ValueFieldAccess -{ - Value* aggregate; - String field_name; -}; - -struct ValueSliceExpression -{ - Value* array_like; - Value* start; - Value* end; -}; - -struct ValueVaArg -{ - Value* va_list; - Type* type; -}; - -struct AggregateInitializationElement -{ - String name; - Value* value; - u32 line; - u32 column; -}; - -struct ValueAggregateInitialization -{ - Slice elements; - Scope* scope; - bool is_constant; - bool zero; -}; - -struct ValueSelect -{ - Value* condition; - Value* true_value; - Value* false_value; -}; - -struct ValueStringToEnum -{ - Type* type; - Value* string; -}; - -enum class ConstantArgumentId -{ - value, - type, -}; - -struct ConstantArgument -{ - String name; - union - { - Type* type; - Value* value; - }; - ConstantArgumentId id; -}; - -struct MacroDeclaration -{ - Slice arguments; - Slice constant_arguments; - Type* return_type; - Block* block; - String name; - Scope scope; - MacroDeclaration* next; - - bool is_generic() - { - return constant_arguments.length != 0; - } -}; - -struct MacroInstantiation -{ - MacroDeclaration* declaration; - Global* instantiation_function; - Slice declaration_arguments; - Slice instantiation_arguments; - Slice constant_arguments; - Type* return_type; - Block* block; - Scope scope; - u32 line; - u32 column; - LLVMValueRef return_alloca; - LLVMBasicBlockRef return_block; -}; - -struct FieldParentPointer -{ - Value* pointer; - String name; -}; - -fn bool variable_is_constant(Value* value); - -struct Value -{ - union - { - ValueConstantInteger constant_integer; - ValueFunction function; - ValueUnary unary; - ValueBinary binary; - Variable* variable_reference; - ValueUnaryType unary_type; - ValueCall call; - ValueArrayInitialization array_initialization; - ValueArrayExpression array_expression; - String enum_literal; - ValueFieldAccess field_access; - ValueSliceExpression slice_expression; - String string_literal; - ValueVaArg va_arg; - ValueAggregateInitialization aggregate_initialization; - ValueSelect select; - ValueStringToEnum string_to_enum; - MacroDeclaration* macro_reference; - MacroInstantiation macro_instantiation; - FieldParentPointer field_parent_pointer; - }; - Type* type; - ValueId id; - ValueKind kind; - LLVMValueRef llvm; - - bool is_constant() - { - switch (id) - { - case ValueId::constant_integer: - case ValueId::enum_literal: - case ValueId::unary_type: - case ValueId::string_literal: - case ValueId::zero: - return true; - case ValueId::unary: - return unary.value->is_constant(); - case ValueId::binary: - return binary.left->is_constant() && binary.right->is_constant(); - case ValueId::field_access: - case ValueId::array_expression: - case ValueId::call: - case ValueId::select: - case ValueId::slice_expression: - return false; - case ValueId::variable_reference: - { - return variable_is_constant(this); - } break; - case ValueId::array_initialization: - { - assert(type); // This asserts that the value type has been analyzed and `is_constant` was properly set - return array_initialization.is_constant; - } break; - case ValueId::aggregate_initialization: - { - assert(type); // This asserts that the value type has been analyzed and `is_constant` was properly set - return aggregate_initialization.is_constant; - } break; - default: trap(); - } - } -}; - -struct Variable -{ - Value* storage; - Value* initial_value; - Type* type; - Scope* scope; - String name; - u32 line; - u32 column; -}; - -fn bool variable_is_constant(Value* value) -{ - assert(value->id == ValueId::variable_reference); - auto* variable = value->variable_reference; - - switch (value->kind) - { - case ValueKind::left: - { - switch (variable->scope->kind) - { - case ScopeKind::global: - return true; - default: - return false; - } - } break; - case ValueKind::right: - return false; - } -} - -enum class Linkage -{ - internal, - external, -}; - -struct Global -{ - Variable variable; - Linkage linkage; - bool emitted; - Global* next; -}; - -struct Local -{ - Variable variable; - Local* next; -}; - -struct Argument -{ - Variable variable; - u32 index; -}; - -struct LLVMIntrinsicId -{ - u32 n; -}; - -enum class IntrinsicIndex -{ - clz, - ctz, - smax, - smin, - trap, - umax, - umin, - va_start, - va_end, - va_copy, - count, -}; - -global_variable String intrinsic_names[] = { - string_literal("llvm.ctlz"), - string_literal("llvm.cttz"), - string_literal("llvm.smax"), - string_literal("llvm.smin"), - string_literal("llvm.trap"), - string_literal("llvm.umax"), - string_literal("llvm.umin"), - string_literal("llvm.va_start"), - string_literal("llvm.va_end"), - string_literal("llvm.va_copy"), -}; - -static_assert(array_length(intrinsic_names) == (u64)IntrinsicIndex::count); - -struct LLVMAttributeId -{ - u32 n; -}; - -enum class AttributeIndex -{ - align, - alwaysinline, - byval, - dead_on_unwind, - inlinehint, - inreg, - naked, - noalias, - noinline, - noreturn, - nounwind, - signext, - sret, - writable, - zeroext, - - count, -}; - -global_variable String attribute_names[] = { - string_literal("align"), - string_literal("alwaysinline"), - string_literal("byval"), - string_literal("dead_on_unwind"), - string_literal("inlinehint"), - string_literal("inreg"), - string_literal("naked"), - string_literal("noalias"), - string_literal("noinline"), - string_literal("noreturn"), - string_literal("nounwind"), - string_literal("signext"), - string_literal("sret"), - string_literal("writable"), - string_literal("zeroext"), -}; - -static_assert(array_length(attribute_names) == (u64)AttributeIndex::count); - -struct ModuleLLVM -{ - LLVMContextRef context; - LLVMModuleRef module; - LLVMBuilderRef builder; - LLVMDIBuilderRef di_builder; - LLVMMetadataRef file; - LLVMTargetMachineRef target_machine; - LLVMTargetDataRef target_data; - LLVMMetadataRef compile_unit; - LLVMTypeRef pointer_type; - LLVMTypeRef void_type; - LLVMIntrinsicId intrinsic_table[(u64)IntrinsicIndex::count]; - LLVMAttributeId attribute_table[(u64)AttributeIndex::count]; - LLVMValueRef memcmp; - LLVMMetadataRef inlined_at; - LLVMBasicBlockRef continue_block; - LLVMBasicBlockRef exit_block; - u32 debug_tag; -}; - -struct Definition -{ - String name; - String value; -}; - -struct Module -{ - Arena* arena; - String content; - u64 offset; - u64 line_offset; - u64 line_character_offset; - - Type* first_pointer_type; - Type* first_slice_type; - Type* first_pair_struct_type; - Type* first_array_type; - Type* first_enum_array_type; - Type* first_function_type; - - Type* va_list_type; - Type* build_mode_enum; - - Value* void_value; - Global* first_global; - Global* last_global; - Global* current_function; - MacroDeclaration* first_macro_declaration; - MacroDeclaration* last_macro_declaration; - MacroDeclaration* current_macro_declaration; - MacroInstantiation* current_macro_instantiation; - - ModuleLLVM llvm; - Scope scope; - - String name; - String path; - String executable; - - Slice objects; - Slice library_directories; - Slice library_names; - Slice library_paths; - bool link_libc = true; - bool link_libcpp = false; - - Target target; - BuildMode build_mode; - bool has_debug_info; - bool silent; -}; - -constexpr u64 i128_offset = 64 * 2; -constexpr u64 void_offset = i128_offset + 2; - -fn Type* integer_type(Module* module, TypeInteger integer) -{ - assert(integer.bit_count); - assert(integer.bit_count <= 64 || integer.bit_count == 128); - if (integer.is_signed) - { - assert(integer.bit_count > 1); - } - auto index = integer.bit_count == 128 ? (i128_offset + integer.is_signed) : (integer.bit_count - 1 + (64 * integer.is_signed)); - auto* result_type = module->scope.types.first + index; - assert(result_type->id == TypeId::integer); - assert(result_type->integer.bit_count == integer.bit_count); - assert(result_type->integer.is_signed == integer.is_signed); - return result_type; -} - -fn Type* void_type(Module* module) -{ - return module->scope.types.first + void_offset; -} - -fn Type* noreturn_type(Module* module) -{ - return void_type(module) + 1; -} - -fn Type* uint1(Module* module) -{ - return integer_type(module, { .bit_count = 1, .is_signed = false }); -} - -fn Type* uint8(Module* module) -{ - return integer_type(module, { .bit_count = 8, .is_signed = false }); -} - -fn Type* uint32(Module* module) -{ - return integer_type(module, { .bit_count = 32, .is_signed = false }); -} - -fn Type* uint64(Module* module) -{ - return integer_type(module, { .bit_count = 64, .is_signed = false }); -} - -fn Type* sint32(Module* module) -{ - return integer_type(module, { .bit_count = 32, .is_signed = true }); -} - -fn Type* sint64(Module* module) -{ - return integer_type(module, { .bit_count = 64, .is_signed = true }); -} - -struct Options -{ - String content; - String path; - String executable; - String name; - Slice definitions; - Slice objects; - Slice library_paths; - Slice library_names; - Slice library_directories; - bool link_libcpp; - Target target; - BuildMode build_mode; - bool has_debug_info; - bool silent; -}; - -fn Type* type_allocate_init(Module* module, Type type) -{ - auto* result = &arena_allocate(module->arena, 1)[0]; - *result = type; - - auto scope = type.scope; - assert(scope); - - if (scope->types.last) - { - assert(scope->types.first); - scope->types.last->next = result; - scope->types.last = result; - } - else - { - assert(!scope->types.first); - scope->types.first = result; - scope->types.last = result; - } - - return result; -} - -fn Value* new_value(Module* module) -{ - auto* result = &arena_allocate(module->arena, 1)[0]; - return result; -} - -fn Slice new_value_array(Module* module, u64 count) -{ - auto result = arena_allocate(module->arena, count); - return result; -} - -fn Slice new_type_array(Module* module, u64 count) -{ - auto result = arena_allocate(module->arena, count); - return result; -} - -fn Global* new_global(Module* module) -{ - auto* result = &arena_allocate(module->arena, 1)[0]; - - if (module->last_global) - { - module->last_global->next = result; - module->last_global = result; - } - else - { - assert(!module->first_global); - module->first_global = result; - module->last_global = result; - } - - return result; -} - -fn Type* get_pointer_type(Module* module, Type* element_type) -{ - auto last_pointer_type = module->first_pointer_type; - while (last_pointer_type) - { - assert(last_pointer_type->id == TypeId::pointer); - if (last_pointer_type->pointer.element_type == element_type) - { - return last_pointer_type; - } - - if (!last_pointer_type->pointer.next) - { - break; - } - - last_pointer_type = last_pointer_type->pointer.next; - } - - String name_parts[] = { - string_literal("&"), - element_type->name, - }; - - auto result = type_allocate_init(module, { - .pointer = { - .element_type = element_type, - }, - .id = TypeId::pointer, - .name = arena_join_string(module->arena, array_to_slice(name_parts)), - .scope = element_type->scope, - }); - - if (last_pointer_type) - { - assert(module->first_pointer_type); - last_pointer_type->pointer.next = result; - } - else - { - assert(!module->first_pointer_type); - module->first_pointer_type = result; - } - - return result; -} - -fn bool is_slice(Type* type) -{ - switch (type->id) - { - case TypeId::structure: - { - return type->structure.is_slice; - } - default: return false; - } -} - -fn Type* get_slice_type(Module* module, Type* element_type) -{ - Type* slice_type = module->first_slice_type; - - if (slice_type) - { - while (1) - { - assert(is_slice(slice_type)); - assert(slice_type->structure.fields.length == 2); - auto* pointer_type = slice_type->structure.fields[0].type; - assert(pointer_type->id == TypeId::pointer); - auto* candidate_element_type = pointer_type->pointer.element_type; - if (candidate_element_type == element_type) - { - return slice_type; - } - - if (!slice_type->structure.next) - { - break; - } - - slice_type = slice_type->structure.next; - } - } - - Type* last_slice_type = slice_type; - auto fields = arena_allocate(module->arena, 2); - fields[0] = { - .name = string_literal("pointer"), - .type = get_pointer_type(module, element_type), - .offset = 0, - .line = 0, - }; - fields[1] = { - .name = string_literal("length"), - .type = uint64(module), - .offset = 8, - .line = 0, - }; - String name_parts[] = { - string_literal("[]"), - element_type->name, - }; - - auto result = type_allocate_init(module, { - .structure = { - .fields = fields, - .byte_size = 16, - .byte_alignment = 8, - .line = 0, - .is_slice = true, - }, - .id = TypeId::structure, - .name = arena_join_string(module->arena, array_to_slice(name_parts)), - .scope = element_type->scope, - }); - - if (last_slice_type) - { - last_slice_type->structure.next = result; - } - else - { - module->first_slice_type = result; - } - - return result; -} - -fn String array_name(Module* module, Type* element_type, u64 element_count) -{ - u8 buffer[512]; - auto buffer_slice = String{ .pointer = buffer, .length = array_length(buffer) }; - - u64 i = 0; - - buffer[i] = '['; - i += 1; - - i += format_integer_decimal(buffer_slice(i), element_count); - - buffer[i] = ']'; - i += 1; - - auto element_name = element_type->name; - memcpy(buffer + i, element_name.pointer, element_name.length); - i += element_name.length; - - auto name = arena_duplicate_string(module->arena, buffer_slice(0, i)); - return name; -} - -fn Type* get_array_type(Module* module, Type* element_type, u64 element_count) -{ - assert(element_type); - assert(element_count); - - Type* array_type = module->first_array_type; - - if (array_type) - { - while (1) - { - assert(array_type->id == TypeId::array); - auto* candidate_element_type = array_type->array.element_type; - auto candidate_element_count = array_type->array.element_count; - - if (candidate_element_type == element_type && candidate_element_count == element_count) - { - return array_type; - } - - if (!array_type->array.next) - { - break; - } - - array_type = array_type->array.next; - } - } - - Type* last_array_type = array_type; - - auto result = type_allocate_init(module, { - .array = { - .element_type = element_type, - .element_count = element_count, - }, - .id = TypeId::array, - .name = array_name(module, element_type, element_count), - .scope = element_type->scope, - }); - - if (last_array_type) - { - last_array_type->array.next = result; - } - else - { - module->first_array_type = result; - } - - return result; -} - -fn Block* scope_to_block(Scope* scope) -{ - assert(scope->kind == ScopeKind::local); - auto byte_offset = offsetof(Block, scope); - auto result = (Block*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::local); - return result; -} - -fn StatementForEach* scope_to_for_each(Scope* scope) -{ - assert(scope->kind == ScopeKind::for_each); - auto byte_offset = offsetof(StatementForEach, scope); - auto result = (StatementForEach*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::for_each); - return result; -} - -fn MacroDeclaration* scope_to_macro_declaration(Scope* scope) -{ - assert(scope->kind == ScopeKind::macro_declaration); - auto byte_offset = offsetof(MacroDeclaration, scope); - auto result = (MacroDeclaration*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::macro_declaration); - return result; -} - -fn MacroInstantiation* scope_to_macro_instantiation(Scope* scope) -{ - assert(scope->kind == ScopeKind::macro_instantiation); - auto byte_offset = offsetof(MacroInstantiation, scope); - auto result = (MacroInstantiation*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::macro_instantiation); - return result; -} - -fn ValueFunction* scope_to_function(Scope* scope) -{ - assert(scope->kind == ScopeKind::function); - auto byte_offset = offsetof(ValueFunction, scope); - auto result = (ValueFunction*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::function); - return result; -} - -fn Module* scope_to_module(Scope* scope) -{ - assert(scope->kind == ScopeKind::global); - auto byte_offset = offsetof(Module, scope); - auto result = (Module*)((u8*)scope - byte_offset); - assert(result->scope.kind == ScopeKind::global); - return result; -} - -fn Value* reference_identifier(Module* module, Scope* current_scope, String identifier, ValueKind kind) -{ - assert(!identifier.equal(string_literal(""))); - assert(!identifier.equal(string_literal("_"))); - - Variable* variable = 0; - - for (Scope* scope = current_scope; scope && !variable; scope = scope->parent) - { - switch (scope->kind) - { - case ScopeKind::global: - { - assert(module == scope_to_module(scope)); - - for (Global* global = module->first_global; global; global = global->next) - { - if (identifier.equal(global->variable.name)) - { - variable = &global->variable; - break; - } - } - - for (MacroDeclaration* macro_declaration = module->first_macro_declaration; macro_declaration; macro_declaration = macro_declaration->next) - { - if (identifier.equal(macro_declaration->name)) - { - auto result = new_value(module); - *result = { - .macro_reference = macro_declaration, - .id = ValueId::macro_reference, - }; - return result; - } - } - } break; - case ScopeKind::function: - { - assert(scope->parent); - auto function = scope_to_function(scope); - for (auto& argument: function->arguments) - { - if (identifier.equal(argument.variable.name)) - { - variable = &argument.variable; - break; - } - } - } break; - case ScopeKind::local: - { - assert(scope->parent); - assert(scope->parent->kind != ScopeKind::global); - - auto block = scope_to_block(scope); - for (Local* local = block->first_local; local; local = local->next) - { - assert(!local->next || block->last_local != local); - if (identifier.equal(local->variable.name)) - { - variable = &local->variable; - break; - } - } - } break; - case ScopeKind::for_each: - { - assert(scope->parent); - auto for_each = scope_to_for_each(scope); - - for (Local* local = for_each->first_local; local; local = local->next) - { - if (identifier.equal(local->variable.name)) - { - variable = &local->variable; - break; - } - } - } break; - case ScopeKind::macro_declaration: - { - assert(scope->parent); - auto macro_declaration = scope_to_macro_declaration(scope); - - for (auto& constant_argument: macro_declaration->constant_arguments) - { - if (identifier.equal(constant_argument.name)) - { - trap(); - } - } - - for (auto& argument: macro_declaration->arguments) - { - if (identifier.equal(argument.variable.name)) - { - variable = &argument.variable; - break; - } - } - } break; - case ScopeKind::macro_instantiation: - { - assert(scope->parent); - auto macro_instantiation = scope_to_macro_instantiation(scope); - - for (auto& argument : macro_instantiation->declaration_arguments) - { - if (identifier.equal(argument.variable.name)) - { - variable = &argument.variable; - break; - } - } - } break; - } - } - - if (variable) - { - auto result = new_value(module); - *result = { - .variable_reference = variable, - .id = ValueId::variable_reference, - .kind = kind, - }; - return result; - } - else - { - report_error(); - } -} - -fn Local* new_local(Module* module, Scope* scope) -{ - auto* result = &arena_allocate(module->arena, 1)[0]; - *result = {}; - - switch (scope->kind) - { - case ScopeKind::local: - { - auto block = scope_to_block(scope); - if (block->last_local) - { - block->last_local->next = result; - block->last_local = result; - } - else - { - block->first_local = result; - block->last_local = result; - } - } break; - case ScopeKind::for_each: - { - auto for_each = scope_to_for_each(scope); - if (for_each->last_local) - { - for_each->last_local->next = result; - for_each->last_local = result; - } - else - { - for_each->first_local = result; - for_each->last_local = result; - } - } break; - default: report_error(); - } - - return result; -} - -fn Type* get_enum_array_type(Module* module, Type* enum_type, Type* element_type) -{ - assert(enum_type); - assert(element_type); - - Type* last_enum_type = module->first_enum_array_type; - - if (last_enum_type) - { - while (1) - { - assert(last_enum_type->id == TypeId::enum_array); - - if (last_enum_type->enum_array.enum_type == enum_type && last_enum_type->enum_array.element_type == element_type) - { - return last_enum_type; - } - - auto next = last_enum_type->enum_array.next; - if (!next) - { - break; - } - - last_enum_type = next; - } - } - - String name_parts[] = { - string_literal("enum_array["), - enum_type->name, - string_literal("]("), - element_type->name, - string_literal(")"), - }; - - assert(enum_type->scope); - assert(element_type->scope); - - auto scope = element_type->scope->kind == ScopeKind::global ? enum_type->scope : element_type->scope; - - auto enum_array_type = type_allocate_init(module, { - .enum_array = { - .enum_type = enum_type, - .element_type = element_type, - }, - .id = TypeId::enum_array, - .name = arena_join_string(module->arena, array_to_slice(name_parts)), - .scope = scope, - }); - return enum_array_type; -} - -fn Type* resolve_alias(Module* module, Type* type) -{ - Type* result_type = 0; - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - case TypeId::integer: - case TypeId::enumerator: - case TypeId::function: - case TypeId::bits: - case TypeId::union_type: - case TypeId::opaque: - case TypeId::forward_declaration: - { - result_type = type; - } break; - case TypeId::pointer: - { - auto* element_type = type->pointer.element_type; - auto* resolved_element_type = resolve_alias(module, element_type); - if (element_type == resolved_element_type) - { - result_type = type; - } - else - { - result_type = get_pointer_type(module, resolved_element_type); - } - } break; - case TypeId::array: - { - auto* element_type = type->array.element_type; - auto element_count = type->array.element_count; - assert(element_count); - auto* resolved_element_type = resolve_alias(module, element_type); - if (element_type == resolved_element_type) - { - result_type = type; - } - else - { - result_type = get_array_type(module, resolved_element_type, element_count); - } - } break; - case TypeId::structure: - { - if (type->structure.is_slice) - { - auto old_element_type = type->structure.fields[0].type->pointer.element_type; - auto element_type = resolve_alias(module, old_element_type); - if (old_element_type == element_type) - { - result_type = type; - } - else - { - result_type = get_slice_type(module, element_type); - } - } - else - { - result_type = type; - } - } break; - case TypeId::alias: - { - result_type = resolve_alias(module, type->alias.type); - } break; - case TypeId::enum_array: - { - auto old_enum_type = type->enum_array.enum_type; - auto old_element_type = type->enum_array.element_type; - auto enum_type = resolve_alias(module, old_enum_type); - auto element_type = resolve_alias(module, old_element_type); - - if (old_enum_type == enum_type && old_element_type == element_type) - { - result_type = type; - } - else - { - result_type = get_enum_array_type(module, enum_type, element_type); - } - } break; - default: unreachable(); - } - - assert(result_type); - return result_type; -} - - -fn u64 enum_bit_count(u64 highest_value) -{ - auto needed_bit_count = highest_value == 0 ? 1 : 64 - clz(highest_value); - return needed_bit_count; -} - -struct ArgBuilder -{ - char* args[128]; - u32 argument_count = 0; - - void add(const char* arg) - { - assert(argument_count < array_length(args)); - args[argument_count] = (char*)arg; - argument_count += 1; - } - - void add(Arena* arena, String arg) - { - if (arg.pointer[arg.length] != 0) - { - arg = arena_duplicate_string(arena, arg); - } - - add((const char*)arg.pointer); - } - - Slice flush() - { - assert(argument_count < array_length(args)); - args[argument_count] = 0; - return { args, argument_count }; - } -}; - -void parse(Module* module); -void emit(Module* module); diff --git a/src/emitter.cpp b/src/emitter.cpp deleted file mode 100644 index 3bd9e25..0000000 --- a/src/emitter.cpp +++ /dev/null @@ -1,10079 +0,0 @@ -#include -#include - -fn LLVMValueRef llvm_module_create_function(Arena* arena, LLVMModuleRef module, LLVMTypeRef function_type, LLVMLinkage linkage_type, String name) -{ - assert(name.pointer[name.length] == 0); - auto function = LLVMAddFunction(module, (char*)name.pointer, function_type); - LLVMSetLinkage(function, linkage_type); - return function; -} - -fn LLVMValueRef llvm_create_global_variable(LLVMModuleRef module, LLVMTypeRef type, bool is_constant, LLVMLinkage linkage_type, LLVMValueRef initial_value, String name, LLVMThreadLocalMode thread_local_mode, bool externally_initialized, u32 alignment, LLVMUnnamedAddr unnamed_address) -{ - assert(name.pointer[name.length] == 0); - auto global = LLVMAddGlobal(module, type, (char*)name.pointer); - LLVMSetGlobalConstant(global, is_constant); - LLVMSetLinkage(global, linkage_type); - LLVMSetInitializer(global, initial_value); - LLVMSetThreadLocalMode(global, thread_local_mode); - LLVMSetExternallyInitialized(global, externally_initialized); - LLVMSetAlignment(global, alignment); - LLVMSetUnnamedAddress(global, unnamed_address); - return global; -} - -fn LLVMValueRef llvm_builder_create_alloca(LLVMBuilderRef b, LLVMTypeRef type, u32 alignment, String name) -{ - assert(name.pointer[name.length] == 0); - auto alloca = LLVMBuildAlloca(b, type, (char*)name.pointer); - LLVMSetAlignment(alloca, alignment); - return alloca; -} - -enum class EvaluationKind -{ - scalar, - aggregate, - complex, -}; - -enum class TypeKind -{ - abi, - memory, -}; - -fn void analyze_block(Module* module, Block* block); -fn void emit_local_storage(Module* module, Variable* variable); -fn void emit_assignment(Module* module, LLVMValueRef left_llvm, Type* left_type, Value* right); -fn void emit_macro_instantiation(Module* module, Value* value); -fn void emit_value(Module* module, Value* value, TypeKind type_kind, bool must_be_constant); -fn void analyze_value(Module* module, Value* value, Type* expected_type, TypeKind type_kind, bool must_be_constant); - -fn void emit_block(Module* module, LLVMBasicBlockRef basic_block) -{ - auto current_basic_block = LLVMGetInsertBlock(module->llvm.builder); - if (current_basic_block) - { - if (!LLVMGetBasicBlockTerminator(current_basic_block)) - { - LLVMBuildBr(module->llvm.builder, basic_block); - } - } - - assert(LLVMGetBasicBlockParent(basic_block)); - - LLVMPositionBuilderAtEnd(module->llvm.builder, basic_block); -} - -fn LLVMValueRef emit_condition(Module* module, Value* condition_value) -{ - auto condition_llvm_value = condition_value->llvm; - auto condition_type = condition_value->type; - assert(condition_type); - assert(condition_llvm_value); - - assert(condition_type->id == TypeId::integer || condition_type->id == TypeId::pointer); - if (!(condition_type->id == TypeId::integer && condition_type->integer.bit_count == 1)) - { - condition_llvm_value = LLVMBuildICmp(module->llvm.builder, LLVMIntNE, condition_llvm_value, LLVMConstNull(condition_type->llvm.abi), ""); - } - - assert(condition_llvm_value); - - return condition_llvm_value; -} - -fn LLVMValueRef emit_intrinsic_call(Module* module, IntrinsicIndex index, Slice argument_types, Slice argument_values) -{ - auto intrinsic_id = module->llvm.intrinsic_table[(backing_type(IntrinsicIndex))index]; - auto intrinsic_function = LLVMGetIntrinsicDeclaration(module->llvm.module, intrinsic_id.n, argument_types.pointer, argument_types.length); - auto intrinsic_function_type = LLVMIntrinsicGetType(module->llvm.context, intrinsic_id.n, argument_types.pointer, argument_types.length); - auto call = LLVMBuildCall2(module->llvm.builder, intrinsic_function_type, intrinsic_function, argument_values.pointer, argument_values.length, ""); - return call; -} - -fn EvaluationKind get_evaluation_kind(Type* type) -{ - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - case TypeId::forward_declaration: - case TypeId::unresolved: - case TypeId::function: - case TypeId::alias: - unreachable(); - case TypeId::integer: - case TypeId::pointer: - case TypeId::bits: - case TypeId::enumerator: - return EvaluationKind::scalar; - case TypeId::array: - case TypeId::structure: - case TypeId::union_type: - case TypeId::enum_array: - return EvaluationKind::aggregate; - default: - unreachable(); - } -} - -fn bool type_is_aggregate_type_for_abi(Type* type) -{ - auto evaluation_kind = get_evaluation_kind(type); - auto is_member_function_pointer_type = false; // TODO - return evaluation_kind != EvaluationKind::scalar || is_member_function_pointer_type; -} - -fn u64 get_byte_allocation_size(Type* type) -{ - auto size = get_byte_size(type); - auto alignment = get_byte_alignment(type); - auto result = align_forward(size, alignment); - return result; -} - -struct LLVMGlobal -{ - char* host_triple; - char* host_cpu_model; - char* host_cpu_features; -}; - -global_variable LLVMGlobal llvm_global; - -fn bool type_is_signed(Type* type) -{ - switch (type->id) - { - case TypeId::integer: - return type->integer.is_signed; - case TypeId::enumerator: - return type_is_signed(type->enumerator.backing_type); - case TypeId::bits: - return type_is_signed(type->bits.backing_type); - case TypeId::pointer: // TODO: pointers should be signed? - return false; - case TypeId::alias: - return type_is_signed(type->alias.type); - default: unreachable(); - } -} - -fn bool type_is_slice(Type* type) -{ - return type->id == TypeId::structure && type->structure.is_slice; -} - -fn bool is_integral_or_enumeration_type(Type* type) -{ - switch (type->id) - { - case TypeId::alias: return is_integral_or_enumeration_type(type->alias.type); - case TypeId::integer: - case TypeId::bits: - case TypeId::enumerator: - return true; - case TypeId::array: - case TypeId::structure: - return false; - default: unreachable(); - } -} - -fn Type* align_integer_type(Module* module, Type* type) -{ - auto bit_count = (u32)get_bit_size(type); - auto abi_bit_count = align_bit_count(bit_count); - bool is_signed = type_is_signed(type); - auto result = integer_type(module, { .bit_count = abi_bit_count, .is_signed = is_signed }); - return result; -} - -fn bool is_promotable_integer_type_for_abi(Type* type) -{ - switch (type->id) - { - case TypeId::integer: return type->integer.bit_count < 32; - case TypeId::bits: return is_promotable_integer_type_for_abi(type->bits.backing_type); - case TypeId::alias: return is_promotable_integer_type_for_abi(type->alias.type); - case TypeId::enumerator: return is_promotable_integer_type_for_abi(type->enumerator.backing_type); - case TypeId::pointer: return false; - default: unreachable(); - } -} - -fn bool receives_type(Value* value) -{ - switch (value->id) - { - case ValueId::constant_integer: - case ValueId::enum_literal: - case ValueId::string_literal: - case ValueId::zero: - return true; - case ValueId::array_expression: - case ValueId::call: - return false; - case ValueId::variable_reference: - { - return value->kind == ValueKind::left && value->id == ValueId::global; - } break; - case ValueId::field_access: - { - auto aggregate = value->field_access.aggregate; - auto field_name = value->field_access.field_name; - - if (field_name.equal(string_literal("length")) && aggregate->id == ValueId::variable_reference && aggregate->kind == ValueKind::left && aggregate->variable_reference->type->id == TypeId::array) - { - return true; - } - else - { - return false; - } - } break; - case ValueId::unary: - { - auto unary_id = value->unary.id; - auto unary_value = value->unary.value; - - switch (unary_id) - { - case UnaryId::extend: - case UnaryId::truncate: - case UnaryId::pointer_cast: - case UnaryId::pointer_from_int: - return true; - case UnaryId::int_from_pointer: - case UnaryId::ampersand: - case UnaryId::dereference: - case UnaryId::va_end: - case UnaryId::leading_zeroes: - case UnaryId::trailing_zeroes: - case UnaryId::exclamation: - case UnaryId::int_from_enum: - case UnaryId::enum_from_int: - case UnaryId::enum_name: - return false; - case UnaryId::minus: - case UnaryId::plus: - case UnaryId::bitwise_not: - return receives_type(unary_value); - } - } break; - case ValueId::binary: - { - auto left = value->binary.left; - auto right = value->binary.right; - auto binary_id = value->binary.id; - - return receives_type(left) && receives_type(right); - } break; - case ValueId::unary_type: - { - auto unary_type_id = value->unary_type.id; - switch (unary_type_id) - { - case UnaryTypeId::align_of: - case UnaryTypeId::byte_size: - case UnaryTypeId::integer_max: - return true; - default: trap(); - } - } break; - case ValueId::infer_or_ignore: - case ValueId::forward_declared_function: - case ValueId::function: - case ValueId::macro_reference: - case ValueId::macro_instantiation: - case ValueId::global: - case ValueId::array_initialization: - case ValueId::slice_expression: - case ValueId::trap: - case ValueId::va_start: - case ValueId::va_arg: - case ValueId::aggregate_initialization: - case ValueId::undefined: - case ValueId::unreachable: - case ValueId::select: - case ValueId::string_to_enum: - case ValueId::local: - case ValueId::argument: - case ValueId::build_mode: - case ValueId::has_debug_info: - case ValueId::field_parent_pointer: - trap(); - } -} - -fn void llvm_initialize_all_raw() -{ - assert(!llvm_initialized); - - LLVMInitializeX86TargetInfo(); - LLVMInitializeX86Target(); - LLVMInitializeX86TargetMC(); - LLVMInitializeX86AsmPrinter(); - LLVMInitializeX86AsmParser(); - LLVMInitializeX86Disassembler(); - - llvm_global = { - .host_triple = LLVMGetDefaultTargetTriple(), - .host_cpu_model = LLVMGetHostCPUName(), - .host_cpu_features = LLVMGetHostCPUFeatures(), - }; -} - -fn void llvm_initialize_all() -{ - if (!llvm_initialized) - { - llvm_initialize_all_raw(); - } -} - -fn bool is_arbitrary_bit_integer(Type* type) -{ - switch (type->id) - { - case TypeId::integer: switch (type->integer.bit_count) - { - case 1: - case 8: - case 16: - case 32: - case 64: - case 128: - return false; - default: return true; - } break; - case TypeId::unresolved: unreachable(); - case TypeId::bits: return is_arbitrary_bit_integer(type->bits.backing_type); - case TypeId::enumerator: return is_arbitrary_bit_integer(type->enumerator.backing_type); - default: return false; - } - -} - -fn u64 integer_max_value(u32 bit_count, bool is_signed) -{ - auto max_value = bit_count == 64 ? ~(u64)0 : ((u64)1 << (bit_count - is_signed)) - 1; - return max_value; -} - -fn void dump_module(Module* module) -{ - auto module_str = LLVMPrintModuleToString(module->llvm.module); - print(c_string_to_slice(module_str)); -} - -fn LLVMCallConv llvm_calling_convention(CallingConvention calling_convention) -{ - LLVMCallConv cc; - switch (calling_convention) - { - case CallingConvention::c: cc = LLVMCCallConv; break; - case CallingConvention::count: unreachable(); - } - - return cc; -} - -fn void llvm_initialize(Module* module) -{ - llvm_initialize_all(); - - auto context = LLVMContextCreate(); - auto m = LLVMModuleCreateWithNameInContext((char*)module->name.pointer, context); - auto builder = LLVMCreateBuilderInContext(context); - - LLVMDIBuilderRef di_builder = 0; - LLVMMetadataRef di_compile_unit = 0; - LLVMMetadataRef di_file = 0; - - if (module->has_debug_info) - { - di_builder = LLVMCreateDIBuilder(m); - auto last_slash = string_last_character(module->path, '/'); - if (last_slash == string_no_match) - { - report_error(); - } - auto directory = module->path(0, last_slash); - auto file_name = module->path(last_slash + 1); - di_file = LLVMDIBuilderCreateFile(di_builder, (char*)file_name.pointer, file_name.length, (char*)directory.pointer, directory.length); - auto producer_name = string_literal("bloat buster"); - auto is_optimized = build_mode_is_optimized(module->build_mode); - auto flags = string_literal(""); - u32 runtime_version = 0; - auto split_name = string_literal(""); - auto sysroot = string_literal(""); - auto sdk = string_literal(""); - di_compile_unit = LLVMDIBuilderCreateCompileUnit(di_builder, LLVMDWARFSourceLanguageC17, di_file, (char*)producer_name.pointer, producer_name.length, is_optimized, (char*)flags.pointer, flags.length, runtime_version, (char*)split_name.pointer, split_name.length, LLVMDWARFEmissionFull, 0, 0, is_optimized, (char*)sysroot.pointer, sysroot.length, (char*)sdk.pointer, sdk.length); - module->scope.llvm = di_compile_unit; - } - - const char* target_triple = {}; - const char* cpu_model = {}; - const char* cpu_features = {}; - - if (target_compare(module->target, target_get_native())) - { - target_triple = llvm_global.host_triple; - if (module->target.host_cpu_model) - { - cpu_model = llvm_global.host_cpu_model; - cpu_features = llvm_global.host_cpu_features; - } - else - { - cpu_model = "generic"; - cpu_features = ""; - } - } - else - { - // TODO - report_error(); - } - - auto target_machine_options = LLVMCreateTargetMachineOptions(); - LLVMTargetMachineOptionsSetCPU(target_machine_options, cpu_model); - LLVMTargetMachineOptionsSetFeatures(target_machine_options, cpu_features); - - LLVMCodeGenOptLevel code_generation_optimization_level; - switch (module->build_mode) - { - case BuildMode::debug_none: - case BuildMode::debug: - code_generation_optimization_level = LLVMCodeGenLevelNone; - break; - case BuildMode::soft_optimize: - code_generation_optimization_level = LLVMCodeGenLevelLess; - break; - case BuildMode::optimize_for_speed: - case BuildMode::optimize_for_size: - code_generation_optimization_level = LLVMCodeGenLevelDefault; - break; - case BuildMode::aggressively_optimize_for_speed: - case BuildMode::aggressively_optimize_for_size: - code_generation_optimization_level = LLVMCodeGenLevelAggressive; - break; - case BuildMode::count: - unreachable(); - } - LLVMTargetMachineOptionsSetCodeGenOptLevel(target_machine_options, code_generation_optimization_level); - - LLVMTargetRef target = 0; - char* error_message = 0; - auto result = LLVMGetTargetFromTriple(target_triple, &target, &error_message); - if (result != 0) - { - report_error(); - } - assert(!error_message); - - auto target_machine = LLVMCreateTargetMachineWithOptions(target, target_triple, target_machine_options); - - auto target_data = LLVMCreateTargetDataLayout(target_machine); - LLVMSetModuleDataLayout(m, target_data); - LLVMSetTarget(m, target_triple); - - module->llvm = { - .context = context, - .module = m, - .builder = builder, - .di_builder = di_builder, - .file = di_file, - .target_machine = target_machine, - .target_data = target_data, - .compile_unit = di_compile_unit, - .pointer_type = LLVMPointerTypeInContext(context, 0), - .void_type = LLVMVoidTypeInContext(context), - }; - - for (u64 i = 0; i < (u64)IntrinsicIndex::count; i += 1) - { - String name = intrinsic_names[i]; - auto intrinsic_id = LLVMLookupIntrinsicID((char*)name.pointer, name.length); - assert(intrinsic_id != 0); - module->llvm.intrinsic_table[i].n = intrinsic_id; - } - - for (u64 i = 0; i < (u64)AttributeIndex::count; i += 1) - { - String name = attribute_names[i]; - auto attribute_id = LLVMGetEnumAttributeKindForName((char*)name.pointer, name.length); - assert(attribute_id != 0); - module->llvm.attribute_table[i].n = attribute_id; - } -} - -enum class AbiSystemVClass -{ - none, - integer, - sse, - sse_up, - x87, - x87_up, - complex_x87, - memory, -}; - -struct AbiSystemVClassifyResult -{ - AbiSystemVClass r[2]; -}; - - -// AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is -// classified recursively so that always two fields are -// considered. The resulting class is calculated according to -// the classes of the fields in the eightbyte: -// -// (a) If both classes are equal, this is the resulting class. -// -// (b) If one of the classes is NO_CLASS, the resulting class is -// the other class. -// -// (c) If one of the classes is MEMORY, the result is the MEMORY -// class. -// -// (d) If one of the classes is INTEGER, the result is the -// INTEGER. -// -// (e) If one of the classes is X87, X87UP, COMPLEX_X87 class, -// MEMORY is used as class. -// -// (f) Otherwise class SSE is used. - -// Accum should never be memory (we should have returned) or -// ComplexX87 (because this cannot be passed in a structure). -fn AbiSystemVClass abi_system_v_merge_class(AbiSystemVClass accumulator, AbiSystemVClass field) -{ - assert(accumulator != AbiSystemVClass::memory && accumulator != AbiSystemVClass::complex_x87); - - if (accumulator == field || field == AbiSystemVClass::none) - { - return accumulator; - } - - if (field == AbiSystemVClass::memory) - { - return AbiSystemVClass::memory; - } - - if (accumulator == AbiSystemVClass::integer || field == AbiSystemVClass::integer) - { - return AbiSystemVClass::integer; - } - - if (field == AbiSystemVClass::x87 || field == AbiSystemVClass::x87_up || field == AbiSystemVClass::complex_x87 || accumulator == AbiSystemVClass::x87 || accumulator == AbiSystemVClass::x87_up) - { - return AbiSystemVClass::memory; - } - - return AbiSystemVClass::sse; -} - -fn AbiSystemVClassifyResult abi_system_v_classify_post_merge(u64 aggregate_size, AbiSystemVClassifyResult classes) -{ - AbiSystemVClassifyResult result = classes; - - if (result.r[1] == AbiSystemVClass::memory) - { - result.r[0] = AbiSystemVClass::memory; - } - - if (result.r[1] == AbiSystemVClass::x87_up) - { - trap(); - } - - if (aggregate_size > 16 && (result.r[0] != AbiSystemVClass::sse || result.r[1] != AbiSystemVClass::sse_up)) - { - result.r[0] = AbiSystemVClass::memory; - } - - if (result.r[1] == AbiSystemVClass::sse_up && result.r[0] != AbiSystemVClass::sse) - { - result.r[0] = AbiSystemVClass::sse; - } - - return result; -} - -fn bool contains_no_user_data(Type* type, u64 start, u64 end) -{ - if (get_byte_size(type) <= start) - { - return true; - } - else - { - switch (type->id) - { - case TypeId::structure: - { - for (auto& field: type->structure.fields) - { - auto field_offset = field.offset; - if (field_offset >= end) - { - break; - } - - auto field_start = field_offset < start ? start - field_offset : 0; - if (!contains_no_user_data(field.type, field_start, end - field_offset)) - { - return false; - } - } - - return true; - } break; - case TypeId::array: - case TypeId::enum_array: - { - Type* element_type = 0; - u64 element_count = 0; - - switch (type->id) - { - case TypeId::array: - { - element_type = type->array.element_type; - element_count = type->array.element_count; - } break; - case TypeId::enum_array: - { - auto enum_type = type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - element_count = enum_type->enumerator.fields.length; - element_type = type->enum_array.element_type; - } break; - default: unreachable(); - } - - assert(element_type); - assert(element_count); - - auto element_size = get_byte_size(element_type); - - for (u64 i = 0; i < element_count; i += 1) - { - auto offset = i * element_size; - if (offset >= end) - { - break; - } - - auto element_start = offset < start ? start - offset : 0; - if (!contains_no_user_data(element_type, element_start, end - offset)) - { - return false; - } - } - - trap(); - } break; - default: return false; - } - } -} - -fn Field* get_member_at_offset(Type* struct_type, u32 offset) -{ - assert(struct_type->id == TypeId::structure); - - Field* result = 0; - - if (struct_type->structure.byte_size > offset) - { - auto fields = struct_type->structure.fields; - - for (u64 i = 0; i < fields.length; i += 1) - { - auto* field = &fields[i]; - auto field_offset = field->offset; - if (field_offset > offset) - { - break; - } - - result = field; - } - - assert(result); - } - - return result; -} - -fn Type* abi_system_v_get_integer_type_at_offset(Module* module, Type* type, u32 offset, Type* source_type, u32 source_offset) -{ - switch (type->id) - { - case TypeId::integer: - { - if (offset == 0) - { - auto bit_count = type->integer.bit_count; - auto start = source_offset + get_byte_size(type); - auto end = source_offset + 8; - - bool type_contains_no_user_data = contains_no_user_data(source_type, start, end); - switch (bit_count) - { - case 64: return type; - case 32: case 16: case 8: - { - if (type_contains_no_user_data) - { - return type; - } - } break; - default: break; - } - } - } break; - case TypeId::pointer: - { - if (offset == 0) - { - return type; - } - else - { - trap(); - } - } break; - case TypeId::structure: - { - auto* field = get_member_at_offset(type, offset); - if (field) - { - auto field_type = field->type; - switch (field_type->id) - { - case TypeId::integer: - case TypeId::enumerator: - { - field_type = align_integer_type(module, field_type); - } break; - default: break; - } - - return abi_system_v_get_integer_type_at_offset(module, field_type, offset - field->offset, source_type, source_offset); - } - else - { - unreachable(); - } - } break; - case TypeId::bits: - { - auto backing_type = type->bits.backing_type; - return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, source_type == type ? backing_type : source_type, source_offset); - } break; - case TypeId::enumerator: - { - auto backing_type = type->enumerator.backing_type; - return abi_system_v_get_integer_type_at_offset(module, backing_type, offset, source_type == type ? backing_type : source_type, source_offset); - } break; - case TypeId::array: - { - auto element_type = type->array.element_type; - auto element_size = get_byte_size(element_type); - auto element_offset = (offset / element_size) * element_size; - return abi_system_v_get_integer_type_at_offset(module, element_type, offset - element_offset, source_type, source_offset); - } break; - default: unreachable(); - } - - auto source_size = get_byte_size(source_type); - assert(source_size != source_offset); - auto byte_count = source_size - source_offset; - u32 bit_count = byte_count > 8 ? 64 : byte_count * 8; - auto result = integer_type(module, { .bit_count = bit_count, .is_signed = false }); - return result; -} - -struct AbiSystemVClassify -{ - u64 base_offset; - bool is_variable_argument; - bool is_register_call; -}; - -fn AbiSystemVClassifyResult abi_system_v_classify_type(Type* type, AbiSystemVClassify options) -{ - AbiSystemVClassifyResult result = {}; - auto is_memory = options.base_offset >= 8; - auto current_index = is_memory; - auto not_current_index = !is_memory; - assert(current_index != not_current_index); - result.r[current_index] = AbiSystemVClass::memory; - - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - result.r[current_index] = AbiSystemVClass::none; - break; - case TypeId::bits: - return abi_system_v_classify_type(type->bits.backing_type, options); - case TypeId::enumerator: - return abi_system_v_classify_type(type->enumerator.backing_type, options); - case TypeId::pointer: - result.r[current_index] = AbiSystemVClass::integer; - break; - case TypeId::integer: - { - if (type->integer.bit_count <= 64) - { - result.r[current_index] = AbiSystemVClass::integer; - } - else if (type->integer.bit_count == 128) - { - trap(); - } - else - { - report_error(); - } - } break; - case TypeId::array: - { - auto byte_size = get_byte_size(type); - if (byte_size <= 64) - { - if (options.base_offset % get_byte_alignment(type) == 0) - { - auto element_type = type->array.element_type; - auto element_size = get_byte_size(element_type); - - result.r[current_index] = AbiSystemVClass::none; - - u64 vector_size = 16; - - if (byte_size > 16 && (byte_size != element_size || byte_size > vector_size)) - { - unreachable(); - } - else - { - auto offset = options.base_offset; - auto element_count = type->array.element_count; - - for (u64 i = 0; i < element_count; i += 1) - { - auto element_classes = abi_system_v_classify_type(element_type, AbiSystemVClassify{ - .base_offset = offset, - .is_variable_argument = options.is_variable_argument, - }); - offset += element_size; - - result.r[0] = abi_system_v_merge_class(result.r[0], element_classes.r[0]); - result.r[1] = abi_system_v_merge_class(result.r[1], element_classes.r[1]); - - if (result.r[0] == AbiSystemVClass::memory || result.r[1] == AbiSystemVClass::memory) - { - break; - } - } - - auto final_result = abi_system_v_classify_post_merge(byte_size, result); - assert(final_result.r[1] != AbiSystemVClass::sse || final_result.r[0] != AbiSystemVClass::sse); - result = final_result; - } - } - } - } break; - case TypeId::structure: - case TypeId::union_type: - { - auto byte_size = get_byte_size(type); - - if (byte_size <= 64) - { - auto has_variable_array = false; - if (!has_variable_array) - { - result.r[current_index] = AbiSystemVClass::none; - auto is_union = type->id == TypeId::union_type; - - switch (type->id) - { - case TypeId::structure: - { - for (auto& field : type->structure.fields) - { - auto offset = options.base_offset + field.offset; - auto member_type = field.type; - auto member_size = get_byte_size(member_type); - auto member_alignment = get_byte_alignment(member_type); - - u64 native_vector_size = 16; - - auto gt_16 = byte_size > 16 && ((!is_union && byte_size != member_size) || byte_size > native_vector_size); - auto padding = offset % member_alignment != 0; - - if (gt_16 || padding) - { - result.r[0] = AbiSystemVClass::memory; - result = abi_system_v_classify_post_merge(byte_size, result); - return result; - } - - auto member_classes = abi_system_v_classify_type(member_type, { - .base_offset = offset, - .is_variable_argument = options.is_variable_argument, - .is_register_call = options.is_register_call, - }); - - for (u64 i = 0; i < array_length(member_classes.r); i += 1) - { - result.r[i] = abi_system_v_merge_class(result.r[i], member_classes.r[i]); - } - - if (result.r[0] == AbiSystemVClass::memory || result.r[1] == AbiSystemVClass::memory) - { - break; - } - } - - result = abi_system_v_classify_post_merge(byte_size, result); - } break; - case TypeId::union_type: - { - trap(); - } break; - default: unreachable(); - } - } - } - } break; - case TypeId::alias: - return abi_system_v_classify_type(type->alias.type, options); - default: unreachable(); - } - - return result; -} - -fn void resolve_type_in_place_memory(Module* module, Type* type); -fn void resolve_type_in_place_abi(Module* module, Type* type) -{ - if (!type->llvm.abi) - { - LLVMTypeRef result = 0; - - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - result = module->llvm.void_type; - break; - case TypeId::integer: - result = LLVMIntTypeInContext(module->llvm.context, type->integer.bit_count); - break; - case TypeId::pointer: - case TypeId::opaque: - result = module->llvm.pointer_type; - break; - case TypeId::array: - { - auto* element_type = type->array.element_type; - auto element_count = type->array.element_count; - assert(element_count); - resolve_type_in_place_memory(module, element_type); - auto array_type = LLVMArrayType2(element_type->llvm.memory, element_count); - result = array_type; - } break; - case TypeId::enumerator: - { - auto backing_type = type->enumerator.backing_type; - resolve_type_in_place_abi(module, backing_type); - result = backing_type->llvm.abi; - } break; - case TypeId::structure: - { - LLVMTypeRef llvm_type_buffer[64]; - auto fields = type->structure.fields; - for (u64 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - resolve_type_in_place_memory(module, field.type); - llvm_type_buffer[i] = field.type->llvm.memory; - } - - result = LLVMStructTypeInContext(module->llvm.context, llvm_type_buffer, fields.length, 0); - auto llvm_size = LLVMStoreSizeOfType(module->llvm.target_data, result); - assert(llvm_size == type->structure.byte_size); - } break; - case TypeId::bits: - { - auto backing_type = type->bits.backing_type; - resolve_type_in_place_abi(module, backing_type); - result = backing_type->llvm.abi; - auto llvm_size = LLVMStoreSizeOfType(module->llvm.target_data, result); - assert(llvm_size == get_byte_size(type)); - } break; - case TypeId::union_type: - { - auto biggest_type = type->union_type.fields[type->union_type.biggest_field].type; - resolve_type_in_place_memory(module, biggest_type); - result = LLVMStructTypeInContext(module->llvm.context, &biggest_type->llvm.memory, 1, false); - auto llvm_size = LLVMStoreSizeOfType(module->llvm.target_data, result); - assert(llvm_size == get_byte_size(type)); - } break; - case TypeId::alias: - { - auto aliased = type->alias.type; - resolve_type_in_place_abi(module, aliased); - result = aliased->llvm.abi; - } break; - case TypeId::enum_array: - { - auto enum_type = type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - auto element_type = type->enum_array.element_type; - resolve_type_in_place_memory(module, element_type); - auto element_count = enum_type->enumerator.fields.length; - assert(element_count); - auto array_type = LLVMArrayType2(element_type->llvm.memory, element_count); - result = array_type; - auto llvm_size = LLVMStoreSizeOfType(module->llvm.target_data, result); - assert(llvm_size == get_byte_size(type)); - } break; - default: unreachable(); - } - - assert(result); - type->llvm.abi = result; - } -} - -fn void resolve_type_in_place_memory(Module* module, Type* type) -{ - if (!type->llvm.memory) - { - resolve_type_in_place_abi(module, type); - - LLVMTypeRef result = 0; - - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - case TypeId::pointer: - case TypeId::opaque: - case TypeId::array: - case TypeId::structure: - case TypeId::enum_array: - result = type->llvm.abi; - break; - case TypeId::integer: - { - auto byte_size = get_byte_size(type); - auto bit_count = byte_size * 8; - result = LLVMIntTypeInContext(module->llvm.context, bit_count); - } break; - case TypeId::enumerator: - { - auto backing_type = type->enumerator.backing_type; - resolve_type_in_place_memory(module, backing_type); - result = backing_type->llvm.memory; - } break; - case TypeId::bits: - { - auto backing_type = type->bits.backing_type; - resolve_type_in_place_memory(module, backing_type); - result = backing_type->llvm.memory; - } break; - case TypeId::union_type: - { - auto biggest_type = type->union_type.fields[type->union_type.biggest_field].type; - resolve_type_in_place_memory(module, biggest_type); - result = LLVMStructTypeInContext(module->llvm.context, &biggest_type->llvm.memory, 1, 0); - } break; - case TypeId::alias: - { - auto aliased = type->alias.type; - resolve_type_in_place_memory(module, aliased); - result = aliased->llvm.memory; - } break; - default: unreachable(); - } - - assert(result); - type->llvm.memory = result; - - if (type->id == TypeId::bits) - { - assert(type->llvm.memory == type->llvm.abi); - } - } -} - -fn void resolve_type_in_place_debug(Module* module, Type* type) -{ - if (module->has_debug_info) - { - if (!type->llvm.debug) - { - LLVMMetadataRef result = 0; - - switch (type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - { - result = LLVMDIBuilderCreateBasicType(module->llvm.di_builder, (char*)type->name.pointer, type->name.length, 0, (u32)DwarfType::void_type, type->id == TypeId::noreturn ? LLVMDIFlagNoReturn : LLVMDIFlagZero); - } break; - case TypeId::integer: - { - DwarfType dwarf_type = type->integer.bit_count == 1 ? DwarfType::boolean : (type->integer.is_signed ? DwarfType::signed_type : DwarfType::unsigned_type); - LLVMDIFlags flags = {}; - auto bit_count = dwarf_type == DwarfType::boolean ? 8 : type->integer.bit_count; - result = LLVMDIBuilderCreateBasicType(module->llvm.di_builder, (char*)type->name.pointer, type->name.length, bit_count, (u32)dwarf_type, flags); - } break; - case TypeId::pointer: - { - resolve_type_in_place_debug(module, type->pointer.element_type); - result = type->llvm.debug; - if (!result) - { - u32 address_space = 0; - result = LLVMDIBuilderCreatePointerType(module->llvm.di_builder, type->pointer.element_type->llvm.debug, get_bit_size(type), get_byte_alignment(type) * 8, address_space, (char*)type->name.pointer, type->name.length); - } - } break; - case TypeId::array: - { - auto array_element_type = type->array.element_type; - auto array_element_count = type->array.element_count; - assert(array_element_count); - resolve_type_in_place_debug(module, array_element_type); - auto bit_alignment = get_byte_alignment(type) * 8; - auto array_type = LLVMDIBuilderCreateArrayType(module->llvm.di_builder, get_bit_size(type), bit_alignment, array_element_type->llvm.debug, 0, 0); - result = array_type; - } break; - case TypeId::enumerator: - { - auto backing_type = type->enumerator.backing_type; - resolve_type_in_place_debug(module, backing_type); - - LLVMMetadataRef field_buffer[64]; - for (u64 i = 0; i < type->enumerator.fields.length; i += 1) - { - auto& field = type->enumerator.fields[i]; - auto enum_field = LLVMDIBuilderCreateEnumerator(module->llvm.di_builder, (char*)field.name.pointer, field.name.length, field.value, !type_is_signed(backing_type)); - field_buffer[i] = enum_field; - } - - auto debug_aligned_type = align_integer_type(module, backing_type); - resolve_type_in_place_debug(module, debug_aligned_type); - - result = LLVMDIBuilderCreateEnumerationType(module->llvm.di_builder, module->scope.llvm, (char*)type->name.pointer, type->name.length, module->llvm.file, type->enumerator.line, get_bit_size(type), get_byte_alignment(type) * 8, field_buffer, type->enumerator.fields.length, debug_aligned_type->llvm.debug); - } break; - case TypeId::structure: - { - LLVMDIFlags flags = {}; - auto forward_declaration = LLVMDIBuilderCreateReplaceableCompositeType(module->llvm.di_builder, module->llvm.debug_tag, (char*)type->name.pointer, type->name.length, module->scope.llvm, module->llvm.file, type->structure.line, 0, type->structure.byte_size * 8, type->structure.byte_alignment * 8, flags, (char*)type->name.pointer, type->name.length); - type->llvm.debug = forward_declaration; - module->llvm.debug_tag += 1; - - LLVMMetadataRef llvm_type_buffer[64]; - - auto fields = type->structure.fields; - for (u64 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto field_type = field.type; - resolve_type_in_place_debug(module, field_type); - auto member_type = LLVMDIBuilderCreateMemberType(module->llvm.di_builder, module->scope.llvm, (char*)field.name.pointer, field.name.length, module->llvm.file, field.line, get_bit_size(field_type), get_byte_alignment(field_type) * 8, field.offset * 8, flags, field_type->llvm.debug); - llvm_type_buffer[i] = member_type; - } - - auto struct_type = LLVMDIBuilderCreateStructType(module->llvm.di_builder, module->scope.llvm, (char*)type->name.pointer, type->name.length, module->llvm.file, type->structure.line, type->structure.byte_size * 8, type->structure.byte_alignment * 8, flags, 0, llvm_type_buffer, fields.length, 0, 0, (char*)type->name.pointer, type->name.length); - LLVMMetadataReplaceAllUsesWith(forward_declaration, struct_type); - result = struct_type; - } break; - case TypeId::bits: - { - LLVMMetadataRef llvm_type_buffer[64]; - - auto fields = type->bits.fields; - auto backing_type = type->bits.backing_type->llvm.debug; - LLVMDIFlags flags = {}; - for (u64 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto field_type = field.type; - resolve_type_in_place_debug(module, field_type); - u64 bit_offset = 0; - auto member_type = LLVMDIBuilderCreateBitFieldMemberType(module->llvm.di_builder, module->scope.llvm, (char*)field.name.pointer, field.name.length, module->llvm.file, field.line, get_bit_size(field_type), bit_offset, field.offset, flags, backing_type); - llvm_type_buffer[i] = member_type; - } - - auto size = get_byte_size(type) * 8; - auto alignment = get_byte_alignment(type) * 8; - auto struct_type = LLVMDIBuilderCreateStructType(module->llvm.di_builder, module->scope.llvm, (char*)type->name.pointer, type->name.length, module->llvm.file, type->bits.line, size, alignment, flags, 0, llvm_type_buffer, fields.length, 0, 0, (char*)type->name.pointer, type->name.length); - result = struct_type; - } break; - case TypeId::union_type: - { - LLVMDIFlags flags = {}; - auto forward_declaration = LLVMDIBuilderCreateReplaceableCompositeType(module->llvm.di_builder, module->llvm.debug_tag, (char*)type->name.pointer, type->name.length, module->scope.llvm, module->llvm.file, type->union_type.line, 0, type->union_type.byte_size * 8, type->union_type.byte_alignment * 8, flags, (char*)type->name.pointer, type->name.length); - module->llvm.debug_tag += 1; - - LLVMMetadataRef llvm_type_buffer[64]; - - auto fields = type->union_type.fields; - for (u64 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto field_type = field.type; - resolve_type_in_place_debug(module, field_type); - auto member_type = LLVMDIBuilderCreateMemberType(module->llvm.di_builder, module->scope.llvm, (char*)field.name.pointer, field.name.length, module->llvm.file, field.line, get_byte_size(field_type) * 8, get_byte_alignment(field_type) * 8, 0, flags, field_type->llvm.debug); - llvm_type_buffer[i] = member_type; - } - - auto union_type = LLVMDIBuilderCreateUnionType(module->llvm.di_builder, module->scope.llvm, (char*)type->name.pointer, type->name.length, module->llvm.file, type->union_type.line, type->union_type.byte_size * 8, type->union_type.byte_alignment * 8, flags, llvm_type_buffer, fields.length, 0, (char*)type->name.pointer, type->name.length); - LLVMMetadataReplaceAllUsesWith(forward_declaration, union_type); - result = union_type; - } break; - case TypeId::alias: - { - auto aliased = type->alias.type; - resolve_type_in_place_debug(module, aliased); - auto alignment = get_byte_alignment(aliased); - result = LLVMDIBuilderCreateTypedef(module->llvm.di_builder, aliased->llvm.debug, (char*) type->name.pointer, type->name.length, module->llvm.file, type->alias.line, type->alias.scope->llvm, alignment * 8); - } break; - case TypeId::enum_array: - { - auto enum_type = type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - auto element_type = type->enum_array.element_type; - auto element_count = enum_type->enumerator.fields.length; - resolve_type_in_place_debug(module, element_type); - assert(element_count); - auto bit_alignment = get_byte_alignment(type) * 8; - auto array_type = LLVMDIBuilderCreateArrayType(module->llvm.di_builder, element_count, bit_alignment, element_type->llvm.debug, 0, 0); - result = array_type; - } break; - case TypeId::opaque: - { - // TODO: ? - return; - } break; - case TypeId::function: - { - auto function_type = &type->function; - LLVMMetadataRef debug_argument_type_buffer[64]; - Slice debug_argument_types = { .pointer = debug_argument_type_buffer, .length = function_type->abi.argument_abis.length + 1 + function_type->base.is_variable_arguments }; - auto semantic_return_type = function_type->base.semantic_return_type; - resolve_type_in_place_debug(module, semantic_return_type); - debug_argument_types[0] = semantic_return_type->llvm.debug; - assert(debug_argument_types[0]); - - auto semantic_argument_types = function_type->base.semantic_argument_types; - auto debug_argument_type_slice = debug_argument_types(1)(0, semantic_argument_types.length); - - for (u64 i = 0; i < semantic_argument_types.length; i += 1) - { - auto* debug_argument_type = &debug_argument_type_slice[i]; - auto semantic_type = semantic_argument_types[i]; - resolve_type_in_place_debug(module, semantic_type); - *debug_argument_type = semantic_type->llvm.debug; - assert(*debug_argument_type); - } - - if (function_type->base.is_variable_arguments) - { - auto void_ty = void_type(module); - assert(void_ty->llvm.debug); - debug_argument_types[function_type->base.semantic_argument_types.length + 1] = void_ty->llvm.debug; - } - - LLVMDIFlags flags = {}; - auto subroutine_type = LLVMDIBuilderCreateSubroutineType(module->llvm.di_builder, module->llvm.file, debug_argument_types.pointer, (u32)debug_argument_types.length, flags); - result = subroutine_type; - } break; - default: unreachable(); - } - - assert(result); - type->llvm.debug = result; - } - } -} - -fn void resolve_type_in_place(Module* module, Type* type) -{ - resolve_type_in_place_abi(module, type); - resolve_type_in_place_memory(module, type); - resolve_type_in_place_debug(module, type); -} - -fn Type* resolve_type(Module* module, Type* type) -{ - Type* result = 0; - - switch (type->id) - { - case TypeId::unresolved: - { - assert(!module->current_macro_declaration); - auto instantiation = module->current_macro_instantiation; - if (!instantiation) - { - report_error(); - } - - auto declaration = instantiation->declaration; - auto declaration_arguments = declaration->constant_arguments; - auto instantiation_arguments = instantiation->constant_arguments; - assert(declaration_arguments.length == instantiation_arguments.length); - - for (u64 i = 0; i < declaration_arguments.length; i += 1) - { - auto& declaration_argument = declaration_arguments[i]; - auto& instantiation_argument = instantiation_arguments[i]; - if (declaration_argument.id == ConstantArgumentId::type && type == declaration_argument.type) - { - assert(declaration_argument.name.equal(instantiation_argument.name)); - result = instantiation_argument.type; - break; - } - } - - if (!result) - { - report_error(); - } - } break; - case TypeId::void_type: - case TypeId::integer: - case TypeId::enumerator: - { - result = type; - } break; - case TypeId::pointer: - { - auto element_type = resolve_type(module, type->pointer.element_type); - result = get_pointer_type(module, element_type); - } break; - case TypeId::structure: - { - if (type->structure.is_slice) - { - auto pointer_type = type->structure.fields[0].type; - assert(pointer_type->id == TypeId::pointer); - auto element_type = resolve_type(module, pointer_type->pointer.element_type); - auto slice_type = get_slice_type(module, element_type); - result = slice_type; - } - else - { - result = type; - } - } break; - default: trap(); - } - - assert(result); - assert(result->id != TypeId::unresolved); - return result; -} - -fn bool type_is_abi_equal(Module* module, Type* a, Type* b) -{ - resolve_type_in_place(module, a); - resolve_type_in_place(module, b); - - bool result = a == b; - if (!result) - { - result = a->llvm.abi == b->llvm.abi; - } - return result; -} - -fn AbiInformation abi_system_v_get_ignore(Module* module, Type* semantic_type) -{ - resolve_type_in_place(module, semantic_type); - - return { - .semantic_type = semantic_type, - .flags = { - .kind = AbiKind::ignore, - }, - }; -} - -struct DirectOptions -{ - Type* semantic_type; - Type* type; - Type* padding; - u32 offset; - u32 alignment; - bool can_be_flattened = true; -}; - -fn AbiInformation abi_system_v_get_direct(Module* module, DirectOptions direct) -{ - AbiInformation result = { - .semantic_type = direct.semantic_type, - .flags = { - .kind = AbiKind::direct, - }, - }; - resolve_type_in_place(module, direct.semantic_type); - resolve_type_in_place(module, direct.type); - if (unlikely(direct.padding)) - { - resolve_type_in_place(module, direct.padding); - } - - result.set_coerce_to_type(direct.type); - result.set_padding_type(direct.padding); - result.set_direct_offset(direct.offset); - result.set_direct_alignment(direct.alignment); - result.set_can_be_flattened(direct.can_be_flattened); - - return result; -} - -struct ExtendOptions -{ - Type* semantic_type; - Type* type; - bool sign; -}; - -fn AbiInformation abi_system_v_get_extend(ExtendOptions options) -{ - assert(is_integral_or_enumeration_type(options.semantic_type)); - AbiInformation result = { - .semantic_type = options.semantic_type, - .flags = { - .kind = AbiKind::extend, - }, - }; - - result.set_coerce_to_type(options.type ? options.type : options.semantic_type); - result.set_padding_type(0); - result.set_direct_offset(0); - result.set_direct_alignment(0); - result.flags.sign_extension = options.sign; - - return result; -} - -fn Type* get_anonymous_struct_pair(Module* module, Type* low, Type* high) -{ - Type* pair; - for (pair = module->first_pair_struct_type; pair; pair = pair->structure.next) - { - assert(pair->id == TypeId::structure); - assert(pair->structure.fields.length == 2); - - if (pair->structure.fields[0].type == low && - pair->structure.fields[1].type == high) - { - return pair; - } - - if (!pair->structure.next) - { - break; - } - } - - auto high_alignment = get_byte_alignment(high); - auto alignment = MAX(get_byte_alignment(low), high_alignment); - u64 high_offset = align_forward(get_byte_size(low), alignment); - auto byte_size = align_forward(high_offset + get_byte_size(high), alignment); - - assert(low->scope); - assert(high->scope); - - auto scope = low->scope->kind == ScopeKind::global ? high->scope : low->scope; - - auto fields = arena_allocate(module->arena, 2); - fields[0] = { - .name = string_literal("low"), - .type = low, - .offset = 0, - .line = 0, - }; - fields[1] = { - .name = string_literal("high"), - .type = high, - .offset = high_offset, - .line = 0, - }; - - auto struct_type = type_allocate_init(module, { - .structure = { - .fields = fields, - .byte_size = byte_size, - .byte_alignment = alignment, - }, - .id = TypeId::structure, - .name = string_literal(""), - .scope = scope, - }); - - if (pair) - { - assert(module->first_pair_struct_type); - pair->structure.next = struct_type; - } - else - { - assert(!module->first_pair_struct_type); - module->first_pair_struct_type = struct_type; - } - - return struct_type; -} - -fn Type* get_by_value_argument_pair(Module* module, Type* low, Type* high) -{ - auto low_size = get_byte_allocation_size(low); - auto high_alignment = get_byte_alignment(high); - auto high_start = align_forward(low_size, high_alignment); - assert(high_start != 0 && high_start <= 8); - if (high_start != 8) - { - trap(); - } - - auto result = get_anonymous_struct_pair(module, low, high); - return result; -} - -struct IndirectOptions -{ - Type* semantic_type; - Type* padding_type = 0; - u32 alignment; - bool by_value = true; - bool realign = false; -}; - -fn AbiInformation abi_system_v_get_indirect(IndirectOptions indirect) -{ - auto result = AbiInformation{ - .semantic_type = indirect.semantic_type, - .attributes = { - .indirect = { - .alignment = 0, - .address_space = 0, - }, - }, - .flags = { - .kind = AbiKind::indirect, - }, - }; - - result.set_indirect_align(indirect.alignment); - result.set_indirect_by_value(indirect.by_value); - result.set_indirect_realign(indirect.realign); - result.set_sret_after_this(false); - result.set_padding_type(indirect.padding_type); - - return result; -} - -struct NaturalAlignIndirect -{ - Type* semantic_type; - Type* padding_type = 0; - bool by_value = true; - bool realign = false; -}; - -fn AbiInformation abi_system_v_get_natural_align_indirect(NaturalAlignIndirect natural) -{ - auto alignment = get_byte_alignment(natural.semantic_type); - return abi_system_v_get_indirect({ - .semantic_type = natural.semantic_type, - .padding_type = natural.padding_type, - .alignment = alignment, - .by_value = natural.by_value, - .realign = natural.realign, - }); -} - -fn bool is_illegal_vector_type(Type* type) -{ - switch (type->id) - { - case TypeId::vector: trap(); - default: - return false; - } -} - -fn AbiInformation abi_system_v_get_indirect_result(Module* module, Type* type, u32 free_gpr) -{ - if (!type_is_aggregate_type_for_abi(type) && !is_illegal_vector_type(type) && !is_arbitrary_bit_integer(type)) - { - if (is_promotable_integer_type_for_abi(type)) - { - return abi_system_v_get_extend({ - .semantic_type = type, - .sign = type_is_signed(type), - }); - } - else - { - return abi_system_v_get_direct(module, { - .semantic_type = type, - .type = type, - }); - } - } - else - { - auto alignment = MAX(get_byte_alignment(type), 8); - auto size = get_byte_size(type); - - if (free_gpr == 0 && alignment == 8 && size <= 8) - { - return abi_system_v_get_direct(module, { - .semantic_type = type, - .type = integer_type(module, { .bit_count = size * 8, .is_signed = false }), - }); - } - else - { - return abi_system_v_get_indirect({ - .semantic_type = type, - .alignment = alignment, - }); - } - } -} - -struct AbiSystemVClassifyArgumentTypeOptions -{ - u32 available_gpr; - bool is_named_argument; - bool is_reg_call; -}; - -struct AbiSystemVClassifyArgumentTypeResult -{ - AbiInformation abi; - AbiRegisterCountSystemV needed_registers; -}; - -fn AbiSystemVClassifyArgumentTypeResult abi_system_v_classify_argument_type(Module* module, Type* semantic_argument_type, AbiSystemVClassifyArgumentTypeOptions options) -{ - auto classify_result = abi_system_v_classify_type(semantic_argument_type, AbiSystemVClassify{ - .base_offset = 0, - .is_variable_argument = !options.is_named_argument, - .is_register_call = options.is_reg_call, - }); - - auto low_class = classify_result.r[0]; - auto high_class = classify_result.r[1]; - - AbiRegisterCountSystemV needed_registers = {}; - - Type* low_type = 0; - - switch (low_class) - { - case AbiSystemVClass::none: unreachable(); - case AbiSystemVClass::integer: - { - needed_registers.gpr += 1; - low_type = abi_system_v_get_integer_type_at_offset(module, semantic_argument_type, 0, semantic_argument_type, 0); - - if (high_class == AbiSystemVClass::none && low_type->id == TypeId::integer) - { - // TODO: if enumerator - - if (is_integral_or_enumeration_type(semantic_argument_type) && is_promotable_integer_type_for_abi(semantic_argument_type)) - { - return { abi_system_v_get_extend({ - .semantic_type = semantic_argument_type, - .sign = type_is_signed(semantic_argument_type), - }), needed_registers }; - } - } - } break; - case AbiSystemVClass::memory: - { - return { abi_system_v_get_indirect_result(module, semantic_argument_type, options.available_gpr), needed_registers }; - } break; - default: unreachable(); - } - - Type* high_type = 0; - - switch (high_class) - { - case AbiSystemVClass::none: - break; - case AbiSystemVClass::integer: - { - needed_registers.gpr += 1; - high_type = abi_system_v_get_integer_type_at_offset(module, semantic_argument_type, 8, semantic_argument_type, 8); - - if (low_class == AbiSystemVClass::none) - { - trap(); - } - } break; - default: unreachable(); - } - - Type* result_type = low_type; - if (high_type) - { - result_type = get_by_value_argument_pair(module, low_type, high_type); - } - - return { - abi_system_v_get_direct(module, DirectOptions{ - .semantic_type = semantic_argument_type, - .type = result_type, - }), - needed_registers, - }; -} - -struct AbiSystemVClassifyArgumentOptions -{ - Type* type; - u16 abi_start; - bool is_reg_call = false; - bool is_named_argument; -}; - -fn AbiInformation abi_system_v_classify_argument(Module* module, AbiRegisterCountSystemV* available_registers, Slice llvm_abi_argument_type_buffer, Slice abi_argument_type_buffer, AbiSystemVClassifyArgumentOptions options) -{ - auto semantic_argument_type = options.type; - if (options.is_reg_call) - { - trap(); - } - - auto result = abi_system_v_classify_argument_type(module, semantic_argument_type, { - .available_gpr = available_registers->gpr, - .is_named_argument = options.is_named_argument, - .is_reg_call = options.is_reg_call, - }); - auto abi = result.abi; - auto needed_registers = result.needed_registers; - - AbiInformation argument_abi; - if (available_registers->gpr >= needed_registers.gpr && available_registers->sse >= needed_registers.sse) - { - available_registers->gpr -= needed_registers.gpr; - available_registers->sse -= needed_registers.sse; - argument_abi = abi; - } - else - { - argument_abi = abi_system_v_get_indirect_result(module, semantic_argument_type, available_registers->gpr); - } - - if (argument_abi.get_padding_type()) - { - trap(); - } - - argument_abi.abi_start = options.abi_start; - - u16 count = 0; - - switch (argument_abi.flags.kind) - { - case AbiKind::direct: - case AbiKind::extend: - { - auto coerce_to_type = argument_abi.get_coerce_to_type(); - resolve_type_in_place(module, coerce_to_type); - - auto is_flattened_struct = argument_abi.flags.kind == AbiKind::direct && argument_abi.get_can_be_flattened() && coerce_to_type->id == TypeId::structure; - - count = is_flattened_struct ? coerce_to_type->structure.fields.length : 1; - - if (is_flattened_struct) - { - for (u64 i = 0; i < coerce_to_type->structure.fields.length; i += 1) - { - auto& field = coerce_to_type->structure.fields[i]; - auto field_type = field.type; - llvm_abi_argument_type_buffer[argument_abi.abi_start + i] = field_type->llvm.abi; - abi_argument_type_buffer[argument_abi.abi_start + i] = field_type; - } - } - else - { - llvm_abi_argument_type_buffer[argument_abi.abi_start] = coerce_to_type->llvm.abi; - abi_argument_type_buffer[argument_abi.abi_start] = coerce_to_type; - } - } break; - case AbiKind::indirect: - { - auto indirect_type = get_pointer_type(module, argument_abi.semantic_type); - auto abi_index = argument_abi.abi_start; - abi_argument_type_buffer[abi_index] = indirect_type; - resolve_type_in_place(module, indirect_type); - llvm_abi_argument_type_buffer[abi_index] = indirect_type->llvm.abi; - count = 1; - } break; - default: unreachable(); - } - - assert(count); - argument_abi.abi_count = count; - - return argument_abi; -} - -fn AbiInformation abi_system_v_get_indirect_return_result(Type* type) -{ - if (type_is_aggregate_type_for_abi(type)) - { - return abi_system_v_get_natural_align_indirect({ - .semantic_type = type, - }); - } - else - { - trap(); - } -} - -fn AbiInformation abi_system_v_classify_return_type(Module* module, Type* semantic_return_type) -{ - auto type_classes = abi_system_v_classify_type(semantic_return_type, {}); - auto low_class = type_classes.r[0]; - auto high_class = type_classes.r[1]; - assert(high_class != AbiSystemVClass::memory || low_class == AbiSystemVClass::memory); - assert(high_class != AbiSystemVClass::sse_up || low_class == AbiSystemVClass::sse); - - Type* low_type = 0; - - switch (low_class) - { - case AbiSystemVClass::none: - { - if (high_class == AbiSystemVClass::none) - { - return abi_system_v_get_ignore(module, semantic_return_type); - } - - trap(); - } break; - case AbiSystemVClass::integer: - { - low_type = abi_system_v_get_integer_type_at_offset(module, semantic_return_type, 0, semantic_return_type, 0); - - if (high_class == AbiSystemVClass::none && low_type->id == TypeId::integer) - { - // TODO - // if (semantic_return_type->id == TypeId::enumerator) - // { - // trap(); - // } - - if (is_integral_or_enumeration_type(semantic_return_type) && is_promotable_integer_type_for_abi(semantic_return_type)) - { - return abi_system_v_get_extend({ - .semantic_type = semantic_return_type, - .sign = type_is_signed(semantic_return_type), - }); - } - } - } break; - case AbiSystemVClass::memory: - { - return abi_system_v_get_indirect_return_result(semantic_return_type); - } break; - default: unreachable(); - } - - Type* high_type = 0; - - switch (high_class) - { - case AbiSystemVClass::none: - break; - case AbiSystemVClass::integer: - { - u64 high_offset = 8; - high_type = abi_system_v_get_integer_type_at_offset(module, semantic_return_type, high_offset, semantic_return_type, high_offset); - if (low_class == AbiSystemVClass::none) - { - trap(); - } - } break; - - default: unreachable(); - } - - if (high_type) - { - low_type = get_by_value_argument_pair(module, low_type, high_type); - } - - auto result = abi_system_v_get_direct(module, { - .semantic_type = semantic_return_type, - .type = low_type, - }); - return result; -} - -struct AttributeBuildOptions -{ - AbiInformation return_abi; - Slice argument_abis; - Slice abi_argument_types; - Type* abi_return_type; - FunctionAttributes attributes; - bool call_site; -}; - -struct AllocaOptions -{ - Type* type; - String name = string_literal(""); - u32 alignment; -}; - -fn Global* get_current_function(Module* module) -{ - Global* parent_function_global = 0; - if (module->current_function) - { - parent_function_global = module->current_function; - } - else if (module->current_macro_instantiation) - { - parent_function_global = module->current_macro_instantiation->instantiation_function; - } - - return parent_function_global; -} - -fn LLVMValueRef create_alloca(Module* module, AllocaOptions options) -{ - auto abi_type = options.type; - resolve_type_in_place(module, abi_type); - - u32 alignment; - if (options.alignment) - { - alignment = options.alignment; - } - else - { - alignment = get_byte_alignment(abi_type); - } - - auto original_block = LLVMGetInsertBlock(module->llvm.builder); - auto function = get_current_function(module); - auto debug_location = LLVMGetCurrentDebugLocation2(module->llvm.builder); - LLVMPositionBuilderBefore(module->llvm.builder, function->variable.storage->function.llvm.alloca_insertion_point); - LLVMSetCurrentDebugLocation2(module->llvm.builder, 0); - - auto alloca = llvm_builder_create_alloca(module->llvm.builder, abi_type->llvm.memory, alignment, options.name); - LLVMPositionBuilderAtEnd(module->llvm.builder, original_block); - LLVMSetCurrentDebugLocation2(module->llvm.builder, debug_location); - return alloca; -} - -struct StoreOptions -{ - LLVMValueRef source; - LLVMValueRef destination; - Type* type; - u32 alignment; -}; - -fn void create_store(Module* module, StoreOptions options) -{ - assert(options.source); - assert(options.destination); - assert(options.type); - - auto resolved_type = resolve_alias(module, options.type); - resolve_type_in_place(module, resolved_type); - - LLVMValueRef source_value; - - LLVMTypeRef memory_type = resolved_type->llvm.memory; - if (resolved_type->llvm.abi == memory_type) - { - source_value = options.source; - } - else - { - source_value = LLVMBuildIntCast2(module->llvm.builder, options.source, memory_type, type_is_signed(resolved_type), ""); - } - - u32 alignment; - if (options.alignment) - { - alignment = options.alignment; - } - else - { - alignment = get_byte_alignment(resolved_type); - } - - auto store = LLVMBuildStore(module->llvm.builder, source_value, options.destination); - LLVMSetAlignment(store, alignment); -} - -fn LLVMValueRef memory_to_abi(Module* module, LLVMValueRef value, Type* type) -{ - LLVMValueRef result = value; - if (type->llvm.memory != type->llvm.abi) - { - result = LLVMBuildIntCast2(module->llvm.builder, result, type->llvm.abi, type_is_signed(type), ""); - } - return result; -} - -struct LoadOptions -{ - Type* type; - LLVMValueRef pointer; - u32 alignment; - TypeKind kind; -}; - -fn LLVMValueRef create_load(Module* module, LoadOptions options) -{ - resolve_type_in_place(module, options.type); - - u32 alignment; - if (options.alignment) - { - alignment = options.alignment; - } - else - { - alignment = get_byte_alignment(options.type); - } - - auto result = LLVMBuildLoad2(module->llvm.builder, options.type->llvm.memory, options.pointer, ""); - LLVMSetAlignment(result, alignment); - - switch (options.kind) - { - case TypeKind::abi: - { - result = memory_to_abi(module, result, options.type); - } break; - case TypeKind::memory: break; - } - - return result; -} - -struct GEPOptions -{ - LLVMTypeRef type; - LLVMValueRef pointer; - Slice indices; - bool inbounds = true; -}; - -fn LLVMValueRef create_gep(Module* module, GEPOptions options) -{ - assert(options.indices.length); - auto* gep_function = options.inbounds ? &LLVMBuildInBoundsGEP2 : &LLVMBuildGEP2; - auto gep = gep_function(module->llvm.builder, options.type, options.pointer, options.indices.pointer, (u32)options.indices.length, ""); - return gep; -} - -using EnumCallback = void (LLVMValueRef, LLVMAttributeIndex, LLVMAttributeRef); - -fn LLVMAttributeRef create_enum_attribute(Module* module, AttributeIndex attribute_index, u64 value) -{ - return LLVMCreateEnumAttribute(module->llvm.context, module->llvm.attribute_table[(u64)attribute_index].n, value); -} - -fn LLVMAttributeRef create_type_attribute(Module* module, AttributeIndex attribute_index, LLVMTypeRef type) -{ - return LLVMCreateTypeAttribute(module->llvm.context, module->llvm.attribute_table[(u64)attribute_index].n, type); -} - -fn LLVMAttributeRef create_string_attribute(Module* module, String key, String value) -{ - return LLVMCreateStringAttribute(module->llvm.context, (char*)key.pointer, key.length, (char*)value.pointer, value.length); -} - -fn void create_and_add_enum_attribute(Module* module, AttributeIndex attribute_name, u64 attribute_value, EnumCallback* add_callback, LLVMValueRef value, u32 attribute_index) -{ - auto attribute = create_enum_attribute(module, attribute_name, attribute_value); - add_callback(value, attribute_index, attribute); -} - -fn void create_and_add_type_attribute(Module* module, AttributeIndex attribute_name, LLVMTypeRef type, EnumCallback* add_callback, LLVMValueRef value, u32 attribute_index) -{ - auto attribute = create_type_attribute(module, attribute_name, type); - add_callback(value, attribute_index, attribute); -} - -fn void create_and_add_string_attribute(Module* module, String attribute_key, String attribute_value, EnumCallback* add_callback, LLVMValueRef value, u32 attribute_index) -{ - auto attribute = create_string_attribute(module, attribute_key, attribute_value); - add_callback(value, attribute_index, attribute); -} - -struct ValueAttribute -{ - u32 alignment; - u32 sign_extend:1; - u32 zero_extend:1; - u32 no_alias:1; - u32 in_reg:1; - u32 sret:1; - u32 writable:1; - u32 dead_on_unwind:1; - u32 by_value:1; -}; - -fn void add_value_attribute(Module* module, LLVMValueRef value, u32 index, EnumCallback* add_callback, LLVMTypeRef semantic_type, LLVMTypeRef abi_type, ValueAttribute attributes) -{ - assert(value); - assert(semantic_type); - assert(abi_type); - - if (attributes.alignment) - { - create_and_add_enum_attribute(module, AttributeIndex::align, attributes.alignment, add_callback, value, index); - } - - if (attributes.sign_extend) - { - create_and_add_enum_attribute(module, AttributeIndex::signext, 0, add_callback, value, index); - } - - if (attributes.zero_extend) - { - create_and_add_enum_attribute(module, AttributeIndex::zeroext, 0, add_callback, value, index); - } - - if (attributes.no_alias) - { - create_and_add_enum_attribute(module, AttributeIndex::noalias, 0, add_callback, value, index); - } - - if (attributes.in_reg) - { - create_and_add_enum_attribute(module, AttributeIndex::inreg, 0, add_callback, value, index); - } - - if (attributes.sret) - { - create_and_add_type_attribute(module, AttributeIndex::sret, semantic_type, add_callback, value, index); - } - - if (attributes.writable) - { - create_and_add_enum_attribute(module, AttributeIndex::writable, 0, add_callback, value, index); - } - - if (attributes.dead_on_unwind) - { - create_and_add_enum_attribute(module, AttributeIndex::dead_on_unwind, 0, add_callback, value, index); - } - - if (attributes.by_value) - { - create_and_add_type_attribute(module, AttributeIndex::byval, semantic_type, add_callback, value, index); - } -} - -fn void emit_attributes(Module* module, LLVMValueRef value, EnumCallback* add_callback, AttributeBuildOptions options) -{ - resolve_type_in_place(module, options.return_abi.semantic_type); - add_value_attribute(module, value, 0, add_callback, options.return_abi.semantic_type->llvm.memory, options.abi_return_type->llvm.abi, { - .alignment = 0, - .sign_extend = options.return_abi.flags.kind == AbiKind::extend && options.return_abi.flags.sign_extension, - .zero_extend = options.return_abi.flags.kind == AbiKind::extend && !options.return_abi.flags.sign_extension, - .no_alias = false, - .in_reg = false, - .sret = false, - .writable = false, - .dead_on_unwind = false, - .by_value = false, - }); - - u64 total_abi_count = 0; - if (options.return_abi.flags.kind == AbiKind::indirect) - { - const auto& abi = options.return_abi; - auto abi_index = abi.flags.sret_after_this; - - auto abi_type = options.abi_argument_types[abi_index]; - resolve_type_in_place(module, abi_type); - add_value_attribute(module, value, abi_index + 1, add_callback, abi.semantic_type->llvm.memory, abi_type->llvm.abi, { - .alignment = get_byte_alignment(abi.semantic_type), - .sign_extend = false, - .zero_extend = false, - .no_alias = true, - .in_reg = abi.flags.in_reg, - .sret = true, - .writable = true, - .dead_on_unwind = true, - .by_value = false, - }); - - total_abi_count += 1; - } - - for (const auto& abi: options.argument_abis) - { - resolve_type_in_place(module, abi.semantic_type); - - for (auto abi_index = abi.abi_start; abi_index < abi.abi_start + abi.abi_count; abi_index += 1) - { - auto abi_type = options.abi_argument_types[abi_index]; - resolve_type_in_place(module, abi_type); - - add_value_attribute(module, value, abi_index + 1, add_callback, abi.semantic_type->llvm.memory, abi_type->llvm.abi, { - .alignment = u32(abi.flags.kind == AbiKind::indirect ? 8 : 0), - .sign_extend = abi.flags.kind == AbiKind::extend && abi.flags.sign_extension, - .zero_extend = abi.flags.kind == AbiKind::extend && !abi.flags.sign_extension, - .no_alias = false, - .in_reg = abi.flags.in_reg, - .sret = false, - .writable = false, - .dead_on_unwind = false, - .by_value = abi.flags.indirect_by_value, - }); - total_abi_count += 1; - } - } - - assert(total_abi_count == options.abi_argument_types.length); - - auto index = ~(u32)0; - { - auto is_noreturn = options.return_abi.semantic_type == noreturn_type(module); - if (is_noreturn) - { - create_and_add_enum_attribute(module, AttributeIndex::noreturn, 0, add_callback, value, index); - } - - auto nounwind = true; - if (nounwind) - { - create_and_add_enum_attribute(module, AttributeIndex::nounwind, 0, add_callback, value, index); - } - - auto no_inline = options.attributes.inline_behavior == InlineBehavior::no_inline; - if (no_inline) - { - create_and_add_enum_attribute(module, AttributeIndex::noinline, 0, add_callback, value, index); - } - - auto always_inline = options.attributes.inline_behavior == InlineBehavior::always_inline; - if (always_inline) - { - create_and_add_enum_attribute(module, AttributeIndex::alwaysinline, 0, add_callback, value, index); - } - - if (module->has_debug_info) - { - create_and_add_string_attribute(module, string_literal("frame-pointer"), string_literal("all"), add_callback, value, index); - } - - if (!options.call_site) - { - if (options.attributes.naked) - { - create_and_add_enum_attribute(module, AttributeIndex::naked, 0, add_callback, value, index); - } - - if (options.attributes.inline_behavior == InlineBehavior::inline_hint) - { - create_and_add_enum_attribute(module, AttributeIndex::inlinehint, 0, add_callback, value, index); - } - } - } -} - -fn void check_types(Module* module, Type* expected, Type* source) -{ - assert(expected); - assert(source); - - if (expected != source) - { - auto resolved_expected = resolve_alias(module, expected); - auto resolved_source = resolve_alias(module, source); - - if (resolved_expected != resolved_source) - { - auto is_dst_p_and_source_int = resolved_expected->id == TypeId::pointer && resolved_source->id == TypeId::integer; - if (!is_dst_p_and_source_int) - { - report_error(); - } - } - } -} - -fn void typecheck(Module* module, Type* expected, Type* source) -{ - if (expected) - { - check_types(module, expected, source); - } -} - -fn bool unary_is_boolean(UnaryId id) -{ - switch (id) - { - case UnaryId::exclamation: - return true; - case UnaryId::minus: - case UnaryId::plus: - case UnaryId::ampersand: - case UnaryId::enum_name: - case UnaryId::extend: - case UnaryId::truncate: - case UnaryId::pointer_cast: - case UnaryId::int_from_enum: - case UnaryId::int_from_pointer: - case UnaryId::va_end: - case UnaryId::bitwise_not: - case UnaryId::dereference: - case UnaryId::pointer_from_int: - case UnaryId::enum_from_int: - case UnaryId::leading_zeroes: - case UnaryId::trailing_zeroes: - return false; - } -} - -fn bool binary_is_boolean(BinaryId id) -{ - switch (id) - { - case BinaryId::add: - case BinaryId::sub: - case BinaryId::mul: - case BinaryId::div: - case BinaryId::rem: - case BinaryId::bitwise_and: - case BinaryId::bitwise_or: - case BinaryId::bitwise_xor: - case BinaryId::shift_left: - case BinaryId::shift_right: - case BinaryId::max: - case BinaryId::min: - return false; - case BinaryId::compare_equal: - case BinaryId::compare_not_equal: - case BinaryId::compare_greater: - case BinaryId::compare_less: - case BinaryId::compare_greater_equal: - case BinaryId::compare_less_equal: - case BinaryId::logical_and: - case BinaryId::logical_or: - case BinaryId::logical_and_shortcircuit: - case BinaryId::logical_or_shortcircuit: - return true; - } -} - -fn bool binary_is_shortcircuiting(BinaryId id) -{ - switch (id) - { - case BinaryId::logical_and_shortcircuit: - case BinaryId::logical_or_shortcircuit: - return true; - default: - return false; - } -} - -enum class IndexType -{ - none, - array, - enum_array, -}; - -struct TypeAnalysis -{ - Type* indexing_type; - bool must_be_constant; -}; - -fn void analyze_type(Module* module, Value* value, Type* expected_type, TypeAnalysis analysis); - -fn void analyze_binary_type(Module* module, Value* left, Value* right, bool is_boolean, Type* expected_type, bool must_be_constant, bool is_sub) -{ - auto left_constant = left->is_constant(); - auto right_constant = right->is_constant(); - auto left_receives_type = receives_type(left); - auto right_receives_type = receives_type(right); - - if (!expected_type && left_receives_type && right_receives_type) - { - if (left->id == right->id) - { - switch (left->id) - { - case ValueId::string_literal: - { - expected_type = get_slice_type(module, uint8(module)); - } break; - default: - report_error(); - } - } - else - { - report_error(); - } - } - - if (!left_receives_type && !right_receives_type) - { - analyze_type(module, left, 0, { .must_be_constant = must_be_constant }); - analyze_type(module, right, 0, { .must_be_constant = must_be_constant }); - } - else if (left_receives_type && !right_receives_type) - { - analyze_type(module, right, 0, { .must_be_constant = must_be_constant }); - analyze_type(module, left, right->type, { .must_be_constant = must_be_constant }); - } - else if (!left_receives_type && right_receives_type) - { - analyze_type(module, left, 0, { .must_be_constant = must_be_constant }); - analyze_type(module, right, left->type, { .must_be_constant = must_be_constant }); - } - else if (left_receives_type && right_receives_type) - { - assert(expected_type); - if (is_boolean) - { - report_error(); - } - - analyze_type(module, left, expected_type, { .must_be_constant = must_be_constant }); - analyze_type(module, right, expected_type, { .must_be_constant = must_be_constant }); - } - else - { - unreachable(); - } - - assert(left->type); - assert(right->type); - - if (expected_type) - { - if (expected_type->id == TypeId::integer && left->type->id == TypeId::pointer && right->type->id == TypeId::pointer && is_sub) - { - check_types(module, left->type, right->type); - } - else if (!is_boolean) - { - typecheck(module, expected_type, left->type); - typecheck(module, expected_type, right->type); - } - } -} - -fn Type* get_va_list_type(Module* module) -{ - if (!module->va_list_type) - { - auto u32_type = uint32(module); - auto void_pointer = get_pointer_type(module, uint8(module)); - auto fields = arena_allocate(module->arena, 4); - fields[0] = { .name = string_literal("gp_offset"), .type = u32_type, .offset = 0 }; - fields[1] = { .name = string_literal("fp_offset"), .type = u32_type, .offset = 4 }; - fields[2] = { .name = string_literal("overflow_arg_area"), .type = void_pointer, .offset = 8 }; - fields[3] = { .name = string_literal("reg_save_area"), .type = void_pointer, .offset = 16 }; - - auto va_list_struct = type_allocate_init(module, { - .structure = { - .fields = fields, - .byte_size = 24, - .byte_alignment = 16, - }, - .id = TypeId::structure, - .name = string_literal("va_list"), - .scope = &module->scope, - }); - - module->va_list_type = get_array_type(module, va_list_struct, 1); - } - - assert(module->va_list_type); - - return module->va_list_type; -} - -fn Global* get_enum_name_array_global(Module* module, Type* enum_type) -{ - assert(enum_type->id == TypeId::enumerator); - - if (!enum_type->enumerator.name_array) - { - auto fields = enum_type->enumerator.fields; - auto u8_type = uint8(module); - auto u64_type = uint64(module); - resolve_type_in_place(module, u8_type); - resolve_type_in_place(module, u64_type); - LLVMValueRef name_constant_buffer[64]; - - for (u32 i = 0; i < fields.length; i += 1) - { - auto null_terminate = true; - auto& field = fields[i]; - auto is_constant = true; - String name_parts[] = { - string_literal("string."), - enum_type->name, - string_literal("."), - field.name, - }; - auto initial_value = LLVMConstStringInContext2(module->llvm.context, (char*)field.name.pointer, field.name.length, false); - u32 alignment = 1; - auto name_global = llvm_create_global_variable(module->llvm.module, LLVMArrayType2(u8_type->llvm.abi, field.name.length + null_terminate), is_constant, LLVMInternalLinkage, initial_value, arena_join_string(module->arena, array_to_slice(name_parts)), LLVMNotThreadLocal, false, alignment, LLVMGlobalUnnamedAddr); - LLVMValueRef constants[] = { - name_global, - LLVMConstInt(u64_type->llvm.abi, field.name.length, false), - }; - auto slice_constant = LLVMConstStructInContext(module->llvm.context, constants, array_length(constants), false); - name_constant_buffer[i] = slice_constant; - } - - auto slice_type = get_slice_type(module, u8_type); - auto array_element_count = fields.length; - auto name_array = LLVMConstArray2(slice_type->llvm.abi, name_constant_buffer, array_element_count); - auto name_array_type = LLVMArrayType2(slice_type->llvm.abi, array_element_count); - auto is_constant = true; - auto name_array_variable = llvm_create_global_variable(module->llvm.module, name_array_type, is_constant, LLVMInternalLinkage, name_array, string_literal("name.array.enum"), LLVMNotThreadLocal, false, get_byte_alignment(slice_type), LLVMGlobalUnnamedAddr); - - auto global_type = get_array_type(module, slice_type, array_element_count); - resolve_type_in_place(module, global_type); - - auto storage_type = get_pointer_type(module, global_type); - resolve_type_in_place(module, storage_type); - - auto global_storage = new_value(module); - *global_storage = { - .type = storage_type, - .id = ValueId::global, - .kind = ValueKind::left, - .llvm = name_array_variable, - }; - - String name_parts[] = { - string_literal("name.array.enum."), - enum_type->name, - }; - - auto global = new_global(module); - *global = { - .variable = { - .storage = global_storage, - .initial_value = 0, - .type = global_type, - .scope = &module->scope, - .name = arena_join_string(module->arena, array_to_slice(name_parts)), - .line = 0, - .column = 0, - }, - .linkage = Linkage::internal, - }; - global->emitted = true; - - enum_type->enumerator.name_array = global; - } - - return enum_type->enumerator.name_array; -} - -struct BlockCopy -{ - Block* source; - Block* destination; -}; -fn void copy_block(Module* module, Scope* parent_scope, BlockCopy copy); - -fn Value* clone_value(Module* module, Scope* scope, Value* old_value) -{ - assert(old_value); - - Value* result = 0; - if (old_value->id == ValueId::variable_reference) - { - result = reference_identifier(module, scope, old_value->variable_reference->name, old_value->kind); - } - else - { - result = new_value(module); - *result = *old_value; - - switch (old_value->id) - { - case ValueId::variable_reference: - { - unreachable(); - } break; - case ValueId::binary: - { - auto left = clone_value(module, scope, old_value->binary.left); - auto right = clone_value(module, scope, old_value->binary.right); - - result->binary = { - .left = left, - .right = right, - .id = old_value->binary.id, - }; - } break; - case ValueId::unary: - { - auto unary_value = clone_value(module, scope, old_value->unary.value); - result->unary = { - .value = unary_value, - .id = old_value->unary.id, - }; - } break; - case ValueId::unary_type: - { - result->unary_type = old_value->unary_type; - } break; - case ValueId::unreachable: - break; - case ValueId::slice_expression: - { - auto old_start = old_value->slice_expression.start; - auto old_end = old_value->slice_expression.end; - - result->slice_expression = { - .array_like = clone_value(module, scope, old_value->slice_expression.array_like), - .start = old_start ? clone_value(module, scope, old_start) : 0, - .end = old_end ? clone_value(module, scope, old_end) : 0, - }; - } break; - case ValueId::call: - { - auto callable = clone_value(module, scope, old_value->call.callable); - auto old_arguments = old_value->call.arguments; - auto arguments = new_value_array(module, old_arguments.length); - - for (u64 i = 0; i < arguments.length; i += 1) - { - arguments[i] = clone_value(module, scope, old_arguments[i]); - } - - result->call = { - .callable = callable, - .arguments = arguments, - .function_type = old_value->call.function_type, - }; - } break; - default: trap(); - } - } - - assert(result); - - return result; -} - -fn Statement* clone_statement(Module* module, Scope* scope, Statement* old_statement) -{ - auto new_statement = &arena_allocate(module->arena, 1)[0]; - *new_statement = {}; - auto old_id = old_statement->id; - new_statement->id = old_id; // TODO: is this right? - new_statement->line = old_statement->line; - new_statement->column = old_statement->column; - - switch (old_id) - { - case StatementId::return_st: - { - auto old_return_value = old_statement->return_st; - new_statement->return_st = old_return_value ? clone_value(module, scope, old_return_value) : 0; - } break; - case StatementId::if_st: - { - auto condition = clone_value(module, scope, old_statement->if_st.condition); - auto if_statement = clone_statement(module, scope, old_statement->if_st.if_statement); - auto else_statement = old_statement->if_st.else_statement; - else_statement = else_statement ? clone_statement(module, scope, else_statement) : 0; - new_statement->if_st = { - .condition = condition, - .if_statement = if_statement, - .else_statement = else_statement, - }; - } break; - case StatementId::block: - { - auto block = &arena_allocate(module->arena, 1)[0]; - copy_block(module, scope, { - .source = old_statement->block, - .destination = block, - }); - - new_statement->block = block; - } break; - case StatementId::expression: - { - auto value = clone_value(module, scope, old_statement->expression); - new_statement->expression = value; - } break; - case StatementId::local: - { - auto local_old = old_statement->local; - auto local_new = new_local(module, scope); - assert(!local_old->variable.storage); - *local_new = { - .variable = { - .storage = 0, - .initial_value = clone_value(module, scope, local_old->variable.initial_value), - .type = local_old->variable.type ? resolve_type(module, local_old->variable.type) : 0, - .scope = scope, - .name = local_old->variable.name, - .line = local_old->variable.line, - .column = local_old->variable.column, - }, - }; - - new_statement->local = local_new; - } break; - default: trap(); - } - - return new_statement; -} - -fn void copy_block(Module* module, Scope* parent_scope, BlockCopy copy) -{ - auto source = copy.source; - auto destination = copy.destination; - - *destination = {}; - auto scope = &destination->scope; - *scope = source->scope; - scope->parent = parent_scope; - assert(!scope->llvm); - - Statement* last_statement = 0; - for (Statement* old_statement = source->first_statement; old_statement; old_statement = old_statement->next) - { - auto statement = clone_statement(module, scope, old_statement); - assert(!statement->next); - if (last_statement) - { - last_statement->next = statement; - last_statement = statement; - } - else - { - last_statement = statement; - destination->first_statement = statement; - } - } -} - -fn Type* get_build_mode_enum(Module* module) -{ - auto result = module->build_mode_enum; - - if (!result) - { - String enum_names[] = { - string_literal("debug_none"), - string_literal("debug"), - string_literal("soft_optimize"), - string_literal("optimize_for_speed"), - string_literal("optimize_for_size"), - string_literal("aggressively_optimize_for_speed"), - string_literal("aggressively_optimize_for_size"), - }; - static_assert(array_length(enum_names) == (u64)BuildMode::count); - - auto enum_fields = arena_allocate(module->arena, array_length(enum_names)); - - u64 field_value = 0; - for (String enum_name : enum_names) - { - enum_fields[field_value] = { - .name = enum_name, - .value = field_value, - }; - - field_value += 1; - } - - auto backing_type = integer_type(module, { .bit_count = (u32)BuildMode::count, .is_signed = false }); - - result = type_allocate_init(module, { - .enumerator = { - .fields = enum_fields, - .backing_type = backing_type, - }, - .id = TypeId::enumerator, - .name = string_literal("BuildMode"), - .scope = &module->scope, - }); - } - - assert(result); - return result; -} - -fn void analyze_type(Module* module, Value* value, Type* expected_type, TypeAnalysis analysis) -{ - assert(!value->type); - assert(!value->llvm); - - if (expected_type && expected_type->id == TypeId::unresolved) - { - auto instantiation = module->current_macro_instantiation; - if (!instantiation) - { - report_error(); - } - - auto declaration = instantiation->declaration; - - Type* resolved_type = 0; - - auto instantiation_arguments = instantiation->constant_arguments; - auto declaration_arguments = declaration->constant_arguments; - - assert(instantiation_arguments.length == declaration_arguments.length); - - for (u64 i = 0; i < instantiation_arguments.length; i += 1) - { - auto& instantiation_argument = instantiation_arguments[i]; - auto& declaration_argument = declaration_arguments[i]; - - assert(declaration_argument.id == instantiation_argument.id); - - if (declaration_argument.id == ConstantArgumentId::type && declaration_argument.type == expected_type) - { - resolved_type = instantiation_argument.type; - resolve_type_in_place(module, resolved_type); - break; - } - } - - if (!resolved_type) - { - report_error(); - } - - expected_type = resolved_type; - } - - Type* value_type = 0; - - switch (value->id) - { - case ValueId::constant_integer: - { - if (!expected_type) - { - if (analysis.indexing_type) - { - expected_type = uint64(module); - } - } - - if (!expected_type) - { - report_error(); - } - - resolve_type_in_place(module, expected_type); - auto* resolved_type = resolve_alias(module, expected_type); - switch (resolved_type->id) - { - case TypeId::integer: - { - if (value->constant_integer.is_signed) - { - if (resolved_type->integer.is_signed) - { - report_error(); - } - - trap(); - } - else - { - auto max_value = integer_max_value(resolved_type->integer.bit_count, resolved_type->integer.is_signed); - - if (value->constant_integer.value > max_value) - { - report_error(); - } - - value_type = expected_type; - } - } break; - case TypeId::pointer: value_type = uint64(module); break; - default: trap(); - } - - typecheck(module, expected_type, value_type); - } break; - case ValueId::unary: - { - auto unary_id = value->unary.id; - auto unary_value = value->unary.value; - switch (unary_id) - { - case UnaryId::extend: - { - if (!expected_type) - { - report_error(); - } - - auto extended_value = unary_value; - analyze_type(module, extended_value, 0, { .must_be_constant = analysis.must_be_constant }); - auto source = extended_value->type; - assert(source); - - auto source_bit_size = get_bit_size(source); - auto expected_bit_size = get_bit_size(expected_type); - if (source_bit_size > expected_bit_size) - { - report_error(); - } - else if (source_bit_size == expected_bit_size && type_is_signed(source) == type_is_signed(expected_type)) - { - report_error(); - } - - value_type = expected_type; - } break; - case UnaryId::truncate: - { - if (!expected_type) - { - report_error(); - } - - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - auto expected_bit_size = get_bit_size(expected_type); - auto source_bit_size = get_bit_size(unary_value->type); - - if (expected_bit_size >= source_bit_size) - { - report_error(); - } - - value_type = expected_type; - } break; - case UnaryId::dereference: - { - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - if (value->kind == ValueKind::left) - { - report_error(); - } - auto pointer_type = unary_value->type; - assert(pointer_type->id == TypeId::pointer); - auto dereference_type = pointer_type->pointer.element_type; - - typecheck(module, expected_type, dereference_type); - value_type = dereference_type; - } break; - case UnaryId::int_from_enum: - { - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - - auto value_enum_type = unary_value->type; - if (value_enum_type->id != TypeId::enumerator) - { - report_error(); - } - - auto backing_type = value_enum_type->enumerator.backing_type; - typecheck(module, expected_type, backing_type); - - value_type = backing_type; - } break; - case UnaryId::int_from_pointer: - { - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - - auto value_enum_type = unary_value->type; - if (value_enum_type->id != TypeId::pointer) - { - report_error(); - } - - value_type = uint64(module); - typecheck(module, expected_type, value_type); - } break; - case UnaryId::pointer_cast: - { - if (!expected_type) - { - report_error(); - } - - if (expected_type->id != TypeId::pointer) - { - report_error(); - } - - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - auto value_pointer_type = unary_value->type; - if (value_pointer_type == expected_type) - { - report_error(); - } - - if (value_pointer_type->id != TypeId::pointer) - { - report_error(); - } - - value_type = expected_type; - } break; - case UnaryId::enum_name: - { - auto string_type = get_slice_type(module, uint8(module)); - typecheck(module, expected_type, string_type); - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - auto enum_type = unary_value->type; - resolve_type_in_place(module, enum_type); - if (enum_type->id != TypeId::enumerator) - { - report_error(); - } - - auto enum_to_string = enum_type->enumerator.enum_to_string_function; - if (!enum_to_string) - { - auto current_block = LLVMGetInsertBlock(module->llvm.builder); - auto enum_name_array_global = get_enum_name_array_global(module, enum_type); - LLVMTypeRef argument_types[] = { - enum_type->llvm.abi, - }; - auto llvm_function_type = LLVMFunctionType(string_type->llvm.memory, argument_types, array_length(argument_types), false); - String name_parts[] = { - string_literal("enum_to_string."), - enum_type->name, - }; - auto function_name = arena_join_string(module->arena, array_to_slice(name_parts)); - auto llvm_function = llvm_module_create_function(module->arena, module->llvm.module, llvm_function_type, LLVMInternalLinkage, function_name); - LLVMSetFunctionCallConv(llvm_function, LLVMFastCallConv); - - LLVMValueRef llvm_argument; - LLVMGetParams(llvm_function, &llvm_argument); - - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "entry"); - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - auto u32_type = uint32(module); - resolve_type_in_place(module, u32_type); - auto current_function = get_current_function(module); - auto old_alloca_insertion_point = current_function->variable.storage->function.llvm.alloca_insertion_point; - current_function->variable.storage->function.llvm.alloca_insertion_point = LLVMBuildAlloca(module->llvm.builder, u32_type->llvm.abi, "alloca.insertion.point"); - - auto alloca = create_alloca(module, { - .type = string_type, - .name = string_literal("return_value"), - }); - - auto* return_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "return_block"); - auto* else_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "else_block"); - - auto enum_fields = enum_type->enumerator.fields; - - auto switch_instruction = LLVMBuildSwitch(module->llvm.builder, llvm_argument, else_block, enum_fields.length); - auto backing_type = enum_type->llvm.abi; - assert(backing_type); - auto u64_type = uint64(module)->llvm.abi; - - for (u64 i = 0; i < enum_fields.length; i += 1) - { - auto& field = enum_fields[i]; - auto* case_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "case_block"); - auto case_value = LLVMConstInt(backing_type, field.value, false); - - LLVMAddCase(switch_instruction, case_value, case_block); - LLVMPositionBuilderAtEnd(module->llvm.builder, case_block); - - LLVMValueRef indices[] = { - LLVMConstNull(u64_type), - LLVMConstInt(u64_type, i, false), - }; - - auto case_value_result_pointer = create_gep(module, { - .type = enum_name_array_global->variable.type->llvm.memory, - .pointer = enum_name_array_global->variable.storage->llvm, - .indices = array_to_slice(indices), - }); - - auto case_value_result = create_load(module, { - .type = string_type, - .pointer = case_value_result_pointer, - }); - - create_store(module, { - .source = case_value_result, - .destination = alloca, - .type = string_type, - }); - - LLVMBuildBr(module->llvm.builder, return_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, else_block); - LLVMBuildUnreachable(module->llvm.builder); - - LLVMPositionBuilderAtEnd(module->llvm.builder, return_block); - auto function_result = create_load(module, { - .type = string_type, - .pointer = alloca, - }); - - LLVMBuildRet(module->llvm.builder, function_result); - - if (current_block) - { - LLVMPositionBuilderAtEnd(module->llvm.builder, current_block); - } - - enum_to_string = llvm_function; - enum_type->enumerator.enum_to_string_function = enum_to_string; - - current_function->variable.storage->function.llvm.alloca_insertion_point = old_alloca_insertion_point; - } - - assert(enum_to_string); - - value_type = string_type; - } break; - case UnaryId::pointer_from_int: - { - if (!expected_type) - { - report_error(); - } - - if (expected_type->id != TypeId::pointer) - { - report_error(); - } - - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - auto unary_value_type = unary_value->type; - if (unary_value_type->id != TypeId::integer) - { - report_error(); - } - - // TODO: is this correct? - if (get_bit_size(unary_value_type) != 64) - { - report_error(); - } - - value_type = expected_type; - } break; - case UnaryId::enum_from_int: - { - if (!expected_type) - { - report_error(); - } - - if (expected_type->id != TypeId::enumerator) - { - report_error(); - } - - analyze_type(module, unary_value, expected_type->enumerator.backing_type, { .must_be_constant = analysis.must_be_constant }); - auto unary_value_type = unary_value->type; - if (unary_value_type->id != TypeId::integer) - { - report_error(); - } - - if (get_bit_size(unary_value_type) != get_bit_size(expected_type)) - { - report_error(); - } - - value_type = expected_type; - } break; - default: - { - auto is_boolean = unary_is_boolean(unary_id); - if (is_boolean) - { - analyze_type(module, unary_value, 0, { .must_be_constant = analysis.must_be_constant }); - value_type = uint1(module); - } - else - { - analyze_type(module, unary_value, expected_type, { .must_be_constant = analysis.must_be_constant }); - value_type = unary_value->type; - } - - typecheck(module, expected_type, value_type); - } break; - } - } break; - case ValueId::unary_type: - { - auto unary_type = resolve_type(module, value->unary_type.type); - value->unary_type.type = unary_type; - auto unary_type_id = value->unary_type.id; - - if (unary_type_id == UnaryTypeId::enum_values) - { - auto element_type = unary_type; - - if (element_type->id != TypeId::enumerator) - { - report_error(); - } - - auto fields = unary_type->enumerator.fields; - auto element_count = fields.length; - if (element_count == 0) - { - report_error(); - } - - auto array_type = get_array_type(module, element_type, element_count); - switch (value->kind) - { - case ValueKind::right: - { - value_type = array_type; - } break; - case ValueKind::left: - { - value_type = get_pointer_type(module, array_type); - } break; - } - } - else if (unary_type_id == UnaryTypeId::enum_names) - { - if (unary_type->id != TypeId::enumerator) - { - report_error(); - } - - value_type = get_slice_type(module, get_slice_type(module, uint8(module))); - } - else - { - if (expected_type) - { - value_type = expected_type; - } - else - { - value_type = unary_type; - } - - assert(value_type); - if (value_type->id != TypeId::integer) - { - report_error(); - } - - u64 value; - auto max_value = integer_max_value(value_type->integer.bit_count, value_type->integer.is_signed); - switch (unary_type_id) - { - case UnaryTypeId::align_of: - { - value = get_byte_alignment(unary_type); - } break; - case UnaryTypeId::byte_size: - { - - value = get_byte_size(unary_type); - } break; - case UnaryTypeId::integer_max: - { - value = integer_max_value(unary_type->integer.bit_count, unary_type->integer.is_signed); - } break; - case UnaryTypeId::enum_names: - case UnaryTypeId::enum_values: - { - unreachable(); - } break; - } - - if (value > max_value) - { - report_error(); - } - } - - typecheck(module, expected_type, value_type); - } break; - case ValueId::binary: - { - auto id = value->binary.id; - auto is_boolean = binary_is_boolean(id); - auto left = value->binary.left; - auto right = value->binary.right; - auto is_sub = id == BinaryId::sub; - analyze_binary_type(module, left, right, is_boolean, expected_type, analysis.must_be_constant, is_sub); - check_types(module, left->type, right->type); - - if (is_sub && left->type->id == TypeId::pointer && right->type->id == TypeId::pointer) - { - assert(left->type == right->type); - - auto u64_type = uint64(module); - auto s64_type = sint64(module); - auto left_int_from_pointer = new_value(module); - *left_int_from_pointer = { - .unary = { - .value = left, - .id = UnaryId::int_from_pointer, - }, - .type = u64_type, - .id = ValueId::unary, - }; - auto right_int_from_pointer = new_value(module); - *right_int_from_pointer = { - .unary = { - .value = right, - .id = UnaryId::int_from_pointer, - }, - .type = u64_type, - .id = ValueId::unary, - }; - - value->type = s64_type; - value->binary.left = left_int_from_pointer; - value->binary.right = right_int_from_pointer; - - auto sub = new_value(module); - *sub = *value; - - auto size_constant = new_value(module); - - assert(left->type->id == TypeId::pointer); - auto element_type = left->type->pointer.element_type; - *size_constant = { - .unary_type = { - .type = element_type, - .id = UnaryTypeId::byte_size, - }, - .id = ValueId::unary_type, - }; - - analyze_type(module, size_constant, s64_type, { .must_be_constant = 1 }); - - *value = { - .binary = { - .left = sub, - .right = size_constant, - .id = BinaryId::div, - }, - .id = ValueId::binary, - }; - - if (expected_type) - { - trap(); - } - else - { - value_type = s64_type; - } - } - else if (is_boolean) - { - value_type = uint1(module); - } - else - { - value_type = left->type; - } - } break; - case ValueId::variable_reference: - { - switch (value->kind) - { - case ValueKind::left: value_type = value->variable_reference->storage->type; break; - case ValueKind::right: value_type = value->variable_reference->type; break; - } - assert(value_type); - typecheck(module, expected_type, value_type); - } break; - case ValueId::call: - { - auto call = &value->call; - auto callable = call->callable; - analyze_type(module, callable, 0, { .must_be_constant = analysis.must_be_constant }); - Type* function_type = 0; - switch (callable->id) - { - case ValueId::variable_reference: - { - auto variable_type = callable->variable_reference->type; - switch (variable_type->id) - { - case TypeId::function: - function_type = variable_type; break; - case TypeId::pointer: - { - auto* element_type = resolve_alias(module, variable_type->pointer.element_type); - switch (element_type->id) - { - case TypeId::function: function_type = element_type; break; - default: report_error(); - } - } break; - default: report_error(); - } - } break; - default: - report_error(); - } - - assert(function_type); - call->function_type = function_type; - - auto semantic_argument_types = function_type->function.base.semantic_argument_types; - auto call_arguments = call->arguments; - if (function_type->function.base.is_variable_arguments) - { - if (call_arguments.length < semantic_argument_types.length) - { - report_error(); - } - } - else - { - if (call_arguments.length != semantic_argument_types.length) - { - report_error(); - } - } - - for (u64 i = 0; i < semantic_argument_types.length; i += 1) - { - auto* argument_type = semantic_argument_types[i]; - auto* call_argument = call_arguments[i]; - analyze_type(module, call_argument, argument_type, { .must_be_constant = analysis.must_be_constant }); - check_types(module, argument_type, call_argument->type); - } - - for (u64 i = semantic_argument_types.length; i < call_arguments.length; i += 1) - { - auto* call_argument = call_arguments[i]; - analyze_type(module, call_argument, 0, { .must_be_constant = analysis.must_be_constant }); - } - - auto semantic_return_type = function_type->function.base.semantic_return_type; - typecheck(module, expected_type, semantic_return_type); - value_type = semantic_return_type; - } break; - case ValueId::array_initialization: - { - auto values = value->array_initialization.values; - if (expected_type) - { - if (expected_type->id != TypeId::array) - { - report_error(); - } - - if (expected_type->array.element_count == 0) - { - // TODO: use existing types? - expected_type->array.element_count = values.length; - assert(expected_type->name.equal(string_literal(""))); - expected_type->name = array_name(module, expected_type->array.element_type, expected_type->array.element_count); - } - else - { - if (expected_type->array.element_count != values.length) - { - report_error(); - } - } - - bool is_constant = true; - - auto* element_type = expected_type->array.element_type; - for (auto value : values) - { - analyze_type(module, value, element_type, { .must_be_constant = analysis.must_be_constant }); - is_constant = is_constant && value->is_constant(); - } - - value->array_initialization.is_constant = is_constant; - - if (value->kind == ValueKind::left) // TODO: possible? - { - report_error(); - } - - value_type = expected_type; - } - else - { - if (values.length == 0) - { - report_error(); - } - - Type* expected_type = 0; - bool is_constant = true; - - for (auto value : values) - { - analyze_type(module, value, expected_type, { .must_be_constant = analysis.must_be_constant }); - - is_constant = is_constant && value->is_constant(); - - auto value_type = value->type; - if (expected_type) - { - if (expected_type != value_type) - { - report_error(); - } - } - else - { - assert(value_type); - expected_type = value_type; - } - } - - if (!expected_type) - { - report_error(); - } - - auto element_type = expected_type; - auto element_count = values.length; - - auto array_type = get_array_type(module, element_type, element_count); - value_type = array_type; - - if (value->kind == ValueKind::left) - { - value_type = get_pointer_type(module, array_type); - } - } - } break; - case ValueId::array_expression: - { - auto array_like = value->array_expression.array_like; - array_like->kind = ValueKind::left; - analyze_type(module, array_like, 0, { .must_be_constant = analysis.must_be_constant }); - assert(array_like->kind == ValueKind::left); - auto array_like_type = array_like->type; - if (array_like_type->id != TypeId::pointer) - { - report_error(); - } - auto pointer_element_type = array_like_type->pointer.element_type; - - auto indexing_type = pointer_element_type->id == TypeId::enum_array ? pointer_element_type->enum_array.enum_type : uint64(module); - - analyze_type(module, value->array_expression.index, 0, { .indexing_type = indexing_type, .must_be_constant = analysis.must_be_constant }); - - Type* element_type = 0; - switch (pointer_element_type->id) - { - case TypeId::array: - { - element_type = pointer_element_type->array.element_type; - } break; - case TypeId::structure: - { - auto slice_type = pointer_element_type; - if (!slice_type->structure.is_slice) - { - report_error(); - } - auto slice_pointer_type = slice_type->structure.fields[0].type; - assert(slice_pointer_type->id == TypeId::pointer); - element_type = slice_pointer_type->pointer.element_type; - } break; - case TypeId::pointer: - { - element_type = pointer_element_type->pointer.element_type; - } break; - case TypeId::enum_array: - { - element_type = pointer_element_type->enum_array.element_type; - } break; - default: report_error(); - } - - assert(element_type); - - value_type = element_type; - if (value->kind == ValueKind::left) - { - value_type = get_pointer_type(module, element_type); - } - - typecheck(module, expected_type, value_type); - } break; - case ValueId::enum_literal: - { - if (!expected_type) - { - expected_type = analysis.indexing_type; - } - - if (!expected_type) - { - report_error(); - } - - if (expected_type->id != TypeId::enumerator) - { - report_error(); - } - - value_type = expected_type; - } break; - case ValueId::trap: - { - value_type = noreturn_type(module); - } break; - case ValueId::field_access: - { - auto aggregate = value->field_access.aggregate; - auto field_name = value->field_access.field_name; - analyze_type(module, aggregate, 0, { .must_be_constant = analysis.must_be_constant }); - - if (aggregate->kind == ValueKind::right) - { - report_error(); - } - - auto aggregate_type = aggregate->type; - if (aggregate_type->id != TypeId::pointer) - { - report_error(); - } - - auto aggregate_element_type = aggregate_type->pointer.element_type; - Type* real_aggregate_type = aggregate_element_type->id == TypeId::pointer ? aggregate_element_type->pointer.element_type : aggregate_element_type; - auto resolved_aggregate_type = resolve_alias(module, real_aggregate_type); - - switch (resolved_aggregate_type->id) - { - case TypeId::structure: - { - Field* result_field = 0; - auto fields = resolved_aggregate_type->structure.fields; - for (u64 i = 0; i < fields.length; i += 1) - { - auto* field = &fields[i]; - if (field_name.equal(field->name)) - { - result_field = field; - break; - } - } - - if (!result_field) - { - // Field not found - report_error(); - } - - auto field_type = result_field->type; - value_type = value->kind == ValueKind::left ? get_pointer_type(module, field_type) : field_type; - } break; - case TypeId::union_type: - { - UnionField* result_field = 0; - auto fields = resolved_aggregate_type->union_type.fields; - for (u64 i = 0; i < fields.length; i += 1) - { - auto* field = &fields[i]; - if (field_name.equal(field->name)) - { - result_field = field; - break; - } - } - - if (!result_field) - { - report_error(); - } - - auto field_type = result_field->type; - value_type = value->kind == ValueKind::left ? get_pointer_type(module, field_type) : field_type; - } break; - case TypeId::bits: - { - if (value->kind == ValueKind::left) - { - report_error(); - } - - auto fields = resolved_aggregate_type->bits.fields; - u64 i; - for (i = 0; i < fields.length; i += 1) - { - auto field = fields[i]; - if (field_name.equal(field.name)) - { - break; - } - } - - if (i == fields.length) - { - report_error(); - } - - assert(value->kind == ValueKind::right); - - auto field = fields[i]; - value_type = field.type; - } break; - case TypeId::enum_array: - case TypeId::array: - { - if (!field_name.equal(string_literal("length"))) - { - report_error(); - } - - if (expected_type) - { - if (expected_type->id != TypeId::integer) - { - report_error(); - } - - value_type = expected_type; - } - else - { - if (resolved_aggregate_type->id == TypeId::enum_array) - { - auto enum_type = resolved_aggregate_type->enum_array.enum_type; - auto backing_type = enum_type->enumerator.backing_type; - value_type = backing_type; - } - else if (resolved_aggregate_type->id == TypeId::array) - { - value_type = uint64(module); - } - else - { - report_error(); - } - } - } break; - case TypeId::pointer: report_error(); // Double indirection is not allowed - default: report_error(); - } - - assert(value_type); - - typecheck(module, expected_type, value_type); - } break; - case ValueId::slice_expression: - { - auto array_like = value->slice_expression.array_like; - auto start = value->slice_expression.start; - auto end = value->slice_expression.end; - - if (array_like->kind != ValueKind::left) - { - report_error(); - } - - analyze_type(module, array_like, 0, { .must_be_constant = analysis.must_be_constant }); - - auto pointer_type = array_like->type; - if (pointer_type->id != TypeId::pointer) - { - report_error(); - } - - Type* sliceable_type = resolve_alias(module, pointer_type->pointer.element_type); - - Type* element_type = 0; - - switch (sliceable_type->id) - { - case TypeId::pointer: - { - element_type = sliceable_type->pointer.element_type; - } break; - case TypeId::structure: - { - if (!sliceable_type->structure.is_slice) - { - report_error(); - } - auto slice_pointer_type = sliceable_type->structure.fields[0].type; - assert(slice_pointer_type->id == TypeId::pointer); - auto slice_element_type = slice_pointer_type->pointer.element_type; - element_type = slice_element_type; - } break; - case TypeId::array: - { - element_type = sliceable_type->array.element_type; - } break; - default: unreachable(); - } - - assert(element_type); - - auto slice_type = get_slice_type(module, element_type); - typecheck(module, expected_type, slice_type); - - auto index_type = uint64(module); - - Value* indices[] = { start, end }; - - for (auto index : indices) - { - if (index) - { - analyze_type(module, index, index_type, { .must_be_constant = analysis.must_be_constant }); - - if (index->type->id != TypeId::integer) - { - report_error(); - } - } - } - - value_type = slice_type; - } break; - case ValueId::string_literal: - { - auto u8_type = uint8(module); - auto pointer_type = get_pointer_type(module, u8_type); - auto slice_type = get_slice_type(module, u8_type); - - if (pointer_type == expected_type) - { - value_type = expected_type; - } - else if (slice_type == expected_type) - { - value_type = expected_type; - } - else - { - typecheck(module, expected_type, slice_type); - value_type = slice_type; - } - } break; - case ValueId::va_start: - { - auto va_list_type = get_va_list_type(module); - typecheck(module, expected_type, va_list_type); - value_type = va_list_type; - } break; - case ValueId::va_arg: - { - analyze_type(module, value->va_arg.va_list, get_pointer_type(module, get_va_list_type(module)), { .must_be_constant = analysis.must_be_constant }); - value_type = value->va_arg.type; - typecheck(module, expected_type, value_type); - } break; - case ValueId::aggregate_initialization: - { - if (!expected_type) - { - report_error(); - } - - auto resolved_type = resolve_alias(module, expected_type); - value_type = resolved_type; - - assert(!value->aggregate_initialization.is_constant); - bool is_constant = true; - auto elements = value->aggregate_initialization.elements; - auto zero = value->aggregate_initialization.zero; - u64 field_mask = 0; - - // TODO: make consecutive initialization with `zero` constant - // ie: - // Right now 0, 1, 2, 3 => constant values, rest zeroed is constant because `declaration_index == initialization_index` - // With constant initialization values 2, 3, 4 and rest zeroed, the aggregate initialization because `declaration_index != initialization_index`, that is, the first initialization index (0) does not match the declaration index (2). The same case can be applied for cases (1, 3) and (2, 4) - - Type* aggregate_type = 0; - switch (value->kind) - { - case ValueKind::left: - { - if (resolved_type->id != TypeId::pointer) - { - report_error(); - } - - aggregate_type = resolved_type->pointer.element_type; - } break; - case ValueKind::right: - { - aggregate_type = resolved_type; - } break; - default: - } - - switch (aggregate_type->id) - { - case TypeId::structure: - { - bool is_ordered = true; - auto fields = aggregate_type->structure.fields; - assert(fields.length <= 64); - - auto same_values_as_field = fields.length == elements.length; - auto is_properly_initialized = same_values_as_field || zero; - - if (zero && same_values_as_field) - { - report_error(); - } - - if (!is_properly_initialized) - { - report_error(); - } - - assert(elements.length <= fields.length); - - for (u32 initialization_index = 0; initialization_index < elements.length; initialization_index += 1) - { - auto value = elements[initialization_index].value; - auto name = elements[initialization_index].name; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < fields.length; declaration_index += 1) - { - auto& field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - if (declaration_index == fields.length) - { - report_error(); - } - - auto mask = (u64)1 << (u64)declaration_index; - auto current_mask = field_mask; - if (current_mask & mask) - { - // Repeated field - report_error(); - } - field_mask = current_mask | mask; - - is_ordered = is_ordered && declaration_index == initialization_index; - - auto field = fields[declaration_index]; - auto declaration_type = field.type; - analyze_type(module, value, declaration_type, { .must_be_constant = analysis.must_be_constant }); - is_constant = is_constant && value->is_constant(); - } - - value->aggregate_initialization.is_constant = is_constant && is_ordered; - } break; - case TypeId::bits: - { - auto fields = aggregate_type->bits.fields; - assert(fields.length <= 64); - - auto same_values_as_field = fields.length == elements.length; - auto is_properly_initialized = same_values_as_field || zero; - - if (zero && same_values_as_field) - { - report_error(); - } - - if (!is_properly_initialized) - { - report_error(); - } - - assert(elements.length <= fields.length); - - for (u32 initialization_index = 0; initialization_index < elements.length; initialization_index += 1) - { - auto value = elements[initialization_index].value; - auto name = elements[initialization_index].name; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < fields.length; declaration_index += 1) - { - auto& field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - if (declaration_index == fields.length) - { - report_error(); - } - - auto mask = 1 << declaration_index; - auto current_mask = field_mask; - if (current_mask & mask) - { - // Repeated field - report_error(); - } - field_mask = current_mask | mask; - - auto field = fields[declaration_index]; - auto declaration_type = field.type; - analyze_type(module, value, declaration_type, { .must_be_constant = analysis.must_be_constant }); - is_constant = is_constant && value->is_constant(); - } - - value->aggregate_initialization.is_constant = is_constant; - } break; - case TypeId::union_type: - { - if (elements.length != 1) - { - report_error(); - } - - auto initialization_value = elements[0].value; - auto initialization_name = elements[0].name; - - u64 i; - auto fields = aggregate_type->union_type.fields; - for (i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - if (initialization_name.equal(field.name)) - { - break; - } - } - - if (i == fields.length) - { - report_error(); - } - - auto field = &fields[i]; - analyze_type(module, initialization_value, field->type, { .must_be_constant = analysis.must_be_constant }); - } break; - case TypeId::enum_array: - { - bool is_ordered = true; - auto enum_type = aggregate_type->enum_array.enum_type; - auto element_type = aggregate_type->enum_array.element_type; - if (enum_type->id != TypeId::enumerator) - { - report_error(); - } - auto fields = enum_type->enumerator.fields; - - assert(fields.length <= 64); - - auto same_values_as_field = fields.length == elements.length; - auto is_properly_initialized = same_values_as_field || zero; - - if (zero && same_values_as_field) - { - report_error(); - } - - if (!is_properly_initialized) - { - report_error(); - } - - assert(elements.length <= fields.length); - - for (u32 initialization_index = 0; initialization_index < elements.length; initialization_index += 1) - { - auto value = elements[initialization_index].value; - auto name = elements[initialization_index].name; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < fields.length; declaration_index += 1) - { - auto& field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - if (declaration_index == fields.length) - { - report_error(); - } - - auto mask = 1 << declaration_index; - auto current_mask = field_mask; - if (current_mask & mask) - { - // Repeated field - report_error(); - } - field_mask = current_mask | mask; - - is_ordered = is_ordered && declaration_index == initialization_index; - - analyze_type(module, value, element_type, { .must_be_constant = analysis.must_be_constant }); - is_constant = is_constant && value->is_constant(); - } - - value->aggregate_initialization.is_constant = is_constant && is_ordered; - } break; - default: report_error(); - } - } break; - case ValueId::zero: - { - if (!expected_type) - { - report_error(); - } - - if (expected_type->id == TypeId::void_type || expected_type->id == TypeId::noreturn) - { - report_error(); - } - - value_type = expected_type; - } break; - case ValueId::select: - { - auto condition = value->select.condition; - auto true_value = value->select.true_value; - auto false_value = value->select.false_value; - analyze_type(module, condition, 0, { .must_be_constant = analysis.must_be_constant }); - auto is_boolean = false; - analyze_binary_type(module, true_value, false_value, is_boolean, expected_type, analysis.must_be_constant, false); - - auto left_type = true_value->type; - auto right_type = false_value->type; - check_types(module, left_type, right_type); - - assert(left_type == right_type); - auto result_type = left_type; - typecheck(module, expected_type, result_type); - - value_type = result_type; - } break; - case ValueId::unreachable: - { - value_type = noreturn_type(module); - } break; - case ValueId::string_to_enum: - { - auto enum_type = value->string_to_enum.type; - auto enum_string_value = value->string_to_enum.string; - if (enum_type->id != TypeId::enumerator) - { - report_error(); - } - - if (!enum_type->enumerator.string_to_enum_function) - { - resolve_type_in_place(module, enum_type); - - auto fields = enum_type->enumerator.fields; - auto array_element_count = fields.length; - - auto insert_block = LLVMGetInsertBlock(module->llvm.builder); - - auto u1_type = uint1(module); - auto u8_type = uint8(module); - auto u64_type = uint64(module); - resolve_type_in_place(module, u1_type); - resolve_type_in_place(module, u8_type); - resolve_type_in_place(module, u64_type); - - auto u64_zero = LLVMConstNull(u64_type->llvm.abi); - - auto enum_alignment = get_byte_alignment(enum_type); - auto enum_size = get_byte_size(enum_type); - auto byte_size = align_forward(enum_size + 1, enum_alignment); - - auto struct_fields = arena_allocate(module->arena, 2); - - struct_fields[0] = { - .name = string_literal("enum_value"), - .type = enum_type, - }; - - struct_fields[1] = { - .name = string_literal("is_valid"), - .type = u1_type, - .offset = enum_size, - }; - - auto struct_type = type_allocate_init(module, { - .structure = { - .fields = struct_fields, - .byte_size = byte_size, - .byte_alignment = enum_alignment, - }, - .id = TypeId::structure, - .name = string_literal("string_to_enum"), - .scope = enum_type->scope, - }); - resolve_type_in_place(module, struct_type); - - LLVMTypeRef argument_types[] = { module->llvm.pointer_type, u64_type->llvm.abi }; - auto llvm_function_type = LLVMFunctionType(struct_type->llvm.abi, argument_types, array_length(argument_types), false); - auto slice_struct_type = get_slice_type(module, u8_type); - - String name_parts[] = { - string_literal("string_to_enum."), - enum_type->name, - }; - auto function_name = arena_join_string(module->arena, array_to_slice(name_parts)); - auto llvm_function = llvm_module_create_function(module->arena, module->llvm.module, llvm_function_type, LLVMInternalLinkage, function_name); - LLVMSetFunctionCallConv(llvm_function, LLVMFastCallConv); - - auto name_array_global = get_enum_name_array_global(module, enum_type); - - auto enum_value_type = enum_type->llvm.memory; - - LLVMValueRef value_constant_buffer[64]; - for (u32 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto global_value = LLVMConstInt(enum_value_type, field.value, false); - value_constant_buffer[i] = global_value; - } - - auto value_array = LLVMConstArray2(enum_value_type, value_constant_buffer, array_element_count); - auto value_array_variable_type = LLVMArrayType2(enum_value_type, array_element_count); - auto is_constant = true; - LLVMThreadLocalMode thread_local_mode = LLVMNotThreadLocal; - auto externally_initialized = false; - auto value_array_variable = llvm_create_global_variable(module->llvm.module, value_array_variable_type, is_constant, LLVMInternalLinkage, value_array, string_literal("value.array.enum"), thread_local_mode, externally_initialized, enum_alignment, LLVMGlobalUnnamedAddr); - - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "entry"); - auto* return_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "return_block"); - auto* loop_entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "loop.entry"); - auto* loop_body_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "loop.body"); - auto* loop_exit_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "loop.exit"); - - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - auto current_function = get_current_function(module); - auto old_alloca_insertion_point = current_function->variable.storage->function.llvm.alloca_insertion_point; - auto u32_type = uint32(module); - resolve_type_in_place(module, u32_type); - current_function->variable.storage->function.llvm.alloca_insertion_point = LLVMBuildAlloca(module->llvm.builder, u32_type->llvm.abi, "alloca.insertion.point"); - - LLVMValueRef arguments[2]; - LLVMGetParams(llvm_function, arguments); - - auto return_value_alloca = create_alloca(module, { - .type = enum_type, - .name = string_literal("return_value"), - }); - - auto return_boolean_alloca = create_alloca(module, { - .type = u8_type, - .name = string_literal("return_bool"), - }); - - auto index_alloca = create_alloca(module, { - .type = u64_type, - .name = string_literal("index"), - }); - - create_store(module, { - .source = u64_zero, - .destination = index_alloca, - .type = u64_type, - }); - - auto slice_pointer = arguments[0]; - auto slice_length = arguments[1]; - LLVMBuildBr(module->llvm.builder, loop_entry_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, loop_entry_block); - auto index_load = create_load(module, { - .type = u64_type, - .pointer = index_alloca, - }); - auto loop_compare = LLVMBuildICmp(module->llvm.builder, LLVMIntULT, index_load, LLVMConstInt(u64_type->llvm.abi, array_element_count, false), ""); - LLVMBuildCondBr(module->llvm.builder, loop_compare, loop_body_block, loop_exit_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, loop_body_block); - auto body_index_load = create_load(module, { - .type = u64_type, - .pointer = index_alloca, - }); - - LLVMValueRef indices[] = { - u64_zero, - body_index_load, - }; - auto array_element_pointer = create_gep(module, { - .type = name_array_global->variable.type->llvm.memory, - .pointer = name_array_global->variable.storage->llvm, - .indices = array_to_slice(indices), - }); - - auto element_length_pointer = LLVMBuildStructGEP2(module->llvm.builder, slice_struct_type->llvm.abi, array_element_pointer, 1, ""); - auto element_length = create_load(module, { - .type = u64_type, - .pointer = element_length_pointer, - }); - - auto length_comparison = LLVMBuildICmp(module->llvm.builder, LLVMIntEQ, slice_length, element_length, ""); - - auto* length_match_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "length.match"); - auto* length_mismatch_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "length.mismatch"); - LLVMBuildCondBr(module->llvm.builder, length_comparison, length_match_block, length_mismatch_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, length_match_block); - - auto s32_type = sint32(module); - resolve_type_in_place(module, s32_type); - - LLVMValueRef memcmp = module->llvm.memcmp; - if (!memcmp) - { - memcmp = LLVMGetNamedFunction(module->llvm.module, "memcmp"); - if (!memcmp) - { - LLVMTypeRef arguments[] = { - module->llvm.pointer_type, - module->llvm.pointer_type, - u64_type->llvm.abi, - }; - auto llvm_function_type = LLVMFunctionType(s32_type->llvm.abi, arguments, array_length(arguments), false); - auto llvm_function = llvm_module_create_function(module->arena, module->llvm.module, llvm_function_type, LLVMExternalLinkage, string_literal("memcmp")); - memcmp = llvm_function; - } - - module->llvm.memcmp = memcmp; - } - - assert(memcmp); - assert(module->llvm.memcmp); - - auto length_index_load = create_load(module, { - .type = u64_type, - .pointer = index_alloca, - }); - - LLVMValueRef length_indices[] = { u64_zero, length_index_load }; - auto length_array_element_pointer = create_gep(module, { - .type = name_array_global->variable.type->llvm.memory, - .pointer = name_array_global->variable.storage->llvm, - .indices = array_to_slice(length_indices), - }); - - auto element_pointer_pointer = LLVMBuildStructGEP2(module->llvm.builder, slice_struct_type->llvm.abi, length_array_element_pointer, 0, ""); - auto element_pointer = create_load(module, { - .type = get_pointer_type(module, u8_type), - .pointer = element_pointer_pointer, - }); - - LLVMValueRef memcmp_arguments[] = { - slice_pointer, - element_pointer, - slice_length, - }; - auto memcmp_return_result = LLVMBuildCall2(module->llvm.builder, LLVMGlobalGetValueType(memcmp), memcmp, memcmp_arguments, array_length(memcmp_arguments), ""); - auto content_comparison = LLVMBuildICmp(module->llvm.builder, LLVMIntEQ, memcmp_return_result, LLVMConstNull(s32_type->llvm.abi), ""); - auto* content_match_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "content.match"); - LLVMBuildCondBr(module->llvm.builder, content_comparison, content_match_block, length_mismatch_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, content_match_block); - - auto content_index_load = create_load(module, { - .type = u64_type, - .pointer = index_alloca, - }); - - LLVMValueRef value_array_indices[] = { - u64_zero, - content_index_load, - }; - auto value_array_element_pointer = create_gep(module, { - .type = value_array_variable_type, - .pointer = value_array_variable, - .indices = array_to_slice(value_array_indices), - }); - - auto enum_value_load = create_load(module, { - .type = enum_type, - .pointer = value_array_element_pointer, - }); - - create_store(module, { - .source = enum_value_load, - .destination = return_value_alloca, - .type = enum_type, - }); - - create_store(module, { - .source = LLVMConstInt(u8_type->llvm.abi, 1, false), - .destination = return_boolean_alloca, - .type = u8_type, - }); - - LLVMBuildBr(module->llvm.builder, return_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, length_mismatch_block); - - auto inc_index_load = create_load(module, { - .type = u64_type, - .pointer = index_alloca, - }); - - auto inc = LLVMBuildAdd(module->llvm.builder, inc_index_load, LLVMConstInt(u64_type->llvm.abi, 1, false), ""); - - create_store(module, { - .source = inc, - .destination = index_alloca, - .type = u64_type, - }); - - LLVMBuildBr(module->llvm.builder, loop_entry_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, loop_exit_block); - - create_store(module, { - .source = LLVMConstNull(enum_type->llvm.memory), - .destination = return_value_alloca, - .type = enum_type, - }); - create_store(module, { - .source = LLVMConstNull(u8_type->llvm.abi), - .destination = return_boolean_alloca, - .type = u8_type, - }); - LLVMBuildBr(module->llvm.builder, return_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, return_block); - auto value_load = create_load(module, { - .type = enum_type, - .pointer = return_value_alloca, - .kind = TypeKind::memory, - }); - - auto return_value = LLVMBuildInsertValue(module->llvm.builder, LLVMGetPoison(struct_type->llvm.memory), value_load, 0, ""); - auto bool_load = create_load(module, { - .type = u8_type, - .pointer = return_boolean_alloca, - }); - - return_value = LLVMBuildInsertValue(module->llvm.builder, return_value, bool_load, 1, ""); - - LLVMBuildRet(module->llvm.builder, return_value); - - // End of scope - LLVMPositionBuilderAtEnd(module->llvm.builder, insert_block); - - enum_type->enumerator.string_to_enum_function = llvm_function; - enum_type->enumerator.string_to_enum_struct_type = struct_type; - - current_function->variable.storage->function.llvm.alloca_insertion_point = old_alloca_insertion_point; - } - - auto struct_type = enum_type->enumerator.string_to_enum_struct_type; - assert(struct_type); - - typecheck(module, expected_type, struct_type); - - auto string_type = get_slice_type(module, uint8(module)); - - analyze_type(module, enum_string_value, string_type, { .must_be_constant = analysis.must_be_constant }); - value_type = struct_type; - } break; - case ValueId::undefined: - { - if (!expected_type) - { - report_error(); - } - - if (expected_type->id == TypeId::void_type || expected_type->id == TypeId::noreturn) - { - report_error(); - } - - value_type = expected_type; - } break; - case ValueId::macro_instantiation: - { - if (module->current_macro_declaration) - { - report_error(); - } - - auto current_function = module->current_function; - if (!current_function) - { - report_error(); - } - - module->current_function = 0; - - auto current_macro_instantiation = module->current_macro_instantiation; - - auto macro_instantiation = &value->macro_instantiation; - module->current_macro_instantiation = macro_instantiation; - - auto declaration = macro_instantiation->declaration; - - auto declaration_arguments = declaration->arguments; - auto instantiation_declaration_arguments = arena_allocate(module->arena, declaration_arguments.length); - macro_instantiation->declaration_arguments = instantiation_declaration_arguments; - - LLVMMetadataRef subprogram = 0; - if (module->has_debug_info) - { - LLVMMetadataRef subroutine_type = 0; - auto is_local_to_unit = true; - auto is_definition = true; - LLVMDIFlags flags = {}; - auto is_optimized = build_mode_is_optimized(module->build_mode); - subprogram = LLVMDIBuilderCreateFunction(module->llvm.di_builder, module->scope.llvm, (char*)declaration->name.pointer, declaration->name.length, (char*)declaration->name.pointer, declaration->name.length, module->llvm.file, macro_instantiation->scope.line, subroutine_type, is_local_to_unit, is_definition, macro_instantiation->scope.line, flags, is_optimized); - } - - macro_instantiation->scope.llvm = subprogram; - - // First copy - for (u64 i = 0; i < declaration_arguments.length; i += 1) - { - auto& instantiation_declaration_argument = instantiation_declaration_arguments[i]; - const auto& declaration_argument = declaration_arguments[i]; - instantiation_declaration_argument = { - .variable = { - .initial_value = 0, - .type = declaration_argument.variable.type, - .scope = ¯o_instantiation->scope, - .name = declaration_argument.variable.name, - .line = declaration_argument.variable.line, - .column = declaration_argument.variable.column, - }, - .index = declaration_argument.index, - }; - } - - auto declaration_constant_arguments = declaration->constant_arguments; - auto instantiation_constant_arguments = macro_instantiation->constant_arguments; - - for (u64 i = 0; i < declaration_constant_arguments.length; i += 1) - { - const auto& declaration_constant_argument = declaration_constant_arguments[i]; - auto& instantiation_constant_argument = instantiation_constant_arguments[i]; - - assert(declaration_constant_argument.id == instantiation_constant_argument.id); - - instantiation_constant_argument.name = declaration_constant_argument.name; - - switch (declaration_constant_argument.id) - { - case ConstantArgumentId::value: - { - trap(); - } break; - case ConstantArgumentId::type: - { - auto declaration_type = declaration_constant_argument.type; - assert(declaration_type->id == TypeId::unresolved); - - auto old_instantiation_type = instantiation_constant_argument.type; - - auto instantiation_type = type_allocate_init(module, { - .alias = { - .type = old_instantiation_type, - .scope = ¯o_instantiation->scope, - .line = macro_instantiation->line, - }, - .id = TypeId::alias, - .name = declaration_constant_argument.name, - .scope = ¯o_instantiation->scope, - }); - instantiation_constant_argument.type = instantiation_type; - } break; - } - } - - value_type = resolve_type(module, declaration->return_type); - assert(value_type->id != TypeId::unresolved); - macro_instantiation->return_type = value_type; - - for (auto& argument : macro_instantiation->declaration_arguments) - { - argument.variable.type = resolve_type(module, argument.variable.type); - } - - auto instantiation_arguments = macro_instantiation->instantiation_arguments; - if (instantiation_arguments.length != instantiation_declaration_arguments.length) - { - report_error(); - } - - if (module->has_debug_info) - { - for (u64 i = 0; i < instantiation_arguments.length; i += 1) - { - auto& instantiation_argument = instantiation_arguments[i]; - const auto& declaration_argument = instantiation_declaration_arguments[i]; - - auto argument_type = declaration_argument.variable.type; - assert(argument_type); - analyze_type(module, instantiation_argument, argument_type, { .must_be_constant = analysis.must_be_constant }); - } - - LLVMMetadataRef type_buffer[64]; - auto type_count = instantiation_arguments.length + 1; - - resolve_type_in_place_debug(module, value_type); - type_buffer[0] = value_type->llvm.debug; - - for (u64 i = 0; i < instantiation_declaration_arguments.length; i += 1) - { - const auto& declaration_argument = instantiation_declaration_arguments[i]; - auto type = declaration_argument.variable.type; - resolve_type_in_place_debug(module, type); - type_buffer[i + 1] = type->llvm.debug; - } - - LLVMSetCurrentDebugLocation2(module->llvm.builder, 0); - LLVMDIFlags flags = {}; - auto subroutine_type = LLVMDIBuilderCreateSubroutineType(module->llvm.di_builder, module->llvm.file, type_buffer, type_count, flags); - assert(macro_instantiation->scope.llvm); - llvm_subprogram_replace_type(subprogram, subroutine_type); - } - - assert(!macro_instantiation->block); - macro_instantiation->block = &arena_allocate(module->arena, 1)[0]; - - copy_block(module, ¯o_instantiation->scope, { - .source = declaration->block, - .destination = macro_instantiation->block, - }); - - resolve_type_in_place(module, value_type); - typecheck(module, expected_type, value_type); - - if (!module->has_debug_info) - { - for (u64 i = 0; i < instantiation_arguments.length; i += 1) - { - auto& instantiation_argument = instantiation_arguments[i]; - const auto& declaration_argument = instantiation_declaration_arguments[i]; - - auto argument_type = declaration_argument.variable.type; - assert(argument_type); - analyze_type(module, instantiation_argument, argument_type, { .must_be_constant = analysis.must_be_constant }); - } - } - - // END of scope - module->current_macro_instantiation = current_macro_instantiation; - module->current_function = current_function; - } break; - case ValueId::build_mode: - { - value_type = get_build_mode_enum(module); - if (expected_type) - { - // typecheck(module, expected_type); - trap(); - } - - typecheck(module, expected_type, value_type); - } break; - case ValueId::has_debug_info: - { - value_type = uint1(module); - typecheck(module, expected_type, value_type); - } break; - case ValueId::field_parent_pointer: - { - auto field_pointer = value->field_parent_pointer.pointer; - auto field_name = value->field_parent_pointer.name; - - if (!expected_type) - { - report_error(); - } - - value_type = expected_type; - - if (value_type->id != TypeId::pointer) - { - report_error(); - } - - auto aggregate_type = value_type->pointer.element_type; - - Type* field_type = 0; - switch (aggregate_type->id) - { - case TypeId::structure: - { - auto fields = aggregate_type->structure.fields; - for (auto& field : fields) - { - if (field_name.equal(field.name)) - { - field_type = field.type; - break; - } - } - } break; - default: report_error(); - } - - if (!field_type) - { - report_error(); - } - - auto pointer_to_field = get_pointer_type(module, field_type); - analyze_type(module, field_pointer, pointer_to_field, {}); - } break; - default: unreachable(); - } - - assert(value_type); - value->type = value_type; -} - -fn LLVMTypeRef get_llvm_type(Type* type, TypeKind type_kind) -{ - switch (type_kind) - { - case TypeKind::abi: - return type->llvm.abi; - case TypeKind::memory: - return type->llvm.memory; - } -} - -fn bool type_is_integer_backing(Type* type) -{ - switch (type->id) - { - case TypeId::enumerator: - case TypeId::integer: - case TypeId::bits: - case TypeId::pointer: - return true; - default: - return false; - } -} - -struct ValueTypePair -{ - LLVMValueRef value; - Type* type; -}; - -fn ValueTypePair enter_struct_pointer_for_coerced_access(Module* module, LLVMValueRef source_value, Type* source_type, u64 destination_size) -{ - unused(module); - assert(source_type->id == TypeId::structure && source_type->structure.fields.length > 0); - auto first_field_type = source_type->structure.fields[0].type; - auto first_field_size = get_byte_size(first_field_type); - auto source_size = get_byte_size(source_type); - - if (!(first_field_size < destination_size && first_field_size < source_size)) - { - auto gep = LLVMBuildStructGEP2(module->llvm.builder, source_type->llvm.abi, source_value, 0, "coerce.dive"); - if (first_field_type->id == TypeId::structure) - { - trap(); - } - else - { - return { gep, first_field_type }; - } - } - else - { - return { source_value, source_type }; - } -} - -fn LLVMValueRef coerce_integer_or_pointer_to_integer_or_pointer(Module* module, LLVMValueRef source, Type* source_type, Type* destination_type) -{ - unused(module); - unused(source_type); - unused(destination_type); - if (source_type != destination_type) - { - trap(); - } - - return source; -} - -fn LLVMValueRef create_coerced_load(Module* module, LLVMValueRef source, Type* source_type, Type* destination_type) -{ - LLVMValueRef result = 0; - - if (type_is_abi_equal(module, source_type, destination_type)) - { - trap(); - } - else - { - auto destination_size = get_byte_size(destination_type); - if (source_type->id == TypeId::structure) - { - auto src = enter_struct_pointer_for_coerced_access(module, source, source_type, destination_size); - source = src.value; - source_type = src.type; - } - - if (type_is_integer_backing(source_type) && type_is_integer_backing(destination_type)) - { - auto load = create_load(module, { - .type = source_type, - .pointer = source, - }); - auto result = coerce_integer_or_pointer_to_integer_or_pointer(module, load, source_type, destination_type); - return result; - } - else - { - auto source_size = get_byte_size(source_type); - - auto is_source_type_scalable = false; - auto is_destination_type_scalable = false; - - if (!is_source_type_scalable && !is_destination_type_scalable && source_size >= destination_size) - { - result = create_load(module, LoadOptions{ .type = destination_type, .pointer = source }); - } - else - { - auto scalable_vector_type = false; - if (scalable_vector_type) - { - trap(); - } - else - { - // Coercion through memory - auto original_destination_alignment = get_byte_alignment(destination_type); - auto source_alignment = get_byte_alignment(source_type); - auto destination_alignment = MAX(original_destination_alignment, source_alignment); - auto destination_alloca = create_alloca(module, { - .type = destination_type, - .name = string_literal("coerce"), - .alignment = destination_alignment, - }); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - LLVMBuildMemCpy(module->llvm.builder, destination_alloca, destination_alignment, source, source_alignment, LLVMConstInt(u64_type->llvm.abi, source_size, false)); - auto load = create_load(module, { - .type = destination_type, - .pointer = destination_alloca, - .alignment = destination_alignment, - }); - result = load; - } - } - } - } - - assert(result); - - return result; -} - -fn void create_coerced_store(Module* module, LLVMValueRef source_value, Type* source_type, LLVMValueRef destination_value, Type* destination_type, u64 destination_size, bool destination_volatile) -{ - unused(destination_volatile); - - auto source_size = get_byte_size(source_type); - - // TODO: this smells badly - //destination_type != uint1(module) - if (!type_is_abi_equal(module, source_type, destination_type) && destination_type->id == TypeId::structure) - { - auto r = enter_struct_pointer_for_coerced_access(module, destination_value, destination_type, source_size); - destination_value = r.value; - destination_type = r.type; - } - - auto is_scalable = false; - - if (is_scalable || source_size <= destination_size) - { - auto destination_alignment = get_byte_alignment(destination_type); - - if (source_type->id == TypeId::integer && destination_type->id == TypeId::pointer && source_size == align_forward(destination_size, destination_alignment)) - { - trap(); - } - else if (source_type->id == TypeId::structure) - { - auto fields = source_type->structure.fields; - for (u32 i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto gep = LLVMBuildStructGEP2(module->llvm.builder, source_type->llvm.abi, destination_value, i, ""); - auto field_value = LLVMBuildExtractValue(module->llvm.builder, source_value, i, ""); - create_store(module, { - .source = field_value, - .destination = gep, - .type = field.type, - .alignment = destination_alignment, - }); - } - } - else - { - create_store(module, StoreOptions{ - .source = source_value, - .destination = destination_value, - .type = destination_type, - .alignment = destination_alignment, - }); - } - } - else if (type_is_integer_backing(source_type)) - { - auto int_type = integer_type(module, { .bit_count = (u32)destination_size * 8, .is_signed = false }); - auto value = coerce_integer_or_pointer_to_integer_or_pointer(module, source_value, source_type, int_type); - create_store(module, { - .source = value, - .destination = destination_value, - .type = int_type, - }); - } - else - { - // Coercion through memory - - auto original_destination_alignment = get_byte_alignment(destination_type); - auto source_alloca_alignment = MAX(original_destination_alignment, get_byte_alignment(source_type)); - auto source_alloca = create_alloca(module, { - .type = source_type, - .name = string_literal("coerce"), - .alignment = source_alloca_alignment, - }); - create_store(module, { - .source = source_value, - .destination = source_alloca, - .type = source_type, - .alignment = source_alloca_alignment, - }); - - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - LLVMBuildMemCpy(module->llvm.builder, destination_value, original_destination_alignment, source_alloca, source_alloca_alignment, LLVMConstInt(u64_type->llvm.abi, destination_size, false)); - } -} - -struct SliceEmitResult -{ - LLVMValueRef values[2]; -}; - -fn LLVMValueRef emit_slice_result(Module* module, SliceEmitResult slice, LLVMTypeRef slice_type) -{ - auto result = LLVMGetPoison(slice_type); - result = LLVMBuildInsertValue(module->llvm.builder, result, slice.values[0], 0, ""); - result = LLVMBuildInsertValue(module->llvm.builder, result, slice.values[1], 1, ""); - return result; -} - -fn SliceEmitResult emit_slice_expression(Module* module, Value* value) -{ - switch (value->id) - { - case ValueId::slice_expression: - { - auto value_type = value->type; - assert(value_type); - assert(type_is_slice(value_type)); - auto slice_pointer_type = value_type->structure.fields[0].type; - assert(slice_pointer_type->id == TypeId::pointer); - auto slice_element_type = slice_pointer_type->pointer.element_type; - - auto index_type = uint64(module); - resolve_type_in_place(module, index_type); - auto llvm_index_type = index_type->llvm.abi; - auto index_zero = LLVMConstInt(llvm_index_type, 0, 0); - - auto array_like = value->slice_expression.array_like; - auto start = value->slice_expression.start; - auto end = value->slice_expression.end; - - assert(array_like->kind == ValueKind::left); - emit_value(module, array_like, TypeKind::memory, false); - - auto pointer_type = array_like->type; - assert(pointer_type->id == TypeId::pointer); - auto sliceable_type = pointer_type->pointer.element_type; - bool has_start = start; - if (start && start->id == ValueId::constant_integer && start->constant_integer.value == 0) - { - has_start = false; - } - - if (start) - { - emit_value(module, start, TypeKind::memory, false); - } - - if (end) - { - emit_value(module, end, TypeKind::memory, false); - } - - switch (sliceable_type->id) - { - case TypeId::pointer: - { - auto element_type = sliceable_type->pointer.element_type; - auto pointer_load = create_load(module, { - .type = sliceable_type, - .pointer = array_like->llvm, - }); - - auto slice_pointer = pointer_load; - if (has_start) - { - LLVMValueRef indices[] = { start->llvm }; - slice_pointer = create_gep(module, { - .type = element_type->llvm.memory, - .pointer = pointer_load, - .indices = array_to_slice(indices), - }); - } - - auto slice_length = end->llvm; - - if (has_start) - { - slice_length = LLVMBuildSub(module->llvm.builder, slice_length, start->llvm, ""); - } - return { slice_pointer, slice_length }; - } break; - case TypeId::structure: - { - assert(sliceable_type->structure.is_slice); - auto slice_load = create_load(module, { - .type = sliceable_type, - .pointer = array_like->llvm, - }); - auto old_slice_pointer = LLVMBuildExtractValue(module->llvm.builder, slice_load, 0, ""); - auto slice_pointer = old_slice_pointer; - - if (has_start) - { - LLVMValueRef indices[] = { start->llvm }; - slice_pointer = create_gep(module, { - .type = slice_element_type->llvm.memory, - .pointer = old_slice_pointer, - .indices = array_to_slice(indices), - }); - } - - auto slice_end = end ? end->llvm : LLVMBuildExtractValue(module->llvm.builder, slice_load, 1, ""); - auto slice_length = slice_end; - if (has_start) - { - slice_length = LLVMBuildSub(module->llvm.builder, slice_end, start->llvm, ""); - } - - return { slice_pointer, slice_length }; - } break; - case TypeId::array: - { - assert(sliceable_type->array.element_type == slice_element_type); - LLVMValueRef slice_pointer = array_like->llvm; - if (has_start) - { - LLVMValueRef indices[] = { index_zero, start->llvm }; - slice_pointer = create_gep(module, { - .type = sliceable_type->llvm.memory, - .pointer = slice_pointer, - .indices = array_to_slice(indices), - }); - } - - LLVMValueRef slice_length = 0; - if (has_start) - { - trap(); - } - else if (end) - { - slice_length = end->llvm; - } - else - { - auto element_count = sliceable_type->array.element_count; - slice_length = LLVMConstInt(llvm_index_type, element_count, 0); - } - - assert(slice_length); - return { slice_pointer, slice_length }; - } break; - default: unreachable(); - } - } break; - default: unreachable(); - } -} - -fn SliceEmitResult emit_string_literal(Module* module, Value* value) -{ - auto resolved_value_type = resolve_alias(module, value->type); - switch (value->id) - { - case ValueId::string_literal: - { - bool null_terminate = true; - auto length = value->string_literal.length; - auto constant_string = LLVMConstStringInContext2(module->llvm.context, (char*)value->string_literal.pointer, length, !null_terminate); - auto u8_type = uint8(module); - resolve_type_in_place(module, u8_type); - auto string_type = LLVMArrayType2(u8_type->llvm.abi, length + null_terminate); - auto is_constant = true; - LLVMThreadLocalMode tlm = LLVMNotThreadLocal; - bool externally_initialized = false; - u32 alignment = 1; - auto global = llvm_create_global_variable(module->llvm.module, string_type, is_constant, LLVMInternalLinkage, constant_string, string_literal("const.string"), tlm, externally_initialized, alignment, LLVMGlobalUnnamedAddr); - - return { global, LLVMConstInt(uint64(module)->llvm.abi, length, false) }; - } break; - default: unreachable(); - } -} - -fn void invalidate_analysis(Module* module, Value* value) -{ - switch (value->id) - { - case ValueId::variable_reference: - case ValueId::constant_integer: - case ValueId::unary_type: - break; - case ValueId::aggregate_initialization: - { - auto elements = value->aggregate_initialization.elements; - for (auto& element : elements) - { - invalidate_analysis(module, element.value); - } - } break; - case ValueId::field_access: - { - invalidate_analysis(module, value->field_access.aggregate); - } break; - case ValueId::binary: - { - invalidate_analysis(module, value->binary.left); - invalidate_analysis(module, value->binary.right); - } break; - case ValueId::unary: - { - invalidate_analysis(module, value->unary.value); - } break; - case ValueId::slice_expression: - { - invalidate_analysis(module, value->slice_expression.array_like); - auto start = value->slice_expression.start; - auto end = value->slice_expression.end; - - if (start) - { - invalidate_analysis(module, start); - } - - if (end) - { - invalidate_analysis(module, end); - } - } break; - default: trap(); - } - - value->type = 0; -} - -fn void reanalyze_type_as_left_value(Module* module, Value* value) -{ - assert(value->type); - assert(value->kind == ValueKind::right); - auto original_type = value->type; - invalidate_analysis(module, value); - value->kind = ValueKind::left; - auto expected_type = value->id == ValueId::aggregate_initialization ? get_pointer_type(module, original_type) : 0; - analyze_type(module, value, expected_type, {}); -} - -fn LLVMValueRef emit_call(Module* module, Value* value, LLVMValueRef left_llvm, Type* left_type) -{ - switch (value->id) - { - case ValueId::call: - { - auto call = &value->call; - - auto raw_function_type = call->function_type; - auto callable = call->callable; - auto call_arguments = call->arguments; - - LLVMValueRef llvm_callable = 0; - - switch (callable->id) - { - case ValueId::variable_reference: - { - auto variable = callable->variable_reference; - auto variable_type = variable->type; - auto llvm_value = variable->storage->llvm; - - switch (variable_type->id) - { - case TypeId::pointer: - { - auto element_type = resolve_alias(module, variable_type->pointer.element_type); - switch (element_type->id) - { - case TypeId::function: - { - llvm_callable = create_load(module, LoadOptions{ - .type = get_pointer_type(module, raw_function_type), - .pointer = llvm_value, - }); - } break; - default: report_error(); - } - } break; - case TypeId::function: llvm_callable = llvm_value; break; - default: report_error(); - } - } break; - default: report_error(); - } - - assert(llvm_callable); - - LLVMValueRef llvm_abi_argument_value_buffer[64]; - LLVMTypeRef llvm_abi_argument_type_buffer[64]; - Type* abi_argument_type_buffer[64]; - AbiInformation argument_abi_buffer[64]; - - u16 abi_argument_count = 0; - - bool uses_in_alloca = false; - if (uses_in_alloca) - { - trap(); - } - - LLVMValueRef llvm_indirect_return_value = 0; - - auto& return_abi = raw_function_type->function.abi.return_abi; - auto return_abi_kind = return_abi.flags.kind; - switch (return_abi_kind) - { - case AbiKind::indirect: - case AbiKind::in_alloca: - case AbiKind::coerce_and_expand: - { - // TODO: handle edge cases: - // - virtual function pointer thunk - // - return alloca already exists - LLVMValueRef pointer = 0; - auto semantic_return_type = return_abi.semantic_type; - if (left_llvm) - { - assert(left_type->pointer.element_type == semantic_return_type); - pointer = left_llvm; - } - else - { - trap(); - } - assert(pointer); - - auto has_sret = return_abi.flags.kind == AbiKind::indirect; - if (has_sret) - { - auto void_ty = void_type(module); - llvm_abi_argument_value_buffer[abi_argument_count] = pointer; - abi_argument_type_buffer[abi_argument_count] = void_ty; - llvm_abi_argument_type_buffer[abi_argument_count] = void_ty->llvm.abi; - abi_argument_count += 1; - llvm_indirect_return_value = pointer; - } - else if (return_abi.flags.kind == AbiKind::in_alloca) - { - trap(); - } - else - { - trap(); - } - } break; - default: break; - } - - auto available_registers = raw_function_type->function.abi.available_registers; - - auto declaration_semantic_argument_count = raw_function_type->function.base.semantic_argument_types.length; - for (u64 call_argument_index = 0; call_argument_index < call_arguments.length; call_argument_index += 1) - { - auto is_named_argument = call_argument_index < declaration_semantic_argument_count; - auto semantic_call_argument_value = call_arguments[call_argument_index]; - - Type* semantic_argument_type; - AbiInformation argument_abi; - Slice llvm_abi_argument_type_buffer_slice = array_to_slice(llvm_abi_argument_type_buffer); - Slice abi_argument_type_buffer_slice = array_to_slice(abi_argument_type_buffer); - - if (is_named_argument) - { - argument_abi = raw_function_type->function.abi.argument_abis[call_argument_index]; - semantic_argument_type = argument_abi.semantic_type; - } - else - { - semantic_argument_type = semantic_call_argument_value->type; - argument_abi = abi_system_v_classify_argument(module, &available_registers.system_v, llvm_abi_argument_type_buffer_slice, abi_argument_type_buffer_slice, { - .type = resolve_alias(module, semantic_argument_type), - .abi_start = abi_argument_count, - .is_named_argument = false, - }); - } - - resolve_type_in_place(module, semantic_argument_type); - - if (is_named_argument) - { - auto llvm_abi_argument_types = llvm_abi_argument_type_buffer_slice(argument_abi.abi_start)(0, argument_abi.abi_count); - auto destination_abi_argument_types = abi_argument_type_buffer_slice(argument_abi.abi_start)(0, argument_abi.abi_count); - auto source_abi_argument_types = raw_function_type->function.abi.abi_argument_types(argument_abi.abi_start)(0, argument_abi.abi_count); - for (u16 i = 0; i < argument_abi.abi_count; i += 1) - { - llvm_abi_argument_types[i] = source_abi_argument_types[i]->llvm.abi; - destination_abi_argument_types[i] = source_abi_argument_types[i]; - } - } - - argument_abi_buffer[call_argument_index] = argument_abi; - - if (argument_abi.padding.type) - { - trap(); - } - - assert(abi_argument_count == argument_abi.abi_start); - auto argument_abi_kind = argument_abi.flags.kind; - switch (argument_abi_kind) - { - case AbiKind::direct: - case AbiKind::extend: - { - auto coerce_to_type = argument_abi.get_coerce_to_type(); - resolve_type_in_place(module, coerce_to_type); - - if (coerce_to_type->id != TypeId::structure && type_is_abi_equal(module, semantic_argument_type, coerce_to_type) && argument_abi.attributes.direct.offset == 0) - { - emit_value(module, semantic_call_argument_value, TypeKind::abi, false); - - auto evaluation_kind = get_evaluation_kind(argument_abi.semantic_type); - Value* v; - switch (evaluation_kind) - { - case EvaluationKind::scalar: v = semantic_call_argument_value; break; - case EvaluationKind::aggregate: trap(); - case EvaluationKind::complex: trap(); - } - - if (!type_is_abi_equal(module, coerce_to_type, v->type)) - { - trap(); - } - - llvm_abi_argument_value_buffer[abi_argument_count] = v->llvm; - abi_argument_count += 1; - } - else - { - if (coerce_to_type->id == TypeId::structure && argument_abi.flags.kind == AbiKind::direct && !argument_abi.flags.can_be_flattened) - { - trap(); - } - - // TODO: fix this hack and collapse it into the generic path - if (coerce_to_type == uint8(module) && semantic_argument_type == uint1(module)) - { - emit_value(module, semantic_call_argument_value, TypeKind::memory, false); - llvm_abi_argument_value_buffer[abi_argument_count] = semantic_call_argument_value->llvm; - abi_argument_count += 1; - } - else - { - auto evaluation_kind = get_evaluation_kind(semantic_argument_type); - Value* src = 0; - switch (evaluation_kind) - { - case EvaluationKind::scalar: trap(); - case EvaluationKind::aggregate: src = semantic_call_argument_value; break; - case EvaluationKind::complex: trap(); - } - assert(src); - - if (argument_abi.attributes.direct.offset != 0) - { - trap(); - } - - if (coerce_to_type->id == TypeId::structure && argument_abi.flags.kind == AbiKind::direct && argument_abi.flags.can_be_flattened) - { - auto source_type_is_scalable = false; - if (source_type_is_scalable) - { - trap(); - } - else - { - if (src->kind == ValueKind::right && !src->is_constant()) - { - if (!type_is_slice(src->type)) - { - switch (src->id) - { - case ValueId::aggregate_initialization: - case ValueId::variable_reference: - case ValueId::field_access: - { - reanalyze_type_as_left_value(module, src); - } break; - default: - { - trap(); - } break; - } - } - } - - emit_value(module, src, TypeKind::memory, false); - auto destination_size = get_byte_size(coerce_to_type); - auto source_size = get_byte_size(argument_abi.semantic_type); - auto alignment = get_byte_alignment(argument_abi.semantic_type); - - LLVMValueRef source = src->llvm; - if (source_size < destination_size) - { - auto alloca = create_alloca(module, { - .type = argument_abi.semantic_type, - .name = string_literal("coerce"), - .alignment = alignment, - }); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - LLVMBuildMemCpy(module->llvm.builder, alloca, alignment, source, alignment, LLVMConstInt(u64_type->llvm.abi, source_size, false)); - source = alloca; - } - - auto coerce_fields = coerce_to_type->structure.fields; - - // TODO: - assert(argument_abi.attributes.direct.offset == 0); - - switch (semantic_call_argument_value->kind) - { - case ValueKind::left: - { - for (u32 i = 0; i < (u32)coerce_fields.length; i += 1) - { - auto& field = coerce_fields[i]; - auto gep = LLVMBuildStructGEP2(module->llvm.builder, coerce_to_type->llvm.memory, source, i, ""); - auto maybe_undef = false; - if (maybe_undef) - { - trap(); - } - - auto load = create_load(module, { - .type = field.type, - .pointer = gep, - .alignment = alignment, - }); - llvm_abi_argument_value_buffer[abi_argument_count] = load; - abi_argument_count += 1; - } - } break; - case ValueKind::right: - { - if (type_is_abi_equal(module, coerce_to_type, semantic_argument_type)) - { - for (u32 i = 0; i < (u32)coerce_fields.length; i += 1) - { - llvm_abi_argument_value_buffer[abi_argument_count] = LLVMBuildExtractValue(module->llvm.builder, source, i, ""); - abi_argument_count += 1; - } - } - else - { - switch (semantic_call_argument_value->id) - { - case ValueId::aggregate_initialization: - { - auto is_constant = semantic_call_argument_value->aggregate_initialization.is_constant; - - if (is_constant) - { - bool is_constant = true; - LLVMLinkage linkage_type = LLVMInternalLinkage; - LLVMThreadLocalMode thread_local_mode = {}; - bool externally_initialized = false; - auto alignment = get_byte_alignment(semantic_argument_type); - - auto global = llvm_create_global_variable(module->llvm.module, semantic_argument_type->llvm.memory, is_constant, linkage_type, semantic_call_argument_value->llvm, string_literal("const.struct"), thread_local_mode, externally_initialized, alignment, LLVMGlobalUnnamedAddr); - - for (u32 i = 0; i < coerce_fields.length; i += 1) - { - auto gep = LLVMBuildStructGEP2(module->llvm.builder, coerce_to_type->llvm.abi, global, i, ""); - auto& field = coerce_fields[i]; - auto maybe_undef = false; - if (maybe_undef) - { - trap(); - } - - auto load = create_load(module, { .type = field.type, .pointer = gep, .alignment = alignment }); - - llvm_abi_argument_value_buffer[abi_argument_count] = load; - abi_argument_count += 1; - } - } - else - { - trap(); - } - } break; - case ValueId::zero: - { - for (u32 i = 0; i < coerce_fields.length; i += 1) - { - auto& field = coerce_fields[i]; - auto field_type = field.type; - llvm_abi_argument_value_buffer[abi_argument_count] = LLVMConstNull(field_type->llvm.abi); - abi_argument_count += 1; - } - } break; - default: trap(); - } - } - } break; - } - } - } - else - { - assert(argument_abi.abi_count == 1); - auto destination_type = coerce_to_type; - - LLVMValueRef v = 0; - switch (src->id) - { - case ValueId::zero: - { - v = LLVMConstNull(coerce_to_type->llvm.abi); - } break; - default: - { - LLVMValueRef pointer = 0; - Type* pointer_type = 0; - if (src->type->id != TypeId::pointer) - { - auto type = src->type; - pointer_type = get_pointer_type(module, type); - if (src->id != ValueId::variable_reference) - { - pointer = create_alloca(module, { - .type = type, - .name = string_literal("my.coerce"), - }); - emit_assignment(module, pointer, pointer_type, src); - } - else - { - assert(src->id == ValueId::variable_reference); - assert(src->kind == ValueKind::right); - reanalyze_type_as_left_value(module, src); - } - } - else - { - trap(); - } - - assert(pointer_type); - assert(pointer_type->id == TypeId::pointer); - auto element_type = pointer_type->pointer.element_type; - - if (!pointer) - { - assert(src->type->id == TypeId::pointer); - assert(src->type->llvm.abi == module->llvm.pointer_type); - emit_value(module, src, TypeKind::memory, false); - pointer = src->llvm; - } - - auto source_type = element_type; - assert(source_type == argument_abi.semantic_type); - auto load = create_coerced_load(module, pointer, source_type, destination_type); - - auto is_cmse_ns_call = false; - if (is_cmse_ns_call) - { - trap(); - } - - auto maybe_undef = false; - if (maybe_undef) - { - trap(); - } - - v = load; - } break; - } - assert(v); - - llvm_abi_argument_value_buffer[abi_argument_count] = v; - abi_argument_count += 1; - } - } - } - } break; - case AbiKind::indirect: - case AbiKind::indirect_aliased: - { - auto evaluation_kind = get_evaluation_kind(semantic_argument_type); - auto do_continue = false; - if (evaluation_kind == EvaluationKind::aggregate) - { - auto same_address_space = true; - assert(argument_abi.abi_start >= raw_function_type->function.abi.abi_argument_types.length || same_address_space); - - // TODO: handmade code, may contain bugs - assert(argument_abi.abi_count == 1); - auto abi_argument_type = abi_argument_type_buffer[argument_abi.abi_start]; - - if (abi_argument_type == semantic_call_argument_value->type) - { - trap(); - } - else if (abi_argument_type->id == TypeId::pointer && abi_argument_type->pointer.element_type == semantic_call_argument_value->type) - { - auto is_constant = semantic_call_argument_value->is_constant(); - - if (is_constant) - { - emit_value(module, semantic_call_argument_value, TypeKind::memory, true); - - bool is_constant = true; - LLVMLinkage linkage_type = LLVMInternalLinkage; - LLVMThreadLocalMode thread_local_mode = {}; - bool externally_initialized = false; - auto alignment = get_byte_alignment(semantic_argument_type); - - auto global = llvm_create_global_variable(module->llvm.module, semantic_argument_type->llvm.memory, is_constant, linkage_type, semantic_call_argument_value->llvm, string_literal("indirect.const.aggregate"), thread_local_mode, externally_initialized, alignment, LLVMGlobalUnnamedAddr); - - llvm_abi_argument_value_buffer[abi_argument_count] = global; - abi_argument_count += 1; - } - else - { - auto pointer_type = get_pointer_type(module, semantic_call_argument_value->type); - - switch (semantic_call_argument_value->id) - { - case ValueId::variable_reference: - { - reanalyze_type_as_left_value(module, semantic_call_argument_value); - emit_value(module, semantic_call_argument_value, TypeKind::memory, false); - llvm_abi_argument_value_buffer[abi_argument_count] = semantic_call_argument_value->llvm; - abi_argument_count += 1; - } break; - default: - { - assert(abi_argument_type->id == TypeId::pointer); - assert(abi_argument_type->pointer.element_type == semantic_call_argument_value->type); - auto alloca = create_alloca(module, { - .type = semantic_call_argument_value->type, - .name = string_literal("indirect.struct.passing"), - }); - emit_assignment(module, alloca, pointer_type, semantic_call_argument_value); - llvm_abi_argument_value_buffer[abi_argument_count] = alloca; - abi_argument_count += 1; - } break; - } - } - - do_continue = true; - } - else - { - trap(); - } - } - - if (!do_continue) - { - trap(); - } - } break; - case AbiKind::ignore: unreachable(); - default: unreachable(); - } - - assert(abi_argument_count == argument_abi.abi_start + argument_abi.abi_count); - } - - auto declaration_abi_argument_count = raw_function_type->function.abi.abi_argument_types.length; - - if (raw_function_type->function.base.is_variable_arguments) - { - assert(abi_argument_count >= declaration_abi_argument_count); - } - else - { - assert(abi_argument_count == declaration_abi_argument_count); - } - - assert(raw_function_type->llvm.abi); - Slice argument_abis = { .pointer = argument_abi_buffer, .length = call_arguments.length }; - auto llvm_call = LLVMBuildCall2(module->llvm.builder, raw_function_type->llvm.abi, llvm_callable, llvm_abi_argument_value_buffer, abi_argument_count, ""); - - LLVMSetInstructionCallConv(llvm_call, llvm_calling_convention(raw_function_type->function.base.calling_convention)); - - emit_attributes(module, llvm_call, &LLVMAddCallSiteAttribute, { - .return_abi = return_abi, - .argument_abis = argument_abis, - .abi_argument_types = { .pointer = abi_argument_type_buffer, .length = abi_argument_count }, - .abi_return_type = raw_function_type->function.abi.abi_return_type, - .attributes = {}, - .call_site = true, - }); - - switch (return_abi_kind) - { - case AbiKind::ignore: - { - assert(return_abi.semantic_type == noreturn_type(module) || return_abi.semantic_type == void_type(module)); - return llvm_call; - } break; - case AbiKind::direct: - case AbiKind::extend: - { - auto coerce_to_type = return_abi.get_coerce_to_type(); - - if (type_is_abi_equal(module, return_abi.semantic_type, coerce_to_type) && return_abi.attributes.direct.offset == 0) - { - auto evaluation_kind = get_evaluation_kind(coerce_to_type); - - switch (evaluation_kind) - { - case EvaluationKind::scalar: return llvm_call; - case EvaluationKind::aggregate: break; - case EvaluationKind::complex: unreachable(); - } - } - - // TODO: if - auto fixed_vector_type = false; - if (fixed_vector_type) - { - trap(); - } - - LLVMValueRef coerce_alloca = 0; - - if (left_llvm) - { - assert(left_type->pointer.element_type == return_abi.semantic_type); - coerce_alloca = left_llvm; - } - else - { - coerce_alloca = create_alloca(module, { - .type = return_abi.semantic_type, - .name = string_literal("coerce"), - }); - } - - LLVMValueRef destination_pointer = coerce_alloca; - if (return_abi.attributes.direct.offset != 0) - { - trap(); - } - - auto destination_type = return_abi.semantic_type; - - auto source_value = llvm_call; - auto source_type = raw_function_type->function.abi.abi_return_type; - auto destination_size = get_byte_size(destination_type); - auto left_destination_size = destination_size - return_abi.attributes.direct.offset; - auto is_destination_volatile = false; - - switch (return_abi.semantic_type->id) - { - case TypeId::structure: - { - if (return_abi.semantic_type->structure.fields.length > 0) - { - create_coerced_store(module, source_value, source_type, destination_pointer, destination_type, left_destination_size, is_destination_volatile); - } - else - { - trap(); - } - } break; - case TypeId::array: - { - if (get_byte_size(return_abi.semantic_type) <= 8) - { - create_store(module, { - .source = source_value, - .destination = destination_pointer, - .type = source_type, - }); - } - else - { - create_coerced_store(module, source_value, source_type, destination_pointer, destination_type, left_destination_size, is_destination_volatile); - } - } break; - default: unreachable(); - } - - assert(coerce_alloca); - if (left_llvm) - { - assert(destination_pointer == left_llvm); - return destination_pointer; - } - else - { - switch (value->kind) - { - case ValueKind::right: return create_load(module, { .type = destination_type, .pointer = destination_pointer }); - case ValueKind::left: trap(); - } - } - } break; - case AbiKind::indirect: - { - assert(llvm_indirect_return_value); - return llvm_indirect_return_value; - } break; - default: unreachable(); - } - } break; - default: unreachable(); - } -} - -fn LLVMValueRef emit_va_arg_from_memory(Module* module, LLVMValueRef va_list_pointer, Type* va_list_struct, Type* argument_type) -{ - assert(va_list_struct->id == TypeId::structure); - auto overflow_arg_area_pointer = LLVMBuildStructGEP2(module->llvm.builder, va_list_struct->llvm.abi, va_list_pointer, 2, ""); - auto overflow_arg_area_type = va_list_struct->structure.fields[2].type; - auto overflow_arg_area = create_load(module, { .type = overflow_arg_area_type, .pointer = overflow_arg_area_pointer }); - if (get_byte_alignment(argument_type) > 8) - { - trap(); - } - - auto argument_type_size = get_byte_size(argument_type); - - auto raw_offset = align_forward(argument_type_size, 8); - auto uint32_type = uint32(module)->llvm.abi; - auto offset = LLVMConstInt(uint32_type, raw_offset, false); - LLVMValueRef indices[] = { - offset, - }; - auto new_overflow_arg_area = create_gep(module, { - .type = uint32_type, - .pointer = overflow_arg_area, - .indices = array_to_slice(indices), - .inbounds = false, - }); - create_store(module, { - .source = new_overflow_arg_area, - .destination = overflow_arg_area_pointer, - .type = overflow_arg_area_type, - }); - return overflow_arg_area; -} - - -fn LLVMValueRef emit_va_arg(Module* module, Value* value, LLVMValueRef left_llvm, Type* left_type, LLVMValueRef llvm_function) -{ - switch (value->id) - { - case ValueId::va_arg: - { - auto raw_va_list_type = get_va_list_type(module); - - auto va_list_value = value->va_arg.va_list; - emit_value(module, va_list_value, TypeKind::memory, false); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - auto zero = LLVMConstNull(u64_type->llvm.memory); - LLVMValueRef gep_indices[] = {zero, zero}; - auto va_list_value_llvm = create_gep(module, { - .type = raw_va_list_type->llvm.memory, - .pointer = va_list_value->llvm, - .indices = array_to_slice(gep_indices), - }); - - auto va_arg_type = value->va_arg.type; - auto r = abi_system_v_classify_argument_type(module, va_arg_type, {}); - auto abi = r.abi; - auto needed_registers = r.needed_registers; - assert(abi.flags.kind != AbiKind::ignore); - - assert(raw_va_list_type->id == TypeId::array); - auto va_list_struct = raw_va_list_type->array.element_type; - LLVMValueRef address = 0; - - if (needed_registers.gpr == 0 && needed_registers.sse == 0) - { - address = emit_va_arg_from_memory(module, va_list_value_llvm, va_list_struct, va_arg_type); - } - else - { - auto va_list_struct_llvm = va_list_struct->llvm.memory; - - LLVMValueRef gpr_offset_pointer = 0; - LLVMValueRef gpr_offset = 0; - if (needed_registers.gpr != 0) - { - gpr_offset_pointer = LLVMBuildStructGEP2(module->llvm.builder, va_list_struct_llvm, va_list_value_llvm, 0, ""); - gpr_offset = create_load(module, { - .type = va_list_struct->structure.fields[0].type, - .pointer = gpr_offset_pointer, - .alignment = 16, - }); - } - else - { - trap(); - } - - auto raw_in_regs = 48 - needed_registers.gpr * 8; - auto u32_type = uint32(module); - resolve_type_in_place(module, u32_type); - auto u32_llvm = u32_type->llvm.memory; - LLVMValueRef in_regs = 0; - if (needed_registers.gpr != 0) - { - in_regs = LLVMConstInt(u32_llvm, raw_in_regs, false); - } - else - { - trap(); - } - - if (needed_registers.gpr != 0) - { - in_regs = LLVMBuildICmp(module->llvm.builder, LLVMIntULE, gpr_offset, in_regs, ""); - } - else - { - trap(); - } - - assert(in_regs); - - LLVMValueRef fp_offset_pointer = 0; - if (needed_registers.sse) - { - trap(); - } - LLVMValueRef fp_offset = 0; - if (needed_registers.sse) - { - trap(); - } - - auto raw_fits_in_fp = 176 - needed_registers.sse * 16; - LLVMValueRef fits_in_fp = 0; - if (needed_registers.sse) - { - trap(); - } - - if (needed_registers.sse && needed_registers.gpr) - { - trap(); - } - - auto* in_reg_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "va_arg.in_reg"); - auto* in_mem_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "va_arg.in_mem"); - auto* end_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "va_arg.end"); - LLVMBuildCondBr(module->llvm.builder, in_regs, in_reg_block, in_mem_block); - - emit_block(module, in_reg_block); - - auto reg_save_area_type = va_list_struct->structure.fields[3].type; - auto reg_save_area = create_load(module, { - .type = reg_save_area_type, - .pointer = LLVMBuildStructGEP2(module->llvm.builder, va_list_struct_llvm, va_list_value_llvm, 3, ""), - .alignment = 16, - }); - - LLVMValueRef register_address = 0; - - if (needed_registers.gpr && needed_registers.sse) - { - trap(); - } - else if (needed_registers.gpr) - { - auto t = reg_save_area_type->pointer.element_type; - resolve_type_in_place(module, t); - - LLVMValueRef indices[] = { gpr_offset }; - register_address = create_gep(module, { - .type = t->llvm.abi, - .pointer = reg_save_area, - .indices = array_to_slice(indices), - .inbounds = false, - }); - if (get_byte_alignment(va_arg_type) > 8) - { - trap(); - } - } - else if (needed_registers.sse == 1) - { - trap(); - } - else if (needed_registers.sse == 2) - { - trap(); - } - else - { - unreachable(); - } - - if (needed_registers.gpr) - { - auto raw_offset = needed_registers.gpr * 8; - auto new_offset = LLVMBuildAdd(module->llvm.builder, gpr_offset, LLVMConstInt(u32_llvm, raw_offset, false), ""); - create_store(module, StoreOptions{ - .source = new_offset, - .destination = gpr_offset_pointer, - .type = u32_type, - }); - } - - if (needed_registers.sse) - { - trap(); - } - - LLVMBuildBr(module->llvm.builder, end_block); - - emit_block(module, in_mem_block); - auto memory_address = emit_va_arg_from_memory(module, va_list_value_llvm, va_list_struct, va_arg_type); - - emit_block(module, end_block); - - LLVMValueRef values[] = { - register_address, - memory_address, - }; - LLVMBasicBlockRef blocks[] = { - in_reg_block, - in_mem_block, - }; - - auto phi = LLVMBuildPhi(module->llvm.builder, module->llvm.pointer_type, ""); - LLVMAddIncoming(phi, values, blocks, array_length(values)); - - address = phi; - - unused(fp_offset_pointer); - unused(fp_offset); - unused(raw_fits_in_fp); - unused(fits_in_fp); - } - - assert(address); - - auto evaluation_kind = get_evaluation_kind(va_arg_type); - - LLVMValueRef result = 0; - - switch (evaluation_kind) - { - case EvaluationKind::scalar: - { - assert(!left_llvm); - assert(!left_type); - result = create_load(module, { - .type = va_arg_type, - .pointer = address, - }); - } break; - case EvaluationKind::aggregate: - { - if (left_llvm) - { - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - u64 memcpy_size = get_byte_size(va_arg_type); - auto alignment = get_byte_alignment(va_arg_type); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, address, alignment, LLVMConstInt(u64_type->llvm.abi, memcpy_size, false)); - return left_llvm; - } - else - { - trap(); - } - } break; - case EvaluationKind::complex: - { - trap(); - } break; - } - - assert(result); - return result; - } break; - default: unreachable(); - } -} - -fn LLVMValueRef emit_field_access(Module* module, Value* value, LLVMValueRef left_llvm, Type* left_type, TypeKind type_kind) -{ - switch (value->id) - { - case ValueId::field_access: - { - auto aggregate = value->field_access.aggregate; - auto field_name = value->field_access.field_name; - - emit_value(module, aggregate, TypeKind::memory, false); - - assert(aggregate->kind == ValueKind::left); - auto aggregate_type = aggregate->type; - assert(aggregate_type->id == TypeId::pointer); - auto aggregate_element_type = aggregate_type->pointer.element_type; - - Type* real_aggregate_type = aggregate_element_type->id == TypeId::pointer ? aggregate_element_type->pointer.element_type : aggregate_element_type; - auto resolved_aggregate_type = resolve_alias(module, real_aggregate_type); - resolve_type_in_place(module, resolved_aggregate_type); - LLVMValueRef v; - if (real_aggregate_type != aggregate_element_type) - { - v = create_load(module, { - .type = aggregate_element_type, - .pointer = aggregate->llvm, - }); - } - else - { - v = aggregate->llvm; - } - - switch (resolved_aggregate_type->id) - { - case TypeId::structure: - case TypeId::union_type: - { - struct StructLikeFieldAccess - { - Type* type; - u32 field_index; - LLVMTypeRef struct_type; - }; - - StructLikeFieldAccess field_access; - switch (resolved_aggregate_type->id) - { - case TypeId::structure: - { - u32 field_index; - auto fields = resolved_aggregate_type->structure.fields; - auto field_count = (u32)fields.length; - for (field_index = 0; field_index < field_count; field_index += 1) - { - auto& field = fields[field_index]; - if (field_name.equal(field.name)) - { - break; - } - } - - if (field_index == field_count) - { - report_error(); - } - - field_access = { - .type = resolved_aggregate_type->structure.fields[field_index].type, - .field_index = field_index, - .struct_type = resolved_aggregate_type->llvm.memory, - }; - } break; - case TypeId::union_type: - { - auto fields = resolved_aggregate_type->union_type.fields; - u32 field_index; - auto field_count = (u32)fields.length; - for (field_index = 0; field_index < field_count; field_index += 1) - { - auto& field = fields[field_index]; - if (field_name.equal(field.name)) - { - break; - } - } - - if (field_index == field_count) - { - report_error(); - } - - auto field_type = resolved_aggregate_type->union_type.fields[field_index].type; - resolve_type_in_place(module, field_type); - auto struct_type = LLVMStructTypeInContext(module->llvm.context, &field_type->llvm.memory, 1, false); - assert(struct_type); - - field_access = { - .type = field_type, - .field_index = 0, - .struct_type = struct_type, - }; - } break; - default: unreachable(); - } - - auto gep = LLVMBuildStructGEP2(module->llvm.builder, field_access.struct_type, v, field_access.field_index, ""); - - if (left_llvm) - { - assert(get_evaluation_kind(field_access.type) == EvaluationKind::aggregate); - auto alignment = get_byte_alignment(field_access.type); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, gep, alignment, LLVMConstInt(u64_type->llvm.abi, get_byte_size(field_access.type), false)); - return gep; - } - else - { - switch (value->kind) - { - case ValueKind::left: - { - return gep; - } break; - case ValueKind::right: - { - auto load = create_load(module, { - .type = field_access.type, - .pointer = gep, - .kind = type_kind, - }); - return load; - } break; - } - } - } break; - case TypeId::bits: - { - auto fields = resolved_aggregate_type->bits.fields; - u64 i; - for (i = 0; i < fields.length; i += 1) - { - auto& field = fields[i]; - if (field_name.equal(field.name)) - { - break; - } - } - - assert(i < fields.length); - - auto& field = fields[i]; - auto field_type = field.type; - resolve_type_in_place(module, field_type); - - auto load = create_load(module, { - .type = resolved_aggregate_type, - .pointer = v, - }); - auto shift = LLVMBuildLShr(module->llvm.builder, load, LLVMConstInt(resolved_aggregate_type->llvm.abi, field.offset, false), ""); - auto trunc = LLVMBuildTrunc(module->llvm.builder, shift, field_type->llvm.abi, ""); - if (left_llvm) - { - trap(); - } - - return trunc; - } break; - case TypeId::enum_array: - case TypeId::array: - { - assert(value->field_access.field_name.equal(string_literal("length"))); - auto array_length_type = get_llvm_type(value->type, type_kind); - u64 array_element_count = 0; - - switch (resolved_aggregate_type->id) - { - case TypeId::enum_array: - { - auto enum_type = resolved_aggregate_type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - array_element_count = enum_type->enumerator.fields.length; - } break; - case TypeId::array: - { - array_element_count = resolved_aggregate_type->array.element_count; - } break; - default: unreachable(); - } - - assert(array_element_count); - - auto result = LLVMConstInt(array_length_type, array_element_count, false); - return result; - } break; - default: unreachable(); - } - } break; - default: unreachable(); - } -} - -fn void emit_assignment(Module* module, LLVMValueRef left_llvm, Type* left_type, Value* right) -{ - Global* parent_function_global; - if (module->current_function) - { - parent_function_global = module->current_function; - } - else if (module->current_macro_instantiation) - { - parent_function_global = module->current_macro_instantiation->instantiation_function; - } - else - { - report_error(); - } - - auto* llvm_function = parent_function_global->variable.storage->llvm; - assert(llvm_function); - - assert(!right->llvm); - auto pointer_type = left_type; - auto value_type = right->type; - assert(pointer_type); - assert(value_type); - resolve_type_in_place(module, pointer_type); - resolve_type_in_place(module, value_type); - - auto resolved_pointer_type = resolve_alias(module, pointer_type); - auto resolved_value_type = resolve_alias(module, value_type); - assert(resolved_pointer_type->id == TypeId::pointer); - assert(resolved_pointer_type->pointer.element_type == resolved_value_type); - - auto type_kind = TypeKind::memory; - - auto evaluation_kind = get_evaluation_kind(resolved_value_type); - switch (evaluation_kind) - { - case EvaluationKind::scalar: - { - emit_value(module, right, type_kind, false); - create_store(module, { - .source = right->llvm, - .destination = left_llvm, - .type = resolved_value_type, - }); - } break; - case EvaluationKind::aggregate: - { - switch (right->id) - { - case ValueId::array_initialization: - { - auto values = right->array_initialization.values; - assert(resolved_value_type->id == TypeId::array); - auto element_type = resolved_value_type->array.element_type; - auto element_count = resolved_value_type->array.element_count; - auto uint64_type = uint64(module); - assert(values.length == element_count); - resolve_type_in_place(module, uint64_type); - - if (right->array_initialization.is_constant) - { - emit_value(module, right, TypeKind::memory, false); - - bool is_constant = true; - LLVMLinkage linkage_type = LLVMInternalLinkage; - LLVMThreadLocalMode thread_local_mode = {}; - bool externally_initialized = false; - auto alignment = get_byte_alignment(resolved_value_type); - - auto global = llvm_create_global_variable(module->llvm.module, value_type->llvm.memory, is_constant, linkage_type, right->llvm, string_literal("array.init"), thread_local_mode, externally_initialized, alignment, LLVMGlobalUnnamedAddr); - - u64 memcpy_size = get_byte_size(resolved_value_type); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, global, alignment, LLVMConstInt(uint64_type->llvm.abi, memcpy_size, false)); - } - else - { - auto u64_zero = LLVMConstNull(uint64_type->llvm.abi); - auto pointer_to_element_type = get_pointer_type(module, element_type); - - for (u64 i = 0; i < values.length; i += 1) - { - LLVMValueRef indices[] = { - u64_zero, - LLVMConstInt(uint64_type->llvm.abi, i, false), - }; - auto alloca_gep = create_gep(module, { - .type = resolved_value_type->llvm.memory, - .pointer = left_llvm, - .indices = array_to_slice(indices), - }); - - emit_assignment(module, alloca_gep, pointer_to_element_type, values[i]); - } - } - } break; - case ValueId::string_literal: - { - auto string_literal = emit_string_literal(module, right); - auto slice_type = get_slice_type(module, uint8(module)); - - for (u32 i = 0; i < array_length(string_literal.values); i += 1) - { - auto member_pointer = LLVMBuildStructGEP2(module->llvm.builder, slice_type->llvm.abi, left_llvm, i, ""); - auto slice_member_type = slice_type->structure.fields[i].type; - create_store(module, { - .source = string_literal.values[i], - .destination = member_pointer, - .type = slice_member_type, - }); - } - } break; - case ValueId::va_start: - { - assert(resolved_value_type == get_va_list_type(module)); - assert(pointer_type->pointer.element_type == get_va_list_type(module)); - LLVMTypeRef argument_types[] = { - module->llvm.pointer_type, - }; - LLVMValueRef argument_values[] = { - left_llvm, - }; - emit_intrinsic_call(module, IntrinsicIndex::va_start, array_to_slice(argument_types), array_to_slice(argument_values)); - } break; - case ValueId::aggregate_initialization: - { - auto elements = right->aggregate_initialization.elements; - auto scope = right->aggregate_initialization.scope; - auto is_constant = right->aggregate_initialization.is_constant; - auto zero = right->aggregate_initialization.zero; - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - u64 byte_size = get_byte_size(value_type); - auto byte_size_value = LLVMConstInt(u64_type->llvm.abi, byte_size, false); - auto alignment = get_byte_alignment(value_type); - - if (is_constant) - { - emit_value(module, right, TypeKind::memory, true); - - LLVMLinkage linkage_type = LLVMInternalLinkage; - LLVMThreadLocalMode thread_local_mode = LLVMNotThreadLocal; - bool externally_initialized = false; - auto global = llvm_create_global_variable(module->llvm.module, value_type->llvm.memory, is_constant, linkage_type, right->llvm, string_literal("const.aggregate"), thread_local_mode, externally_initialized, alignment, LLVMGlobalUnnamedAddr); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, global, alignment, byte_size_value); - } - else - { - switch (resolved_value_type->id) - { - case TypeId::structure: - { - u64 max_field_index = 0; - u64 field_mask = 0; - auto fields = resolved_value_type->structure.fields; - assert(fields.length <= 64); - unused(field_mask); - - if (zero) - { - auto u8_type = uint8(module); - resolve_type_in_place(module, u8_type); - LLVMBuildMemSet(module->llvm.builder, left_llvm, LLVMConstNull(u8_type->llvm.memory), byte_size_value, alignment); - } - - for (const auto& element : elements) - { - auto name = element.name; - auto value = element.value; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < (u32)fields.length; declaration_index += 1) - { - auto field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - assert(declaration_index < fields.length); - - if (module->has_debug_info) - { - auto debug_location = LLVMDIBuilderCreateDebugLocation(module->llvm.context, element.line, element.column, scope->llvm, module->llvm.inlined_at); - LLVMSetCurrentDebugLocation2(module->llvm.builder, debug_location); - } - - field_mask |= 1 << declaration_index; - max_field_index = MAX(max_field_index, declaration_index); - auto& field = fields[declaration_index]; - auto destination_pointer = LLVMBuildStructGEP2(module->llvm.builder, resolved_value_type->llvm.memory, left_llvm, declaration_index, ""); - emit_assignment(module, destination_pointer, get_pointer_type(module, field.type), value); - } - } break; - case TypeId::union_type: - { - assert(elements.length == 1); - auto fields = resolved_value_type->union_type.fields; - auto biggest_field_index = resolved_value_type->union_type.biggest_field; - auto& biggest_field = fields[biggest_field_index]; - auto biggest_field_type = biggest_field.type; - auto value = elements[0].value; - auto field_value_type = value->type; - auto field_type_size = get_byte_size(field_value_type); - - LLVMTypeRef struct_type; - auto union_size = resolved_value_type->union_type.byte_size; - - if (field_type_size < union_size) - { - auto u8_type = uint8(module); - resolve_type_in_place(module, u8_type); - LLVMBuildMemSet(module->llvm.builder, left_llvm, LLVMConstNull(u8_type->llvm.memory), LLVMConstInt(u64_type->llvm.memory, union_size, false), alignment); - } - else if (field_type_size > union_size) - { - unreachable(); - } - - if (type_is_abi_equal(module, field_value_type, biggest_field_type)) - { - struct_type = resolved_value_type->llvm.memory; - } - else - { - struct_type = LLVMStructTypeInContext(module->llvm.context, &field_value_type->llvm.memory, 1, false); - } - - auto destination_pointer = LLVMBuildStructGEP2(module->llvm.builder, struct_type, left_llvm, 0, ""); - auto field_pointer_type = get_pointer_type(module, field_value_type); - - emit_assignment(module, destination_pointer, field_pointer_type, value); - } break; - default: unreachable(); - } - } - } break; - case ValueId::call: - { - auto result = emit_call(module, right, left_llvm, left_type); - assert(result == left_llvm); - } break; - case ValueId::va_arg: - { - auto result = emit_va_arg(module, right, left_llvm, left_type, llvm_function); - if (result != left_llvm) - { - trap(); - } - } break; - case ValueId::slice_expression: - { - auto slice = emit_slice_expression(module, right); - auto slice_pointer_type = resolved_value_type->structure.fields[0].type; - create_store(module, { - .source = slice.values[0], - .destination = left_llvm, - .type = slice_pointer_type, - }); - - auto slice_length_destination = LLVMBuildStructGEP2(module->llvm.builder, resolved_value_type->llvm.abi, left_llvm, 1, ""); - create_store(module, { - .source = slice.values[1], - .destination = slice_length_destination, - .type = uint64(module), - }); - } break; - case ValueId::zero: - { - auto u8_type = uint8(module); - auto u64_type = uint64(module); - resolve_type_in_place(module, u8_type); - resolve_type_in_place(module, u64_type); - - auto size = get_byte_size(resolved_value_type); - auto alignment = get_byte_alignment(resolved_value_type); - LLVMBuildMemSet(module->llvm.builder, left_llvm, LLVMConstNull(u8_type->llvm.memory), LLVMConstInt(u64_type->llvm.memory, size, false), alignment); - } break; - case ValueId::variable_reference: - { - auto* variable = right->variable_reference; - switch (right->kind) - { - case ValueKind::left: - { - trap(); - } break; - case ValueKind::right: - { - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - auto memcpy_size = get_byte_size(resolved_value_type); - auto alignment = get_byte_alignment(resolved_value_type); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, variable->storage->llvm, alignment, LLVMConstInt(u64_type->llvm.abi, memcpy_size, false)); - } break; - } - } break; - case ValueId::string_to_enum: - { - emit_value(module, right, TypeKind::memory, false); - - auto enum_type = right->string_to_enum.type; - auto s2e_struct_type = enum_type->enumerator.string_to_enum_struct_type; - create_store(module, { - .source = right->llvm, - .destination = left_llvm, - .type = s2e_struct_type, - }); - } break; - case ValueId::undefined: - { - // TODO: do something? - } break; - case ValueId::macro_instantiation: - { - emit_macro_instantiation(module, right); - auto size = get_byte_size(resolved_value_type); - auto alignment = get_byte_alignment(resolved_value_type); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - LLVMBuildMemCpy(module->llvm.builder, left_llvm, alignment, right->macro_instantiation.return_alloca, alignment, LLVMConstInt(u64_type->llvm.abi, size, false)); - } break; - case ValueId::unary: - case ValueId::select: - case ValueId::array_expression: - { - emit_value(module, right, TypeKind::memory, false); - create_store(module, { - .source = right->llvm, - .destination = left_llvm, - .type = resolved_value_type, - }); - } break; - case ValueId::field_access: - { - auto value = emit_field_access(module, right, left_llvm, left_type, TypeKind::memory); - right->llvm = value; - } break; - case ValueId::unary_type: - { - auto unary_type_id = right->unary_type.id; - auto unary_type = right->unary_type.type; - - switch (unary_type_id) - { - case UnaryTypeId::enum_names: - { - assert(unary_type->id == TypeId::enumerator); - auto global = get_enum_name_array_global(module, unary_type); - - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - - LLVMValueRef slice_values[] = { - global->variable.storage->llvm, - LLVMConstInt(u64_type->llvm.abi, unary_type->enumerator.fields.length, 0), - }; - auto slice = LLVMConstStructInContext(module->llvm.context, slice_values, array_length(slice_values), 0); - - create_store(module, { - .source = slice, - .destination = left_llvm, - .type = resolved_value_type, - }); - } break; - default: - trap(); - } - } break; - default: unreachable(); - } - } break; - default: unreachable(); - } -} - -fn LLVMValueRef emit_binary(Module* module, LLVMValueRef left, Type* left_type, LLVMValueRef right, Type* right_type, BinaryId id, Type* resolved_value_type) -{ - switch (resolved_value_type->id) - { - case TypeId::integer: - { - switch (id) - { - case BinaryId::max: - case BinaryId::min: - { - IntrinsicIndex intrinsic; - switch (resolved_value_type->id) - { - case TypeId::integer: - { - auto is_signed = resolved_value_type->integer.is_signed; - switch (id) - { - case BinaryId::max: - { - intrinsic = is_signed ? IntrinsicIndex::smax : IntrinsicIndex::umax; - } break; - case BinaryId::min: - { - intrinsic = is_signed ? IntrinsicIndex::smin : IntrinsicIndex::umin; - } break; - default: unreachable(); - } - } break; - default: report_error(); - } - LLVMTypeRef argument_types[] = { resolved_value_type->llvm.abi }; - LLVMValueRef argument_values[] = { left, right }; - auto llvm_value = emit_intrinsic_call(module, intrinsic, array_to_slice(argument_types), array_to_slice(argument_values)); - return llvm_value; - } break; - case BinaryId::shift_right: - if (resolved_value_type->integer.is_signed) - { - return LLVMBuildAShr(module->llvm.builder, left, right, ""); - } - else - { - return LLVMBuildLShr(module->llvm.builder, left, right, ""); - } - break; - case BinaryId::div: - if (resolved_value_type->integer.is_signed) - { - return LLVMBuildSDiv(module->llvm.builder, left, right, ""); - } - else - { - return LLVMBuildUDiv(module->llvm.builder, left, right, ""); - } - break; - case BinaryId::rem: - if (resolved_value_type->integer.is_signed) - { - return LLVMBuildSRem(module->llvm.builder, left, right, ""); - } - else - { - return LLVMBuildURem(module->llvm.builder, left, right, ""); - } - break; - case BinaryId::compare_equal: - case BinaryId::compare_not_equal: - case BinaryId::compare_greater: - case BinaryId::compare_less: - case BinaryId::compare_greater_equal: - case BinaryId::compare_less_equal: - { - LLVMIntPredicate predicate; - assert(left_type == right_type); - auto left_signed = type_is_signed(left_type); - auto right_signed = type_is_signed(right_type); - assert(left_signed == right_signed); - auto is_signed = left_signed; - - switch (id) - { - case BinaryId::compare_equal: predicate = LLVMIntEQ; break; - case BinaryId::compare_not_equal: predicate = LLVMIntNE; break; - case BinaryId::compare_greater: predicate = is_signed ? LLVMIntSGT : LLVMIntUGT; break; - case BinaryId::compare_less: predicate = is_signed ? LLVMIntSLT : LLVMIntULT; break; - case BinaryId::compare_greater_equal: predicate = is_signed ? LLVMIntSGE : LLVMIntUGE; break; - case BinaryId::compare_less_equal: predicate = is_signed ? LLVMIntSLE : LLVMIntULE; break; - default: unreachable(); - } - return LLVMBuildICmp(module->llvm.builder, predicate, left, right, ""); - } break; - case BinaryId::add: return LLVMBuildAdd(module->llvm.builder, left, right, ""); break; - case BinaryId::sub: return LLVMBuildSub(module->llvm.builder, left, right, ""); break; - case BinaryId::mul: return LLVMBuildMul(module->llvm.builder, left, right, ""); break; - case BinaryId::logical_and: - case BinaryId::bitwise_and: return LLVMBuildAnd(module->llvm.builder, left, right, ""); break; - case BinaryId::logical_or: - case BinaryId::bitwise_or: return LLVMBuildOr(module->llvm.builder, left, right, ""); break; - case BinaryId::bitwise_xor: return LLVMBuildXor(module->llvm.builder, left, right, ""); break; - case BinaryId::shift_left: return LLVMBuildShl(module->llvm.builder, left, right, ""); break; - default: unreachable(); - } - } break; - case TypeId::pointer: - { - auto element_type = resolved_value_type->pointer.element_type; - resolve_type_in_place(module, element_type); - - if (id != BinaryId::add && id != BinaryId::sub) - { - report_error(); - } - - LLVMValueRef index = right; - if (id == BinaryId::sub) - { - index = LLVMBuildNeg(module->llvm.builder, index, ""); - } - - LLVMValueRef indices[] = { index }; - - return create_gep(module, { - .type = element_type->llvm.abi, - .pointer = left, - .indices = array_to_slice(indices), - }); - } break; - default: unreachable(); - } -} - -fn void emit_local_storage(Module* module, Variable* variable) -{ - assert(!variable->storage); - auto value_type = variable->type; - resolve_type_in_place(module, value_type); - auto pointer_type = get_pointer_type(module, value_type); - auto storage = new_value(module); - assert(variable->name.pointer); - assert(variable->name.length); - auto alloca = create_alloca(module, { - .type = value_type, - .name = variable->name, - }); - *storage = Value{ - .type = pointer_type, - .id = ValueId::local, - .llvm = alloca, - }; - variable->storage = storage; -} - -fn LLVMMetadataRef null_expression(Module* module) -{ - return LLVMDIBuilderCreateExpression(module->llvm.di_builder, 0, 0); -} - -fn void end_debug_local(Module* module, Variable* variable, LLVMMetadataRef llvm_local) -{ - auto debug_location = LLVMDIBuilderCreateDebugLocation(module->llvm.context, variable->line, variable->column, variable->scope->llvm, module->llvm.inlined_at); - LLVMSetCurrentDebugLocation2(module->llvm.builder, debug_location); - auto basic_block = LLVMGetInsertBlock(module->llvm.builder); - assert(basic_block); - LLVMDIBuilderInsertDeclareRecordAtEnd(module->llvm.di_builder, variable->storage->llvm, llvm_local, null_expression(module), debug_location, basic_block); -} - -fn void emit_local_variable(Module* module, Local* local) -{ - emit_local_storage(module, &local->variable); - assert(local->variable.storage); - - if (module->has_debug_info) - { - auto debug_type = local->variable.type->llvm.debug; - assert(debug_type); - bool always_preserve = true; - LLVMDIFlags flags = {}; - - auto scope = local->variable.scope->llvm; - auto bit_alignment = get_byte_alignment(local->variable.storage->type->pointer.element_type) * 8; - auto local_variable = LLVMDIBuilderCreateAutoVariable(module->llvm.di_builder, scope, (char*)local->variable.name.pointer, local->variable.name.length, module->llvm.file, local->variable.line, debug_type, always_preserve, flags, bit_alignment); - - end_debug_local(module, &local->variable, local_variable); - } -} - -fn void emit_argument(Module* module, Argument* argument) -{ - emit_local_storage(module, &argument->variable); - assert(argument->variable.storage); - - if (module->has_debug_info) - { - auto debug_type = argument->variable.type->llvm.debug; - assert(debug_type); - auto scope = argument->variable.scope->llvm; - auto always_preserve = true; - LLVMDIFlags flags = {}; - auto argument_variable = LLVMDIBuilderCreateParameterVariable(module->llvm.di_builder, scope, (char*)argument->variable.name.pointer, argument->variable.name.length, argument->index, module->llvm.file, argument->variable.line, debug_type, always_preserve, flags); - - end_debug_local(module, &argument->variable, argument_variable); - } -} - -fn void emit_macro_instantiation(Module* module, Value* value) -{ - switch (value->id) - { - case ValueId::macro_instantiation: - { - auto current_function = module->current_function; - if (!current_function) - { - report_error(); - } - module->current_function = 0; - - auto old_macro_instantiation = module->current_macro_instantiation; - assert(!old_macro_instantiation); - auto macro_instantiation = &value->macro_instantiation; - module->current_macro_instantiation = macro_instantiation; - - LLVMMetadataRef caller_debug_location = 0; - if (module->has_debug_info) - { - assert(!module->llvm.inlined_at); - caller_debug_location = LLVMDIBuilderCreateDebugLocation(module->llvm.context, macro_instantiation->line, macro_instantiation->column, macro_instantiation->scope.parent->llvm, 0); - LLVMSetCurrentDebugLocation2(module->llvm.builder, caller_debug_location); - } - - for (Value* instantiation_argument: macro_instantiation->instantiation_arguments) - { - emit_value(module, instantiation_argument, TypeKind::abi, false); - } - - auto older_inlined_at = module->llvm.inlined_at; - assert(!older_inlined_at); - module->llvm.inlined_at = caller_debug_location; - - auto llvm_function = current_function->variable.storage->llvm; - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "macro.entry"); - - LLVMBuildBr(module->llvm.builder, entry_block); - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - LLVMValueRef return_alloca = 0; - auto return_type = macro_instantiation->return_type; - if (return_type->id != TypeId::void_type && return_type->id != TypeId::noreturn) - { - return_alloca = create_alloca(module, { - .type = return_type, - .name = string_literal("macro.return"), - }); - } - assert(!macro_instantiation->return_alloca); - macro_instantiation->return_alloca = return_alloca; - - auto* return_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "macro.return_block"); - assert(!macro_instantiation->return_block); - macro_instantiation->return_block = return_block; - - auto declaration_arguments = macro_instantiation->declaration_arguments; - auto instantiation_arguments = macro_instantiation->instantiation_arguments; - assert(declaration_arguments.length == instantiation_arguments.length); - - for (u64 i = 0; i < declaration_arguments.length; i += 1) - { - auto* declaration_argument = &declaration_arguments[i]; - auto* instantiation_argument = instantiation_arguments[i]; - - emit_argument(module, declaration_argument); - - auto type = declaration_argument->variable.type; - auto resolved_type = resolve_alias(module, type); - auto evaluation_kind = get_evaluation_kind(resolved_type); - auto llvm_instantiation_argument = instantiation_argument->llvm; - auto llvm_declaration_argument = declaration_argument->variable.storage->llvm; - switch (evaluation_kind) - { - case EvaluationKind::scalar: - { - create_store(module, { - .source = llvm_instantiation_argument, - .destination = llvm_declaration_argument, - .type = type, - }); - } break; - default: - trap(); - } - } - - analyze_block(module, macro_instantiation->block); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, return_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, return_block); - - module->llvm.inlined_at = older_inlined_at; - module->current_macro_instantiation = old_macro_instantiation; - module->current_function = current_function; - } break; - default: unreachable(); - } -} - -fn void analyze_statement(Module* module, Scope* scope, Statement* statement); - -fn void analyze_block(Module* module, Block* block) -{ - if (module->has_debug_info) - { - auto lexical_block = LLVMDIBuilderCreateLexicalBlock(module->llvm.di_builder, block->scope.parent->llvm, module->llvm.file, block->scope.line, block->scope.column); - block->scope.llvm = lexical_block; - } - - u32 last_line = 0; - u32 last_column = 0; - LLVMMetadataRef last_debug_location = 0; - - for (auto* statement = block->first_statement; statement; statement = statement->next) - { - analyze_statement(module, &block->scope, statement); - } -} - -fn LLVMValueRef emit_constant_array(Module* module, Slice elements, Type* element_type) -{ - LLVMValueRef value_buffer[128]; - assert(elements.length <= array_length(value_buffer)); - - resolve_type_in_place(module, element_type); - - for (u64 i = 0; i < elements.length; i += 1) - { - auto* v = elements[i]; - emit_value(module, v, TypeKind::memory, true); - value_buffer[i] = v->llvm; - } - - auto constant_array = LLVMConstArray2(element_type->llvm.memory, value_buffer, elements.length); - return constant_array; -} - -fn void emit_value(Module* module, Value* value, TypeKind type_kind, bool expect_constant) -{ - auto must_be_constant = expect_constant || (!module->current_function && !module->current_macro_instantiation); - Global* parent_function_global = 0; - if (module->current_function) - { - parent_function_global = module->current_function; - } - else if (module->current_macro_instantiation) - { - parent_function_global = module->current_macro_instantiation->instantiation_function; - } - else - { - assert(must_be_constant); - } - - LLVMValueRef llvm_function = 0; - if (parent_function_global) - { - llvm_function = parent_function_global->variable.storage->llvm; - assert(llvm_function); - } - - assert(value->type); - assert(!value->llvm); - auto resolved_value_type = resolve_alias(module, value->type); - resolve_type_in_place(module, resolved_value_type); - - - LLVMValueRef llvm_value = 0; - switch (value->id) - { - case ValueId::constant_integer: - { - auto llvm_integer_type = get_llvm_type(resolved_value_type, type_kind); - llvm_value = LLVMConstInt(llvm_integer_type, value->constant_integer.value, value->constant_integer.is_signed); - } break; - case ValueId::unary: - { - auto unary_value = value->unary.value; - assert(!unary_value->llvm); - auto unary_id = value->unary.id; - auto resolved_unary_type = resolve_alias(module, unary_value->type); - if (unary_id == UnaryId::truncate || unary_id == UnaryId::enum_name) - { - type_kind = TypeKind::abi; - } - emit_value(module, unary_value, type_kind, must_be_constant); - auto destination_type = get_llvm_type(resolved_value_type, type_kind); - assert(destination_type); - auto llvm_unary_value = unary_value->llvm; - assert(llvm_unary_value); - - switch (unary_id) - { - case UnaryId::minus: - { - if (value->unary.value->is_constant()) - { - llvm_value = LLVMConstNeg(llvm_unary_value); - } - else - { - llvm_value = LLVMBuildNeg(module->llvm.builder, llvm_unary_value, ""); - } - } break; - case UnaryId::plus: - { - trap(); - } break; - case UnaryId::ampersand: - { - assert(resolved_value_type == resolved_unary_type); - llvm_value = llvm_unary_value; - } break; - case UnaryId::exclamation: - { - if (resolved_value_type == resolved_unary_type) - { - llvm_value = LLVMBuildNot(module->llvm.builder, llvm_unary_value, ""); - } - else - { - switch (resolved_unary_type->id) - { - case TypeId::pointer: - { - llvm_value = LLVMBuildICmp(module->llvm.builder, LLVMIntEQ, llvm_unary_value, LLVMConstNull(resolved_unary_type->llvm.abi), ""); - } break; - default: report_error(); - } - } - } break; - case UnaryId::enum_name: - { - assert(type_kind == TypeKind::abi); - auto enum_type = resolved_unary_type; - assert(enum_type->id == TypeId::enumerator); - auto enum_to_string = enum_type->enumerator.enum_to_string_function; - assert(enum_to_string); - auto call = LLVMBuildCall2(module->llvm.builder, LLVMGlobalGetValueType(enum_to_string), enum_to_string, &llvm_unary_value, 1, ""); - LLVMSetInstructionCallConv(call, LLVMFastCallConv); - llvm_value = call; - } break; - case UnaryId::extend: - { - assert(resolved_unary_type->id == TypeId::integer); - if (resolved_unary_type->integer.is_signed) - { - llvm_value = LLVMBuildSExt(module->llvm.builder, llvm_unary_value, destination_type, ""); - } - else - { - llvm_value = LLVMBuildZExt(module->llvm.builder, llvm_unary_value, destination_type, ""); - } - } break; - case UnaryId::truncate: - { - if (type_kind != TypeKind::abi) - { - assert(resolved_value_type->llvm.abi == resolved_value_type->llvm.memory); - } - - llvm_value = LLVMBuildTrunc(module->llvm.builder, llvm_unary_value, destination_type, ""); - } break; - case UnaryId::pointer_cast: - case UnaryId::int_from_enum: - { - llvm_value = llvm_unary_value; - } break; - case UnaryId::int_from_pointer: - { - llvm_value = LLVMBuildPtrToInt(module->llvm.builder, llvm_unary_value, resolved_value_type->llvm.abi, ""); - } break; - case UnaryId::va_end: - { - LLVMTypeRef argument_types[] = { module->llvm.pointer_type }; - LLVMValueRef argument_values[] = { llvm_unary_value }; - llvm_value = emit_intrinsic_call(module, IntrinsicIndex::va_end, array_to_slice(argument_types), array_to_slice(argument_values)); - } break; - case UnaryId::bitwise_not: - { - llvm_value = LLVMBuildNot(module->llvm.builder, llvm_unary_value, ""); - } break; - case UnaryId::dereference: - { - switch (value->kind) - { - case ValueKind::right: - { - auto pointer_type = unary_value->type; - assert(pointer_type->id == TypeId::pointer); - auto child_type = resolve_alias(module, pointer_type->pointer.element_type); - assert(child_type == resolved_value_type); - auto load = create_load(module, LoadOptions{ - .type = child_type, - .pointer = unary_value->llvm, - .kind = type_kind, - }); - llvm_value = load; - } break; - case ValueKind::left: - trap(); - } - } break; - case UnaryId::pointer_from_int: - { - llvm_value = LLVMBuildIntToPtr(module->llvm.builder, llvm_unary_value, resolved_value_type->llvm.abi, ""); - } break; - case UnaryId::enum_from_int: - { - llvm_value = llvm_unary_value; - } break; - case UnaryId::leading_zeroes: - case UnaryId::trailing_zeroes: - { - auto intrinsic = unary_id == UnaryId::leading_zeroes ? IntrinsicIndex::clz : IntrinsicIndex::ctz; - auto u1_type = uint1(module); - resolve_type_in_place(module, u1_type); - auto zero_is_poison = LLVMConstNull(u1_type->llvm.abi); - LLVMValueRef values[] = { llvm_unary_value, zero_is_poison }; - LLVMTypeRef types[] = { destination_type }; - llvm_value = emit_intrinsic_call(module, intrinsic, array_to_slice(types), array_to_slice(values)); - } break; - } - } break; - case ValueId::unary_type: - { - auto unary_type = value->unary_type.type; - auto unary_type_id = value->unary_type.id; - - resolve_type_in_place(module, unary_type); - - switch (unary_type_id) - { - case UnaryTypeId::align_of: - { - assert(resolved_value_type->id == TypeId::integer); - auto constant_integer = LLVMConstInt(resolved_value_type->llvm.abi, get_byte_alignment(unary_type), false); - llvm_value = constant_integer; - } break; - case UnaryTypeId::byte_size: - { - assert(resolved_value_type->id == TypeId::integer); - auto constant_integer = LLVMConstInt(resolved_value_type->llvm.abi, get_byte_size(unary_type), false); - llvm_value = constant_integer; - } break; - case UnaryTypeId::integer_max: - { - assert(unary_type->id == TypeId::integer); - auto is_signed = unary_type->integer.is_signed; - auto max_value = integer_max_value(unary_type->integer.bit_count, is_signed); - auto constant_integer = LLVMConstInt(resolved_value_type->llvm.abi, max_value, is_signed); - llvm_value = constant_integer; - } break; - case UnaryTypeId::enum_values: - { - LLVMValueRef buffer[64]; - assert(type_kind == TypeKind::memory); - assert(unary_type->id == TypeId::enumerator); - auto fields = unary_type->enumerator.fields; - auto llvm_enum_type = unary_type->llvm.memory; - u64 i = 0; - for (auto& field : fields) - { - auto v = field.value; - buffer[i] = LLVMConstInt(llvm_enum_type, v, false); - i += 1; - } - auto array_value = LLVMConstArray2(llvm_enum_type, buffer, i); - - switch (value->kind) - { - case ValueKind::right: - { - llvm_value = array_value; - } break; - case ValueKind::left: - { - auto is_constant = true; - assert(resolved_value_type->id == TypeId::pointer); - auto array_type = resolved_value_type->pointer.element_type; - assert(array_type->id == TypeId::array); - resolve_type_in_place(module, array_type); - auto alignment = get_byte_alignment(resolved_value_type); - auto value_array_variable = llvm_create_global_variable(module->llvm.module, array_type->llvm.memory, is_constant, LLVMInternalLinkage, array_value, string_literal("enum.values"), LLVMNotThreadLocal, 0, alignment, LLVMGlobalUnnamedAddr); - llvm_value = value_array_variable; - } break; - } - } break; - case UnaryTypeId::enum_names: - { - trap(); - } break; - } - } break; - case ValueId::binary: - { - auto binary_id = value->binary.id; - bool is_shorcircuiting = binary_is_shortcircuiting(binary_id); - Value* values[2] = { value->binary.left, value->binary.right }; - - if (is_shorcircuiting) - { - enum class ShortcircuitingOperation - { - boolean_and, - boolean_or, - }; - - ShortcircuitingOperation shorcircuiting_op; - switch (binary_id) - { - case BinaryId::logical_and_shortcircuit: - shorcircuiting_op = ShortcircuitingOperation::boolean_and; - break; - case BinaryId::logical_or_shortcircuit: - shorcircuiting_op = ShortcircuitingOperation::boolean_or; - break; - default: - unreachable(); - } - - auto* left = value->binary.left; - - auto* right_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "shortcircuit.right"); - auto* end_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "shortcircuit.end"); - - LLVMBasicBlockRef true_block; - LLVMBasicBlockRef false_block; - - switch (shorcircuiting_op) - { - case ShortcircuitingOperation::boolean_and: - true_block = right_block; - false_block = end_block; - break; - case ShortcircuitingOperation::boolean_or: - true_block = end_block; - false_block = right_block; - break; - } - - emit_value(module, left, TypeKind::abi, must_be_constant); - auto llvm_condition = emit_condition(module, left); - auto current_basic_block = LLVMGetInsertBlock(module->llvm.builder); - - LLVMBuildCondBr(module->llvm.builder, llvm_condition, true_block, false_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, right_block); - - auto* right = value->binary.right; - if (right->llvm) - { - assert(false); // TODO: check if this if is really necessary - } - else - { - emit_value(module, right, TypeKind::abi, must_be_constant); - } - - auto right_llvm = right->llvm; - - LLVMValueRef right_condition = 0; - - switch (right->type->id) - { - case TypeId::integer: - { - switch (right->type->integer.bit_count) - { - case 1: - right_condition = right_llvm; - break; - default: trap(); - } - } break; - default: trap(); - } - - assert(right_condition); - - LLVMBuildBr(module->llvm.builder, end_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, end_block); - - auto boolean_type = uint1(module); - resolve_type_in_place(module, boolean_type); - auto boolean = boolean_type->llvm.abi; - - LLVMValueRef incoming_left = 0; - - switch (shorcircuiting_op) - { - case ShortcircuitingOperation::boolean_and: - incoming_left = LLVMConstNull(boolean); - break; - case ShortcircuitingOperation::boolean_or: - incoming_left = LLVMConstInt(boolean, 1, false); - break; - } - - assert(incoming_left); - - LLVMValueRef incoming_values[] = { - incoming_left, - right_condition, - }; - - LLVMBasicBlockRef blocks[] = { - current_basic_block, - right_block, - }; - static_assert(array_length(incoming_values) == array_length(blocks)); - - auto phi = LLVMBuildPhi(module->llvm.builder, boolean, ""); - LLVMAddIncoming(phi, incoming_values, blocks, array_length(blocks)); - - llvm_value = phi; - - switch (type_kind) - { - case TypeKind::abi: - break; - case TypeKind::memory: - llvm_value = memory_to_abi(module, llvm_value, boolean_type); - break; - } - } - else - { - LLVMValueRef llvm_values[2]; - for (u64 i = 0; i < array_length(values); i += 1) - { - auto* binary_value = values[i]; - if (binary_value->llvm) - { - assert(false); // TODO: check if this if is really necessary - } - else - { - emit_value(module, binary_value, TypeKind::abi, must_be_constant); - } - - llvm_values[i] = binary_value->llvm; - } - - llvm_value = emit_binary(module, llvm_values[0], values[0]->type, llvm_values[1], values[1]->type, value->binary.id, resolved_value_type); - } - } break; - case ValueId::variable_reference: - { - auto* variable = value->variable_reference; - - auto resolved_variable_value_type = resolve_alias(module, variable->type); - auto resolved_variable_pointer_type = resolve_alias(module, variable->storage->type); - - switch (value->kind) - { - case ValueKind::left: - { - if (resolved_variable_pointer_type == resolved_value_type) - { - llvm_value = variable->storage->llvm; - } - else - { - trap(); - } - } break; - case ValueKind::right: - { - if (resolved_variable_value_type != resolved_value_type) - { - report_error(); - } - - if (must_be_constant) - { - if (variable->scope->kind != ScopeKind::global) - { - report_error(); - } - - llvm_value = variable->initial_value->llvm; - assert(llvm_value); - } - else - { - assert(get_byte_size(resolved_value_type) <= 16); - - auto evaluation_kind = get_evaluation_kind(resolved_value_type); - switch (evaluation_kind) - { - case EvaluationKind::scalar: - case EvaluationKind::aggregate: - { - llvm_value = create_load(module, { - .type = resolved_value_type, - .pointer = variable->storage->llvm, - .kind = type_kind, - }); - } break; - case EvaluationKind::complex: - trap(); - } - } - } break; - } - } break; - case ValueId::call: - { - auto call = emit_call(module, value, 0, 0); - llvm_value = call; - } break; - case ValueId::array_initialization: - { - auto values = value->array_initialization.values; - - if (value->array_initialization.is_constant) - { - assert(value->kind == ValueKind::right); - auto element_type = resolved_value_type->array.element_type; - llvm_value = emit_constant_array(module, values, element_type); - } - else - { - switch (value->kind) - { - case ValueKind::right: - { - trap(); - } break; - case ValueKind::left: - { - assert(resolved_value_type->id == TypeId::pointer); - auto array_type = resolved_value_type->pointer.element_type; - assert(array_type->id == TypeId::array); - auto alloca = create_alloca(module, { - .type = array_type, - .name = string_literal("array.init"), - }); - - auto pointer_to_element_type = get_pointer_type(module, array_type->array.element_type); - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - auto llvm_u64_type = u64_type->llvm.abi; - auto u64_zero = LLVMConstNull(llvm_u64_type); - - LLVMTypeRef llvm_array_type = array_type->llvm.memory; - - for (u64 i = 0; i < values.length; i += 1) - { - LLVMValueRef indices[] = { - u64_zero, - LLVMConstInt(llvm_u64_type, i, false), - }; - auto alloca_gep = create_gep(module, { - .type = llvm_array_type, - .pointer = alloca, - .indices = array_to_slice(indices), - }); - auto value = values[i]; - emit_assignment(module, alloca_gep, pointer_to_element_type, value); - } - - llvm_value = alloca; - } break; - } - } - } break; - case ValueId::array_expression: - { - auto* array_like = value->array_expression.array_like; - auto* index = value->array_expression.index; - - switch (array_like->kind) - { - case ValueKind::left: - { - emit_value(module, array_like, TypeKind::memory, must_be_constant); - emit_value(module, index, TypeKind::memory, must_be_constant); - - auto array_like_type = array_like->type; - assert(array_like_type->id == TypeId::pointer); - auto pointer_element_type = array_like_type->pointer.element_type; - - switch (pointer_element_type->id) - { - case TypeId::enum_array: - case TypeId::array: - { - auto array_type = pointer_element_type; - - auto uint64_type = uint64(module); - resolve_type_in_place(module, uint64_type); - auto u64_llvm = uint64_type->llvm.abi; - auto zero_index = LLVMConstNull(u64_llvm); - - Type* element_type = 0; - LLVMValueRef llvm_index = index->llvm; - - switch (pointer_element_type->id) - { - case TypeId::array: - { - element_type = array_type->array.element_type; - } break; - case TypeId::enum_array: - { - auto enum_type = array_type->enum_array.enum_type; - assert(enum_type->id == TypeId::enumerator); - element_type = array_type->enum_array.element_type; - } break; - default: unreachable(); - } - - assert(element_type); - assert(llvm_index); - - LLVMValueRef indices[] = { zero_index, llvm_index }; - auto gep = create_gep(module, { - .type = array_type->llvm.memory, - .pointer = array_like->llvm, - .indices = array_to_slice(indices), - }); - - switch (value->kind) - { - case ValueKind::left: - llvm_value = gep; - break; - case ValueKind::right: - llvm_value = create_load(module, LoadOptions{ - .type = element_type, - .pointer = gep, - }); - break; - } - } break; - case TypeId::structure: - { - auto slice_type = pointer_element_type; - assert(slice_type->structure.is_slice); - auto slice_pointer_type = slice_type->structure.fields[0].type; - auto slice_element_type = slice_pointer_type->pointer.element_type; - resolve_type_in_place(module, slice_element_type); - - auto pointer_load = create_load(module, { - .type = slice_pointer_type, - .pointer = array_like->llvm, - }); - LLVMValueRef indices[1] = { - index->llvm, - }; - auto gep = create_gep(module, { - .type = slice_element_type->llvm.memory, - .pointer = pointer_load, - .indices = array_to_slice(indices), - }); - - switch (value->kind) - { - case ValueKind::left: - llvm_value = gep; - break; - case ValueKind::right: - llvm_value = create_load(module, LoadOptions{ - .type = slice_element_type, - .pointer = gep, - }); - break; - } - } break; - case TypeId::pointer: - { - auto element_type = pointer_element_type->pointer.element_type; - // TODO: consider not emitting the and doing straight GEP? - auto pointer_load = create_load(module, { - .type = pointer_element_type, - .pointer = array_like->llvm, - }); - LLVMValueRef indices[] = { index->llvm }; - auto gep = create_gep(module, { - .type = element_type->llvm.memory, - .pointer = pointer_load, - .indices = array_to_slice(indices), - }); - - llvm_value = gep; - - if (value->kind == ValueKind::right) - { - llvm_value = create_load(module, { - .type = element_type, - .pointer = gep, - }); - } - } break; - default: unreachable(); - } - } break; - case ValueKind::right: - { - trap(); - } break; - } - } break; - case ValueId::enum_literal: - { - assert(resolved_value_type->id == TypeId::enumerator); - auto enum_name = value->enum_literal; - bool found = false; - u64 i; - for (i = 0; i < resolved_value_type->enumerator.fields.length; i += 1) - { - auto& field = resolved_value_type->enumerator.fields[i]; - if (enum_name.equal(field.name)) - { - found = true; - break; - } - } - - if (!found) - { - report_error(); - } - - auto& field = resolved_value_type->enumerator.fields[i]; - auto llvm_type = get_llvm_type(resolved_value_type, type_kind); - llvm_value = LLVMConstInt(llvm_type, field.value, type_is_signed(resolved_value_type)); - } break; - case ValueId::trap: - { - auto call = emit_intrinsic_call(module, IntrinsicIndex::trap, {}, {}); - LLVMBuildUnreachable(module->llvm.builder); - LLVMClearInsertionPosition(module->llvm.builder); - llvm_value = call; - } break; - case ValueId::field_access: - { - llvm_value = emit_field_access(module, value, 0, 0, type_kind); - } break; - case ValueId::slice_expression: - { - auto slice = emit_slice_expression(module, value); - llvm_value = emit_slice_result(module, slice, resolved_value_type->llvm.abi); - } break; - case ValueId::va_arg: - { - llvm_value = emit_va_arg(module, value, 0, 0, llvm_function); - } break; - case ValueId::aggregate_initialization: - { - auto elements = value->aggregate_initialization.elements; - auto is_constant = value->aggregate_initialization.is_constant; - auto zero = value->aggregate_initialization.zero; - - switch (value->kind) - { - case ValueKind::left: - { - if (resolved_value_type->id != TypeId::pointer) - { - report_error(); - } - - auto aggregate_type = resolved_value_type->pointer.element_type; - - auto alloca = create_alloca(module, { - .type = aggregate_type, - }); - auto resolved_pointer_type = resolved_value_type; - auto old_type = value->type; - // Overwrite type so asserts are not triggered - value->type = aggregate_type; - emit_assignment(module, alloca, resolved_pointer_type, value); - value->type = old_type; - llvm_value = alloca; - } break; - case ValueKind::right: - { - switch (resolved_value_type->id) - { - case TypeId::structure: - { - auto fields = resolved_value_type->structure.fields; - - if (is_constant) - { - LLVMValueRef constant_buffer[64]; - u32 constant_count = (u32)elements.length; - - for (u64 i = 0; i < elements.length; i += 1) - { - auto* value = elements[i].value; - emit_value(module, value, TypeKind::memory, must_be_constant); - auto llvm_value = value->llvm; - assert(llvm_value); - assert(LLVMIsAConstant(llvm_value)); - constant_buffer[i] = llvm_value; - } - - if (zero) - { - if (elements.length == fields.length) - { - unreachable(); - } - - for (u64 i = elements.length; i < fields.length; i += 1) - { - auto& field = fields[i]; - auto field_type = field.type; - resolve_type_in_place(module, field_type); - constant_buffer[i] = LLVMConstNull(field_type->llvm.memory); - constant_count += 1; - } - } - - assert(constant_count == fields.length); - - llvm_value = LLVMConstNamedStruct(get_llvm_type(resolved_value_type, type_kind), constant_buffer, constant_count); - } - else - { - // TODO: shouldn't this be a left value? - unreachable(); - } - } break; - case TypeId::union_type: - { - trap(); - } break; - case TypeId::bits: - { - auto fields = resolved_value_type->bits.fields; - Type* backing_type = resolved_value_type->bits.backing_type; - resolve_type_in_place(module, backing_type); - auto abi_type = get_llvm_type(backing_type, type_kind); - - if (is_constant) - { - u64 bits_value = 0; - - for (u32 initialization_index = 0; initialization_index < elements.length; initialization_index += 1) - { - auto value = elements[initialization_index].value; - auto name = elements[initialization_index].name; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < fields.length; declaration_index += 1) - { - auto& field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - if (declaration_index == fields.length) - { - unreachable(); - } - - const auto& field = fields[declaration_index]; - u64 field_value; - switch (value->id) - { - case ValueId::constant_integer: - { - field_value = value->constant_integer.value; - } break; - case ValueId::enum_literal: - { - auto enum_name = value->enum_literal; - auto value_type = value->type; - assert(value_type->id == TypeId::enumerator); - - for (auto& field: value_type->enumerator.fields) - { - if (enum_name.equal(field.name)) - { - field_value = field.value; - break; - } - } - } break; - default: unreachable(); - } - - bits_value |= field_value << field.offset; - } - - llvm_value = LLVMConstInt(abi_type, bits_value, false); - } - else - { - llvm_value = LLVMConstNull(abi_type); - - for (u32 initialization_index = 0; initialization_index < elements.length; initialization_index += 1) - { - auto value = elements[initialization_index].value; - auto name = elements[initialization_index].name; - - u32 declaration_index; - for (declaration_index = 0; declaration_index < fields.length; declaration_index += 1) - { - auto& field = fields[declaration_index]; - - if (name.equal(field.name)) - { - break; - } - } - - if (declaration_index == fields.length) - { - unreachable(); - } - - const auto& field = fields[declaration_index]; - - emit_value(module, value, TypeKind::memory, must_be_constant); - - auto extended = LLVMBuildZExt(module->llvm.builder, value->llvm, abi_type, ""); - auto shl = LLVMBuildShl(module->llvm.builder, extended, LLVMConstInt(abi_type, field.offset, false), ""); - auto or_value = LLVMBuildOr(module->llvm.builder, llvm_value, shl, ""); - llvm_value = or_value; - } - } - } break; - case TypeId::enum_array: - { - assert(is_constant); - assert(elements.length <= 64); - Value* value_buffer[64]; - for (u64 i = 0; i < elements.length; i += 1) - { - value_buffer[i] = elements[i].value; - } - Slice values = { value_buffer, elements.length }; - auto element_type = resolved_value_type->enum_array.element_type; - llvm_value = emit_constant_array(module, values, element_type); - } break; - default: unreachable(); - } - } break; - } - - } break; - case ValueId::zero: - { - llvm_value = LLVMConstNull(get_llvm_type(resolved_value_type, type_kind)); - } break; - case ValueId::select: - { - auto condition = value->select.condition; - auto true_value = value->select.true_value; - auto false_value = value->select.false_value; - - emit_value(module, condition, TypeKind::abi, must_be_constant); - LLVMValueRef llvm_condition = condition->llvm; - auto condition_type = condition->type; - - switch (condition_type->id) - { - case TypeId::integer: - { - if (condition_type->integer.bit_count != 1) - { - trap(); - } - } break; - default: trap(); - } - - emit_value(module, true_value, type_kind, must_be_constant); - emit_value(module, false_value, type_kind, must_be_constant); - - llvm_value = LLVMBuildSelect(module->llvm.builder, llvm_condition, true_value->llvm, false_value->llvm, ""); - } break; - case ValueId::unreachable: - { - if (module->has_debug_info && !build_mode_is_optimized(module->build_mode)) - { - emit_intrinsic_call(module, IntrinsicIndex::trap, {}, {}); - } - llvm_value = LLVMBuildUnreachable(module->llvm.builder); - LLVMClearInsertionPosition(module->llvm.builder); - } break; - case ValueId::string_to_enum: - { - auto enum_type = value->string_to_enum.type; - auto string_value = value->string_to_enum.string; - emit_value(module, string_value, TypeKind::memory, must_be_constant); - auto llvm_string_value = string_value->llvm; - - auto s2e = enum_type->enumerator.string_to_enum_function; - auto first_field = LLVMBuildExtractValue(module->llvm.builder, llvm_string_value, 0, ""); - auto second_field = LLVMBuildExtractValue(module->llvm.builder, llvm_string_value, 1, ""); - LLVMValueRef fields[] = { - first_field, - second_field, - }; - auto call = LLVMBuildCall2(module->llvm.builder, LLVMGlobalGetValueType(s2e), s2e, fields, array_length(fields), ""); - LLVMSetInstructionCallConv(call, LLVMFastCallConv); - llvm_value = call; - } break; - case ValueId::string_literal: - { - auto string_literal = emit_string_literal(module, value); - switch (resolved_value_type->id) - { - case TypeId::structure: - { - llvm_value = emit_slice_result(module, string_literal, resolved_value_type->llvm.abi); - } break; - case TypeId::pointer: - { - llvm_value = string_literal.values[0]; - } break; - default: - report_error(); - } - } break; - case ValueId::macro_instantiation: - { - emit_macro_instantiation(module, value); - - auto macro_instantiation = &value->macro_instantiation; - auto return_type = macro_instantiation->return_type; - auto return_alloca = macro_instantiation->return_alloca; - - // TODO: more professional - switch (return_type->id) - { - case TypeId::void_type: - case TypeId::noreturn: - { - return; - } - default: - { - llvm_value = create_load(module, { - .type = return_type, - .pointer = return_alloca, - .kind = type_kind, - }); - } break; - } - } break; - case ValueId::undefined: - { - llvm_value = LLVMGetPoison(get_llvm_type(resolved_value_type, type_kind)); - } break; - case ValueId::build_mode: - { - llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type->enumerator.backing_type, type_kind), (u64)module->build_mode, false); - } break; - case ValueId::has_debug_info: - { - llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type, type_kind), module->has_debug_info, false); - } break; - case ValueId::field_parent_pointer: - { - auto field_pointer = value->field_parent_pointer.pointer; - auto field_name = value->field_parent_pointer.name; - - emit_value(module, field_pointer, TypeKind::memory, false); - auto llvm_field_pointer = field_pointer->llvm; - assert(llvm_field_pointer); - - assert(resolved_value_type->id == TypeId::pointer); - auto aggregate_type = resolved_value_type->pointer.element_type; - - switch (aggregate_type->id) - { - case TypeId::structure: - { - auto fields = aggregate_type->structure.fields; - Field* result_field = 0; - for (auto& field: fields) - { - if (field_name.equal(field.name)) - { - result_field = &field; - break; - } - } - - assert(result_field); - auto offset = result_field->offset; - auto u64_type = uint64(module); - resolve_type_in_place(module, u64_type); - auto llvm_u64 = u64_type->llvm.abi; - auto address_int = LLVMBuildPtrToInt(module->llvm.builder, llvm_field_pointer, llvm_u64, ""); - - address_int = LLVMBuildSub(module->llvm.builder, address_int, LLVMConstInt(llvm_u64, offset, false), ""); - - auto address_pointer = LLVMBuildIntToPtr(module->llvm.builder, address_int, resolved_value_type->llvm.abi, ""); - llvm_value = address_pointer; - } break; - default: - report_error(); - } - } break; - default: unreachable(); - } - - assert(llvm_value); - value->llvm = llvm_value; -} - -fn void analyze_value(Module* module, Value* value, Type* expected_type, TypeKind type_kind, bool must_be_constant) -{ - analyze_type(module, value, expected_type, { .must_be_constant = must_be_constant }); - emit_value(module, value, type_kind, must_be_constant); -} - -fn void analyze_statement(Module* module, Scope* scope, Statement* statement) -{ - Global* parent_function_global; - if (module->current_function) - { - parent_function_global = module->current_function; - } - else if (module->current_macro_instantiation) - { - parent_function_global = module->current_macro_instantiation->instantiation_function; - } - else - { - report_error(); - } - - auto* llvm_function = parent_function_global->variable.storage->llvm; - assert(llvm_function); - - LLVMMetadataRef statement_location = 0; - - if (module->has_debug_info) - { - statement_location = LLVMDIBuilderCreateDebugLocation(module->llvm.context, statement->line, statement->column, scope->llvm, module->llvm.inlined_at); - LLVMSetCurrentDebugLocation2(module->llvm.builder, statement_location); - } - - switch (statement->id) - { - case StatementId::return_st: - { - auto return_value = statement->return_st; - - if (module->current_function) - { - assert(!module->current_macro_instantiation); - auto& function_type = parent_function_global->variable.storage->type->pointer.element_type->function; - auto& return_abi = function_type.abi.return_abi; - - switch (return_abi.semantic_type->id) - { - case TypeId::void_type: - { - if (return_value) - { - report_error(); - } - } break; - case TypeId::noreturn: - { - report_error(); - } break; - default: - { - if (module->has_debug_info) - { - LLVMSetCurrentDebugLocation2(module->llvm.builder, statement_location); - } - - auto return_alloca = module->current_function->variable.storage->function.llvm.return_alloca; - if (!return_alloca) - { - report_error(); - } - - if (!return_value) - { - report_error(); - } - - analyze_type(module, return_value, return_abi.semantic_type, {}); - auto pointer_type = get_pointer_type(module, return_abi.semantic_type); - emit_assignment(module, return_alloca, pointer_type, return_value); - } break; - } - - auto return_block = parent_function_global->variable.storage->function.llvm.return_block; - LLVMBuildBr(module->llvm.builder, return_block); - LLVMClearInsertionPosition(module->llvm.builder); - } - else if (module->current_macro_instantiation) - { - auto macro_instantiation = module->current_macro_instantiation; - auto return_type = macro_instantiation->return_type; - assert(return_type); - analyze_type(module, return_value, return_type, {}); - emit_assignment(module, macro_instantiation->return_alloca, get_pointer_type(module, return_type), return_value); - LLVMBuildBr(module->llvm.builder, macro_instantiation->return_block); - LLVMClearInsertionPosition(module->llvm.builder); - } - else - { - report_error(); - } - } break; - case StatementId::local: - { - auto local = statement->local; - auto expected_type = local->variable.type; - assert(!local->variable.storage); - analyze_type(module, local->variable.initial_value, expected_type, {}); - local->variable.type = expected_type ? expected_type : local->variable.initial_value->type; - assert(local->variable.type); - if (expected_type) - { - assert(expected_type == local->variable.type); - } - emit_local_variable(module, local); - emit_assignment(module, local->variable.storage->llvm, local->variable.storage->type, local->variable.initial_value); - } break; - case StatementId::if_st: - { - auto* taken_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "if.taken"); - auto* not_taken_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "if.not_taken"); - auto* exit_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "if.exit"); - - auto condition = statement->if_st.condition; - analyze_value(module, condition, 0, TypeKind::abi, false); - auto llvm_condition = emit_condition(module, condition); - - LLVMBuildCondBr(module->llvm.builder, llvm_condition, taken_block, not_taken_block); - LLVMPositionBuilderAtEnd(module->llvm.builder, taken_block); - - analyze_statement(module, scope, statement->if_st.if_statement); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, exit_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, not_taken_block); - auto else_statement = statement->if_st.else_statement; - if (else_statement) - { - analyze_statement(module, scope, else_statement); - } - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, exit_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, exit_block); - } break; - case StatementId::block: - { - analyze_block(module, statement->block); - } break; - case StatementId::expression: - { - analyze_value(module, statement->expression, 0, TypeKind::memory, false); - } break; - case StatementId::while_st: - { - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "while.entry"); - LLVMBuildBr(module->llvm.builder, entry_block); - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - auto body_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "while.body"); - auto continue_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "while.continue"); - auto exit_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "while.exit"); - - auto previous_continue_block = module->llvm.continue_block; - auto previous_exit_block = module->llvm.exit_block; - module->llvm.continue_block = continue_block; - module->llvm.exit_block = exit_block; - - auto condition = statement->while_st.condition; - auto block = statement->while_st.block; - - if (condition->is_constant()) - { - switch (condition->id) - { - case ValueId::constant_integer: - { - if (condition->constant_integer.value == 0) - { - report_error(); - } - } break; - default: unreachable(); - } - - LLVMBuildBr(module->llvm.builder, body_block); - } - else - { - analyze_value(module, condition, 0, TypeKind::abi, false); - auto llvm_condition = emit_condition(module, condition); - - LLVMBuildCondBr(module->llvm.builder, llvm_condition, body_block, exit_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, body_block); - - analyze_block(module, block); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, continue_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, continue_block); - - LLVMBuildBr(module->llvm.builder, entry_block); - - if (!LLVMGetFirstUse((LLVMValueRef)body_block)) - { - trap(); - } - - if (!LLVMGetFirstUse((LLVMValueRef)exit_block)) - { - trap(); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, exit_block); - - module->llvm.continue_block = previous_continue_block; - module->llvm.exit_block = previous_exit_block; - } break; - case StatementId::assignment: - { - auto left = statement->assignment.left; - auto right = statement->assignment.right; - auto id = statement->assignment.id; - analyze_value(module, left, 0, TypeKind::memory, false); - - auto left_type = left->type; - if (left_type->id != TypeId::pointer) - { - report_error(); - } - auto element_type = left_type->pointer.element_type; - auto left_llvm = left->llvm; - - switch (id) - { - case StatementAssignmentId::assign: - { - analyze_type(module, right, element_type, {}); - emit_assignment(module, left_llvm, left_type, right); - } break; - case StatementAssignmentId::assign_add: - case StatementAssignmentId::assign_sub: - case StatementAssignmentId::assign_mul: - case StatementAssignmentId::assign_div: - case StatementAssignmentId::assign_rem: - case StatementAssignmentId::assign_shift_left: - case StatementAssignmentId::assign_shift_right: - case StatementAssignmentId::assign_and: - case StatementAssignmentId::assign_or: - case StatementAssignmentId::assign_xor: - { - auto evaluation_kind = get_evaluation_kind(element_type); - assert(evaluation_kind == EvaluationKind::scalar); - auto load = create_load(module, { - .type = element_type, - .pointer = left_llvm, - .kind = TypeKind::abi, - }); - analyze_value(module, right, element_type, TypeKind::abi, false); - auto a = load; - auto b = right->llvm; - - BinaryId binary_id; - switch (id) - { - case StatementAssignmentId::assign: unreachable(); - case StatementAssignmentId::assign_add: binary_id = BinaryId::add; break; - case StatementAssignmentId::assign_sub: binary_id = BinaryId::sub; break; - case StatementAssignmentId::assign_mul: binary_id = BinaryId::mul; break; - case StatementAssignmentId::assign_div: binary_id = BinaryId::div; break; - case StatementAssignmentId::assign_rem: binary_id = BinaryId::rem; break; - case StatementAssignmentId::assign_shift_left: binary_id = BinaryId::shift_left; break; - case StatementAssignmentId::assign_shift_right: binary_id = BinaryId::shift_right; break; - case StatementAssignmentId::assign_and: binary_id = BinaryId::bitwise_and; break; - case StatementAssignmentId::assign_or: binary_id = BinaryId::bitwise_or; break; - case StatementAssignmentId::assign_xor: binary_id = BinaryId::bitwise_xor; break; - } - - auto op = emit_binary(module, a, element_type, b, right->type, binary_id, element_type); - - create_store(module, { - .source = op, - .destination = left_llvm, - .type = element_type, - }); - } break; - } - } break; - case StatementId::switch_st: - { - auto* exit_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "switch.exit"); - - auto discriminant = statement->switch_st.discriminant; - auto clauses = statement->switch_st.clauses; - analyze_value(module, discriminant, 0, TypeKind::abi, false); - - auto discriminant_type = discriminant->type; - - u32 invalid_clause_index = ~(u32)0; - u32 else_clause_index = invalid_clause_index; - u32 discriminant_case_count = 0; - - // TODO: more analysis - switch (discriminant_type->id) - { - case TypeId::enumerator: - { - } break; - case TypeId::integer: - { - } break; - default: report_error(); - } - - for (u64 i = 0; i < clauses.length; i += 1) - { - auto& clause = clauses[i]; - clause.basic_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, clause.values.length == 0 ? "switch.else_case_block" : "switch.case_block"); - discriminant_case_count += clause.values.length; - - if (clause.values.length == 0) - { - if (else_clause_index != invalid_clause_index) - { - report_error(); - } - - else_clause_index = i; - } - else - { - for (auto& value: clause.values) - { - switch (value.id) - { - case ClauseDiscriminantId::single: - { - assert(value.single); - analyze_value(module, value.single, discriminant_type, TypeKind::abi, true); - } break; - case ClauseDiscriminantId::range: - { - auto start = value.range[0]; - auto end = value.range[1]; - for (auto v : value.range) - { - analyze_value(module, v, discriminant_type, TypeKind::abi, true); - } - - if (start->id != end->id) - { - report_error(); - } - - switch (start->id) - { - case ValueId::constant_integer: - { - if (start->constant_integer.value >= end->constant_integer.value) - { - report_error(); - } - } break; - default: report_error(); - } - } break; - } - } - } - } - - LLVMBasicBlockRef else_block; - if (else_clause_index != invalid_clause_index) - { - else_block = clauses[else_clause_index].basic_block; - } - else - { - else_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "switch.else_case_block"); - } - - auto switch_instruction = LLVMBuildSwitch(module->llvm.builder, discriminant->llvm, else_block, discriminant_case_count); - bool all_blocks_terminated = true; - - for (auto& clause : clauses) - { - for (const auto& value : clause.values) - { - switch (value.id) - { - case ClauseDiscriminantId::single: - { - LLVMAddCase(switch_instruction, value.single->llvm, clause.basic_block); - } break; - case ClauseDiscriminantId::range: - { - auto start = value.range[0]; - auto end = value.range[1]; - - LLVMAddCase(switch_instruction, start->llvm, clause.basic_block); - - switch (start->id) - { - case ValueId::constant_integer: - { - auto start_value = start->constant_integer.value; - auto end_value = end->constant_integer.value; - - for (u64 i = start_value + 1; i < end_value; i += 1) - { - LLVMAddCase(switch_instruction, LLVMConstInt(start->type->llvm.abi, i, false), clause.basic_block); - } - - } break; - default: unreachable(); - } - - LLVMAddCase(switch_instruction, end->llvm, clause.basic_block); - } break; - } - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, clause.basic_block); - - analyze_block(module, clause.block); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - all_blocks_terminated = false; - LLVMBuildBr(module->llvm.builder, exit_block); - LLVMClearInsertionPosition(module->llvm.builder); - } - } - - if (else_clause_index == invalid_clause_index) - { - LLVMPositionBuilderAtEnd(module->llvm.builder, else_block); - if (module->has_debug_info && !build_mode_is_optimized(module->build_mode)) - { - emit_intrinsic_call(module, IntrinsicIndex::trap, {}, {}); - } - LLVMBuildUnreachable(module->llvm.builder); - LLVMClearInsertionPosition(module->llvm.builder); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, exit_block); - - if (all_blocks_terminated) - { - LLVMBuildUnreachable(module->llvm.builder); - LLVMClearInsertionPosition(module->llvm.builder); - } - } break; - case StatementId::for_each: - { - if (module->has_debug_info) - { - auto lexical_block = LLVMDIBuilderCreateLexicalBlock(module->llvm.di_builder, statement->for_each.scope.parent->llvm, module->llvm.file, statement->for_each.scope.line, statement->for_each.scope.column); - statement->for_each.scope.llvm = lexical_block; - } - - auto index_type = uint64(module); - resolve_type_in_place(module, index_type); - auto index_zero = LLVMConstNull(index_type->llvm.abi); - - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "for_each.entry"); - auto* body_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "for_each.body"); - auto* continue_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "for_each.continue"); - auto* exit_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "for_each.exit"); - - auto previous_continue_block = module->llvm.continue_block; - auto previous_exit_block = module->llvm.exit_block; - - module->llvm.continue_block = continue_block; - module->llvm.exit_block = exit_block; - - auto left_values = statement->for_each.left_values; - auto right_values = statement->for_each.right_values; - - switch (statement->for_each.kind) - { - case ForEachKind::slice: - { - assert(left_values.length == right_values.length); - - Local* local = statement->for_each.first_local; - - for (u64 i = 0; i < right_values.length; i += 1, local = local->next) - { - auto kind = left_values[i]; - auto right = right_values[i]; - - analyze_type(module, right, 0, {}); - - if (right->kind == ValueKind::right) - { - if (!is_slice(right->type)) - { - reanalyze_type_as_left_value(module, right); - } - } - - Type* aggregate_type = 0; - - if (right->kind == ValueKind::left && right->type->id != TypeId::pointer) - { - if (!type_is_slice(right->type)) - { - report_error(); - } - - right->kind = ValueKind::right; - } - - switch (right->kind) - { - case ValueKind::right: - { - aggregate_type = right->type; - assert(is_slice(aggregate_type)); - } break; - case ValueKind::left: - { - auto pointer_type = right->type; - if (pointer_type->id != TypeId::pointer) - { - report_error(); - } - - aggregate_type = pointer_type->pointer.element_type; - } break; - } - - Type* child_type = 0; - - switch (aggregate_type->id) - { - case TypeId::array: - { - child_type = aggregate_type->array.element_type; - } break; - case TypeId::structure: - { - if (!aggregate_type->structure.is_slice) - { - report_error(); - } - child_type = aggregate_type->structure.fields[0].type->pointer.element_type; - } break; - default: trap(); - } - - assert(child_type); - assert(!local->variable.type); - - Type* local_type = 0; - - switch (kind) - { - case ValueKind::left: local_type = get_pointer_type(module, child_type); break; - case ValueKind::right: local_type = child_type; break; - } - - assert(local_type); - - local->variable.type = local_type; - - emit_local_variable(module, local); - emit_value(module, right, TypeKind::memory, false); - } - - assert(!local); - - LLVMValueRef length_value = 0; - - for (auto value : right_values) - { - Type* aggregate_type = 0; - auto value_type = value->type; - - switch (value->kind) - { - case ValueKind::right: - { - aggregate_type = value_type; - } break; - case ValueKind::left: - { - if (value_type->id != TypeId::pointer) - { - report_error(); - } - - aggregate_type = value_type->pointer.element_type; - } break; - } - - assert(aggregate_type); - - auto llvm_value = value->llvm; - - switch (aggregate_type->id) - { - case TypeId::array: - { - assert(value->kind == ValueKind::left); - length_value = LLVMConstInt(index_type->llvm.abi, aggregate_type->array.element_count, false); - } break; - case TypeId::structure: - { - assert(aggregate_type->structure.is_slice); - - switch (value->kind) - { - case ValueKind::right: - { - length_value = LLVMBuildExtractValue(module->llvm.builder, llvm_value, 1, "slice.length"); - } break; - case ValueKind::left: - { - auto gep = LLVMBuildStructGEP2(module->llvm.builder, aggregate_type->llvm.abi, llvm_value, 1, "slice.length.pointer"); - auto load = create_load(module, { - .type = index_type, - .pointer = gep, - }); - length_value = load; - } break; - } - - } break; - default: unreachable(); - } - - break; - } - - assert(length_value); - - auto index_alloca = create_alloca(module, { .type = index_type, .name = string_literal("for_each.index") }); - create_store(module, { .source = index_zero, .destination = index_alloca, .type = index_type }); - - LLVMBuildBr(module->llvm.builder, entry_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - auto header_index_load = create_load(module, { .type = index_type, .pointer = index_alloca }); - auto index_compare = LLVMBuildICmp(module->llvm.builder, LLVMIntULT, header_index_load, length_value, ""); - LLVMBuildCondBr(module->llvm.builder, index_compare, body_block, exit_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, body_block); - auto body_index_load = create_load(module, { .type = index_type, .pointer = index_alloca }); - - local = statement->for_each.first_local; - - for (u64 i = 0; i < right_values.length; i += 1, local = local->next) - { - auto variable_kind = left_values[i]; - auto right = right_values[i]; - - auto right_type = right->type; - auto right_kind = right->kind; - auto right_llvm = right->llvm; - - Type* aggregate_type = 0; - switch (right_kind) - { - case ValueKind::right: - { - aggregate_type = right_type; - } break; - case ValueKind::left: - { - assert(right_type->id == TypeId::pointer); - aggregate_type = right_type->pointer.element_type; - } break; - } - - assert(aggregate_type); - - LLVMValueRef element_pointer_value = 0; - - switch (aggregate_type->id) - { - case TypeId::array: - { - assert(right_kind == ValueKind::left); - LLVMValueRef indices[] = { - index_zero, - body_index_load, - }; - element_pointer_value = create_gep(module, { - .type = aggregate_type->llvm.memory, - .pointer = right_llvm, - .indices = array_to_slice(indices), - }); - } break; - case TypeId::structure: - { - assert(aggregate_type->structure.is_slice); - - if (right_kind == ValueKind::left) - { - right_llvm = create_load(module, { - .type = aggregate_type, - .pointer = right_llvm, - }); - } - - auto extract_pointer = LLVMBuildExtractValue(module->llvm.builder, right_llvm, 0, ""); - - LLVMValueRef indices[] = { - body_index_load, - }; - auto gep_type = aggregate_type->structure.fields[0].type->pointer.element_type; - resolve_type_in_place(module, gep_type); - auto gep = create_gep(module, { - .type = gep_type->llvm.memory, - .pointer = extract_pointer, - .indices = array_to_slice(indices), - }); - element_pointer_value = gep; - } break; - default: unreachable(); - } - - assert(element_pointer_value); - - auto local_type = local->variable.type; - - switch (variable_kind) - { - case ValueKind::right: - { - auto evaluation_kind = get_evaluation_kind(local_type); - if (evaluation_kind == EvaluationKind::scalar || (aggregate_type->id == TypeId::structure && aggregate_type->structure.is_slice) || (local_type->id == TypeId::structure && local_type->structure.is_slice)) - { - auto load = create_load(module, { - .type = local_type, - .pointer = element_pointer_value, - }); - - create_store(module, { - .source = load, - .destination = local->variable.storage->llvm, - .type = local_type, - }); - } - else - { - trap(); - } - } break; - case ValueKind::left: - { - create_store(module, { - .source = element_pointer_value, - .destination = local->variable.storage->llvm, - .type = local_type, - }); - } break; - } - } - - assert(!local); - - analyze_statement(module, &statement->for_each.scope, statement->for_each.predicate); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, continue_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, continue_block); - - auto continue_index_load = create_load(module, { .type = index_type, .pointer = index_alloca }); - auto inc = LLVMBuildAdd(module->llvm.builder, continue_index_load, LLVMConstInt(index_type->llvm.abi, 1, false), ""); - create_store(module, { .source = inc, .destination = index_alloca, .type = index_type }); - - LLVMBuildBr(module->llvm.builder, entry_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, exit_block); - } break; - case ForEachKind::range: - { - Local* local = statement->for_each.first_local; - // Assert there is only one - assert(local); - assert(!local->next); - assert(!local->variable.type); - - assert(left_values.length == 1); - - if (right_values.length == 2) - { - auto start = right_values[0]; - auto end = right_values[1]; - - Type* local_type = 0; - - if (start->is_constant()) - { - switch (start->id) - { - case ValueId::constant_integer: - { - switch (end->id) - { - case ValueId::constant_integer: - { - auto start_signed = start->constant_integer.is_signed; - auto end_signed = end->constant_integer.is_signed; - auto is_signed = !(!start_signed && !end_signed); - local_type = integer_type(module, { .bit_count = 64, .is_signed = is_signed }); - } break; - default: - { - analyze_type(module, end, 0, {}); - auto end_type = end->type; - assert(end_type); - start->type = end_type; - local_type = end_type; - } break; - } - } break; - default: trap(); - } - } - else - { - analyze_binary_type(module, start, end, false, 0, false, false); - assert(start->type == end->type); - local_type = start->type; - } - - assert(local_type); - - for (auto right: right_values) - { - if (!right->type) - { - analyze_type(module, right, local_type, {}); - } - } - - local->variable.type = local_type; - emit_local_variable(module, local); - emit_value(module, start, TypeKind::memory, false); - - auto index_alloca = local->variable.storage->llvm; - - create_store(module, { - .source = start->llvm, - .destination = index_alloca, - .type = local_type, - }); - - LLVMBuildBr(module->llvm.builder, entry_block); - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - - auto header_index_load = create_load(module, { - .type = local_type, - .pointer = index_alloca, - }); - emit_value(module, end, TypeKind::abi, false); - auto length_value = end->llvm; - auto index_compare = LLVMBuildICmp(module->llvm.builder, LLVMIntULT, header_index_load, length_value, ""); - LLVMBuildCondBr(module->llvm.builder, index_compare, body_block, exit_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, body_block); - analyze_statement(module, &statement->for_each.scope, statement->for_each.predicate); - - if (LLVMGetInsertBlock(module->llvm.builder)) - { - LLVMBuildBr(module->llvm.builder, continue_block); - } - - LLVMPositionBuilderAtEnd(module->llvm.builder, continue_block); - - auto continue_index_load = create_load(module, { - .type = local_type, - .pointer = index_alloca, - }); - - auto inc = LLVMBuildAdd(module->llvm.builder, continue_index_load, LLVMConstInt(local_type->llvm.abi, 1, false), ""); - create_store(module, { - .source = inc, - .destination = index_alloca, - .type = local_type, - }); - - LLVMBuildBr(module->llvm.builder, entry_block); - - LLVMPositionBuilderAtEnd(module->llvm.builder, exit_block); - } - else - { - // TODO: case for reverse range - trap(); - } - } break; - } - - // END OF SCOPE - module->llvm.continue_block = previous_continue_block; - module->llvm.exit_block = previous_exit_block; - } break; - case StatementId::break_st: - { - auto exit_block = module->llvm.exit_block; - if (!exit_block) - { - report_error(); - } - - LLVMBuildBr(module->llvm.builder, exit_block); - LLVMClearInsertionPosition(module->llvm.builder); - } break; - case StatementId::continue_st: - { - auto continue_block = module->llvm.continue_block; - if (!continue_block) - { - report_error(); - } - - LLVMBuildBr(module->llvm.builder, continue_block); - LLVMClearInsertionPosition(module->llvm.builder); - } break; - default: unreachable(); - } -} - -fn void emit_debug_argument(Module* module, Argument* argument, LLVMBasicBlockRef basic_block) -{ - assert(module->has_debug_info); - resolve_type_in_place(module, argument->variable.type); - bool always_preserve = true; - LLVMDIFlags flags = {}; - LLVMMetadataRef scope = argument->variable.scope->llvm; - auto parameter_variable = LLVMDIBuilderCreateParameterVariable(module->llvm.di_builder, scope, (char*)argument->variable.name.pointer, argument->variable.name.length, argument->index, module->llvm.file, argument->variable.line, argument->variable.type->llvm.debug, always_preserve, flags); - auto inlined_at = module->llvm.inlined_at; - auto debug_location = LLVMDIBuilderCreateDebugLocation(module->llvm.context, argument->variable.line, argument->variable.column, scope, inlined_at); - LLVMDIBuilderInsertDeclareRecordAtEnd(module->llvm.di_builder, argument->variable.storage->llvm, parameter_variable, LLVMDIBuilderCreateExpression(module->llvm.di_builder, 0, 0), debug_location, basic_block); -} - -struct ObjectGenerate -{ - String path; - BBLLVMOptimizationLevel optimization_level; - bool run_optimization_passes; - bool has_debug_info; -}; - -fn bool generate_object(LLVMModuleRef module, LLVMTargetMachineRef target_machine, ObjectGenerate options) -{ - if (options.run_optimization_passes) - { - bool prefer_speed = options.optimization_level == BBLLVMOptimizationLevel::O2 || options.optimization_level == BBLLVMOptimizationLevel::O3; - auto pass_builder_options = LLVMCreatePassBuilderOptions(); - LLVMPassBuilderOptionsSetVerifyEach(pass_builder_options, 1); - LLVMPassBuilderOptionsSetDebugLogging(pass_builder_options, 0); - LLVMPassBuilderOptionsSetLoopInterleaving(pass_builder_options, prefer_speed); - LLVMPassBuilderOptionsSetLoopVectorization(pass_builder_options, prefer_speed); - LLVMPassBuilderOptionsSetSLPVectorization(pass_builder_options, prefer_speed); - LLVMPassBuilderOptionsSetLoopUnrolling(pass_builder_options, prefer_speed); - LLVMPassBuilderOptionsSetMergeFunctions(pass_builder_options, prefer_speed); - - const char* passes; - switch (options.optimization_level) - { - case BBLLVMOptimizationLevel::O0: passes = "default"; break; - case BBLLVMOptimizationLevel::O1: passes = "default"; break; - case BBLLVMOptimizationLevel::O2: passes = "default"; break; - case BBLLVMOptimizationLevel::O3: passes = "default"; break; - case BBLLVMOptimizationLevel::Os: passes = "default"; break; - case BBLLVMOptimizationLevel::Oz: passes = "default"; break; - } - - auto error = LLVMRunPasses(module, passes, target_machine, pass_builder_options); - if (error) - { - report_error(); - } - } - - auto file_name = cstr(options.path); - char* error_message = 0; - auto result = LLVMTargetMachineEmitToFile(target_machine, module, file_name, LLVMObjectFile, &error_message); - if (result) - { - assert(error_message); - trap(); - } - else - { - assert(!error_message); - } - - return !result; -} - -fn void link(Module* module) -{ - Arena* arena = module->arena; - ArgBuilder builder; - builder.add("ld.lld"); - builder.add("--error-limit=0"); - builder.add("-o"); - assert(module->executable.pointer[module->executable.length] == 0); - builder.add((char*)module->executable.pointer); - - for (String library_directory: module->library_directories) - { - String parts[] = { - string_literal("-L"), - library_directory, - }; - builder.add(arena, arena_join_string(arena, array_to_slice(parts))); - } - - String candidate_library_paths[] = { - string_literal("/usr/lib"), - string_literal("/usr/lib/x86_64-linux-gnu"), - }; - - u64 index; - String scrt1_object_path = {}; - for (index = 0; index < array_length(candidate_library_paths); index += 1) - { - auto directory_path = candidate_library_paths[index]; - String parts[] = { - directory_path, - string_literal("/Scrt1.o"), - }; - scrt1_object_path = arena_join_string(arena, array_to_slice(parts)); - auto file = os_open(scrt1_object_path, { .read = 1}, {}); - if (file >= 0) - { - os_close(file); - break; - } - } - - if (index == array_length(candidate_library_paths)) - { - report_error(); - } - - { - String parts[] = { - string_literal("-L"), - candidate_library_paths[index], - }; - - builder.add((char*)arena_join_string(arena, array_to_slice(parts)).pointer); - } - - builder.add("-L/usr/lib/gcc/x86_64-pc-linux-gnu/15.1.1"); - builder.add("-L/usr/lib/gcc/x86_64-linux-gnu/13"); - - for (String object: module->objects) - { - builder.add(arena, object); - } - - for (String library_path: module->library_paths) - { - builder.add(arena, library_path); - } - - for (String library_name: module->library_names) - { - String parts[] = { - string_literal("-l"), - library_name, - }; - builder.add(arena, arena_join_string(arena, array_to_slice(parts))); - } - - if (module->link_libcpp) - { - builder.add("-lstdc++"); - } - - auto link_libc = true; - auto dynamic_linker = true; - - if (dynamic_linker) - { - builder.add("-dynamic-linker"); - auto dynamic_linker_path = "/usr/lib64/ld-linux-x86-64.so.2"; - builder.add(dynamic_linker_path); - } - - if (link_libc) - { - assert(scrt1_object_path.pointer); - builder.add((char*)scrt1_object_path.pointer); - builder.add("-lc"); - } - - auto args = builder.flush(); - auto result = lld_elf_link(args.pointer, args.length, true, false); - if (!result.success) - { - print(string_literal("Command failed:\n")); - for (auto arg : args) - { - auto a = c_string_to_slice(arg); - print(a); - print(string_literal(" ")); - } - print(string_literal("\n")); - assert(result.stdout_string.length == 0); - assert(result.stderr_string.length != 0); - print(result.stderr_string); - print(string_literal("\n")); - exit(1); - } -} - -void emit(Module* module) -{ - assert(!module->current_function); - assert(!module->current_macro_instantiation); - assert(!module->current_macro_declaration); - llvm_initialize(module); - - for (auto* global = module->first_global; global; global = global->next) - { - assert(!module->current_function); - assert(!module->current_macro_instantiation); - assert(!module->current_macro_declaration); - - if (global->emitted) - { - continue; - } - - switch (global->variable.storage->id) - { - case ValueId::function: - case ValueId::forward_declared_function: - { - if (global->variable.storage->id == ValueId::forward_declared_function && global->linkage != Linkage::external) - { - report_error(); - } - - auto function_type = &global->variable.storage->type->pointer.element_type->function; - auto semantic_argument_count = function_type->base.semantic_argument_types.length; - function_type->abi.argument_abis = arena_allocate(module->arena, semantic_argument_count); - auto resolved_calling_convention = resolve_calling_convention(function_type->base.calling_convention); - auto is_reg_call = resolved_calling_convention == ResolvedCallingConvention::system_v && false; // TODO: regcall calling convention - - LLVMTypeRef llvm_abi_argument_type_buffer[64]; - - switch (resolved_calling_convention) - { - case ResolvedCallingConvention::system_v: - { - function_type->abi.available_registers = { - .system_v = { - .gpr = (u32)(is_reg_call ? 11 : 6), - .sse = (u32)(is_reg_call ? 16 : 8), - }, - }; - auto semantic_return_type = function_type->base.semantic_return_type; - function_type->abi.return_abi = abi_system_v_classify_return_type(module, resolve_alias(module, semantic_return_type)); - auto return_abi_kind = function_type->abi.return_abi.flags.kind; - - Type* abi_argument_type_buffer[64]; - u16 abi_argument_type_count = 0; - - Type* abi_return_type; - switch (return_abi_kind) - { - case AbiKind::direct: - case AbiKind::extend: - { - abi_return_type = function_type->abi.return_abi.coerce_to_type; - } break; - case AbiKind::ignore: - case AbiKind::indirect: - { - abi_return_type = void_type(module); - } break; - default: unreachable(); // TODO - } - assert(abi_return_type); - function_type->abi.abi_return_type = abi_return_type; - resolve_type_in_place(module, abi_return_type); - - if (function_type->abi.return_abi.flags.kind == AbiKind::indirect) - { - assert(!function_type->abi.return_abi.flags.sret_after_this); - function_type->abi.available_registers.system_v.gpr -= 1; - auto indirect_type = get_pointer_type(module, function_type->abi.return_abi.semantic_type); - resolve_type_in_place(module, indirect_type); - - auto abi_index = abi_argument_type_count; - abi_argument_type_buffer[abi_index] = indirect_type; - llvm_abi_argument_type_buffer[abi_index] = indirect_type->llvm.abi; - abi_argument_type_count += 1; - } - - - for (u64 i = 0; i < semantic_argument_count; i += 1) - { - auto& abi = function_type->abi.argument_abis[i]; - auto semantic_argument_type = resolve_alias(module, function_type->base.semantic_argument_types[i]); - auto is_named_argument = i < semantic_argument_count; - assert(is_named_argument); - - abi = abi_system_v_classify_argument(module, &function_type->abi.available_registers.system_v, array_to_slice(llvm_abi_argument_type_buffer), array_to_slice(abi_argument_type_buffer), { - .type = semantic_argument_type, - .abi_start = abi_argument_type_count, - .is_named_argument = is_named_argument, - }); - - abi_argument_type_count += abi.abi_count; - } - - auto abi_argument_types = new_type_array(module, abi_argument_type_count); - memcpy(abi_argument_types.pointer, abi_argument_type_buffer, sizeof(abi_argument_type_buffer[0]) * abi_argument_type_count); - function_type->abi.abi_argument_types = abi_argument_types; - } break; - case ResolvedCallingConvention::win64: - { - report_error(); - } break; - case ResolvedCallingConvention::count: unreachable(); - } - - auto llvm_function_type = LLVMFunctionType(function_type->abi.abi_return_type->llvm.abi, llvm_abi_argument_type_buffer, (u32)function_type->abi.abi_argument_types.length, function_type->base.is_variable_arguments); - - LLVMMetadataRef subroutine_type = 0; - if (module->has_debug_info) - { - LLVMMetadataRef debug_argument_type_buffer[64]; - Slice debug_argument_types = { .pointer = debug_argument_type_buffer, .length = function_type->abi.argument_abis.length + 1 + function_type->base.is_variable_arguments }; - debug_argument_types[0] = function_type->abi.return_abi.semantic_type->llvm.debug; - assert(debug_argument_types[0]); - - auto debug_argument_type_slice = debug_argument_types(1)(0, function_type->abi.argument_abis.length); - - for (u64 i = 0; i < function_type->abi.argument_abis.length; i += 1) - { - auto& argument_abi = function_type->abi.argument_abis[i]; - auto* debug_argument_type = &debug_argument_type_slice[i]; - *debug_argument_type = argument_abi.semantic_type->llvm.debug; - assert(*debug_argument_type); - } - - if (function_type->base.is_variable_arguments) - { - auto void_ty = void_type(module); - assert(void_ty->llvm.debug); - debug_argument_types[function_type->abi.argument_abis.length + 1] = void_ty->llvm.debug; - } - - LLVMDIFlags flags = {}; - subroutine_type = LLVMDIBuilderCreateSubroutineType(module->llvm.di_builder, module->llvm.file, debug_argument_types.pointer, (u32)debug_argument_types.length, flags); - } - - global->variable.storage->type->pointer.element_type->llvm.abi = llvm_function_type; - global->variable.storage->type->pointer.element_type->llvm.debug = subroutine_type; - - LLVMLinkage llvm_linkage_type; - switch (global->linkage) - { - case Linkage::internal: llvm_linkage_type = LLVMInternalLinkage; break; - case Linkage::external: llvm_linkage_type = LLVMExternalLinkage; break; - } - auto llvm_function = llvm_module_create_function(module->arena, module->llvm.module, llvm_function_type, llvm_linkage_type, global->variable.name); - global->variable.storage->llvm = llvm_function; - - LLVMCallConv cc; - switch (function_type->base.calling_convention) - { - case CallingConvention::c: cc = LLVMCCallConv; break; - case CallingConvention::count: unreachable(); - } - - LLVMSetFunctionCallConv(llvm_function, cc); - - emit_attributes(module, llvm_function, &LLVMAddAttributeAtIndex, { - .return_abi = function_type->abi.return_abi, - .argument_abis = function_type->abi.argument_abis, - .abi_argument_types = function_type->abi.abi_argument_types, - .abi_return_type = function_type->abi.abi_return_type, - .attributes = global->variable.storage->function.attributes, - .call_site = false, - }); - - LLVMMetadataRef subprogram = 0; - auto is_definition = global->variable.storage->id == ValueId::function; - - if (module->has_debug_info) - { - auto is_local_to_unit = global->linkage == Linkage::internal; - auto line = global->variable.line; - auto scope_line = line + 1; - LLVMDIFlags flags = {}; - auto is_optimized = build_mode_is_optimized(module->build_mode); - subprogram = LLVMDIBuilderCreateFunction(module->llvm.di_builder, module->scope.llvm, (char*)global->variable.name.pointer, global->variable.name.length, (char*)global->variable.name.pointer, global->variable.name.length, module->llvm.file, line, subroutine_type, is_local_to_unit, is_definition, scope_line, flags, is_optimized); - LLVMSetSubprogram(llvm_function, subprogram); - } - - switch (global->variable.storage->id) - { - case ValueId::function: - { - global->variable.storage->function.scope.llvm = subprogram; - } break; - case ValueId::forward_declared_function: - { - assert(global->linkage == Linkage::external); - if (module->has_debug_info) - { - LLVMDIBuilderFinalizeSubprogram(module->llvm.di_builder, subprogram); - } - } break; - default: unreachable(); - } - } break; - case ValueId::global: - { - assert(!module->current_function); - analyze_value(module, global->variable.initial_value, global->variable.type, TypeKind::memory, true); - - auto initial_value_type = global->variable.initial_value->type; - - if (!global->variable.type) - { - global->variable.type = initial_value_type; - } - - auto global_type = global->variable.type; - - if (global_type != initial_value_type) - { - report_error(); - } - - resolve_type_in_place(module, global_type); - - bool is_constant = false; - LLVMLinkage linkage; - switch (global->linkage) - { - case Linkage::internal: linkage = LLVMInternalLinkage; break; - case Linkage::external: linkage = LLVMExternalLinkage; break; - } - - LLVMThreadLocalMode thread_local_mode = LLVMNotThreadLocal; - bool externally_initialized = false; - - auto alignment = get_byte_alignment(global_type); - auto global_llvm = llvm_create_global_variable(module->llvm.module, global_type->llvm.memory, is_constant, linkage, global->variable.initial_value->llvm, global->variable.name, thread_local_mode, externally_initialized, alignment, LLVMNoUnnamedAddr); - global->variable.storage->llvm = global_llvm; - global->variable.storage->type = get_pointer_type(module, global_type); - - if (module->has_debug_info) - { - auto name = global->variable.name; - auto linkage_name = name; - auto local_to_unit = global->linkage == Linkage::internal; - auto global_debug = LLVMDIBuilderCreateGlobalVariableExpression(module->llvm.di_builder, module->scope.llvm, (char*)name.pointer, name.length, (char*)linkage_name.pointer, linkage_name.length, module->llvm.file, global->variable.line, global_type->llvm.debug, local_to_unit, null_expression(module), 0, alignment * 8); - LLVMGlobalSetMetadata(global_llvm, 0, global_debug); - } - } break; - default: report_error(); - } - } - - for (auto* global = module->first_global; global; global = global->next) - { - assert(!module->current_function); - assert(!module->current_macro_instantiation); - assert(!module->current_macro_declaration); - - if (global->variable.storage->id == ValueId::function) - { - module->current_function = global; - - auto function_type = &global->variable.storage->type->pointer.element_type->function; - auto semantic_argument_types = function_type->base.semantic_argument_types; - auto llvm_function = global->variable.storage->llvm; - assert(llvm_function); - - LLVMValueRef llvm_abi_argument_buffer[64]; - Slice llvm_abi_arguments = { .pointer = llvm_abi_argument_buffer, .length = function_type->abi.abi_argument_types.length }; - LLVMGetParams(llvm_function, llvm_abi_argument_buffer); - - auto* entry_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "entry"); - auto return_block = LLVMAppendBasicBlockInContext(module->llvm.context, llvm_function, "return_block"); - global->variable.storage->function.llvm.return_block = return_block; - - LLVMPositionBuilderAtEnd(module->llvm.builder, entry_block); - LLVMSetCurrentDebugLocation2(module->llvm.builder, 0); - - auto u32_type = uint32(module); - resolve_type_in_place(module, u32_type); - global->variable.storage->function.llvm.alloca_insertion_point = LLVMBuildAlloca(module->llvm.builder, u32_type->llvm.abi, "alloca.insertion.point"); - - auto return_abi_kind = function_type->abi.return_abi.flags.kind; - switch (return_abi_kind) - { - case AbiKind::indirect: - { - auto indirect_argument_index = function_type->abi.return_abi.flags.sret_after_this; - if (function_type->abi.return_abi.flags.sret_after_this) - { - trap(); - } - - global->variable.storage->function.llvm.return_alloca = llvm_abi_arguments[indirect_argument_index]; - - if (!function_type->abi.return_abi.flags.indirect_by_value) - { - trap(); - } - } break; - case AbiKind::in_alloca: - { - trap(); - } break; - default: - { - auto alloca = create_alloca(module, { - .type = function_type->abi.return_abi.semantic_type, - .name = string_literal("return_value"), - }); - global->variable.storage->function.llvm.return_alloca = alloca; - } break; - case AbiKind::ignore: break; - } - - auto arguments = global->variable.storage->function.arguments; - auto argument_abis = function_type->abi.argument_abis; - assert(arguments.length == argument_abis.length); - for (u64 i = 0; i < semantic_argument_types.length; i += 1) - { - auto* argument = &arguments[i]; - auto& argument_abi = argument_abis[i]; - auto argument_abi_arguments = llvm_abi_arguments(argument_abi.abi_start)(0, argument_abi.abi_count); - - LLVMValueRef semantic_argument_storage = 0; - switch (argument_abi.flags.kind) - { - case AbiKind::direct: - case AbiKind::extend: - { - auto first_argument = argument_abi_arguments[0]; - auto coerce_to_type = argument_abi.get_coerce_to_type(); - if (coerce_to_type->id != TypeId::structure && type_is_abi_equal(module, coerce_to_type, argument_abi.semantic_type) && argument_abi.attributes.direct.offset == 0) - { - assert(argument_abi.abi_count == 1); - - auto is_promoted = false; - auto v = first_argument; - if (coerce_to_type->llvm.abi != LLVMTypeOf(v)) - { - trap(); - } - - if (is_promoted) - { - trap(); - } - - // TODO: this we can get rid of because we handle all of this inside `create_alloca`, load, stores, etc - if (is_arbitrary_bit_integer(argument_abi.semantic_type)) - { - auto bit_count = (u32)get_bit_size(argument_abi.semantic_type); - auto abi_bit_count = align_bit_count(bit_count); - bool is_signed = type_is_signed(argument_abi.semantic_type); - auto destination_type = integer_type(module, { .bit_count = abi_bit_count, .is_signed = is_signed }); - auto alloca = create_alloca(module, { - .type = destination_type, - .name = argument->variable.name, - }); - - LLVMValueRef result; - if (bit_count < abi_bit_count) - { - if (is_signed) - { - result = LLVMBuildSExt(module->llvm.builder, first_argument, destination_type->llvm.memory, ""); - } - else - { - result = LLVMBuildZExt(module->llvm.builder, first_argument, destination_type->llvm.memory, ""); - } - } - else - { - trap(); - } - - create_store(module, { - .source = result, - .destination = alloca, - .type = destination_type, - }); - - semantic_argument_storage = alloca; - } - else - { - auto alloca = create_alloca(module, { - .type = argument_abi.semantic_type, - .name = argument->variable.name, - }); - create_store(module, { - .source = first_argument, - .destination = alloca, - .type = argument_abi.semantic_type, - }); - - semantic_argument_storage = alloca; - } - } - else - { - auto is_fixed_vector_type = false; - if (is_fixed_vector_type) - { - trap(); - } - - if (coerce_to_type->id == TypeId::structure && coerce_to_type->structure.fields.length > 1 && argument_abi.flags.kind == AbiKind::direct && !argument_abi.flags.can_be_flattened) - { - auto contains_homogeneous_scalable_vector_types = false; - if (contains_homogeneous_scalable_vector_types) - { - trap(); - } - } - - auto alloca = create_alloca(module, { .type = argument_abi.semantic_type, .name = argument->variable.name }); - LLVMValueRef pointer; - Type* pointer_type; - if (argument_abi.attributes.direct.offset > 0) - { - trap(); - } - else - { - pointer = alloca; - pointer_type = argument_abi.semantic_type; - } - - if (coerce_to_type->id == TypeId::structure && coerce_to_type->structure.fields.length > 1 && argument_abi.flags.kind == AbiKind::direct && argument_abi.flags.can_be_flattened) - { - auto struct_size = get_byte_size(coerce_to_type); - auto pointer_element_size = get_byte_size(pointer_type); - auto is_scalable = false; - - if (is_scalable) - { - trap(); - } - else - { - auto source_size = struct_size; - auto destination_size = pointer_element_size; - auto address_alignment = get_byte_alignment(argument_abi.semantic_type); - - LLVMValueRef address; - if (source_size <= destination_size) - { - address = alloca; - } - else - { - address = create_alloca(module, { .type = coerce_to_type, .name = string_literal("coerce"), .alignment = address_alignment }); - } - - assert(coerce_to_type->structure.fields.length == argument_abi.abi_count); - - resolve_type_in_place(module, coerce_to_type); - - for (u64 i = 0; i < coerce_to_type->structure.fields.length; i += 1) - { - auto gep = LLVMBuildStructGEP2(module->llvm.builder, coerce_to_type->llvm.abi, address, i, ""); - create_store(module, { - .source = argument_abi_arguments[i], - .destination = gep, - .type = coerce_to_type->structure.fields[i].type, - }); - } - - if (source_size > destination_size) - { - auto u64_type = uint64(module); - LLVMBuildMemCpy(module->llvm.builder, pointer, address_alignment, address, address_alignment, LLVMConstInt(u64_type->llvm.abi, destination_size, false)); - } - } - } - else - { - assert(argument_abi.abi_count == 1); - auto abi_argument_type = function_type->abi.abi_argument_types[argument_abi.abi_start]; - auto destination_size = get_byte_size(pointer_type) - argument_abi.attributes.direct.offset; - auto is_volatile = false; - create_coerced_store(module, argument_abi_arguments[0], abi_argument_type, pointer, pointer_type, destination_size, is_volatile); - } - - semantic_argument_storage = alloca; - } - } break; - case AbiKind::indirect: - { - assert(argument_abi.abi_count == 1); - auto evaluation_kind = get_evaluation_kind(argument_abi.semantic_type); - switch (evaluation_kind) - { - default: - { - if (argument_abi.flags.indirect_realign || argument_abi.flags.kind == AbiKind::indirect_aliased) - { - trap(); - } - - auto use_indirect_debug_address = !argument_abi.flags.indirect_by_value; - if (use_indirect_debug_address) - { - trap(); - } - - auto llvm_argument = argument_abi_arguments[0]; - semantic_argument_storage = llvm_argument; - } break; - case EvaluationKind::scalar: trap(); - } - } break; - default: unreachable(); - } - - assert(semantic_argument_storage); - - auto storage = new_value(module); - auto value_type = argument->variable.type; - *storage = { - .type = get_pointer_type(module, value_type), - .id = ValueId::argument, - .llvm = semantic_argument_storage, - }; - argument->variable.storage = storage; - - if (module->has_debug_info) - { - emit_debug_argument(module, argument, entry_block); - } - } - - analyze_block(module, global->variable.storage->function.block); - - auto* current_basic_block = LLVMGetInsertBlock(module->llvm.builder); - if (current_basic_block) - { - assert(!LLVMGetBasicBlockTerminator(current_basic_block)); - - if (!LLVMGetFirstInstruction(current_basic_block) || !LLVMGetFirstUse((LLVMValueRef)current_basic_block)) - { - LLVMReplaceAllUsesWith((LLVMValueRef)return_block, (LLVMValueRef)current_basic_block); - LLVMDeleteBasicBlock(return_block); - } - else - { - emit_block(module, return_block); - } - } - else - { - bool has_single_jump_to_return_block = false; - - auto first_use = LLVMGetFirstUse((LLVMValueRef)return_block); - LLVMValueRef user = 0; - if (first_use) - { - auto second_use = LLVMGetNextUse(first_use); - auto has_one_use = first_use && !second_use; - if (has_one_use) - { - user = LLVMGetUser(first_use); - has_single_jump_to_return_block = LLVMIsABranchInst(user) && !LLVMIsConditional(user) && LLVMGetSuccessor(user, 0) == return_block; - } - } - - if (has_single_jump_to_return_block) - { - assert(LLVMGetBasicBlockParent(return_block)); - auto new_return_block = LLVMGetInstructionParent(user); - // Remove unconditional branch instruction to the return block - LLVMInstructionEraseFromParent(user); - assert(!LLVMGetFirstUse((LLVMValueRef)return_block)); - assert(!LLVMGetBasicBlockTerminator(return_block)); - assert(LLVMGetBasicBlockParent(return_block)); - LLVMPositionBuilderAtEnd(module->llvm.builder, new_return_block); - LLVMDeleteBasicBlock(return_block); - } - else - { - emit_block(module, return_block); - } - } - - if (module->has_debug_info) - { - LLVMSetCurrentDebugLocation2(module->llvm.builder, 0); - auto subprogram = LLVMGetSubprogram(llvm_function); - LLVMDIBuilderFinalizeSubprogram(module->llvm.di_builder, subprogram); - } - - if (function_type->abi.return_abi.semantic_type == noreturn_type(module) || global->variable.storage->function.attributes.naked) - { - LLVMBuildUnreachable(module->llvm.builder); - } - else if (function_type->abi.return_abi.semantic_type == void_type(module)) - { - LLVMBuildRetVoid(module->llvm.builder); - } - else - { - LLVMValueRef return_value = 0; - - switch (return_abi_kind) - { - case AbiKind::direct: - case AbiKind::extend: - { - auto return_alloca = global->variable.storage->function.llvm.return_alloca; - auto coerce_to_type = function_type->abi.return_abi.get_coerce_to_type(); - auto return_semantic_type = function_type->abi.return_abi.semantic_type; - if (type_is_abi_equal(module, coerce_to_type, return_semantic_type) && function_type->abi.return_abi.attributes.direct.offset == 0) - { - auto store = llvm_find_return_value_dominating_store(module->llvm.builder, return_alloca, return_semantic_type->llvm.abi); - if (store) - { - return_value = LLVMGetOperand(store, 0); - auto alloca = LLVMGetOperand(store, 1); - assert(alloca == return_alloca); - LLVMInstructionEraseFromParent(store); - assert(!LLVMGetFirstUse(alloca)); - LLVMInstructionEraseFromParent(alloca); - } - else - { - return_value = create_load(module, LoadOptions{ - .type = return_semantic_type, - .pointer = return_alloca, - }); - } - } - else - { - LLVMValueRef source = 0; - if (function_type->abi.return_abi.attributes.direct.offset == 0) - { - source = return_alloca; - } - else - { - trap(); - } - assert(source); - - auto source_type = function_type->abi.return_abi.semantic_type; - auto destination_type = coerce_to_type; - auto result = create_coerced_load(module, source, source_type, destination_type); - return_value = result; - } - } break; - case AbiKind::indirect: - { - auto evaluation_kind = get_evaluation_kind(function_type->abi.return_abi.semantic_type); - switch (evaluation_kind) - { - case EvaluationKind::scalar: trap(); - case EvaluationKind::aggregate: break; - case EvaluationKind::complex: trap(); - } - } break; - default: unreachable(); - } - - LLVMBuildRet(module->llvm.builder, return_value); - } - - LLVMInstructionEraseFromParent(global->variable.storage->function.llvm.alloca_insertion_point); - - // END OF SCOPE - module->current_function = 0; - } - } - - if (module->has_debug_info) - { - LLVMDIBuilderFinalize(module->llvm.di_builder); - } - - char* verification_error_message = 0; - auto result = LLVMVerifyModule(module->llvm.module, LLVMReturnStatusAction, &verification_error_message) == 0; - if (!result) - { - dump_module(module); - print(string_literal("\n==========================\nLLVM VERIFICATION ERROR\n==========================\n")); - print(c_string_to_slice(verification_error_message)); - bb_fail(); - } - - if (!module->silent) - { - dump_module(module); - } - - BBLLVMOptimizationLevel optimization_level; - switch (module->build_mode) - { - case BuildMode::debug_none: - case BuildMode::debug: - optimization_level = BBLLVMOptimizationLevel::O0; - break; - case BuildMode::soft_optimize: - optimization_level = BBLLVMOptimizationLevel::O1; - break; - case BuildMode::optimize_for_speed: - optimization_level = BBLLVMOptimizationLevel::O2; - break; - case BuildMode::optimize_for_size: - optimization_level = BBLLVMOptimizationLevel::Os; - break; - case BuildMode::aggressively_optimize_for_speed: - optimization_level = BBLLVMOptimizationLevel::O3; - break; - case BuildMode::aggressively_optimize_for_size: - optimization_level = BBLLVMOptimizationLevel::Oz; - break; - case BuildMode::count: - unreachable(); - } - auto object_generation_result = generate_object(module->llvm.module, module->llvm.target_machine, { - .path = module->objects[0], - .optimization_level = optimization_level, - .run_optimization_passes = module->build_mode != BuildMode::debug_none, - .has_debug_info = module->has_debug_info, - }); - assert(object_generation_result); - - link(module); -} diff --git a/src/entry_point.cpp b/src/entry_point.cpp deleted file mode 100644 index 97e54ea..0000000 --- a/src/entry_point.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -void entry_point(Slice arguments, Slice environment); -int main(int argc, const char* argv[], char* const envp[]) -{ - auto* envp_end = envp; - while (*envp_end) - { - envp_end += 1; - } - - entry_point(Slice{(char* const*)argv, (u64)argc}, {envp, (u64)(envp_end - envp)}); - return 0; -} diff --git a/src/entry_point.hpp b/src/entry_point.hpp deleted file mode 100644 index 8ef2889..0000000 --- a/src/entry_point.hpp +++ /dev/null @@ -1,2 +0,0 @@ -#include - diff --git a/src/lib.cpp b/src/lib.cpp deleted file mode 100644 index 3fe3b1c..0000000 --- a/src/lib.cpp +++ /dev/null @@ -1,233 +0,0 @@ -#include -using uid_t = u32; -using gid_t = u32; -using off_t = s64; -using ino_t = u64; -using dev_t = u64; - -struct timespec -{ - s64 seconds; - s64 nanoseconds; -}; - -struct Stat -{ - dev_t dev; - ino_t ino; - u64 nlink; - - u32 mode; - uid_t uid; - gid_t gid; - u32 _0; - dev_t rdev; - off_t size; - s64 blksize; - s64 blocks; - - timespec atim; - timespec mtim; - timespec ctim; - s64 _1[3]; -}; - -extern "C" s32 fstat(s32, Stat*); -extern "C" s32 fork(); -extern "C" s32 dup2(s32, s32); -extern "C" s32 execve(const char* path_name, const char* const argv[], char* const envp[]); -extern "C" s32 waitpid(s32 pid, int* wstatus, int options); -extern "C" s32 pipe(int fd[2]); - -u64 os_file_size(s32 fd) -{ - Stat stat; - auto result = fstat(fd, &stat); - assert(result == 0); - return (u64)stat.size; -} - -fn u8 EXITSTATUS(u32 s) -{ - return (u8)((s & 0xff00) >> 8); -} - -fn u32 TERMSIG(u32 s) -{ - return s & 0x7f; -} - -fn u32 STOPSIG(u32 s) -{ - return EXITSTATUS(s); -} - -fn bool IFEXITED(u32 s) -{ - return TERMSIG(s) == 0; -} - -fn bool IFSTOPPED(u32 s) -{ - return u16(((s & 0xffff) * 0x10001) >> 8) > 0x7f00; -} - -fn bool IFSIGNALED(u32 s) -{ - return (s & 0xffff) - 1 < 0xff; -} - -Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options) -{ - unused(arena); - assert(arguments.pointer[arguments.length] == 0); - assert(environment.pointer[environment.length] == 0); - - Execution execution = {}; - - s32 null_file_descriptor = -1; - if (options.null_file_descriptor >= 0) - { - null_file_descriptor = options.null_file_descriptor; - } - else if (options.policies[0] == ExecuteStandardStreamPolicy::ignore || options.policies[1] == ExecuteStandardStreamPolicy::ignore) - { - null_file_descriptor = open("/dev/null", { .access_mode = OPEN::AccessMode::write_only }); - } - - int pipes[standard_stream_count][2]; - - for (int i = 0; i < 2; i += 1) - { - if (options.policies[i] == ExecuteStandardStreamPolicy::pipe) - { - if (pipe(pipes[i]) == -1) - { - trap(); - } - } - } - - auto pid = fork(); - - switch (pid) - { - case -1: - { - trap(); - } break; - case 0: // Child process - { - for (u64 i = 0; i < standard_stream_count; i += 1) - { - auto fd = (s32)i + 1; - switch (options.policies[i]) - { - case ExecuteStandardStreamPolicy::inherit: - { - } break; - case ExecuteStandardStreamPolicy::pipe: - { - close(pipes[i][0]); - dup2(pipes[i][1], fd); - close(pipes[i][1]); - } break; - case ExecuteStandardStreamPolicy::ignore: - { - dup2(null_file_descriptor, fd); - close(null_file_descriptor); - } break; - } - } - - auto result = execve(arguments[0], arguments.pointer, environment.pointer); - - if (result != -1) - { - unreachable(); - } - - trap(); - } break; - default: - { - for (u64 i = 0; i < standard_stream_count; i += 1) - { - if (options.policies[i] == ExecuteStandardStreamPolicy::pipe) - { - close(pipes[i][1]); - } - } - - // TODO: better allocation strategy - u64 allocation_size = 1024 * 1024; - Slice allocation = {}; - if (options.policies[0] == ExecuteStandardStreamPolicy::pipe || options.policies[1] == ExecuteStandardStreamPolicy::pipe) - { - allocation = arena_allocate(arena, allocation_size * ((options.policies[0] == ExecuteStandardStreamPolicy::pipe) + (options.policies[1] == ExecuteStandardStreamPolicy::pipe))); - } - - u64 offset = 0; - for (u64 i = 0; i < standard_stream_count; i += 1) - { - if (options.policies[i] == ExecuteStandardStreamPolicy::pipe) - { - auto buffer = allocation(offset)(0, allocation_size); - auto byte_count = read(pipes[i][0], buffer.pointer, buffer.length); - assert(byte_count >= 0); - execution.streams[i] = buffer(0, byte_count); - close(pipes[i][0]); - - offset += allocation_size; - } - } - - int status = 0; - auto waitpid_result = waitpid(pid, &status, 0); - - if (waitpid_result == pid) - { - if (IFEXITED(status)) - { - execution.termination_kind = TerminationKind::exit; - execution.termination_code = EXITSTATUS(status); - } - else if (IFSIGNALED(status)) - { - execution.termination_kind = TerminationKind::signal; - execution.termination_code = TERMSIG(status); - } - else if (IFSTOPPED(status)) - { - execution.termination_kind = TerminationKind::stop; - execution.termination_code = STOPSIG(status); - } - else - { - execution.termination_kind = TerminationKind::unknown; - } - - if (options.null_file_descriptor < 0 && null_file_descriptor >= 0) - { - close(null_file_descriptor); - } - } - else if (waitpid_result == -1) - { - trap(); - } - else - { - trap(); - } - } break; - } - - return execution; -} - -extern "C" char* getenv(const char*); -char* os_get_environment_variable(const char* env) -{ - return getenv(env); -} diff --git a/src/lib.hpp b/src/lib.hpp deleted file mode 100644 index 060b2bf..0000000 --- a/src/lib.hpp +++ /dev/null @@ -1,722 +0,0 @@ -#pragma once - -#define global_variable static - -#define EXPORT extern "C" -#define fn static -#define unused(x) (void)(x) -#define breakpoint() __builtin_debugtrap() -#define string_literal_length(s) (sizeof(s) - 1) -#define string_literal(s) ((String){ .pointer = (u8*)(s), .length = string_literal_length(s), }) -#define split_string_literal(s) (char*)(s), string_literal_length(s) -#define offsetof(S, f) __builtin_offsetof(S, f) - -#define array_length(arr) sizeof(arr) / sizeof((arr)[0]) -#define array_to_slice(arr) { .pointer = (arr), .length = array_length(arr) } -#define array_to_bytes(arr) { .pointer = (u8*)(arr), .length = sizeof(arr) } -#define backing_type(E) __underlying_type(E) - -#define unreachable_raw() __builtin_unreachable() -#define trap() __builtin_trap() -#if BB_DEBUG -#define unreachable() trap() -#else -#define unreachable() unreachable_raw() -#endif -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#define expect(x, b) __builtin_expect(!!(x), b) -#define likely(x) expect(x, 1) -#define unlikely(x) expect(x, 0) - -#define assert(x) (unlikely(!(x)) ? unreachable() : unused(0)) - -#define clz(x) __builtin_clzg(x) -#define ctz(x) __builtin_ctzg(x) - -#define case_to_name(E,n) case E::n: return string_literal(#n) - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long u64; - -typedef signed char s8; -typedef signed short s16; -typedef signed int s32; -typedef signed long s64; - -typedef float f32; -typedef double f64; - -fn u64 align_forward(u64 value, u64 alignment) -{ - assert(alignment != 0); - auto mask = alignment - 1; - auto result = (value + mask) & ~mask; - return result; -} - -constexpr u64 kb = 1024; -constexpr u64 mb = 1024 * 1024; -constexpr u64 gb = 1024 * 1024 * 1024; - -extern "C" [[noreturn]] void exit(s32 status) noexcept(true); -extern "C" void *memcpy (void* __restrict destination, const void *__restrict source, u64 byte_count) noexcept(true); -extern "C" s32 memcmp (const void* a, const void *b, u64 __n) noexcept(true); -extern "C" char* realpath(const char* __restrict path, char* resolved_path) noexcept(true); - -struct RawSlice -{ - void* pointer; - u64 length; -}; - -fn bool raw_slice_equal(RawSlice a, RawSlice b, u64 size_of_T) -{ - bool result = a.length == b.length; - if (result) - { - if (a.pointer != b.pointer) - { - result = memcmp(a.pointer, b.pointer, a.length * size_of_T) == 0; - } - } - - return result; -} - -fn RawSlice raw_slice_slice(RawSlice s, u64 start, u64 end, u64 size_of_T) -{ - return {(u8*)s.pointer + (size_of_T * start), end - start}; -} - -template -struct Slice -{ - T* pointer; - u64 length; - - T* begin() - { - return pointer; - } - - T* end() { - return pointer + length; - } - - T& operator[](u64 index) - { - assert(index < length); - return pointer[index]; - } - - bool equal(Slice other) - { - return raw_slice_equal(*(RawSlice*)this, *(RawSlice*)&other, sizeof(T)); - } - - Slice operator()(u64 start, u64 end) - { - return {pointer + start, end - start}; - } - - Slice operator()(u64 start) - { - return {pointer + start, length - start}; - } -}; - -using String = Slice; -fn const char* cstr(String string) -{ - assert(string.pointer[string.length] == 0); - return (const char*) string.pointer; -} - -fn String c_string_to_slice(const char* cstr) -{ - const auto* end = cstr; - while (*end) - { - end += 1; - } - - return { (u8*)cstr, u64(end - cstr) }; -} - -constexpr auto string_no_match = ~(u64)0; - -fn u64 string_first_character(String string, u8 ch) -{ - u64 result = string_no_match; - - for (u64 i = 0; i < string.length; i += 1) - { - if (string[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -fn u64 string_last_character(String string, u8 ch) -{ - u64 result = string_no_match; - u64 i = string.length; - - while (i > 0) - { - i -= 1; - - if (string[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -struct ProtectionFlags -{ - u8 read:1; - u8 write:1; - u8 execute:1; -}; - -struct MapFlags -{ - u8 priv:1; - u8 anonymous:1; - u8 no_reserve:1; - u8 populate:1; -}; - -struct PROT -{ - u32 read:1; - u32 write:1; - u32 execute:1; - u32 sem:1; - u32 _:28; -}; -static_assert(sizeof(PROT) == sizeof(u32)); - -struct MAP -{ - enum class Type : u32 - { - shared = 0, - priv = 1, - shared_validate = 2, - }; - - Type type:4; - u32 fixed:1; - u32 anonymous:1; - u32 bit32:1; - u32 _0: 1; - u32 grows_down:1; - u32 _1: 2; - u32 deny_write:1; - u32 executable:1; - u32 locked:1; - u32 no_reserve:1; - u32 populate:1; - u32 non_block:1; - u32 stack:1; - u32 huge_tlb:1; - u32 sync:1; - u32 fixed_no_replace:1; - u32 _2:5; - u32 uninitialized:1; - u32 _3:5; -}; -static_assert(sizeof(MAP) == sizeof(u32)); - -struct OPEN -{ - enum class AccessMode : u32 - { - read_only = 0, - write_only = 1, - read_write = 2, - }; - - AccessMode access_mode:2; - u32 _0:4; - u32 creat:1; - u32 excl:1; - u32 no_ctty:1; - u32 trunc:1; - u32 append:1; - u32 non_block:1; - u32 d_sync:1; - u32 a_sync:1; - u32 direct:1; - u32 _1:1; - u32 directory:1; - u32 no_follow:1; - u32 no_a_time:1; - u32 cloexec:1; - u32 sync:1; - u32 path:1; - u32 tmp_file:1; - u32 _2:9; -}; -static_assert(sizeof(OPEN) == sizeof(u32)); - -extern "C" s32* __errno_location() noexcept(true); -extern "C" void* mmap(void*, u64, PROT, MAP, s32, s64); -extern "C" s32 mprotect(void*, u64, PROT); -extern "C" s64 ptrace(s32, s32, u64, u64); -extern "C" s32 open(const char*, OPEN, ...); -extern "C" s32 close(s32); -extern "C" s64 write(s32, const void*, u64); -extern "C" s64 read(s32, void*, u64); -extern "C" s32 mkdir(const char*, u64); - -enum class Error : u32 -{ - success = 0, - perm = 1, -}; - -fn Error errno() -{ - return (Error)*__errno_location(); -} - -fn void* os_reserve(void* base, u64 size, ProtectionFlags protection, MapFlags map) -{ - auto protection_flags = PROT - { - .read = protection.read, - .write = protection.write, - .execute = protection.execute, - .sem = 0, - ._ = 0, - }; - - auto map_flags = MAP - { - .type = map.priv ? MAP::Type::priv : MAP::Type::shared, - .fixed = 0, - .anonymous = map.anonymous, - .bit32 = 0, - ._0 = 0, - .grows_down = 0, - ._1 = 0, - .deny_write = 0, - .executable = 0, - .locked = 0, - .no_reserve = map.no_reserve, - .populate = map.populate, - .non_block = 0, - .stack = 0, - .huge_tlb = 0, - .sync = 0, - .fixed_no_replace = 0, - ._2 = 0, - .uninitialized = 0, - ._3 = 0, - }; - - auto* address = mmap(base, size, protection_flags, map_flags, -1, 0); - assert((u64)address != ~(u64)0); - - return address; -} - -fn void os_commit(void* address, u64 size, ProtectionFlags protection) -{ - auto protection_flags = PROT - { - .read = protection.read, - .write = protection.write, - .execute = protection.execute, - .sem = 0, - ._ = 0, - }; - auto result = mprotect(address, size, protection_flags); - assert(!result); -} - -struct OpenFlags -{ - u32 truncate:1; - u32 execute:1; - u32 write:1; - u32 read:1; - u32 create:1; - u32 directory:1; -}; - -struct Permissions -{ - u32 read:1; - u32 write:1; - u32 execute:1; -}; - -fn s32 os_open(String path, OpenFlags flags, Permissions permissions) -{ - OPEN::AccessMode access_mode; - if (flags.read && flags.write) - { - access_mode = OPEN::AccessMode::read_write; - } - else if (flags.read) - { - access_mode = OPEN::AccessMode::read_only; - } - else if (flags.write) - { - access_mode = OPEN::AccessMode::read_only; - } - else - { - unreachable(); - } - - auto o = OPEN { - .access_mode = access_mode, - .creat = flags.create, - .trunc = flags.truncate, - .directory = flags.directory, - }; - - // TODO: - auto mode = permissions.execute ? 0755 : 0644; - - auto fd = open(cstr(path), o, mode); - return fd; -} - -fn bool is_file_valid(s32 fd) -{ - return fd >= 0; -} - -fn void os_close(s32 fd) -{ - assert(is_file_valid(fd)); - - auto result = close(fd); - assert(result == 0); -} - -u64 os_file_size(s32 fd); - -fn u64 os_read_partially(s32 fd, u8* buffer, u64 byte_count) -{ - auto result = read(fd, buffer, byte_count); - assert(result > 0); - return (u64)result; -} - -fn void os_read(s32 fd, String buffer, u64 byte_count) -{ - assert(byte_count <= buffer.length); - u64 it_byte_count = 0; - while (it_byte_count < byte_count) - { - auto read_byte_count = os_read_partially(fd, buffer.pointer + it_byte_count, byte_count - it_byte_count); - it_byte_count += read_byte_count; - } - assert(it_byte_count == byte_count); -} - -fn u64 os_write_partially(s32 fd, u8* buffer, u64 byte_count) -{ - auto result = write(fd, buffer, byte_count); - assert(result > 0); - return (u64)result; -} - -fn void os_write(s32 fd, String content) -{ - u64 it_byte_count = 0; - while (it_byte_count < content.length) - { - auto written_byte_count = os_write_partially(fd, content.pointer + it_byte_count, content.length - it_byte_count); - it_byte_count += written_byte_count; - } - assert(it_byte_count == content.length); -} - -fn String path_absolute_stack(String buffer, String relative_path) -{ - const char* absolute_path = realpath(cstr(relative_path), (char*)buffer.pointer); - if (absolute_path) - { - auto slice = c_string_to_slice(absolute_path); - assert(slice.length < buffer.length); - return slice; - } - return {}; -} - -fn bool os_is_debugger_present() -{ - bool result = false; - if (ptrace(0, 0, 0, 0) == -1) - { - auto errno_error = errno(); - result = errno_error == Error::perm; - } - - return result; -} - -fn void make_directory(const char* path) -{ - auto result = mkdir(path, 0755); - unused(result); -} - -fn void print(String string) -{ - os_write(1, string); -} - -struct ArenaInitialization -{ - u64 reserved_size; - u64 granularity; - u64 initial_size; -}; - -struct Arena -{ - u64 reserved_size; - u64 position; - u64 os_position; - u64 granularity; - u8 reserved[32]; -}; - -constexpr u64 arena_minimum_position = sizeof(Arena); - -fn Arena* arena_initialize(ArenaInitialization i) -{ - ProtectionFlags protection_flags = { - .read = 1, - .write = 1, - }; - MapFlags map_flags = { - .priv = 1, - .anonymous = 1, - .no_reserve = 1, - }; - - auto* arena = (Arena*)os_reserve(0, i.reserved_size, protection_flags, map_flags); - os_commit(arena, i.initial_size, { .read = 1, .write = 1 }); - - *arena = { - .reserved_size = i.reserved_size, - .position = arena_minimum_position, - .os_position = i.initial_size, - .granularity = i.granularity, - }; - - return arena; -} - -fn inline Arena* arena_initialize_default(u64 initial_size) -{ - ArenaInitialization i = { - .reserved_size = 4 * gb, - .granularity = 4 * kb, - .initial_size = initial_size, - }; - return arena_initialize(i); -} - -fn void* arena_allocate_bytes(Arena* arena, u64 size, u64 alignment) -{ - void* result = 0; - - if (size) - { - auto aligned_offset = align_forward(arena->position, alignment); - auto aligned_size_after = aligned_offset + size; - - if (aligned_size_after > arena->os_position) - { - auto target_commited_size = align_forward(aligned_size_after, arena->granularity); - auto size_to_commit = target_commited_size - arena->os_position; - auto commit_pointer = ((u8*)arena) + arena->os_position; - os_commit(commit_pointer, size_to_commit, { .read = 1, .write = 1 }); - arena->os_position = target_commited_size; - } - - result = (u8*)arena + aligned_offset; - arena->position = aligned_size_after; - assert(arena->position <= arena->os_position); - } - - return result; -} - -template -fn Slice arena_allocate(Arena* arena, u64 count) -{ - return { (T*)arena_allocate_bytes(arena, sizeof(T) * count, alignof(T)), count }; -} - -fn String arena_join_string(Arena* arena, Slice pieces) -{ - u64 size = 0; - for (auto piece : pieces) - { - size += piece.length; - } - - auto* pointer = (u8*)arena_allocate_bytes(arena, size + 1, 1); - u64 i = 0; - for (auto piece : pieces) - { - memcpy(pointer + i, piece.pointer, piece.length); - i += piece.length; - } - - assert(i == size); - pointer[i] = 0; - - return { pointer, size }; -} - -fn String arena_duplicate_string(Arena* arena, String string) -{ - auto memory = (u8*)arena_allocate_bytes(arena, string.length + 1, 1); - memcpy(memory, string.pointer, string.length); - memory[string.length] = 0; - return { memory, string.length}; -} - -fn void arena_restore(Arena* arena, u64 position) -{ - assert(position <= arena->position); - arena->position = position; -} - -fn void arena_reset(Arena* arena) -{ - arena->position = arena_minimum_position; -} - -fn String path_absolute(Arena* arena, String relative_path) -{ - u8 buffer[4096]; - auto stack = path_absolute_stack(array_to_slice(buffer), relative_path); - auto result = arena_duplicate_string(arena, stack); - return result; -} - -fn String file_read(Arena* arena, String file_path) -{ - auto fd = os_open(file_path, { .read = 1 }, { .read = 1 }); - String result = {}; - - if (is_file_valid(fd)) - { - auto file_size = os_file_size(fd); - result = arena_allocate(arena, file_size); - os_read(fd, result, file_size); - os_close(fd); - } - - return result; -} - -#define bb_fail() os_is_debugger_present() ? trap() : exit(1) -#define bb_fail_with_message(message) (print(message), bb_fail()) - -fn u64 next_power_of_two(u64 n) -{ - n -= 1; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n |= n >> 32; - n += 1; - return n; -} - -fn u8 format_integer_decimal(String buffer, u64 v) -{ - u8 byte_count = 0; - auto value = v; - - if (value != 0) - { - u8 reverse_buffer[64]; - u8 reverse_index = 0; - - while (value != 0) - { - auto digit_value = (u8)(value % 10); - auto ascii_character = digit_value + '0'; - value /= 10; - reverse_buffer[reverse_index] = ascii_character; - reverse_index += 1; - } - - while (reverse_index != 0) - { - reverse_index -= 1; - buffer[byte_count] = reverse_buffer[reverse_index]; - byte_count += 1; - } - } - else - { - buffer[0] = '0'; - byte_count = 1; - } - - return byte_count; -} - -enum class ExecuteStandardStreamPolicy : u8 -{ - inherit, - pipe, - ignore, -}; - -global_variable constexpr u64 standard_stream_count = 2; - -struct ExecuteOptions -{ - ExecuteStandardStreamPolicy policies[standard_stream_count]; // INDICES: stdout = 0, stderr = 1 - s32 null_file_descriptor = -1; -}; - -enum class TerminationKind : u8 -{ - unknown, - exit, - signal, - stop, -}; - -struct Execution -{ - String streams[2]; - TerminationKind termination_kind; - u32 termination_code; -}; - -Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options); -char* os_get_environment_variable(const char* env); diff --git a/src/llvm.cpp b/src/llvm.cpp deleted file mode 100644 index 141fe49..0000000 --- a/src/llvm.cpp +++ /dev/null @@ -1,316 +0,0 @@ -#include - -#include "llvm/Config/llvm-config.h" - -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/Module.h" -#include "llvm/IR/Verifier.h" -#include "llvm/IR/DebugInfo.h" -#include "llvm/IR/LegacyPassManager.h" - -#include "llvm/Passes/PassBuilder.h" - -#include "llvm/Analysis/TargetLibraryInfo.h" -#include "llvm/Analysis/TargetTransformInfo.h" - -#include "llvm/Frontend/Driver/CodeGenOptions.h" - -#include "llvm/TargetParser/Host.h" -#include "llvm/TargetParser/SubtargetFeature.h" - -#include "llvm/Target/TargetMachine.h" - -#include "llvm/MC/TargetRegistry.h" - -#include "llvm/Support/FileSystem.h" - -#include "lld/Common/CommonLinkerContext.h" - -EXPORT void llvm_subprogram_replace_type(LLVMMetadataRef subprogram, LLVMMetadataRef subroutine_type) -{ - auto sp = llvm::unwrap(subprogram); - sp->replaceType(llvm::unwrap(subroutine_type)); -} - -// If there are multiple uses of the return-value slot, just check -// for something immediately preceding the IP. Sometimes this can -// happen with how we generate implicit-returns; it can also happen -// with noreturn cleanups. -fn llvm::StoreInst* get_store_if_valid(llvm::User* user, llvm::Value* return_alloca, llvm::Type* element_type) -{ - auto *SI = dyn_cast(user); - if (!SI || SI->getPointerOperand() != return_alloca || - SI->getValueOperand()->getType() != element_type) - return nullptr; - // These aren't actually possible for non-coerced returns, and we - // only care about non-coerced returns on this code path. - // All memory instructions inside __try block are volatile. - assert(!SI->isAtomic() && - (!SI->isVolatile() - //|| CGF.currentFunctionUsesSEHTry()) - )); - return SI; -} - -// copy of static llvm::StoreInst *findDominatingStoreToReturnValue(CodeGenFunction &CGF) { -// in clang/lib/CodeGen/CGCall.cpp:3526 in LLVM 19 -EXPORT LLVMValueRef llvm_find_return_value_dominating_store(LLVMBuilderRef b, LLVMValueRef ra, LLVMTypeRef et) -{ - auto builder = llvm::unwrap(b); - auto return_alloca = llvm::unwrap(ra); - auto element_type = llvm::unwrap(et); - // Check if a User is a store which pointerOperand is the ReturnValue. - // We are looking for stores to the ReturnValue, not for stores of the - // ReturnValue to some other location. - if (!return_alloca->hasOneUse()) { - llvm::BasicBlock *IP = builder->GetInsertBlock(); - if (IP->empty()) return nullptr; - - // Look at directly preceding instruction, skipping bitcasts and lifetime - // markers. - for (llvm::Instruction &I : make_range(IP->rbegin(), IP->rend())) { - if (isa(&I)) - continue; - if (auto *II = dyn_cast(&I)) - if (II->getIntrinsicID() == llvm::Intrinsic::lifetime_end) - continue; - - return wrap(get_store_if_valid(&I, return_alloca, element_type)); - } - return nullptr; - } - - llvm::StoreInst *store = get_store_if_valid(return_alloca->user_back(), return_alloca, element_type); - if (!store) return nullptr; - - // Now do a first-and-dirty dominance check: just walk up the - // single-predecessors chain from the current insertion point. - llvm::BasicBlock *StoreBB = store->getParent(); - llvm::BasicBlock *IP = builder->GetInsertBlock(); - llvm::SmallPtrSet SeenBBs; - while (IP != StoreBB) { - if (!SeenBBs.insert(IP).second || !(IP = IP->getSinglePredecessor())) - return nullptr; - } - - // Okay, the store's basic block dominates the insertion point; we - // can do our thing. - return wrap(store); -} - -EXPORT void llvm_module_run_optimization_pipeline(LLVMModuleRef m, LLVMTargetMachineRef tm, BBLLVMOptimizationPipelineOptions options) -{ - auto module = llvm::unwrap(m); - auto target_machine = (llvm::TargetMachine*)tm; - // TODO: PGO - // TODO: CS profile - - llvm::PipelineTuningOptions pipeline_tuning_options; - pipeline_tuning_options.LoopUnrolling = options.loop_unrolling; - pipeline_tuning_options.LoopInterleaving = options.loop_interleaving; - pipeline_tuning_options.LoopVectorization = options.loop_vectorization; - pipeline_tuning_options.SLPVectorization = options.slp_vectorization; - pipeline_tuning_options.MergeFunctions = options.merge_functions; - pipeline_tuning_options.CallGraphProfile = options.call_graph_profile; - pipeline_tuning_options.UnifiedLTO = options.unified_lto; - - // TODO: instrumentation - - llvm::LoopAnalysisManager loop_analysis_manager; - llvm::FunctionAnalysisManager function_analysis_manager; - llvm::CGSCCAnalysisManager cgscc_analysis_manager; - llvm::ModuleAnalysisManager module_analysis_manager; - - llvm::PassBuilder pass_builder(target_machine, pipeline_tuning_options); - - if (options.assignment_tracking && options.debug_info != 0) - { - pass_builder.registerPipelineStartEPCallback([&](llvm::ModulePassManager& MPM, llvm::OptimizationLevel Level) { - unused(Level); - MPM.addPass(llvm::AssignmentTrackingPass()); - }); - } - - llvm::Triple target_triple = target_machine->getTargetTriple(); // Need to make a copy, incoming bugfix: https://github.com/llvm/llvm-project/pull/127718 - // TODO: add library (?) - std::unique_ptr TLII(llvm::driver::createTLII(target_triple, llvm::driver::VectorLibrary::NoLibrary)); - function_analysis_manager.registerPass([&] { return llvm::TargetLibraryAnalysis(*TLII); }); - - pass_builder.registerModuleAnalyses(module_analysis_manager); - pass_builder.registerCGSCCAnalyses(cgscc_analysis_manager); - pass_builder.registerFunctionAnalyses(function_analysis_manager); - pass_builder.registerLoopAnalyses(loop_analysis_manager); - pass_builder.crossRegisterProxies(loop_analysis_manager, function_analysis_manager, cgscc_analysis_manager, module_analysis_manager); - - llvm::ModulePassManager module_pass_manager; - - if (options.verify_module) - { - module_pass_manager.addPass(llvm::VerifierPass()); - } - - bool thin_lto = false; - bool lto = false; - - llvm::OptimizationLevel optimization_level; - switch ((BBLLVMOptimizationLevel)options.optimization_level) - { - case BBLLVMOptimizationLevel::O0: optimization_level = llvm::OptimizationLevel::O0; break; - case BBLLVMOptimizationLevel::O1: optimization_level = llvm::OptimizationLevel::O1; break; - case BBLLVMOptimizationLevel::O2: optimization_level = llvm::OptimizationLevel::O2; break; - case BBLLVMOptimizationLevel::O3: optimization_level = llvm::OptimizationLevel::O3; break; - case BBLLVMOptimizationLevel::Os: optimization_level = llvm::OptimizationLevel::Os; break; - case BBLLVMOptimizationLevel::Oz: optimization_level = llvm::OptimizationLevel::Oz; break; - } - - // TODO: thin lto post-link - // TODO: instrument - if (thin_lto) { - __builtin_trap(); // TODO - } else if (lto) { - __builtin_trap(); // TODO - } else if (lto) { - __builtin_trap(); // TODO - } else { - module_pass_manager.addPass(pass_builder.buildPerModuleDefaultPipeline(optimization_level)); - } - - // TODO: if emit bitcode/IR - - module_pass_manager.run(*module, module_analysis_manager); -} - -EXPORT BBLLVMCodeGenerationPipelineResult llvm_module_run_code_generation_pipeline(LLVMModuleRef m, LLVMTargetMachineRef tm, const BBLLVMCodeGenerationPipelineOptions* options) -{ - auto module = llvm::unwrap(m); - auto target_machine = (llvm::TargetMachine*)tm; - - // We still use the legacy PM to run the codegen pipeline since the new PM - // does not work with the codegen pipeline. - // FIXME: make the new PM work with the codegen pipeline. - llvm::legacy::PassManager CodeGenPasses; -#if LLVM_VERSION_MAJOR >= 19 - if (options->optimize_when_possible) - { - CodeGenPasses.add(createTargetTransformInfoWrapperPass(target_machine->getTargetIRAnalysis())); - } -#endif - - llvm::raw_pwrite_stream* dwarf_object_file = 0; - if (options->output_dwarf_file_path.length) - { - __builtin_trap(); - } - - if (options->optimize_when_possible) - { - llvm::Triple target_triple = target_machine->getTargetTriple(); // Need to make a copy, incoming bugfix: https://github.com/llvm/llvm-project/pull/127718 - // TODO: add library (?) - std::unique_ptr TLII(llvm::driver::createTLII(target_triple, llvm::driver::VectorLibrary::NoLibrary)); - CodeGenPasses.add(new llvm::TargetLibraryInfoWrapperPass(*TLII)); - } - - std::unique_ptr stream; - - if (options->output_file_path.length) - { - std::error_code error_code; - - stream = std::make_unique(llvm::StringRef((char*)options->output_file_path.pointer, options->output_file_path.length), error_code, llvm::sys::fs::OF_None); - - if (error_code) - { - return BBLLVMCodeGenerationPipelineResult::failed_to_create_file; - } - } - else - { - stream = std::make_unique(); - } - - llvm::CodeGenFileType file_type; - switch (options->file_type) - { - case BBLLVMCodeGenerationFileType::assembly_file: file_type = llvm::CodeGenFileType::AssemblyFile; break; - case BBLLVMCodeGenerationFileType::object_file: file_type = llvm::CodeGenFileType::ObjectFile; break; - case BBLLVMCodeGenerationFileType::null: file_type = llvm::CodeGenFileType::Null; break; - } - - auto disable_verify = !options->verify_module; - if (target_machine->addPassesToEmitFile(CodeGenPasses, *stream, dwarf_object_file, file_type, disable_verify)) - { - return BBLLVMCodeGenerationPipelineResult::failed_to_add_emit_passes; - } - - CodeGenPasses.run(*module); - - return BBLLVMCodeGenerationPipelineResult::success; -} - -#define lld_api_function_signature(name) bool name(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) - -#define lld_link_decl(link_name) \ -namespace link_name \ -{\ - lld_api_function_signature(link);\ -} - -typedef lld_api_function_signature(LinkerFunction); - -namespace lld -{ - lld_link_decl(coff); - lld_link_decl(elf); - lld_link_decl(mingw); - lld_link_decl(macho); - lld_link_decl(wasm); -} - -fn LLDResult lld_api_generic(lld_api_args(), LinkerFunction linker_function) -{ - LLDResult result = {}; - auto arguments = llvm::ArrayRef(argument_pointer, argument_count); - - std::string stdout_string; - llvm::raw_string_ostream stdout_stream(stdout_string); - - std::string stderr_string; - llvm::raw_string_ostream stderr_stream(stderr_string); - - result.success = linker_function(arguments, stdout_stream, stderr_stream, exit_early, disable_output); - - auto stdout_length = stdout_string.length(); - if (stdout_length) - { - auto* stdout_pointer = new u8[stdout_length + 1]; - memcpy(stdout_pointer, stdout_string.data(), stdout_length); - result.stdout_string = { stdout_pointer, stdout_length }; - stdout_pointer[stdout_length] = 0; - } - - auto stderr_length = stderr_string.length(); - if (stderr_length) - { - auto* stderr_pointer = new u8[stderr_length + 1]; - memcpy(stderr_pointer, stderr_string.data(), stderr_length); - result.stderr_string = { stderr_pointer, stderr_length }; - stderr_pointer[stderr_length] = 0; - } - - // TODO: should we only call it on success? - lld::CommonLinkerContext::destroy(); - - return result; -} - -#define lld_api_function_impl(link_name) \ -EXPORT lld_api_function_decl(link_name)\ -{\ - return lld_api_generic(argument_pointer, argument_count, exit_early, disable_output, lld::link_name::link);\ -} - -// lld_api_function_impl(coff) -lld_api_function_impl(elf) -// lld_api_function_impl(mingw) -// lld_api_function_impl(macho) -// lld_api_function_impl(wasm) diff --git a/src/llvm.hpp b/src/llvm.hpp deleted file mode 100644 index eab0a12..0000000 --- a/src/llvm.hpp +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -struct LLDResult -{ - String stdout_string; - String stderr_string; - bool success; -}; - -enum class BBLLVMOptimizationLevel : u8 -{ - O0 = 0, - O1 = 1, - O2 = 2, - O3 = 3, - Os = 4, - Oz = 5, -}; - -enum class DwarfType -{ - void_type = 0x0, - address = 0x1, - boolean = 0x2, - complex_float = 0x3, - float_type = 0x4, - signed_type = 0x5, - signed_char = 0x6, - unsigned_type = 0x7, - unsigned_char = 0x8, - - // DWARF 3. - imaginary_float = 0x9, - packed_decimal = 0xa, - numeric_string = 0xb, - edited = 0xc, - signed_fixed = 0xd, - unsigned_fixed = 0xe, - decimal_float = 0xf, - - // DWARF 4. - UTF = 0x10, - - // DWARF 5. - UCS = 0x11, - ASCII = 0x12, - - // HP extensions. - HP_float80 = 0x80, // Floating-point (80 bit). - HP_complex_float80 = 0x81, // Complex floating-point (80 bit). - HP_float128 = 0x82, // Floating-point (128 bit). - HP_complex_float128 = 0x83, // Complex fp (128 bit). - HP_floathpintel = 0x84, // Floating-point (82 bit IA64). - HP_imaginary_float80 = 0x85, - HP_imaginary_float128 = 0x86, - HP_VAX_float = 0x88, // F or G floating. - HP_VAX_float_d = 0x89, // D floating. - HP_packed_decimal = 0x8a, // Cobol. - HP_zoned_decimal = 0x8b, // Cobol. - HP_edited = 0x8c, // Cobol. - HP_signed_fixed = 0x8d, // Cobol. - HP_unsigned_fixed = 0x8e, // Cobol. - HP_VAX_complex_float = 0x8f, // F or G floating complex. - HP_VAX_complex_float_d = 0x90, // D floating complex. -}; - -fn bool llvm_initialized = false; - -extern "C" LLVMValueRef llvm_find_return_value_dominating_store(LLVMBuilderRef b, LLVMValueRef ra, LLVMTypeRef et); - -extern "C" void llvm_subprogram_replace_type(LLVMMetadataRef subprogram, LLVMMetadataRef subroutine_type); - -#define lld_api_args() char* const* argument_pointer, u64 argument_count, bool exit_early, bool disable_output -#define lld_api_function_decl(link_name) LLDResult lld_ ## link_name ## _link(lld_api_args()) -extern "C" lld_api_function_decl(elf); diff --git a/src/parser.cpp b/src/parser.cpp deleted file mode 100644 index ceb7a7a..0000000 --- a/src/parser.cpp +++ /dev/null @@ -1,4066 +0,0 @@ -#include - -enum class ValueIntrinsic -{ - align_of, - build_mode, - byte_size, - enum_from_int, - enum_name, - enum_names, - enum_values, - extend, - field_parent_pointer, - has_debug_info, - integer_max, - int_from_enum, - int_from_pointer, - leading_zeroes, - max, - min, - pointer_cast, - pointer_from_int, - select, - string_to_enum, - trailing_zeroes, - trap, - truncate, - va_start, - va_end, - va_arg, - va_copy, - count, -}; - -enum class TokenId -{ - none, - comma, - end_of_statement, - integer, - left_brace, - left_bracket, - left_parenthesis, - right_brace, - right_bracket, - right_parenthesis, - - plus, - dash, - asterisk, - forward_slash, - percentage, - caret, - bar, - ampersand, - exclamation, - - assign_plus, - assign_dash, - assign_asterisk, - assign_forward_slash, - assign_percentage, - assign_caret, - assign_bar, - assign_ampersand, - - value_keyword, - operator_keyword, - identifier, - string_literal, - value_intrinsic, - - shift_left, - shift_right, - assign_shift_left, - assign_shift_right, - - compare_less, - compare_less_equal, - compare_greater, - compare_greater_equal, - compare_equal, - compare_not_equal, - - dot, - double_dot, - triple_dot, - - pointer_dereference, - - assign, - tilde, -}; - -enum class TokenIntegerKind -{ - hexadecimal, - decimal, - octal, - binary, - character_literal, -}; - -struct TokenInteger -{ - u64 value; - TokenIntegerKind kind; -}; - -enum class ValueKeyword -{ - undefined, - unreachable, - zero, - count, -}; - -enum class OperatorKeyword -{ - and_op, - or_op, - and_op_shortcircuit, - or_op_shortcircuit, - count, -}; - -struct Token -{ - union - { - TokenInteger integer; - ValueKeyword value_keyword; - String identifier; - OperatorKeyword operator_keyword; - ValueIntrinsic value_intrinsic; - String string_literal; - }; - TokenId id; -}; - -enum class Precedence -{ - none, - assignment, - boolean_or, - boolean_and, - comparison, - bitwise, - shifting, - add_like, - div_like, - prefix, - aggregate_initialization, - postfix, -}; - -struct ValueBuilder -{ - Token token; - Value* left; - Precedence precedence; - ValueKind kind; - bool allow_assignment_operators; - - inline ValueBuilder with_precedence(Precedence precedence) - { - auto result = *this; - result.precedence = precedence; - return result; - } - - inline ValueBuilder with_token(Token token) - { - auto result = *this; - result.token = token; - return result; - } - - inline ValueBuilder with_left(Value* value) - { - auto result = *this; - result.left = value; - return result; - } - - inline ValueBuilder with_kind(ValueKind kind) - { - auto result = *this; - result.kind = kind; - return result; - } -}; - -global_variable constexpr u8 left_bracket = '['; -global_variable constexpr u8 right_bracket = ']'; -global_variable constexpr u8 left_brace = '{'; -global_variable constexpr u8 right_brace = '}'; -global_variable constexpr u8 left_parenthesis = '('; -global_variable constexpr u8 right_parenthesis = ')'; - -fn bool is_space(u8 ch) -{ - return ((ch == ' ') | (ch == '\n')) | ((ch == '\t') | (ch == '\r')); -} - -fn bool is_lower(u8 ch) -{ - return ((ch >= 'a') & (ch <= 'z')); -} - -fn bool is_upper(u8 ch) -{ - return ((ch >= 'A') & (ch <= 'Z')); -} - -fn bool is_decimal(u8 ch) -{ - return ((ch >= '0') & (ch <= '9')); -} - -fn bool is_octal(u8 ch) -{ - return ((ch >= '0') & (ch <= '7')); -} - -fn bool is_binary(u8 ch) -{ - return ((ch == '0') | (ch == '1')); -} - -fn bool is_hexadecimal_alpha_lower(u8 ch) -{ - return ((ch >= 'a') & (ch <= 'f')); -} - -fn bool is_hexadecimal_alpha_upper(u8 ch) -{ - return ((ch >= 'A') & (ch <= 'F')); -} - -fn bool is_hexadecimal_alpha(u8 ch) -{ - return is_hexadecimal_alpha_lower(ch) || is_hexadecimal_alpha_upper(ch); -} - -fn bool is_hexadecimal(u8 ch) -{ - return is_decimal(ch) || is_hexadecimal_alpha(ch); -} - -fn bool is_identifier_start(u8 ch) -{ - return (is_lower(ch) || is_upper(ch)) || (ch == '_'); -} - -fn bool is_identifier(u8 ch) -{ - return is_identifier_start(ch) || is_decimal(ch); -} - -fn u32 get_line(Module* module) -{ - auto line = module->line_offset + 1; - assert(line < ~(u32)0); - return (u32)line; -} - -fn u32 get_column(Module* module) -{ - auto column = module->offset - module->line_character_offset + 1; - assert(column < ~(u32)0); - return (u32)column; -} - -struct Checkpoint -{ - u64 offset; - u64 line_offset; - u64 line_character_offset; -}; - -fn Checkpoint get_checkpoint(Module* module) -{ - return { - .offset = module->offset, - .line_offset = module->line_offset, - .line_character_offset = module->line_character_offset, - }; -} - -fn void set_checkpoint(Module* module, Checkpoint checkpoint) -{ - module->offset = checkpoint.offset; - module->line_offset = checkpoint.line_offset; - module->line_character_offset = checkpoint.line_character_offset; -} - -fn bool consume_character_if_match(Module* module, u8 expected_ch) -{ - bool is_ch = false; - auto i = module->offset; - if (i < module->content.length) - { - auto ch = module->content[i]; - is_ch = expected_ch == ch; - module->offset = i + is_ch; - } - - return is_ch; -} - -fn void expect_character(Module* module, u8 expected_ch) -{ - if (!consume_character_if_match(module, expected_ch)) - { - report_error(); - } -} - -fn void skip_space(Module* module) -{ - while (1) - { - auto iteration_offset = module->offset; - - while (module->offset < module->content.length) - { - auto ch = module->content[module->offset]; - if (!is_space(ch)) - { - break; - } - - module->line_offset += ch == '\n'; - module->line_character_offset = ch == '\n' ? module->offset : module->line_character_offset; - module->offset += 1; - } - - if (module->offset + 1 < module->content.length) - { - auto i = module->offset; - auto first_ch = module->content[i]; - auto second_ch = module->content[i + 1]; - auto is_comment = first_ch == '/' && second_ch == '/'; - - if (is_comment) - { - while (module->offset < module->content.length) - { - auto ch = module->content[module->offset]; - if (ch == '\n') - { - break; - } - module->offset += 1; - } - - if (module->offset < module->content.length) - { - module->line_offset += 1; - module->line_character_offset = module->offset; - module->offset += 1; - } - } - } - - if (module->offset - iteration_offset == 0) - { - break; - } - } -} - -fn String parse_identifier(Module* module) -{ - auto start = module->offset; - - if (is_identifier_start(module->content[start])) - { - module->offset = start + 1; - - while (module->offset < module->content.length) - { - auto i = module->offset; - if (is_identifier(module->content[i])) - { - module->offset = i + 1; - } - else - { - break; - } - } - } - - auto end = module->offset; - if (end - start == 0) - { - report_error(); - } - - return module->content(start, end); -} - -fn u8 escape_character(u8 ch) -{ - switch (ch) - { - case 'n': return '\n'; - case 't': return '\t'; - case 'r': return '\r'; - case '\'': return '\''; - case '\\': return '\\'; - default: report_error(); - } -} - -fn String parse_string_literal(Module* module) -{ - expect_character(module, '"'); - - auto start = module->offset; - u64 escape_character_count = 0; - - while (1) - { - auto ch = module->content[module->offset]; - if (ch == '"') - { - break; - } - escape_character_count += ch == '\\'; - module->offset += 1; - } - - auto end = module->offset; - auto length = end - start - escape_character_count; - auto pointer = (u8*)arena_allocate_bytes(module->arena, length + 1, 1); - auto string_literal = String{ .pointer = pointer, .length = length }; - - for (u64 source_i = start, i = 0; source_i < end; source_i += 1, i += 1) - { - auto ch = module->content[source_i]; - if (ch == '\\') - { - source_i += 1; - ch = module->content[source_i]; - string_literal[i] = escape_character(ch); - } - else - { - string_literal[i] = ch; - } - } - - expect_character(module, '"'); - - return string_literal; -} - -fn String parse_name(Module* module) -{ - String result; - if (module->content[module->offset] == '"') - { - result = parse_string_literal(module); - } - else - { - result = parse_identifier(module); - } - return result; -} - - -fn u64 accumulate_hexadecimal(u64 accumulator, u8 ch) -{ - u64 value; - - if (is_decimal(ch)) - { - value = ch - '0'; - } - else if (is_hexadecimal_alpha_upper(ch)) - { - value = ch - 'A' + 10; - } - else if (is_hexadecimal_alpha_lower(ch)) - { - value = ch - 'a' + 10; - } - else - { - unreachable(); - } - - auto result = (accumulator * 16) + value; - return result; -} - -fn u64 accumulate_decimal(u64 accumulator, u8 ch) -{ - assert(is_decimal(ch)); - return (accumulator * 10) + (ch - '0'); -} - -fn u64 accumulate_octal(u64 accumulator, u8 ch) -{ - assert(is_octal(ch)); - return (accumulator * 8) + (ch - '0'); -} - -fn u64 accumulate_binary(u64 accumulator, u8 ch) -{ - assert(is_binary(ch)); - return (accumulator * 2) + (ch - '0'); -} - -fn u64 parse_integer_decimal_assume_valid(String string) -{ - u64 value = 0; - - for (u8 ch: string) - { - assert(is_decimal(ch)); - value = accumulate_decimal(value, ch); - } - - return value; -} - -fn Value* parse_value(Module* module, Scope* scope, ValueBuilder builder); - -struct FunctionHeaderArgument -{ - String name; - u32 line; -}; - -struct FunctionHeaderParsing -{ - Type* type; - Slice arguments; - FunctionAttributes attributes; -}; - -fn bool type_function_base_compare(Module* module, TypeFunctionBase& a, TypeFunctionBase& b) -{ - auto same_return_type = resolve_alias(module, a.semantic_return_type) == b.semantic_return_type; - auto same_calling_convention = a.calling_convention == b.calling_convention; - auto same_is_variable_arguments = a.is_variable_arguments == b.is_variable_arguments; - - auto same_argument_length = a.semantic_argument_types.length == b.semantic_argument_types.length; - auto same_argument_types = same_argument_length; - - if (same_argument_length) - { - for (u64 i = 0; i < a.semantic_argument_types.length; i += 1) - { - auto a_type = resolve_alias(module, a.semantic_argument_types[i]); - auto b_type = resolve_alias(module, b.semantic_argument_types[i]); - - auto is_same_argument_type = a_type == b_type; - - same_argument_types = same_argument_types && is_same_argument_type; - } - } - - return same_return_type && same_calling_convention && same_is_variable_arguments && same_argument_types; -} - -fn Type* get_function_type(Module* module, TypeFunctionBase base) -{ - base.semantic_return_type = resolve_alias(module, base.semantic_return_type); - for (u64 i = 0; i < base.semantic_argument_types.length; i += 1) - { - base.semantic_argument_types[i] = resolve_alias(module, base.semantic_argument_types[i]); - } - - Type* last_function_type = module->first_function_type; - - while (last_function_type) - { - assert(last_function_type->id == TypeId::function); - if (type_function_base_compare(module, base, last_function_type->function.base)) - { - return last_function_type; - } - - auto next = last_function_type->function.next; - if (!next) - { - break; - } - - last_function_type = next; - } - - auto result = type_allocate_init(module, Type{ - .function = { - .base = base, - }, - .id = TypeId::function, - .name = string_literal(""), - .scope = &module->scope, - }); - - if (last_function_type) - { - assert(module->first_function_type); - last_function_type->function.next = result; - } - else - { - assert(!module->first_function_type); - module->first_function_type = result; - } - - return result; -} - - -fn Type* parse_type(Module* module, Scope* scope); -fn FunctionHeaderParsing parse_function_header(Module* module, Scope* scope, bool mandate_argument_names) -{ - auto calling_convention = CallingConvention::c; - auto function_attributes = FunctionAttributes{}; - bool is_variable_arguments = false; - - if (consume_character_if_match(module, left_bracket)) - { - while (module->offset < module->content.length) - { - auto function_identifier = parse_identifier(module); - - enum class FunctionKeyword - { - cc, - count, - }; - - String function_keywords[] = { - string_literal("cc"), - }; - static_assert(array_length(function_keywords) == (u64)FunctionKeyword::count); - - backing_type(FunctionKeyword) i; - for (i = 0; i < (backing_type(FunctionKeyword))(FunctionKeyword::count); i += 1) - { - auto function_keyword = function_keywords[i]; - if (function_keyword.equal(function_identifier)) - { - break; - } - } - - auto function_keyword = (FunctionKeyword)i; - skip_space(module); - - switch (function_keyword) - { - case FunctionKeyword::cc: - { - expect_character(module, left_parenthesis); - skip_space(module); - auto calling_convention_string = parse_identifier(module); - String calling_conventions[] = { - string_literal("c"), - }; - static_assert(array_length(calling_conventions) == (u64)CallingConvention::count); - - backing_type(CallingConvention) i; - for (i = 0; i < (backing_type(CallingConvention))CallingConvention::count; i += 1) - { - auto calling_convention = calling_conventions[i]; - if (calling_convention.equal(calling_convention_string)) - { - break; - } - } - - auto candidate_calling_convention = (CallingConvention)i; - if (candidate_calling_convention == CallingConvention::count) - { - report_error(); - } - - calling_convention = candidate_calling_convention; - - skip_space(module); - expect_character(module, right_parenthesis); - } break; - case FunctionKeyword::count: - { - report_error(); - } break; - } - - skip_space(module); - - if (consume_character_if_match(module, right_bracket)) - { - break; - } - else - { - report_error(); - } - } - } - - skip_space(module); - - expect_character(module, left_parenthesis); - - Type* semantic_argument_type_buffer[64]; - String semantic_argument_name_buffer[64]; - u32 argument_line_buffer[64]; - u32 semantic_argument_count = 0; - - while (module->offset < module->content.length) - { - skip_space(module); - - if (consume_character_if_match(module, '.')) - { - expect_character(module, '.'); - expect_character(module, '.'); - skip_space(module); - expect_character(module, right_parenthesis); - is_variable_arguments = true; - break; - } - - if (consume_character_if_match(module, right_parenthesis)) - { - break; - } - - auto line = get_line(module); - argument_line_buffer[semantic_argument_count] = line; - - String argument_name = {}; - - if (mandate_argument_names) - { - argument_name = arena_duplicate_string(module->arena, parse_identifier(module)); - - skip_space(module); - - expect_character(module, ':'); - - skip_space(module); - } - - semantic_argument_name_buffer[semantic_argument_count] = argument_name; - - auto argument_type = parse_type(module, scope); - semantic_argument_type_buffer[semantic_argument_count] = argument_type; - - skip_space(module); - - unused(consume_character_if_match(module, ',')); - - semantic_argument_count += 1; - } - - skip_space(module); - - auto return_type = parse_type(module, scope); - - skip_space(module); - - Slice argument_types = {}; - if (semantic_argument_count != 0) - { - argument_types = new_type_array(module, semantic_argument_count); - memcpy(argument_types.pointer, semantic_argument_type_buffer, semantic_argument_count * sizeof(Type*)); - } - - auto function_type = get_function_type(module, { - .semantic_return_type = return_type, - .semantic_argument_types = argument_types, - .calling_convention = calling_convention, - .is_variable_arguments = is_variable_arguments, - }); - - Slice arguments = {}; - if (mandate_argument_names) - { - arguments = arena_allocate(module->arena, semantic_argument_count); - for (u64 i = 0; i < semantic_argument_count; i += 1) - { - arguments[i] = { - .name = semantic_argument_name_buffer[i], - .line = argument_line_buffer[i], - }; - } - } - - return { - .type = function_type, - .arguments = arguments, - .attributes = function_attributes, - }; -} - -fn Type* parse_type(Module* module, Scope* scope) -{ - auto start_character = module->content[module->offset]; - if (is_identifier_start(start_character)) - { - auto identifier = parse_identifier(module); - if (identifier.equal(string_literal("void"))) - { - return void_type(module); - } - else if (identifier.equal(string_literal("noreturn"))) - { - return noreturn_type(module); - } - else if (identifier.equal(string_literal("enum_array"))) - { - skip_space(module); - expect_character(module, left_bracket); - auto enum_type = parse_type(module, scope); - expect_character(module, right_bracket); - - expect_character(module, left_parenthesis); - auto element_type = parse_type(module, scope); - expect_character(module, right_parenthesis); - - auto enum_array_type = get_enum_array_type(module, enum_type, element_type); - return enum_array_type; - } - else if (identifier.equal(string_literal("fn"))) - { - skip_space(module); - auto mandate_argument_names = false; - auto function_header = parse_function_header(module, scope, mandate_argument_names); - auto result = function_header.type; - return result; - } - else - { - auto is_int_type = identifier.length > 1 && (identifier[0] == 's' || identifier[0] == 'u'); - - if (is_int_type) - { - for (auto ch : identifier(1)) - { - is_int_type = is_int_type && is_decimal(ch); - } - } - - if (is_int_type) - { - bool is_signed; - switch (identifier[0]) - { - case 's': is_signed = true; break; - case 'u': is_signed = false; break; - default: unreachable(); - } - - auto bit_count = parse_integer_decimal_assume_valid(identifier(1)); - if (bit_count == 0) - { - report_error(); - } - if (bit_count > 64) - { - if (bit_count != 128) - { - report_error(); - } - } - - auto result = integer_type(module, { .bit_count = (u32)bit_count, .is_signed = is_signed }); - return result; - } - else - { - assert(scope); - auto it_scope = scope; - while (it_scope) - { - for (Type* type = it_scope->types.first; type; type = type->next) - { - if (identifier.equal(type->name)) - { - return type; - } - } - - it_scope = it_scope->parent; - } - - report_error(); - } - } - } - else if (start_character == '&') - { - module->offset += 1; - skip_space(module); - auto element_type = parse_type(module, scope); - auto pointer_type = get_pointer_type(module, element_type); - return pointer_type; - } - else if (start_character == left_bracket) - { - module->offset += 1; - skip_space(module); - - auto is_slice = consume_character_if_match(module, right_bracket); - if (is_slice) - { - skip_space(module); - auto element_type = parse_type(module, scope); - auto slice_type = get_slice_type(module, element_type); - return slice_type; - } - else - { - bool length_inferred = false; - auto checkpoint = get_checkpoint(module); - if (consume_character_if_match(module, '_')) - { - skip_space(module); - - length_inferred = consume_character_if_match(module, ']'); - } - - Value* length_value = 0; - u64 element_count = 0; - bool resolved = false; - if (!length_inferred) - { - set_checkpoint(module, checkpoint); - - length_value = parse_value(module, scope, {}); - assert(length_value); - - if (length_value->is_constant()) - { - switch (length_value->id) - { - case ValueId::constant_integer: - { - element_count = length_value->constant_integer.value; - if (element_count == 0) - { - report_error(); - } - resolved = true; - } break; - default: - { - report_error(); - } break; - } - } - - skip_space(module); - expect_character(module, right_bracket); - } - - skip_space(module); - - auto element_type = parse_type(module, scope); - - if (length_inferred) - { - assert(!length_value); - auto result = type_allocate_init(module, { - .array = { - .element_type = element_type, - .element_count = 0, - }, - .id = TypeId::array, - .name = string_literal(""), - .scope = element_type->scope, - }); - - return result; - } - else - { - if (!resolved) - { - report_error(); - } - - assert(element_count != 0); - - auto array_type = get_array_type(module, element_type, element_count); - return array_type; - } - } - } - else if (start_character == '@') - { - module->offset += 1; - auto identifier = parse_identifier(module); - enum class TypeIntrinsic - { - return_type, - count, - }; - - String type_intrinsics[] = { - string_literal("ReturnType"), - }; - - static_assert(array_length(type_intrinsics) == (u64)TypeIntrinsic::count); - - backing_type(TypeIntrinsic) i; - for (i = 0; i < (backing_type(TypeIntrinsic))TypeIntrinsic::count; i += 1) - { - String type_intrinsic = type_intrinsics[i]; - if (identifier.equal(type_intrinsic)) - { - break; - } - } - - auto intrinsic = (TypeIntrinsic)i; - switch (intrinsic) - { - case TypeIntrinsic::return_type: - { - auto return_type = module->current_function->variable.type->function.base.semantic_return_type; - return return_type; - } break; - case TypeIntrinsic::count: report_error(); - } - } - else - { - report_error(); - } -} - -fn u64 parse_hexadecimal(Module* module) -{ - u64 value = 0; - - while (true) - { - auto ch = module->content[module->offset]; - - if (!is_hexadecimal(ch)) - { - break; - } - - module->offset += 1; - value = accumulate_hexadecimal(value, ch); - } - - return value; -} - -fn u64 parse_decimal(Module* module) -{ - u64 value = 0; - - while (true) - { - auto ch = module->content[module->offset]; - - if (!is_decimal(ch)) - { - break; - } - - module->offset += 1; - value = accumulate_decimal(value, ch); - } - - return value; -} - -fn u64 parse_octal(Module* module) -{ - u64 value = 0; - - while (true) - { - auto ch = module->content[module->offset]; - - if (!is_octal(ch)) - { - break; - } - - module->offset += 1; - value = accumulate_octal(value, ch); - } - - return value; -} - -fn u64 parse_binary(Module* module) -{ - u64 value = 0; - - while (true) - { - auto ch = module->content[module->offset]; - - if (!is_binary(ch)) - { - break; - } - - module->offset += 1; - value = accumulate_binary(value, ch); - } - - return value; -} - -fn Token tokenize(Module* module) -{ - skip_space(module); - - auto start_index = module->offset; - if (start_index == module->content.length) - { - report_error(); - } - - auto start_character = module->content[start_index]; - - Token token; - - switch (start_character) - { - case ',': - case ';': - case '~': - case left_brace: - case left_parenthesis: - case left_bracket: - case right_brace: - case right_parenthesis: - case right_bracket: - { - module->offset += 1; - TokenId id; - switch (start_character) - { - case ',': id = TokenId::comma; break; - case ';': id = TokenId::end_of_statement; break; - case '~': id = TokenId::tilde; break; - case left_brace: id = TokenId::left_brace; break; - case left_parenthesis: id = TokenId::left_parenthesis; break; - case left_bracket: id = TokenId::left_bracket; break; - case right_brace: id = TokenId::right_brace; break; - case right_parenthesis: id = TokenId::right_parenthesis; break; - case right_bracket: id = TokenId::right_bracket; break; - default: unreachable(); - } - token = { - .id = id, - }; - } break; - case '@': - { - module->offset += 1; - if (is_identifier_start(module->content[module->offset])) - { - auto identifier = parse_identifier(module); - - String value_intrinsics[] = { - string_literal("align_of"), - string_literal("build_mode"), - string_literal("byte_size"), - string_literal("enum_from_int"), - string_literal("enum_name"), - string_literal("enum_names"), - string_literal("enum_values"), - string_literal("extend"), - string_literal("field_parent_pointer"), - string_literal("has_debug_info"), - string_literal("integer_max"), - string_literal("int_from_enum"), - string_literal("int_from_pointer"), - string_literal("leading_zeroes"), - string_literal("max"), - string_literal("min"), - string_literal("pointer_cast"), - string_literal("pointer_from_int"), - string_literal("select"), - string_literal("string_to_enum"), - string_literal("trailing_zeroes"), - string_literal("trap"), - string_literal("truncate"), - string_literal("va_start"), - string_literal("va_end"), - string_literal("va_arg"), - string_literal("va_copy"), - }; - static_assert(array_length(value_intrinsics) == (u64)ValueIntrinsic::count); - - backing_type(ValueIntrinsic) i; - for (i = 0; i < (backing_type(ValueIntrinsic))(ValueIntrinsic::count); i += 1) - { - String candidate = value_intrinsics[i]; - if (identifier.equal(candidate)) - { - break; - } - } - - auto intrinsic = (ValueIntrinsic)i; - if (intrinsic == ValueIntrinsic::count) - { - report_error(); - } - - token = { - .value_intrinsic = intrinsic, - .id = TokenId::value_intrinsic, - }; - } - else - { - trap(); - } - } break; - case '<': - { - auto next_ch = module->content[start_index + 1]; - TokenId id; - switch (next_ch) - { - case '<': - switch (module->content[start_index + 2]) - { - case '=': id = TokenId::assign_shift_left; break; - default: id = TokenId::shift_left; break; - } break; - case '=': id = TokenId::compare_less_equal; break; - default: id = TokenId::compare_less; break; - } - - u64 add; - switch (id) - { - case TokenId::assign_shift_left: add = 3; break; - case TokenId::shift_left: - case TokenId::compare_less_equal: add = 2; break; - case TokenId::compare_less: add = 1; break; - default: unreachable(); - } - - module->offset += add; - token = { - .id = id, - }; - } break; - case '>': - { - auto next_ch = module->content[start_index + 1]; - TokenId id; - switch (next_ch) - { - case '>': - switch (module->content[start_index + 2]) - { - case '=': id = TokenId::assign_shift_right; break; - default: id = TokenId::shift_right; break; - } break; - case '=': id = TokenId::compare_greater_equal; break; - default: id = TokenId::compare_greater; break; - } - - u64 add; - switch (id) - { - case TokenId::assign_shift_right: add = 3; break; - case TokenId::shift_right: - case TokenId::compare_greater_equal: add = 2; break; - case TokenId::compare_greater: add = 1; break; - default: unreachable(); - } - - module->offset += add; - token = { - .id = id, - }; - } break; - case '=': - { - auto next_ch = module->content[start_index + 1]; - auto is_compare_equal = next_ch == '='; - TokenId id = is_compare_equal ? TokenId::compare_equal : TokenId::assign; - module->offset += is_compare_equal + 1; - token = { - .id = id, - }; - } break; - case '.': - { - auto next_ch = module->content[start_index + 1]; - TokenId id; - switch (next_ch) - { - default: id = TokenId::dot; break; - case '&': id = TokenId::pointer_dereference; break; - case '.': - switch (module->content[start_index + 2]) - { - case '.': id = TokenId::triple_dot; break; - default: id = TokenId::double_dot; break; - } break; - } - - u64 add; - switch (id) - { - case TokenId::dot: add = 1; break; - case TokenId::double_dot: add = 2; break; - case TokenId::triple_dot: add = 3; break; - case TokenId::pointer_dereference: add = 2; break; - default: unreachable(); - } - module->offset += add; - - token = { - .id = id, - }; - } break; - case '"': - { - auto string_literal = parse_string_literal(module); - - token = { - .string_literal = string_literal, - .id = TokenId::string_literal, - }; - } break; - case '\'': - { - module->offset += 1; - - u8 ch; - if (module->content[module->offset] == '\\') - { - module->offset += 1; - ch = escape_character(module->content[module->offset]); - } - else - { - ch = module->content[module->offset]; - if (ch == '\'') - { - report_error(); - } - } - - module->offset += 1; - expect_character(module, '\''); - token = Token{ - .integer = { - .value = ch, - .kind = TokenIntegerKind::character_literal, - }, - .id = TokenId::integer, - }; - } break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - auto next_ch = module->content[start_index + 1]; - TokenIntegerKind token_integer_kind = TokenIntegerKind::decimal; - if (start_character == '0') - { - switch (next_ch) - { - case 'x': token_integer_kind = TokenIntegerKind::hexadecimal; break; - case 'd': token_integer_kind = TokenIntegerKind::decimal; break; - case 'o': token_integer_kind = TokenIntegerKind::octal; break; - case 'b': token_integer_kind = TokenIntegerKind::binary; break; - default: token_integer_kind = TokenIntegerKind::decimal; break; - } - auto inferred_decimal = token_integer_kind == TokenIntegerKind::decimal && next_ch != 'd'; - module->offset += 2 * (token_integer_kind != TokenIntegerKind::decimal || !inferred_decimal); - } - - u64 value; - switch (token_integer_kind) - { - case TokenIntegerKind::hexadecimal: value = parse_hexadecimal(module); break; - case TokenIntegerKind::decimal: value = parse_decimal(module); break; - case TokenIntegerKind::octal: value = parse_octal(module); break; - case TokenIntegerKind::binary: value = parse_binary(module); break; - case TokenIntegerKind::character_literal: report_error(); break; - } - - token = { - .integer = { - .value = value, - .kind = token_integer_kind, - }, - .id = TokenId::integer, - }; - } break; - case '+': - case '-': - case '*': - case '/': - case '%': - case '&': - case '|': - case '^': - case '!': - { - auto next_ch = module->content[start_index + 1]; - TokenId id; - if (next_ch == '=') - { - switch (start_character) - { - case '+': id = TokenId::assign_plus; break; - case '-': id = TokenId::assign_dash; break; - case '*': id = TokenId::assign_asterisk; break; - case '/': id = TokenId::assign_forward_slash; break; - case '%': id = TokenId::assign_percentage; break; - case '&': id = TokenId::assign_ampersand; break; - case '|': id = TokenId::assign_bar; break; - case '^': id = TokenId::assign_caret; break; - case '!': id = TokenId::compare_not_equal; break; - default: unreachable(); - } - } - else - { - switch (start_character) - { - case '+': id = TokenId::plus; break; - case '-': id = TokenId::dash; break; - case '*': id = TokenId::asterisk; break; - case '/': id = TokenId::forward_slash; break; - case '%': id = TokenId::percentage; break; - case '&': id = TokenId::ampersand; break; - case '|': id = TokenId::bar; break; - case '^': id = TokenId::caret; break; - case '!': id = TokenId::exclamation; break; - default: unreachable(); - } - } - - token.id = id; - - module->offset += 1 + (next_ch == '='); - } break; - default: - { - if (is_identifier_start(start_character)) - { - auto identifier = parse_identifier(module); - - String value_keywords[] = { - string_literal("undefined"), - string_literal("unreachable"), - string_literal("zero"), - }; - static_assert(array_length(value_keywords) == (u64)ValueKeyword::count); - - backing_type(ValueKeyword) i; - for (i = 0; i < (backing_type(ValueKeyword))ValueKeyword::count; i += 1) - { - String candidate = value_keywords[i]; - if (candidate.equal(identifier)) - { - break; - } - } - - auto value_keyword = (ValueKeyword)i; - - if (value_keyword == ValueKeyword::count) - { - auto advance = identifier.pointer[identifier.length] == '?'; - identifier.length += advance; - module->offset += advance; - - String operators[] = { - string_literal("and"), - string_literal("or"), - string_literal("and?"), - string_literal("or?"), - }; - static_assert(array_length(operators) == (u64)OperatorKeyword::count); - - backing_type(OperatorKeyword) i; - for (i = 0; i < (backing_type(OperatorKeyword))OperatorKeyword::count; i += 1) - { - auto candidate = operators[i]; - if (candidate.equal(identifier)) - { - break; - } - } - - auto operator_keyword = (OperatorKeyword)i; - if (operator_keyword == OperatorKeyword::count) - { - identifier.length -= advance; - module->offset -= advance; - - token = { - .identifier = identifier, - .id = TokenId::identifier, - }; - } - else - { - token = { - .operator_keyword = operator_keyword, - .id = TokenId::operator_keyword, - }; - } - } - else - { - token = { - .value_keyword = value_keyword, - .id = TokenId::value_keyword, - }; - } - } - else - { - report_error(); - } - } break; - } - - assert(start_index != module->offset); - return token; -} - -fn Value* parse_value(Module* module, Scope* scope, ValueBuilder builder); - -fn Value* parse_aggregate_initialization(Module* module, Scope* scope, ValueBuilder builder, u8 end_ch) -{ - skip_space(module); - - u64 field_count = 0; - - AggregateInitializationElement element_buffer[64]; - bool zero = false; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, end_ch)) - { - break; - } - - auto field_index = field_count; - auto checkpoint = get_checkpoint(module); - if (consume_character_if_match(module, '.')) - { - auto name = parse_identifier(module); - skip_space(module); - expect_character(module, '='); - skip_space(module); - - auto line = get_line(module); - auto column = get_column(module); - - auto value = parse_value(module, scope, {}); - skip_space(module); - consume_character_if_match(module, ','); - - element_buffer[field_index] = { - .name = name, - .value = value, - .line = line, - .column = column, - }; - } - else - { - auto token = tokenize(module); - zero = token.id == TokenId::value_keyword && token.value_keyword == ValueKeyword::zero; - if (zero) - { - skip_space(module); - - if (consume_character_if_match(module, ',')) - { - skip_space(module); - } - - expect_character(module, right_brace); - break; - } - else - { - report_error(); - } - } - - field_count += 1; - } - - auto elements = arena_allocate(module->arena, field_count); - memcpy(elements.pointer, element_buffer, sizeof(element_buffer[0]) * field_count); - - auto result = new_value(module); - *result = { - .aggregate_initialization = { - .elements = elements, - .scope = scope, - .is_constant = false, - .zero = zero, - }, - .id = ValueId::aggregate_initialization, - .kind = builder.kind, - }; - - return result; -} - -fn Value* parse_precedence(Module* module, Scope* scope, ValueBuilder builder); -fn Value* parse_left(Module* module, Scope* scope, ValueBuilder builder) -{ - Token token = builder.token; - Value* result; - switch (token.id) - { - case TokenId::integer: - { - auto integer_value = token.integer.value; - result = new_value(module); - *result = { - .constant_integer = { - .value = integer_value, - .is_signed = false, - }, - .id = ValueId::constant_integer, - .kind = ValueKind::right, - }; - } break; - case TokenId::dash: - case TokenId::ampersand: - case TokenId::exclamation: - case TokenId::tilde: - // Unary - { - assert(!builder.left); - UnaryId id; - switch (token.id) - { - case TokenId::dash: id = UnaryId::minus; break; - case TokenId::ampersand: id = UnaryId::ampersand; break; - case TokenId::exclamation: id = UnaryId::exclamation; break; - case TokenId::tilde: id = UnaryId::bitwise_not; break; - default: unreachable(); - } - - auto unary_value = parse_precedence(module, scope, builder.with_precedence(Precedence::prefix).with_token({}).with_kind(token.id == TokenId::ampersand ? ValueKind::left : builder.kind)); - - result = new_value(module); - *result = { - .unary = { - .value = unary_value, - .id = id, - }, - .id = ValueId::unary, - .kind = ValueKind::right, - }; - } break; - case TokenId::identifier: - { - result = reference_identifier(module, scope, token.identifier, builder.kind); - } break; - case TokenId::value_intrinsic: - { - ValueIntrinsic intrinsic = token.value_intrinsic; - result = new_value(module); - - switch (intrinsic) - { - case ValueIntrinsic::enum_from_int: - case ValueIntrinsic::enum_name: - case ValueIntrinsic::extend: - case ValueIntrinsic::int_from_enum: - case ValueIntrinsic::int_from_pointer: - case ValueIntrinsic::leading_zeroes: - case ValueIntrinsic::truncate: - case ValueIntrinsic::pointer_cast: - case ValueIntrinsic::pointer_from_int: - case ValueIntrinsic::trailing_zeroes: - case ValueIntrinsic::va_end: - { - UnaryId id; - switch (intrinsic) - { - case ValueIntrinsic::enum_from_int: id = UnaryId::enum_from_int; break; - case ValueIntrinsic::enum_name: id = UnaryId::enum_name; break; - case ValueIntrinsic::extend: id = UnaryId::extend; break; - case ValueIntrinsic::int_from_enum: id = UnaryId::int_from_enum; break; - case ValueIntrinsic::int_from_pointer: id = UnaryId::int_from_pointer; break; - case ValueIntrinsic::leading_zeroes: id = UnaryId::leading_zeroes; break; - case ValueIntrinsic::truncate: id = UnaryId::truncate; break; - case ValueIntrinsic::pointer_cast: id = UnaryId::pointer_cast; break; - case ValueIntrinsic::pointer_from_int: id = UnaryId::pointer_from_int; break; - case ValueIntrinsic::trailing_zeroes: id = UnaryId::trailing_zeroes; break; - case ValueIntrinsic::va_end: id = UnaryId::va_end; break; - default: unreachable(); - } - - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - auto argument = parse_value(module, scope, {}); - expect_character(module, right_parenthesis); - - *result = { - .unary = { - .value = argument, - .id = id, - }, - .id = ValueId::unary, - }; - } break; - case ValueIntrinsic::align_of: - case ValueIntrinsic::byte_size: - case ValueIntrinsic::enum_values: - case ValueIntrinsic::enum_names: - case ValueIntrinsic::integer_max: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto type = parse_type(module, scope); - - expect_character(module, right_parenthesis); - - UnaryTypeId id; - switch (intrinsic) - { - case ValueIntrinsic::align_of: id = UnaryTypeId::align_of; break; - case ValueIntrinsic::byte_size: id = UnaryTypeId::byte_size; break; - case ValueIntrinsic::enum_names: id = UnaryTypeId::enum_names; break; - case ValueIntrinsic::enum_values: id = UnaryTypeId::enum_values; break; - case ValueIntrinsic::integer_max: id = UnaryTypeId::integer_max; break; - default: unreachable(); - } - - *result = { - .unary_type = { - .type = type, - .id = id, - }, - .id = ValueId::unary_type, - }; - } break; - case ValueIntrinsic::select: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto condition = parse_value(module, scope, {}); - - expect_character(module, ','); - skip_space(module); - - auto true_value = parse_value(module, scope, {}); - - expect_character(module, ','); - skip_space(module); - - auto false_value = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, right_parenthesis); - - *result = { - .select = { - .condition = condition, - .true_value = true_value, - .false_value = false_value, - }, - .id = ValueId::select, - }; - } break; - case ValueIntrinsic::string_to_enum: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto type = parse_type(module, scope); - - skip_space(module); - expect_character(module, ','); - skip_space(module); - - auto string_value = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, right_parenthesis); - *result = { - .string_to_enum = { - .type = type, - .string = string_value, - }, - .id = ValueId::string_to_enum, - }; - } break; - case ValueIntrinsic::trap: - case ValueIntrinsic::va_start: - case ValueIntrinsic::has_debug_info: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - expect_character(module, right_parenthesis); - - ValueId id; - switch (intrinsic) - { - case ValueIntrinsic::trap: id = ValueId::trap; break; - case ValueIntrinsic::va_start: id = ValueId::va_start; break; - case ValueIntrinsic::has_debug_info: id = ValueId::has_debug_info; break; - default: unreachable(); - } - *result = { - .id = id, - }; - } break; - case ValueIntrinsic::va_arg: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - auto valist = parse_value(module, scope, {}); - skip_space(module); - expect_character(module, ','); - skip_space(module); - auto ty = parse_type(module, scope); - skip_space(module); - expect_character(module, right_parenthesis); - *result = { - .va_arg = { - .va_list = valist, - .type = ty, - }, - .id = ValueId::va_arg, - }; - } break; - case ValueIntrinsic::va_copy: - { - trap(); - } break; - case ValueIntrinsic::min: - case ValueIntrinsic::max: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - auto left = parse_value(module, scope, {}); - skip_space(module); - expect_character(module, ','); - skip_space(module); - auto right = parse_value(module, scope, {}); - skip_space(module); - expect_character(module, right_parenthesis); - - BinaryId binary_id; - switch (intrinsic) - { - case ValueIntrinsic::max: binary_id = BinaryId::max; break; - case ValueIntrinsic::min: binary_id = BinaryId::min; break; - default: unreachable(); - } - - *result = { - .binary = { - .left = left, - .right = right, - .id = binary_id, - }, - .id = ValueId::binary, - }; - } break; - case ValueIntrinsic::build_mode: - { - *result = { - .id = ValueId::build_mode, - }; - } break; - case ValueIntrinsic::field_parent_pointer: - { - skip_space(module); - expect_character(module, left_parenthesis); - - auto field_pointer = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, ','); - skip_space(module); - - auto field_name = parse_string_literal(module); - - skip_space(module); - expect_character(module, right_parenthesis); - - *result = { - .field_parent_pointer = { - .pointer = field_pointer, - .name = field_name, - }, - .id = ValueId::field_parent_pointer, - }; - } break; - case ValueIntrinsic::count: unreachable(); - } - } break; - case TokenId::left_bracket: - { - u64 element_count = 0; - Value* value_buffer[128]; - - skip_space(module); - - auto checkpoint = get_checkpoint(module); - bool is_aggregate_initialization = false; - if (consume_character_if_match(module, '.')) - { - auto identifier = parse_identifier(module); - - skip_space(module); - is_aggregate_initialization = consume_character_if_match(module, '='); - if (!is_aggregate_initialization) - { - if (!consume_character_if_match(module, ',')) - { - report_error(); - } - } - } - - set_checkpoint(module, checkpoint); - - if (is_aggregate_initialization) - { - result = parse_aggregate_initialization(module, scope, builder, right_bracket); - } - else - { - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_bracket)) - { - break; - } - - auto value = parse_value(module, scope, {}); - assert(element_count < array_length(value_buffer)); - value_buffer[element_count] = value; - element_count += 1; - - consume_character_if_match(module, ','); - } - - auto values = new_value_array(module, element_count); - memcpy(values.pointer, value_buffer, element_count * sizeof(Value*)); - - result = new_value(module); - *result = { - .array_initialization = { - .values = values, - .is_constant = false, // This is analyzed later - }, - .id = ValueId::array_initialization, - }; - } - } break; - case TokenId::dot: - { - auto identifier = parse_name(module); - result = new_value(module); - - *result = { - .enum_literal = identifier, - .id = ValueId::enum_literal, - }; - } break; - case TokenId::left_parenthesis: - { - result = parse_value(module, scope, { - .kind = builder.kind, - }); - expect_character(module, right_parenthesis); - } break; - case TokenId::string_literal: - { - result = new_value(module); - *result = { - .string_literal = token.string_literal, - .id = ValueId::string_literal, - }; - } break; - case TokenId::left_brace: - { - result = parse_aggregate_initialization(module, scope, builder, right_brace); - } break; - case TokenId::value_keyword: - { - result = new_value(module); - Value value; - switch (token.value_keyword) - { - case ValueKeyword::undefined: value = { .id = ValueId::undefined }; break; - case ValueKeyword::unreachable: value = { .id = ValueId::unreachable }; break; - case ValueKeyword::zero: value = { .id = ValueId::zero }; break; - case ValueKeyword::count: unreachable(); - } - *result = value; - } break; - default: report_error(); - } - - return result; -} - -fn Precedence get_token_precedence(Token token) -{ - switch (token.id) - { - case TokenId::none: unreachable(); - case TokenId::comma: - case TokenId::double_dot: - case TokenId::triple_dot: - case TokenId::end_of_statement: - case TokenId::right_brace: - case TokenId::right_bracket: - case TokenId::right_parenthesis: - return Precedence::none; - case TokenId::assign: - case TokenId::assign_shift_left: - case TokenId::assign_shift_right: - case TokenId::assign_plus: - case TokenId::assign_dash: - case TokenId::assign_asterisk: - case TokenId::assign_forward_slash: - case TokenId::assign_percentage: - case TokenId::assign_caret: - case TokenId::assign_bar: - case TokenId::assign_ampersand: - return Precedence::assignment; - case TokenId::operator_keyword: // TODO: check if any other operator that is not bitwise is added - { - switch (token.operator_keyword) - { - case OperatorKeyword::and_op: - case OperatorKeyword::and_op_shortcircuit: - return Precedence::boolean_and; - case OperatorKeyword::or_op: - case OperatorKeyword::or_op_shortcircuit: - return Precedence::boolean_or; - case OperatorKeyword::count: unreachable(); - } - } break; - case TokenId::compare_equal: - case TokenId::compare_not_equal: - case TokenId::compare_less: - case TokenId::compare_less_equal: - case TokenId::compare_greater: - case TokenId::compare_greater_equal: - return Precedence::comparison; - case TokenId::ampersand: - case TokenId::bar: - case TokenId::caret: - return Precedence::bitwise; - case TokenId::shift_left: - case TokenId::shift_right: - return Precedence::shifting; - case TokenId::plus: - case TokenId::dash: - return Precedence::add_like; - case TokenId::asterisk: - case TokenId::forward_slash: - case TokenId::percentage: - return Precedence::div_like; - case TokenId::pointer_dereference: - case TokenId::left_parenthesis: - case TokenId::left_bracket: - case TokenId::dot: - return Precedence::postfix; - default: trap(); - } -} - -fn Slice parse_call_arguments(Module* module, Scope* scope) -{ - Slice arguments = {}; - - u32 semantic_argument_count = 0; - Value* semantic_argument_buffer[64]; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_parenthesis)) - { - break; - } - - auto argument = parse_value(module, scope, {}); - auto argument_index = semantic_argument_count; - semantic_argument_buffer[argument_index] = argument; - - skip_space(module); - - consume_character_if_match(module, ','); - - semantic_argument_count += 1; - } - - if (semantic_argument_count != 0) - { - arguments = new_value_array(module, semantic_argument_count); - memcpy(arguments.pointer, semantic_argument_buffer, semantic_argument_count * sizeof(Value*)); - } - - return arguments; -} - -fn Value* parse_right(Module* module, Scope* scope, ValueBuilder builder) -{ - auto* left = builder.left; - assert(left); - - Token token = builder.token; - Value* result = 0; - - switch (token.id) - { - case TokenId::plus: - case TokenId::dash: - case TokenId::asterisk: - case TokenId::forward_slash: - case TokenId::percentage: - case TokenId::ampersand: - case TokenId::bar: - case TokenId::caret: - case TokenId::shift_left: - case TokenId::shift_right: - case TokenId::compare_equal: - case TokenId::compare_not_equal: - case TokenId::compare_less: - case TokenId::compare_less_equal: - case TokenId::compare_greater: - case TokenId::compare_greater_equal: - case TokenId::operator_keyword: - // Binary - { - auto precedence = get_token_precedence(token); - assert(precedence != Precedence::assignment); - - BinaryId id; - switch (token.id) - { - case TokenId::operator_keyword: - switch (token.operator_keyword) - { - case OperatorKeyword::and_op: id = BinaryId::logical_and; break; - case OperatorKeyword::or_op: id = BinaryId::logical_or; break; - case OperatorKeyword::and_op_shortcircuit: id = BinaryId::logical_and_shortcircuit; break; - case OperatorKeyword::or_op_shortcircuit: id = BinaryId::logical_or_shortcircuit; break; - case OperatorKeyword::count: unreachable(); - } break; - case TokenId::plus: id = BinaryId::add; break; - case TokenId::dash: id = BinaryId::sub; break; - case TokenId::asterisk: id = BinaryId::mul; break; - case TokenId::forward_slash: id = BinaryId::div; break; - case TokenId::percentage: id = BinaryId::rem; break; - case TokenId::ampersand: id = BinaryId::bitwise_and; break; - case TokenId::bar: id = BinaryId::bitwise_or; break; - case TokenId::caret: id = BinaryId::bitwise_xor; break; - case TokenId::shift_left: id = BinaryId::shift_left; break; - case TokenId::shift_right: id = BinaryId::shift_right; break; - case TokenId::compare_equal: id = BinaryId::compare_equal; break; - case TokenId::compare_not_equal: id = BinaryId::compare_not_equal; break; - case TokenId::compare_less: id = BinaryId::compare_less; break; - case TokenId::compare_less_equal: id = BinaryId::compare_less_equal; break; - case TokenId::compare_greater: id = BinaryId::compare_greater; break; - case TokenId::compare_greater_equal: id = BinaryId::compare_greater_equal; break; - default: unreachable(); - } - - auto right_precedence = (Precedence)((backing_type(Precedence))precedence + (precedence != Precedence::assignment)); - auto right = parse_precedence(module, scope, builder.with_precedence(right_precedence).with_token({}).with_left(0)); - - result = new_value(module); - *result = { - .binary = { - .left = left, - .right = right, - .id = id, - }, - .id = ValueId::binary, - .kind = ValueKind::right, - }; - } break; - case TokenId::pointer_dereference: - { - result = new_value(module); - *result = { - .unary = { - .value = left, - .id = UnaryId::dereference, - }, - .id = ValueId::unary, - .kind = ValueKind::right, - }; - } break; - case TokenId::left_parenthesis: - { - result = new_value(module); - // Callable - switch (left->id) - { - case ValueId::macro_reference: - { - auto* declaration = left->macro_reference; - if (declaration->is_generic()) - { - report_error(); - } - - auto instantiation_line = get_line(module); - auto instantiation_column = get_column(module); - - auto arguments = parse_call_arguments(module, scope); - - *result = { - .macro_instantiation = { - .declaration = declaration, - .instantiation_function = module->current_function, - .declaration_arguments = {}, - .instantiation_arguments = arguments, - .constant_arguments = {}, - .return_type = declaration->return_type, - .scope = { - .parent = scope, - .line = declaration->scope.line, - .column = declaration->scope.column, - .kind = ScopeKind::macro_instantiation, - }, - .line = instantiation_line, - .column = instantiation_column, - }, - .id = ValueId::macro_instantiation, - }; - } break; - default: - { - auto arguments = parse_call_arguments(module, scope); - *result = { - .call = { - .callable = left, - .arguments = arguments, - }, - .id = ValueId::call, - .kind = ValueKind::right, - }; - } break; - } - } break; - case TokenId::left_bracket: - { - skip_space(module); - result = new_value(module); - - if (left->id == ValueId::macro_reference) - { - auto* declaration = left->macro_reference; - if (!declaration->is_generic()) - { - report_error(); - } - - auto instantiation_line = get_line(module); - auto instantiation_column = get_column(module); - auto original_constant_argument_count = declaration->constant_arguments.length; - auto constant_arguments = arena_allocate(module->arena, original_constant_argument_count); - u64 constant_argument_count = 0; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_bracket)) - { - break; - } - - auto constant_argument_index = constant_argument_count; - if (constant_argument_index == original_constant_argument_count) - { - report_error(); - } - - auto constant_argument = declaration->constant_arguments[constant_argument_index]; - - switch (constant_argument.id) - { - case ConstantArgumentId::value: - { - trap(); // TODO - } break; - case ConstantArgumentId::type: - { - auto argument_type = parse_type(module, scope); - constant_arguments[constant_argument_index] = { - .name = constant_argument.name, - .type = argument_type, - .id = ConstantArgumentId::type, - }; - } break; - } - - constant_argument_count += 1; - - skip_space(module); - consume_character_if_match(module, ','); - } - - skip_space(module); - - expect_character(module, left_parenthesis); - - auto instantiation_arguments = parse_call_arguments(module, scope); - - *result = { - .macro_instantiation = { - .declaration = declaration, - .instantiation_function = module->current_function, - .declaration_arguments = {}, - .instantiation_arguments = instantiation_arguments, - .constant_arguments = constant_arguments, - .return_type = declaration->return_type, - .block = 0, - .scope = { - .parent = scope, - .line = declaration->scope.line, - .column = declaration->scope.column, - .kind = ScopeKind::macro_instantiation, - }, - .line = instantiation_line, - .column = instantiation_column, - }, - .id = ValueId::macro_instantiation, - }; - } - else - { - left->kind = ValueKind::left; - - Value* start_value = 0; - auto start = !(module->content[module->offset] == '.' && module->content[module->offset + 1] == '.'); - if (start) - { - start_value = parse_value(module, scope, {}); - } - - auto is_array = consume_character_if_match(module, right_bracket); - if (is_array) - { - if (!start_value) - { - report_error(); - } - - auto index = start_value; - *result = { - .array_expression = { - .array_like = left, - .index = index, - }, - .id = ValueId::array_expression, - .kind = builder.kind, - }; - } - else - { - expect_character(module, '.'); - expect_character(module, '.'); - - Value* end_value = 0; - if (!consume_character_if_match(module, right_bracket)) - { - end_value = parse_value(module, scope, {}); - expect_character(module, right_bracket); - } - - *result = { - .slice_expression = { - .array_like = left, - .start = start_value, - .end = end_value, - }, - .id = ValueId::slice_expression, - }; - } - } - } break; - case TokenId::dot: - { - left->kind = ValueKind::left; - - skip_space(module); - - auto identifier = parse_identifier(module); - result = new_value(module); - *result = { - .field_access = { - .aggregate = left, - .field_name = identifier, - }, - .id = ValueId::field_access, - .kind = builder.kind, - }; - } break; - default: report_error(); - } - - return result; -} - -fn Value* parse_precedence_left(Module* module, Scope* scope, ValueBuilder builder) -{ - auto result = builder.left; - auto precedence = builder.precedence; - - while (1) - { - auto checkpoint = get_checkpoint(module); - auto token = tokenize(module); - auto token_precedence = get_token_precedence(token); - if (token_precedence == Precedence::assignment) - { - token_precedence = builder.allow_assignment_operators ? Precedence::assignment : Precedence::none; - } - - if ((backing_type(Precedence))precedence > (backing_type(Precedence))token_precedence) - { - set_checkpoint(module, checkpoint); - break; - } - - auto left = result; - auto right = parse_right(module, scope, builder.with_token(token).with_precedence(Precedence::none).with_left(left)); - result = right; - } - - return result; -} - -fn Value* parse_precedence(Module* module, Scope* scope, ValueBuilder builder) -{ - assert(builder.token.id == TokenId::none); - auto token = tokenize(module); - auto left = parse_left(module, scope, builder.with_token(token)); - auto result = parse_precedence_left(module, scope, builder.with_left(left)); - return result; -} - -fn Value* parse_value(Module* module, Scope* scope, ValueBuilder builder) -{ - assert(builder.precedence == Precedence::none); - assert(!builder.left); - auto value = parse_precedence(module, scope, builder.with_precedence(Precedence::assignment)); - return value; -} - -fn Block* parse_block(Module* module, Scope* parent_scope); - -fn void print_value(Value* value, u32 identation) -{ - unused(identation); - for (u32 i = 0; i < identation; i += 1) - { - print(string_literal(" ")); - } - - switch (value->id) - { - case ValueId::unary: - { - switch (value->unary.id) - { - case UnaryId::extend: - { - print(string_literal("extend")); - } break; - default: unreachable(); - } - - print(string_literal("\n")); - - print_value(value->unary.value, identation + 1); - } break; - case ValueId::binary: - { - switch (value->binary.id) - { - case BinaryId::compare_equal: - { - print(string_literal("==")); - } break; - case BinaryId::compare_not_equal: - { - print(string_literal("!=")); - } break; - case BinaryId::logical_and: - { - print(string_literal("and")); - } break; - case BinaryId::logical_or: - { - print(string_literal("or")); - } break; - case BinaryId::logical_and_shortcircuit: - { - print(string_literal("and?")); - } break; - case BinaryId::logical_or_shortcircuit: - { - print(string_literal("or?")); - } break; - default: unreachable(); - } - print(string_literal("\n")); - - print_value(value->binary.left, identation + 1); - print_value(value->binary.right, identation + 1); - } break; - case ValueId::variable_reference: - { - print(value->variable_reference->name); - } break; - case ValueId::constant_integer: - { - print(string_literal("constant_integer")); - } break; - case ValueId::call: - { - print(string_literal("call ")); - } break; - default: unreachable(); - } - - print(string_literal("\n")); -} - -fn Statement* parse_statement(Module* module, Scope* scope) -{ - bool require_semicolon = true; - - auto statement_line = get_line(module); - auto statement_column = get_column(module); - - auto* statement = &arena_allocate(module->arena, 1)[0]; - *statement = Statement{ - .line = statement_line, - .column = statement_column, - }; - - auto statement_start_character = module->content[module->offset]; - switch (statement_start_character) - { - case '>': - { - module->offset += 1; - skip_space(module); - - auto local_name = arena_duplicate_string(module->arena, parse_identifier(module)); - skip_space(module); - - Type* local_type = 0; - - if (consume_character_if_match(module, ':')) - { - skip_space(module); - local_type = parse_type(module, scope); - skip_space(module); - } - expect_character(module, '='); - auto initial_value = parse_value(module, scope, {}); - - auto local = new_local(module, scope); - *local = { - .variable = { - .storage = 0, - .initial_value = initial_value, - .type = local_type, - .scope = scope, - .name = local_name, - .line = statement_line, - .column = statement_column, - }, - }; - statement->local = local; - statement->id = StatementId::local; - } break; - case '@': - { - statement->expression = parse_value(module, scope, {}); - statement->id = StatementId::expression; - } break; - case left_brace: - { - auto block = parse_block(module, scope); - statement->block = block; - statement->id = StatementId::block; - require_semicolon = false; - } break; - default: - { - if (is_identifier_start(statement_start_character)) - { - auto checkpoint = get_checkpoint(module); - auto statement_start_identifier = parse_identifier(module); - skip_space(module); - - enum class StatementStartKeyword - { - underscore_st, - return_st, - if_st, - // TODO: make `unreachable` a statement start keyword? - for_st, - while_st, - switch_st, - break_st, - continue_st, - count, - }; - - String statement_start_keywords[] = { - string_literal("_"), - string_literal("return"), - string_literal("if"), - string_literal("for"), - string_literal("while"), - string_literal("switch"), - string_literal("break"), - string_literal("continue"), - }; - - static_assert(array_length(statement_start_keywords) == (u64)StatementStartKeyword::count); - - backing_type(StatementStartKeyword) i; - for (i = 0; i < (backing_type(StatementStartKeyword))StatementStartKeyword::count; i += 1) - { - auto statement_start_keyword = statement_start_keywords[i]; - if (statement_start_keyword.equal(statement_start_identifier)) - { - break; - } - } - - auto statement_start_keyword = (StatementStartKeyword)i; - switch (statement_start_keyword) - { - case StatementStartKeyword::underscore_st: - { - trap(); - } break; - case StatementStartKeyword::return_st: - { - Value* return_value = 0; - if (module->content[module->offset] != ';') - { - return_value = parse_value(module, scope, {}); - } - statement->return_st = return_value; - statement->id = StatementId::return_st; - } break; - case StatementStartKeyword::if_st: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto condition = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, right_parenthesis); - skip_space(module); - - auto if_statement = parse_statement(module, scope); - - skip_space(module); - - bool is_else = false; - Statement* else_statement = 0; - if (is_identifier_start(module->content[module->offset])) - { - auto checkpoint = get_checkpoint(module); - auto identifier = parse_identifier(module); - is_else = identifier.equal(string_literal("else")); - - if (is_else) - { - skip_space(module); - else_statement = parse_statement(module, scope); - } - else - { - set_checkpoint(module, checkpoint); - } - } - - require_semicolon = false; - - statement->if_st = { - .condition = condition, - .if_statement = if_statement, - .else_statement = else_statement, - }; - statement->id = StatementId::if_st; - } break; - case StatementStartKeyword::for_st: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto parent_scope = scope; - - *statement = Statement{ - .for_each = { - .first_local = 0, - .last_local = 0, - .left_values = {}, - .right_values = {}, - .predicate = 0, - .scope = { - .parent = parent_scope, - .line = statement_line, - .column = statement_column, - .kind = ScopeKind::for_each, - }, - .kind = {}, - }, - .id = StatementId::for_each, - .line = statement_line, - .column = statement_column, - }; - - auto scope = &statement->for_each.scope; - - ValueKind left_value_buffer[64]; - u64 left_value_count = 0; - - while (1) - { - skip_space(module); - - auto is_left = module->content[module->offset] == '&'; - module->offset += is_left; - - auto for_local_line = get_line(module); - auto for_local_column = get_column(module); - - if (is_identifier_start(module->content[module->offset])) - { - auto local_name = arena_duplicate_string(module->arena, parse_identifier(module)); - auto local = new_local(module, scope); - *local = { - .variable = { - .storage = 0, - .initial_value = 0, - .type = 0, - .scope = scope, - .name = local_name, - .line = for_local_line, - .column = for_local_column, - }, - }; - - auto kind = is_left ? ValueKind::left : ValueKind::right; - left_value_buffer[left_value_count] = kind; - left_value_count += 1; - } - else - { - trap(); - } - - skip_space(module); - - if (!consume_character_if_match(module, ',')) - { - expect_character(module, ':'); - break; - } - } - - skip_space(module); - - Value* right_value_buffer[64]; - u64 right_value_count = 0; - - right_value_buffer[right_value_count] = parse_value(module, scope, {}); - right_value_count += 1; - - skip_space(module); - - auto token = tokenize(module); - - ForEachKind kind; - switch (token.id) - { - case TokenId::double_dot: - { - if (left_value_count != 1) - { - report_error(); - } - - right_value_buffer[right_value_count] = parse_value(module, scope, {}); - right_value_count += 1; - - expect_character(module, right_parenthesis); - kind = ForEachKind::range; - } break; - case TokenId::right_parenthesis: - { - right_value_buffer[0]->kind = ValueKind::left; - kind = ForEachKind::slice; - } break; - default: report_error(); - } - - statement->for_each.kind = kind; - - if (kind == ForEachKind::slice && left_value_count != right_value_count) - { - report_error(); - } - - auto left_values = arena_allocate(module->arena, left_value_count); - memcpy(left_values.pointer, left_value_buffer, left_value_count * sizeof(left_value_buffer[0])); - auto right_values = arena_allocate(module->arena, right_value_count); - memcpy(right_values.pointer, right_value_buffer, right_value_count * sizeof(right_value_buffer[0])); - - statement->for_each.left_values = left_values; - statement->for_each.right_values = right_values; - - skip_space(module); - - auto predicate = parse_statement(module, scope); - statement->for_each.predicate = predicate; - - skip_space(module); - - require_semicolon = false; - } break; - case StatementStartKeyword::while_st: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto condition = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, right_parenthesis); - skip_space(module); - - auto block = parse_block(module, scope); - - require_semicolon = false; - statement->while_st = { - .condition = condition, - .block = block, - }; - statement->id = StatementId::while_st; - } break; - case StatementStartKeyword::switch_st: - { - skip_space(module); - expect_character(module, left_parenthesis); - skip_space(module); - - auto discriminant = parse_value(module, scope, {}); - - skip_space(module); - expect_character(module, right_parenthesis); - - skip_space(module); - expect_character(module, left_brace); - - StatementSwitchClause clause_buffer[64]; - u64 clause_count = 0; - - while (1) - { - skip_space(module); - - bool is_else = false; - if (is_identifier_start(module->content[module->offset])) - { - auto else_checkpoint = get_checkpoint(module); - auto i = parse_identifier(module); - is_else = i.equal(string_literal("else")); - if (!is_else) - { - set_checkpoint(module, else_checkpoint); - } - } - - Slice clause_values = {}; - if (is_else) - { - skip_space(module); - - expect_character(module, '='); - expect_character(module, '>'); - } - else - { - ClauseDiscriminant case_buffer[64]; - u64 case_count = 0; - - while (1) - { - auto first_case_value = parse_value(module, scope, {}); - - skip_space(module); - - auto checkpoint = get_checkpoint(module); - auto token = tokenize(module); - - ClauseDiscriminant clause_discriminant; - switch (token.id) - { - case TokenId::triple_dot: - { - auto last_case_value = parse_value(module, scope, {}); - clause_discriminant = { - .range = { first_case_value, last_case_value }, - .id = ClauseDiscriminantId::range, - }; - } break; - default: - { - if (token.id != TokenId::comma) set_checkpoint(module, checkpoint); - - clause_discriminant = { - .single = first_case_value, - .id = ClauseDiscriminantId::single, - }; - } break; - } - - switch (clause_discriminant.id) - { - case ClauseDiscriminantId::single: - { - assert(clause_discriminant.single); - } break; - case ClauseDiscriminantId::range: - { - assert(clause_discriminant.range[0]); - assert(clause_discriminant.range[1]); - } break; - } - - case_buffer[case_count] = clause_discriminant; - case_count += 1; - - skip_space(module); - - if (consume_character_if_match(module, '=')) - { - expect_character(module, '>'); - break; - } - } - - clause_values = arena_allocate(module->arena, case_count); - memcpy(clause_values.pointer, case_buffer, case_count * sizeof(case_buffer[0])); - } - - skip_space(module); - - auto clause_block = parse_block(module, scope); - clause_buffer[clause_count] = { - .values = clause_values, - .block = clause_block, - }; - clause_count += 1; - - consume_character_if_match(module, ','); - - skip_space(module); - - if (consume_character_if_match(module, right_brace)) - { - break; - } - } - - auto clauses = arena_allocate(module->arena, clause_count); - memcpy(clauses.pointer, clause_buffer, sizeof(clause_buffer[0]) * clause_count); - - require_semicolon = false; - - statement->switch_st = { - .discriminant = discriminant, - .clauses = clauses, - }; - statement->id = StatementId::switch_st; - } break; - case StatementStartKeyword::break_st: - { - statement->id = StatementId::break_st; - } break; - case StatementStartKeyword::continue_st: - { - statement->id = StatementId::continue_st; - } break; - case StatementStartKeyword::count: - { - set_checkpoint(module, checkpoint); - - auto left = parse_value(module, scope, { .kind = ValueKind::left }); - - skip_space(module); - - if (consume_character_if_match(module, ';')) - { - require_semicolon = false; - statement->expression = left; - statement->id = StatementId::expression; - } - else - { - auto token = tokenize(module); - - StatementAssignmentId id; - switch (token.id) - { - case TokenId::assign: id = StatementAssignmentId::assign; break; - case TokenId::assign_plus: id = StatementAssignmentId::assign_add; break; - case TokenId::assign_dash: id = StatementAssignmentId::assign_sub; break; - case TokenId::assign_asterisk: id = StatementAssignmentId::assign_mul; break; - case TokenId::assign_forward_slash: id = StatementAssignmentId::assign_div; break; - case TokenId::assign_percentage: id = StatementAssignmentId::assign_rem; break; - case TokenId::assign_shift_left: id = StatementAssignmentId::assign_shift_left; break; - case TokenId::assign_shift_right: id = StatementAssignmentId::assign_shift_right; break; - case TokenId::assign_ampersand: id = StatementAssignmentId::assign_and; break; - case TokenId::assign_bar: id = StatementAssignmentId::assign_or; break; - case TokenId::assign_caret: id = StatementAssignmentId::assign_xor; break; - default: trap(); - } - - skip_space(module); - - auto right = parse_value(module, scope, {}); - statement->assignment = { - .left = left, - .right = right, - .id = id, - }; - statement->id = StatementId::assignment; - } - } break; - } - } - else - { - trap(); - } - } break; - } - - if (require_semicolon) - { - expect_character(module, ';'); - } - - return statement; -} - -fn Block* parse_block(Module* module, Scope* parent_scope) -{ - auto* block = &arena_allocate(module->arena, 1)[0]; - *block = { - .scope = { - .parent = parent_scope, - .line = get_line(module), - .column = get_column(module), - .kind = ScopeKind::local, - }, - }; - auto* scope = &block->scope; - - expect_character(module, left_brace); - - Statement* current_statement = 0; - - while (true) - { - skip_space(module); - - if (module->offset == module->content.length) - { - break; - } - - if (consume_character_if_match(module, right_brace)) - { - break; - } - - auto* statement = parse_statement(module, scope); - if (!block->first_statement) - { - block->first_statement = statement; - } - - if (current_statement) - { - current_statement->next = statement; - } - - assert(statement->next == 0); - current_statement = statement; - } - - return block; -} - -void parse(Module* module) -{ - auto scope = &module->scope; - - while (1) - { - skip_space(module); - - if (module->offset == module->content.length) - { - break; - } - - bool is_export = false; - bool is_extern = false; - - auto global_line = get_line(module); - auto global_column = get_column(module); - - if (consume_character_if_match(module, left_bracket)) - { - while (module->offset < module->content.length) - { - auto global_keyword_string = parse_identifier(module); - enum class GlobalKeyword - { - export_keyword, - extern_keyword, - count, - }; - String global_keyword_strings[] = { - string_literal("export"), - string_literal("extern"), - }; - static_assert(array_length(global_keyword_strings) == (u64)GlobalKeyword::count); - - u32 i; - for (i = 0; i < array_length(global_keyword_strings); i += 1) - { - String keyword = global_keyword_strings[i]; - if (keyword.equal(global_keyword_string)) - { - break; - } - } - - auto global_keyword = (GlobalKeyword)i; - switch (global_keyword) - { - case GlobalKeyword::export_keyword: - { - is_export = true; - } break; - case GlobalKeyword::extern_keyword: - { - is_extern = true; - } break; - case GlobalKeyword::count: - { - report_error(); - } - } - - if (consume_character_if_match(module, right_bracket)) - { - break; - } - else - { - report_error(); - } - } - - skip_space(module); - } - - auto global_name = arena_duplicate_string(module->arena, parse_identifier(module)); - - Global* global_forward_declaration = 0; - Global* last_global = module->first_global; - while (last_global) - { - if (global_name.equal(last_global->variable.name)) - { - global_forward_declaration = last_global; - if (last_global->variable.storage->id != ValueId::forward_declared_function) - { - report_error(); - } - - if (last_global->linkage == Linkage::external) - { - report_error(); - } - - break; - } - - last_global = last_global->next; - } - - Type* type_it = module->scope.types.first; - Type* type_forward_declaration = 0; - while (type_it) - { - if (global_name.equal(type_it->name)) - { - if (type_it->id == TypeId::forward_declaration) - { - type_forward_declaration = type_it; - break; - } - else - { - report_error(); - } - } - - if (!type_it->next) - { - break; - } - - type_it = type_it->next; - } - - skip_space(module); - - Type* global_type = 0; - - if (consume_character_if_match(module, ':')) - { - skip_space(module); - - global_type = parse_type(module, scope); - - skip_space(module); - } - - expect_character(module, '='); - - skip_space(module); - - enum class GlobalKeyword - { - bits, - enumerator, - function, - macro, - opaque, - structure, - typealias, - union_type, - count, - }; - - auto i = (backing_type(GlobalKeyword))GlobalKeyword::count; - - if (is_identifier_start(module->content[module->offset])) - { - auto checkpoint = get_checkpoint(module); - auto global_string = parse_identifier(module); - skip_space(module); - - String global_keywords[] = { - string_literal("bits"), - string_literal("enum"), - string_literal("fn"), - string_literal("macro"), - string_literal("opaque"), - string_literal("struct"), - string_literal("typealias"), - string_literal("union"), - }; - static_assert(array_length(global_keywords) == (u64)GlobalKeyword::count); - - for (i = 0; i < (backing_type(GlobalKeyword))GlobalKeyword::count; i += 1) - { - String global_keyword = global_keywords[i]; - if (global_string.equal(global_keyword)) - { - break; - } - } - - auto global_keyword = (GlobalKeyword)i; - - if (global_forward_declaration && global_keyword != GlobalKeyword::function) - { - report_error(); - } - - switch (global_keyword) - { - case GlobalKeyword::bits: - { - auto is_implicit_type = module->content[module->offset] == left_brace; - Type* backing_type = 0; - if (!is_implicit_type) - { - backing_type = parse_type(module, scope); - } - - skip_space(module); - expect_character(module, left_brace); - - u64 field_bit_offset = 0; - u64 field_count = 0; - Field field_buffer[64]; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_brace)) - { - break; - } - - auto field_line = get_line(module); - auto field_name = parse_identifier(module); - - skip_space(module); - expect_character(module, ':'); - skip_space(module); - - auto field_type = parse_type(module, scope); - - auto field_bit_count = get_bit_size(field_type); - - skip_space(module); - - consume_character_if_match(module, ','); - - field_buffer[field_count] = { - .name = field_name, - .type = field_type, - .offset = field_bit_offset, - .line = field_line, - }; - - field_bit_offset += field_bit_count; - field_count += 1; - } - - consume_character_if_match(module, ';'); - - auto fields = arena_allocate(module->arena, field_count); - memcpy(fields.pointer, field_buffer, sizeof(Field) * field_count); - - auto needed_bit_count = MAX(next_power_of_two(field_bit_offset), 8); - if (needed_bit_count > ~(u32)0) - { - report_error(); - } - - auto bit_count = (u32)needed_bit_count; - - if (!backing_type) - { - backing_type = integer_type(module, { .bit_count = bit_count, .is_signed = false }); - } - - if (backing_type->id != TypeId::integer) - { - report_error(); - } - - auto backing_type_bit_size = get_bit_size(backing_type); - if (backing_type_bit_size > 64) - { - report_error(); - } - - auto bits_type = type_allocate_init(module, { - .bits = { - .fields = fields, - .backing_type = backing_type, - .line = global_line, - .is_implicit_backing_type = is_implicit_type, - }, - .id = TypeId::bits, - .name = global_name, - .scope = &module->scope, - }); - unused(bits_type); - } break; - case GlobalKeyword::enumerator: - { - auto is_implicit_type = module->content[module->offset] == left_brace; - Type* backing_type = 0; - if (!is_implicit_type) - { - backing_type = parse_type(module, scope); - } - - skip_space(module); - expect_character(module, left_brace); - - u64 field_count = 0; - String name_buffer[64]; - u64 int_value_buffer[64]; - - bool is_resolved = true; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_brace)) { - break; - } - - auto field_index = field_count; - field_count += 1; - - auto field_name = parse_name(module); - name_buffer[field_index] = field_name; - - skip_space(module); - - u64 field_integer_value = field_index; - - if (consume_character_if_match(module, '=')) - { - skip_space(module); - auto field_value = parse_value(module, scope, {}); - if (is_resolved) - { - if (field_value->is_constant()) - { - switch (field_value->id) - { - case ValueId::constant_integer: - { - field_integer_value = field_value->constant_integer.value; - } break; - default: trap(); - } - } - else - { - trap(); - } - } - else - { - trap(); - } - } - else - { - if (!is_resolved) - { - report_error(); - } - } - - int_value_buffer[field_index] = field_integer_value; - - skip_space(module); - consume_character_if_match(module, ','); - } - - if (is_resolved) - { - auto fields = arena_allocate(module->arena, field_count); - u64 highest_value = 0; - // auto lowest_value = ~(u64)0; - - for (u64 i = 0; i < field_count; i += 1) - { - auto value = int_value_buffer[i]; - highest_value = MAX(highest_value, value); - fields[i] = { - .name = name_buffer[i], - .value = value, - }; - } - - auto needed_bit_count = enum_bit_count(highest_value); - - if (!backing_type) - { - backing_type = integer_type(module, { .bit_count = needed_bit_count, .is_signed = false }); - } - - auto enum_type = type_allocate_init(module, { - .enumerator = { - .fields = fields, - .backing_type = backing_type, - .line = global_line, - }, - .id = TypeId::enumerator, - .name = global_name, - .scope = &module->scope, - }); - - unused(enum_type); - } - else - { - trap(); - } - } break; - case GlobalKeyword::function: - { - auto mandate_argument_names = true; - auto function_header = parse_function_header(module, scope, mandate_argument_names); - - auto function_type = function_header.type; - auto function_attributes = function_header.attributes; - - auto semantic_argument_types = function_type->function.base.semantic_argument_types; - - auto pointer_to_function_type = get_pointer_type(module, function_type); - - Global* global = 0; - if (global_forward_declaration) - { - global = global_forward_declaration; - if (global_forward_declaration->variable.type != function_type) - { - report_error(); - } - - assert(global_forward_declaration->variable.storage->type == pointer_to_function_type); - - global->variable.name = global_name; - global->variable.line = global_line; - global->variable.column = global_column; - } - else - { - auto storage = new_value(module); - *storage = { - .type = pointer_to_function_type, - .id = ValueId::forward_declared_function, - // TODO? .kind = ValueKind::left, - }; - - global = new_global(module); - *global = { - .variable = { - .storage = storage, - .initial_value = 0, - .type = function_type, - .scope = scope, - .name = global_name, - .line = global_line, - .column = global_column, - }, - .linkage = (is_export | is_extern) ? Linkage::external : Linkage::internal, - }; - } - - if (!consume_character_if_match(module, ';')) - { - module->current_function = global; - Slice arguments = arena_allocate(module->arena, semantic_argument_types.length); - for (u32 i = 0; i < semantic_argument_types.length; i += 1) - { - Argument* argument = &arguments[i]; - auto header_argument = function_header.arguments[i]; - auto name = header_argument.name; - auto* type = semantic_argument_types[i]; - auto line = header_argument.line; - - *argument = { - .variable = { - .storage = 0, - .initial_value = 0, - .type = type, - .scope = &global->variable.storage->function.scope, - .name = name, - .line = line, - .column = 0, - }, - .index = i + 1, - }; - } - - global->variable.storage->function = { - .arguments = arguments, - .scope = { - .parent = scope, - .line = global_line, - .column = global_column, - .kind = ScopeKind::function, - }, - .block = 0, - .attributes = function_attributes, - }; - global->variable.storage->id = ValueId::function; - - global->variable.storage->function.block = parse_block(module, &global->variable.storage->function.scope); - module->current_function = 0; - } - } break; - case GlobalKeyword::macro: - { - ConstantArgument constant_argument_buffer[64]; - u64 constant_argument_count = 0; - - auto is_generic = consume_character_if_match(module, left_bracket); - auto macro_declaration = &arena_allocate(module->arena, 1)[0]; - - *macro_declaration = { - .arguments = {}, - .constant_arguments = {}, - .return_type = 0, - .block = 0, - .name = global_name, - .scope = { - .parent = scope, - .line = global_line, - .column = global_column, - .kind = ScopeKind::macro_declaration, - }, - }; - - if (is_generic) - { - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_bracket)) - { - break; - } - - auto argument_name = arena_duplicate_string(module->arena, parse_identifier(module)); - - skip_space(module); - - auto has_value = consume_character_if_match(module, ':'); - - auto constant_argument_index = constant_argument_count; - - if (has_value) - { - trap(); // TODO - } - else - { - auto ty = type_allocate_init(module, { - .id = TypeId::unresolved, - .name = argument_name, - .scope = ¯o_declaration->scope, - }); - - constant_argument_buffer[constant_argument_index] = { - .name = argument_name, - .type = ty, - .id = ConstantArgumentId::type, - }; - } - - constant_argument_count += 1; - } - - skip_space(module); - } - - expect_character(module, left_parenthesis); - - if (is_generic) - { - if (constant_argument_count == 0) - { - report_error(); - } - } - else - { - assert(constant_argument_count == 0); - } - - macro_declaration->constant_arguments = arena_allocate(module->arena, constant_argument_count); - memcpy(macro_declaration->constant_arguments.pointer, constant_argument_buffer, sizeof(constant_argument_buffer[0]) * constant_argument_count); - - if (module->last_macro_declaration) - { - assert(module->first_macro_declaration); - module->last_macro_declaration->next = macro_declaration; - module->last_macro_declaration = macro_declaration; - } - else - { - assert(!module->first_macro_declaration); - module->first_macro_declaration = macro_declaration; - module->last_macro_declaration = macro_declaration; - } - - module->current_macro_declaration = macro_declaration; - - auto scope = ¯o_declaration->scope; - - Argument argument_buffer[64]; - u32 argument_count = 0; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_parenthesis)) - { - break; - } - - auto argument_index = argument_count; - auto argument_line = get_line(module); - auto argument_column = get_column(module); - - auto argument_name = arena_duplicate_string(module->arena, parse_identifier(module)); - - skip_space(module); - expect_character(module, ':'); - skip_space(module); - - auto argument_type = parse_type(module, scope); - - auto argument = &argument_buffer[argument_count]; - *argument = { - .variable = { - .storage = 0, - .initial_value = 0, - .type = argument_type, - .scope = scope, - .name = argument_name, - .line = argument_line, - .column = argument_column, - }, - .index = argument_index + 1, - }; - argument_count += 1; - - skip_space(module); - - consume_character_if_match(module, ','); - } - - skip_space(module); - - auto return_type = parse_type(module, scope); - macro_declaration->return_type = return_type; - - auto arguments = arena_allocate(module->arena, argument_count); - memcpy(arguments.pointer, argument_buffer, sizeof(argument_buffer[0]) * argument_count); - macro_declaration->arguments = arguments; - - skip_space(module); - - auto block = parse_block(module, scope); - macro_declaration->block = block; - - // END OF SCOPE - module->current_macro_declaration = 0; - } break; - case GlobalKeyword::structure: - { - skip_space(module); - - Type* struct_type; - if (type_forward_declaration) - { - struct_type = type_forward_declaration; - } - else - { - struct_type = type_allocate_init(module, { - .id = TypeId::forward_declaration, - .name = global_name, - .scope = &module->scope, - }); - } - - if (consume_character_if_match(module, left_brace)) - { - Field field_buffer[256]; - - u64 byte_size = 0; - u32 byte_alignment = 1; - - u32 field_count = 0; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_brace)) - { - break; - } - - auto field_index = field_count; - auto field_line = get_line(module); - auto field_name = parse_identifier(module); - - skip_space(module); - expect_character(module, ':'); - skip_space(module); - - auto field_type = parse_type(module, scope); - - auto field_byte_alignment = get_byte_alignment(field_type); - auto field_byte_size = get_byte_size(field_type); - // Align struct size by field alignment - auto field_byte_offset = align_forward(byte_size, field_byte_alignment); - - field_buffer[field_index] = { - .name = field_name, - .type = field_type, - .offset = field_byte_offset, - .line = field_line, - }; - - byte_size = field_byte_offset + field_byte_size; - byte_alignment = MAX(byte_alignment, field_byte_alignment); - - skip_space(module); - - consume_character_if_match(module, ','); - - field_count += 1; - } - - byte_size = align_forward(byte_size, byte_alignment); - assert(byte_size % byte_alignment == 0); - - skip_space(module); - consume_character_if_match(module, ';'); - - auto fields = arena_allocate(module->arena, field_count); - memcpy(fields.pointer, field_buffer, sizeof(Field) * field_count); - - struct_type->structure = { - .fields = fields, - .byte_size = byte_size, - .byte_alignment = byte_alignment, - .line = global_line, - .is_slice = false, - .next = 0, - }; - struct_type->id = TypeId::structure; - } - else - { - expect_character(module, ';'); - } - } break; - case GlobalKeyword::typealias: - { - auto aliased_type = parse_type(module, scope); - - if (!consume_character_if_match(module, ';')) - { - report_error(); - } - - auto alias_type = type_allocate_init(module, { - .alias = { - .type = aliased_type, - .scope = scope, - .line = global_line, - }, - .id = TypeId::alias, - .name = global_name, - .scope = scope, - }); - unused(alias_type); - } break; - case GlobalKeyword::union_type: - { - skip_space(module); - expect_character(module, left_brace); - - Type* union_type; - if (type_forward_declaration) - { - union_type = type_forward_declaration; - } - else - { - union_type = type_allocate_init(module, { - .id = TypeId::forward_declaration, - .name = global_name, - .scope = &module->scope, - }); - } - - u32 field_count = 0; - u32 biggest_field = 0; - u32 byte_alignment = 1; - u32 byte_size = 0; - - UnionField field_buffer[64]; - - while (1) - { - skip_space(module); - - if (consume_character_if_match(module, right_brace)) - { - break; - } - - auto field_index = field_count; - field_count += 1; - - auto field_line = get_line(module); - auto field_name = parse_identifier(module); - - skip_space(module); - expect_character(module, ':'); - skip_space(module); - - auto field_type = parse_type(module, scope); - - auto field_byte_alignment = get_byte_alignment(field_type); - auto field_byte_size = get_byte_size(field_type); - - field_buffer[field_index] = UnionField{ - .type = field_type, - .name = field_name, - .line = field_line, - }; - - biggest_field = field_byte_size > byte_size ? field_index : biggest_field; - byte_alignment = MAX(byte_alignment, field_byte_alignment); - byte_size = MAX(byte_size, field_byte_size); - - skip_space(module); - - consume_character_if_match(module, ','); - } - - skip_space(module); - consume_character_if_match(module, ';'); - - auto fields = arena_allocate(module->arena, field_count); - memcpy(fields.pointer, field_buffer, sizeof(field_buffer[0]) * field_count); - - auto biggest_size = get_byte_size(fields[biggest_field].type); - assert(biggest_size == byte_size); - - union_type->union_type = { - .fields = fields, - .byte_size = byte_size, - .byte_alignment = byte_alignment, - .line = global_line, - .biggest_field = biggest_field, - }; - union_type->id = TypeId::union_type; - } break; - case GlobalKeyword::opaque: - { - skip_space(module); - expect_character(module, ';'); - auto opaque_type = type_allocate_init(module, { - .id = TypeId::opaque, - .name = global_name, - .scope = &module->scope, - }); - unused(opaque_type); - } break; - case GlobalKeyword::count: - { - set_checkpoint(module, checkpoint); - } break; - } - } - - if (i == (backing_type(GlobalKeyword))GlobalKeyword::count) - { - auto initial_value = parse_value(module, scope, {}); - skip_space(module); - expect_character(module, ';'); - - auto global_storage = new_value(module); - *global_storage = { - .id = ValueId::global, - }; - - auto global = new_global(module); - *global = { - .variable = { - .storage = global_storage, - .initial_value = initial_value, - .type = global_type, - .scope = scope, - .name = global_name, - .line = global_line, - .column = global_column, - }, - .linkage = Linkage::internal, // TODO: linkage - }; - } - } -} -- 2.43.0