From: Toni Wilen Date: Sun, 25 Mar 2018 10:05:23 +0000 (+0300) Subject: New debugger features (executable debugging, invalid memory access checker, segtracke... X-Git-Tag: 4000~143 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=727166102d1d886c9fdfbece180ceec66269e022;p=francis%2Fwinuae.git New debugger features (executable debugging, invalid memory access checker, segtracker etc..) --- diff --git a/cfgfile.cpp b/cfgfile.cpp index 596a4760..cecd6082 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -1595,6 +1595,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_str (f, _T("use_gui"), guimode1[p->start_gui]); cfgfile_write_bool (f, _T("use_debugger"), p->start_debugger); + cfgfile_dwrite_bool(f, _T("debugging_features"), p->debugging_features); cfgfile_write_rom (f, &p->path_rom, p->romfile, _T("kickstart_rom_file")); cfgfile_write_rom (f, &p->path_rom, p->romextfile, _T("kickstart_ext_rom_file")); @@ -2212,9 +2213,11 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) } cfgfile_writeramboard(p, f, _T("fastmem"), i, &p->fastmem[i]); } - cfgfile_write (f, _T("mem25bit_size"), _T("%d"), p->mem25bit_size / 0x100000); - cfgfile_write (f, _T("a3000mem_size"), _T("%d"), p->mbresmem_low_size / 0x100000); - cfgfile_write (f, _T("mbresmem_size"), _T("%d"), p->mbresmem_high_size / 0x100000); + cfgfile_write(f, _T("debugmem_start"), _T("0x%x"), p->debugmem_start); + cfgfile_write(f, _T("debugmem_size"), _T("%d"), p->debugmem_size / 0x100000); + cfgfile_write(f, _T("mem25bit_size"), _T("%d"), p->mem25bit_size / 0x100000); + cfgfile_write(f, _T("a3000mem_size"), _T("%d"), p->mbresmem_low_size / 0x100000); + cfgfile_write(f, _T("mbresmem_size"), _T("%d"), p->mbresmem_high_size / 0x100000); for (int i = 0; i < MAX_RAM_BOARDS; i++) { if (i == 0 || p->z3fastmem[i].size) { if (i > 0) @@ -2225,7 +2228,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) } cfgfile_writeramboard(p, f, _T("z3mem"), i, &p->z3fastmem[i]); } - cfgfile_write (f, _T("z3mem_start"), _T("0x%x"), p->z3autoconfig_start); + cfgfile_write(f, _T("z3mem_start"), _T("0x%x"), p->z3autoconfig_start); cfgfile_write(f, _T("bogomem_size"), _T("%d"), p->bogomem_size / 0x40000); if (p->cpuboard_type) { const struct cpuboardtype *cbt = &cpuboards[p->cpuboard_type]; @@ -3040,6 +3043,7 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) return 1; if (cfgfile_yesno(option, value, _T("use_debugger"), &p->start_debugger) + || cfgfile_yesno(option, value, _T("debugging_features"), &p->debugging_features) || cfgfile_yesno(option, value, _T("floppy0wp"), &p->floppyslots[0].forcedwriteprotect) || cfgfile_yesno(option, value, _T("floppy1wp"), &p->floppyslots[1].forcedwriteprotect) || cfgfile_yesno(option, value, _T("floppy2wp"), &p->floppyslots[2].forcedwriteprotect) diff --git a/custom.cpp b/custom.cpp index bcd9e920..7bef8fc0 100644 --- a/custom.cpp +++ b/custom.cpp @@ -4977,7 +4977,9 @@ static void immediate_copper (int num) pos = oldpos; if (!dmaen(DMA_COPPER)) break; - if (cop_state.ip >= currprefs.chipmem_size && (cop_state.ip < currprefs.z3chipmem_start || cop_state.ip >= currprefs.z3chipmem_start + currprefs.z3chipmem_size)) + if (cop_state.ip >= currprefs.chipmem_size && + (cop_state.ip < currprefs.z3chipmem_start || cop_state.ip >= currprefs.z3chipmem_start + currprefs.z3chipmem_size) && + (cop_state.ip < debugmem_bank.start || cop_state.ip >= debugmem_bank.start + debugmem_bank.allocated_size)) break; pos++; oldpos = pos; diff --git a/debug.cpp b/debug.cpp index fb85474c..07b92d5d 100644 --- a/debug.cpp +++ b/debug.cpp @@ -21,6 +21,7 @@ #include "newcpu.h" #include "cpu_prefetch.h" #include "debug.h" +#include "debugmem.h" #include "cia.h" #include "xwin.h" #include "identify.h" @@ -46,11 +47,18 @@ #include "drawing.h" #include "devices.h" +#define TRACE_SKIP_INS 1 +#define TRACE_MATCH_PC 2 +#define TRACE_MATCH_INS 3 +#define TRACE_RANGE_PC 4 +#define TRACE_SKIP_LINE 5 +#define TRACE_CHECKONLY 10 + +static int trace_mode; +static uae_u32 trace_param1; +static uae_u32 trace_param2; + int debugger_active; -static uaecptr skipaddr_start, skipaddr_end; -static int skipaddr_doskip; -static uae_u32 skipins; -static int do_skip; static int debug_rewind; static int memwatch_triggered; int memwatch_enabled; @@ -64,6 +72,7 @@ int debug_illegal = 0; uae_u64 debug_illegal_mask; static int debug_mmu_mode; static bool break_if_enforcer; +static uaecptr debug_pc; static uaecptr processptr; static uae_char *processname; @@ -81,17 +90,29 @@ void deactivate_debugger (void) processptr = 0; xfree (processname); processname = NULL; + debugmem_enable(); + debug_pc = 0xffffffff; } void activate_debugger (void) { - do_skip = 0; + debugger_load_libraries(); + + debug_pc = 0xffffffff; + trace_mode = 0; if (debugger_active) return; debugger_active = 1; set_special (SPCFLAG_BRK); debugging = 1; mmu_triggered = 0; + debugmem_disable(); +} + +void activate_debugger_new(void) +{ + activate_debugger(); + debug_pc = M68K_GETPC; } bool debug_enforcer(void) @@ -650,7 +671,7 @@ static int readregx (TCHAR **c, uae_u32 *valp) int i; uae_u32 addr; TCHAR *p = *c; - TCHAR tmp[10]; + TCHAR tmp[10], *tp; int extra = 0; addr = 0; @@ -662,30 +683,31 @@ static int readregx (TCHAR **c, uae_u32 *valp) i++; } tmp[i] = 0; + tp = tmp; if (_totupper (tmp[0]) == 'R') { - memmove (tmp, tmp + 1, sizeof (tmp) - sizeof (TCHAR)); + tp = tmp + 1; extra = 1; } - if (!_tcsncmp (tmp, _T("USP"), 3)) { + if (!_tcsncmp (tp, _T("USP"), 3)) { addr = regs.usp; (*c) += 3; - } else if (!_tcsncmp (tmp, _T("VBR"), 3)) { + } else if (!_tcsncmp (tp, _T("VBR"), 3)) { addr = regs.vbr; (*c) += 3; - } else if (!_tcsncmp (tmp, _T("MSP"), 3)) { + } else if (!_tcsncmp (tp, _T("MSP"), 3)) { addr = regs.msp; (*c) += 3; - } else if (!_tcsncmp (tmp, _T("ISP"), 3)) { + } else if (!_tcsncmp (tp, _T("ISP"), 3)) { addr = regs.isp; (*c) += 3; - } else if (!_tcsncmp (tmp, _T("PC"), 2)) { + } else if (!_tcsncmp (tp, _T("PC"), 2)) { addr = regs.pc; (*c) += 2; - } else if (tmp[0] == 'A' || tmp[0] == 'D') { + } else if (tp[0] == 'A' || tp[0] == 'D') { int reg = 0; - if (tmp[0] == 'A') + if (tp[0] == 'A') reg += 8; - reg += tmp[1] - '0'; + reg += tp[1] - '0'; if (reg < 0 || reg > 15) return 0; addr = regs.regs[reg]; @@ -789,9 +811,21 @@ static int checkvaltype2 (TCHAR **c, uae_u32 *val, TCHAR def) if (readregx (c, val)) return 1; } + TCHAR name[256]; + name[0] = 0; + for (int i = 0; i < sizeof name / sizeof(TCHAR) - 1; i++) { + nc = (*c)[i]; + if (nc == 0 || nc == ' ') + break; + name[i] = nc; + name[i + 1] = 0; + } + if (name[0] && debugmem_get_symbol_value(name, val)) { + (*c) += _tcslen(name); + return 1; + } if (def == '!') { return readintx (c, val) ? -1 : 0; - return -1; } else if (def == '$') { return readhexx (c, val) ? -1 : 0; } else if (def == '%') { @@ -2030,11 +2064,11 @@ void record_copper (uaecptr addr, uae_u16 word1, uae_u16 word2, int hpos, int vp } if (debug_copper & 2) { /* trace */ debug_copper &= ~2; - activate_debugger (); + activate_debugger_new(); } if ((debug_copper & 4) && addr >= debug_copper_pc && addr <= debug_copper_pc + 3) { debug_copper &= ~4; - activate_debugger (); + activate_debugger_new(); } } @@ -2583,15 +2617,15 @@ static void illg_debug_do (uaecptr addr, int rwi, int size, uae_u32 val) else if (rwi & 1) console_out_f (_T("R: %08X PC=%08X\n"), ad, pc); if (illgdebug_break) - activate_debugger (); + activate_debugger_new(); } else if (!(mask & 1) && (rwi & 1)) { console_out_f (_T("RO: %08X=%02X PC=%08X\n"), ad, v, pc); if (illgdebug_break) - activate_debugger (); + activate_debugger_new(); } else if (!(mask & 2) && (rwi & 2)) { console_out_f (_T("WO: %08X PC=%08X\n"), ad, pc); if (illgdebug_break) - activate_debugger (); + activate_debugger_new(); } } } @@ -2701,7 +2735,7 @@ static void smc_detector (uaecptr addr, int rwi, int size, uae_u32 *valp) console_out_f (_T("SMC at %08X - %08X (%d) from %08X\n"), hitaddr, hitaddr + hitcnt, hitcnt, hitpc); if (smc_mode) - activate_debugger (); + activate_debugger_new(); if (smc_table[hitaddr].cnt >= SMC_MAXHITS) console_out_f (_T("* hit count >= %d, future hits ignored\n"), SMC_MAXHITS); } @@ -2945,6 +2979,7 @@ static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp, uae_u3 mwhit.val = val; memwatch_triggered = i + 1; debugging = 1; + debug_pc = mwhit.pc; set_special (SPCFLAG_BRK); return 1; } @@ -4442,11 +4477,10 @@ int instruction_breakpoint (TCHAR **c) } else if (nc == 'I') { next_char (c); if (more_params (c)) - skipins = readhex (c); + trace_param1 = readhex (c); else - skipins = 0x10000; - do_skip = 1; - skipaddr_doskip = 1; + trace_param1 = 0x10000; + trace_mode = TRACE_MATCH_INS; return 1; } else if (nc == 'D' && (*c)[1] == 0) { for (i = 0; i < BREAKPOINT_TOTAL; i++) @@ -4477,18 +4511,17 @@ int instruction_breakpoint (TCHAR **c) console_out (_T("\n")); return 0; } - skipaddr_doskip = 1; - skipaddr_start = readhex (c); + trace_mode = TRACE_RANGE_PC; + trace_param1 = readhex (c); if (more_params (c)) { - skipaddr_end = readhex (c); + trace_param2 = readhex (c); } else { for (i = 0; i < BREAKPOINT_TOTAL; i++) { bpn = &bpnodes[i]; - if (bpn->enabled && bpn->value1 == skipaddr_start) { + if (bpn->enabled && bpn->value1 == trace_param1) { bpn->enabled = 0; console_out (_T("Breakpoint removed.\n")); - skipaddr_start = 0xffffffff; - skipaddr_doskip = 0; + trace_mode = 0; return 0; } } @@ -4496,28 +4529,18 @@ int instruction_breakpoint (TCHAR **c) bpn = &bpnodes[i]; if (bpn->enabled) continue; - bpn->value1 = skipaddr_start; + bpn->value1 = trace_param1; bpn->type = BREAKPOINT_REG_PC; bpn->oper = BREAKPOINT_CMP_EQUAL; bpn->enabled = 1; console_out (_T("Breakpoint added.\n")); - skipaddr_start = 0xffffffff; - skipaddr_doskip = 0; + trace_mode = 0; break; } return 0; } } -#if 0 - if (skipaddr_start == 0xC0DEDBAD) { - trace_same_insn_count = 0; - logfile = fopen ("uae.trace", "w"); - memcpy (trace_insn_copy, regs.pc_p, 10); - memcpy (&trace_prev_regs, ®s, sizeof regs); - } -#endif - do_skip = 1; - skipaddr_doskip = -1; + trace_mode = TRACE_CHECKONLY; return 1; } @@ -4535,9 +4558,7 @@ static int process_breakpoint (TCHAR **c) } else { processptr = readhex (c); } - do_skip = 1; - skipaddr_doskip = 1; - skipaddr_start = 0; + trace_mode = TRACE_CHECKONLY; return 1; } @@ -4742,7 +4763,7 @@ void debugtest (enum debugtest_item di, const TCHAR *format, ...) va_end (parms); write_log (_T("%s PC=%08X: %s\n"), debugtest_names[di], M68K_GETPC, buffer); if (debugtest_modes[di] == 2) - activate_debugger (); + activate_debugger_new(); } static void debugtest_set (TCHAR **inptr) @@ -5034,9 +5055,9 @@ static void find_ea (TCHAR **inptr) if ((addr & 1) == 0 && addr + 6 <= end) { sea = 0xffffffff; dea = 0xffffffff; - m68k_disasm_ea (addr, NULL, 1, &sea, &dea); + m68k_disasm_ea (addr, NULL, 1, &sea, &dea, 0xffffffff); if (ea == sea || ea == dea) { - m68k_disasm (addr, NULL, 1); + m68k_disasm (addr, NULL, 1, 0xffffffff); hits++; if (hits > 100) { console_out_f (_T("Too many hits. End addr = %08X\n"), addr); @@ -5174,7 +5195,7 @@ static bool debug_line (TCHAR *input) for (int i = 0; i < inss; i++) { put_word(asmaddr + i * 2, asmout[i]); } - m68k_disasm(asmaddr, &nxdis, 1); + m68k_disasm(asmaddr, &nxdis, 0xffffffff, 1); asmaddr = nxdis; } console_out_f(_T("%08X "), asmaddr); @@ -5225,17 +5246,22 @@ static bool debug_line (TCHAR *input) } case 'e': dump_custom_regs (tolower(*inptr) == 'a'); break; case 'r': - { - if (*inptr == 'c') { - next_char(&inptr); - m68k_dumpcache (*inptr == 'd'); - } else if (more_params(&inptr)) { - m68k_modify (&inptr); - } else { - m68k_dumpstate (&nextpc); - } + { + if (*inptr == 'c') { + next_char(&inptr); + m68k_dumpcache(*inptr == 'd'); + } else if (*inptr == 's') { + if (*(inptr + 1) == 's') + debugmem_list_stackframe(true); + else + debugmem_list_stackframe(false); + } else if (more_params(&inptr)) { + m68k_modify(&inptr); + } else { + m68k_dumpstate(&nextpc, 0xffffffff); } - break; + } + break; case 'D': deepcheatsearch (&inptr); break; case 'C': cheatsearch (&inptr); break; case 'W': writeintomem (&inptr); break; @@ -5243,7 +5269,19 @@ static bool debug_line (TCHAR *input) case 'S': saveloadmem (&inptr, true); break; case 'L': saveloadmem (&inptr, false); break; case 's': - if (*inptr == 'c') { + if (*inptr == 'e' && *(inptr + 1) == 'g') { + next_char(&inptr); + next_char(&inptr); + addr = 0xffffffff; + if (*inptr == 's') { + debugmem_list_segment(1, addr); + } else { + if (more_params(&inptr)) { + addr = readhex(&inptr); + } + debugmem_list_segment(0, addr); + } + } else if (*inptr == 'c') { screenshot (1, 1); } else if (*inptr == 'p') { inptr++; @@ -5272,7 +5310,7 @@ static bool debug_line (TCHAR *input) for (int i = 0; i < inss; i++) { put_word(asmaddr + i * 2, asmout[i]); } - m68k_disasm(asmaddr, &nxdis, 1); + m68k_disasm(asmaddr, &nxdis, 1, 0xffffffff); asmaddr = nxdis; return false; } @@ -5325,34 +5363,68 @@ static bool debug_line (TCHAR *input) if (ppcmode) { ppc_disasm(daddr, &nxdis, count); } else { - m68k_disasm (daddr, &nxdis, count); + m68k_disasm (daddr, &nxdis, 0xffffffff, count); } } } break; case 'T': - if (inptr[0] == 't' || inptr[0] == 0) + if (inptr[0] == 'L') + debugger_scan_libraries(); + else if (inptr[0] == 't' || inptr[0] == 0) show_exec_tasks (); else show_exec_lists (&inptr[0]); break; case 't': no_trace_exceptions = 0; - if (*inptr != 't') { - if (more_params (&inptr)) - skipaddr_doskip = readint (&inptr); - if (skipaddr_doskip <= 0 || skipaddr_doskip > 10000) - skipaddr_doskip = 1; - } else { + if (*inptr == 't') { no_trace_exceptions = 1; + inptr++; } - set_special (SPCFLAG_BRK); - exception_debugging = 1; - return true; + if (*inptr == 'r') { + // break when PC in debugmem + if (debugmem_get_range(&trace_param1, &trace_param2)) { + trace_mode = TRACE_RANGE_PC; + return true; + } + } else if (*inptr == 's') { + if (*(inptr + 1) == 'e') { + debugmem_enable_stackframe(true); + } else if (*(inptr + 1) == 'd') { + debugmem_enable_stackframe(false); + } else if (*(inptr + 1) == 'p') { + if (debugmem_break_stack_pop()) { + debugger_active = 0; + return true; + } + } else { + if (debugmem_break_stack_pop()) { + debugger_active = 0; + return true; + } + } + } else if (*inptr == 'l') { + // skip next source line + if (debugmem_isactive()) { + trace_mode = TRACE_SKIP_LINE; + trace_param1 = 1; + trace_param2 = debugmem_get_sourceline(M68K_GETPC, NULL, 0); + return true; + } + } else { + if (more_params(&inptr)) + trace_param1 = readint(&inptr); + if (trace_param1 <= 0 || trace_param1 > 10000) + trace_param1 = 1; + trace_mode = TRACE_SKIP_INS; + exception_debugging = 1; + return true; + } + break; case 'z': - skipaddr_start = nextpc; - skipaddr_doskip = 1; - do_skip = 1; + trace_mode = TRACE_MATCH_PC; + trace_param1 = nextpc; exception_debugging = 1; return true; @@ -5440,7 +5512,7 @@ static bool debug_line (TCHAR *input) if (regs.pc == addr || addr == 0) { m68k_setpc (regs.pc); if (badly) { - m68k_dumpstate (NULL); + m68k_dumpstate(NULL, 0xffffffff); } else { if (lastvpos >= 0) { dma_disasm(lastframes, lastvpos, lasthpos, history[temp].fp, history[temp].vpos, history[temp].hpos); @@ -5449,7 +5521,7 @@ static bool debug_line (TCHAR *input) lastvpos = history[temp].vpos; lasthpos = history[temp].hpos; console_out_f(_T("%2d "), regs.intmask ? regs.intmask : (regs.s ? -1 : 0)); - m68k_disasm (regs.pc, NULL, 1); + m68k_disasm (regs.pc, NULL, 0xffffffff, 1); } if (addr && regs.pc == addr) break; @@ -5648,6 +5720,25 @@ static bool debug_line (TCHAR *input) if (staterecorder (&inptr)) return true; break; + case 'u': + { + if (more_params(&inptr)) { + if (*inptr == 'a') { + debugmem_inhibit_break(1); + console_out(_T("All break to debugger methods inhibited.\n")); + } else if (*inptr == 'c') { + debugmem_inhibit_break(-1); + console_out(_T("All break to debugger methods allowed.\n")); + } + } else { + if (debugmem_inhibit_break(0)) { + console_out(_T("Current break to debugger method inhibited.\n")); + } else { + console_out(_T("Current break to debugger method allowed.\n")); + } + } + } + break; case 'U': if (currprefs.mmu_model && more_params (&inptr)) { int i; @@ -5696,7 +5787,8 @@ static void debug_1 (void) { TCHAR input[MAX_LINEWIDTH]; - m68k_dumpstate (&nextpc); + m68k_dumpstate(&nextpc, debug_pc); + debug_pc = 0xffffffff; nxdis = nextpc; nxmem = 0; debugger_active = 1; @@ -5774,7 +5866,7 @@ void debug (void) #endif if (!memwatch_triggered) { - if (do_skip) { + if (trace_mode) { uae_u32 pc; uae_u16 opcode; int bp = 0; @@ -5789,7 +5881,6 @@ void debug (void) if (bpn->type == BREAKPOINT_REG_PC) { if (bpn->value1 == pc) { bp = 1; - console_out_f (_T("Breakpoint at %08X\n"), pc); break; } } else if (bpn->type >= 0 && bpn->type < BREAKPOINT_REG_END) { @@ -5826,8 +5917,8 @@ void debug (void) } } - if (skipaddr_doskip) { - if (skipaddr_start == pc) + if (trace_mode) { + if (trace_mode == TRACE_MATCH_PC && trace_param1 == pc) bp = -1; if ((processptr || processname) && notinrom()) { uaecptr execbase = get_long_debug (4); @@ -5858,20 +5949,34 @@ void debug (void) } } } - } else if (skipins != 0xffffffff) { - if (skipins == 0x10000) { + } else if (trace_mode == TRACE_MATCH_INS) { + if (trace_param1 == 0x10000) { if (opcode == 0x4e75 || opcode == 0x4e73 || opcode == 0x4e77) bp = -1; - } else if (opcode == skipins) + } else if (opcode == trace_param1) { bp = -1; - } else if (skipaddr_start == 0xffffffff && skipaddr_doskip < 0) { - if ((pc < 0xe00000 || pc >= 0x1000000) && opcode != 0x4ef9) + } + } else if (trace_mode == TRACE_SKIP_INS) { + if (trace_param1 != 0) + trace_param1--; + if (trace_param1 == 0) { bp = -1; + } +#if 0 } else if (skipaddr_start == 0xffffffff && skipaddr_doskip > 0) { bp = -1; - } else if (skipaddr_end != 0xffffffff) { - if (pc >= skipaddr_start && pc < skipaddr_end) +#endif + } else if (trace_mode == TRACE_RANGE_PC) { + if (pc >= trace_param1 && pc < trace_param2) bp = -1; + } else if (trace_mode == TRACE_SKIP_LINE) { + if (trace_param1 != 0) + trace_param1--; + if (trace_param1 == 0) { + int line = debugmem_get_sourceline(pc, NULL, 0); + if (line > 0 && line != trace_param2) + bp = -1; + } } } if (!bp) { @@ -5892,13 +5997,6 @@ void debug (void) } memwatch_triggered = 0; } - if (skipaddr_doskip > 0) { - skipaddr_doskip--; - if (skipaddr_doskip > 0) { - debug_continue(); - return; - } - } wasactive = ismouseactive (); #ifdef WITH_PPC @@ -5908,11 +6006,7 @@ void debug (void) pause_sound (); setmouseactive (0); activate_console (); - do_skip = 0; - skipaddr_start = 0xffffffff; - skipaddr_end = 0xffffffff; - skipins = 0xffffffff; - skipaddr_doskip = 0; + trace_mode = 0; exception_debugging = 0; debug_rewind = 0; processptr = 0; @@ -5922,7 +6016,9 @@ void debug (void) savestate_init (); } #endif + debugmem_disable(); debug_1 (); + debugmem_enable(); if (!debug_rewind && !currprefs.cachesize #ifdef FILESYS && nr_units () == 0 @@ -5930,11 +6026,13 @@ void debug (void) ) { savestate_capture (1); } - for (i = 0; i < BREAKPOINT_TOTAL; i++) { - if (bpnodes[i].enabled) - do_skip = 1; + if (!trace_mode) { + for (i = 0; i < BREAKPOINT_TOTAL; i++) { + if (bpnodes[i].enabled) + trace_mode = TRACE_CHECKONLY; + } } - if (do_skip) { + if (trace_mode) { set_special (SPCFLAG_BRK); debugging = -1; } @@ -5958,8 +6056,8 @@ const TCHAR *debuginfo (int mode) void mmu_disasm (uaecptr pc, int lines) { debug_mmu_mode = regs.s ? 6 : 2; - m68k_dumpstate (0xffffffff, NULL); - m68k_disasm (pc, NULL, lines); + m68k_dumpstate(NULL, 0xffffffff); + m68k_disasm (pc, NULL, 0xffffffff, lines); } static int mmu_logging; diff --git a/debugmem.cpp b/debugmem.cpp new file mode 100644 index 00000000..6e5c754f --- /dev/null +++ b/debugmem.cpp @@ -0,0 +1,2607 @@ + +/* + * + * Combined Enforcer, MungWall and SegTracker emulation. + * + */ + +#include "sysconfig.h" +#include "sysdeps.h" + +#include "options.h" +#include "memory.h" +#include "newcpu.h" +#include "debug.h" +#include "debugmem.h" +#include "filesys.h" +#include "zfile.h" +#include "uae.h" +#include "fsdb.h" + +#define N_GSYM 0x20 +#define N_FUN 0x24 +#define N_STSYM 0x26 +#define N_LCSYM 0x28 +#define N_MAIN 0x2a +#define N_ROSYM 0x2c +#define N_RSYM 0x40 +#define N_SLINE 0x44 +#define N_DSLINE 0x46 +#define N_SSYM 0x60 +#define N_SO 0x64 +#define N_LSYM 0x80 +#define N_SOL 0x84 +#define N_PSYM 0xa0 +#define N_EINCL 0xa2 +#define N_LBRAC 0xc0 +#define N_RBRAC 0xe0 + +#define MAX_SOURCELINELEN 100 + +static mem_get_func debugmem_func_lgeti; +static mem_get_func debugmem_func_wgeti; +static mem_get_func debugmem_func_lget; +static mem_get_func debugmem_func_wget; +static mem_get_func debugmem_func_bget; +static mem_put_func debugmem_func_lput; +static mem_put_func debugmem_func_wput; +static mem_put_func debugmem_func_bput; +static xlate_func debugmem_func_xlate; +static bool debugmem_initialized; +static bool debug_waiting; +static uaecptr debug_task; +static uae_u8 *exec_thistask; +static int executable_last_segment; +static bool libraries_loaded, fds_loaded; +static bool debugmem_mapped; + +static int debugstack_word_state; +static uaecptr debugstack_word_addr; +static uaecptr debugstack_word_val; +static bool break_stack_pop, break_stack_push, break_stack_s; +static bool debugmem_active; +static int stackframemode; + +uae_u32 debugmem_chiplimit; +bool debugmem_trace; + +#define MAX_DEBUGMEMALLOCS 10000 +#define MAX_DEBUGSEGS 1000 +#define MAX_DEBUGSYMS 10000 +#define MAX_STACKVARS 10000 +#define MAX_DEBUGCODEFILES 1000 +#define MAX_STACKFRAMES 100 + + +struct debugstackframe +{ + uaecptr current_pc; + uaecptr branch_pc; + uaecptr next_pc; + uaecptr stack; + uae_u32 regs[16]; + uae_u16 sr; +}; +static struct debugstackframe *stackframes, *stackframessuper; +static int stackframecnt, stackframecntsuper; + +static uae_u32 debugmemptr; + +struct stab +{ + TCHAR *string; + uae_u8 type; + uae_u8 other; + uae_u16 desc; + uae_u32 val; +}; +static struct stab *stabs; +static int stabscount; + +struct stabtype +{ + TCHAR *name; + uae_u32 id; +}; + +struct debugcodefile +{ + const TCHAR *name; + int length; + uae_u8 *data; + int lines; + uae_u8 **lineptr; + struct stabtype *stabtypes; + int stabtypecount; +}; +static struct debugcodefile **codefiles; +static int codefilecnt; + +struct linemapping +{ + struct debugcodefile *file; + int line; +}; +static struct linemapping *linemap; +static int linemapsize; + +#define SYMBOL_LOCAL 0 +#define SYMBOL_GLOBAL 1 + +#define SYMBOLTYPE_FUNC 1 + +struct debugsymbol +{ + TCHAR *name; + uae_u32 segment; + uae_u32 allocid; + uae_u32 value; + uae_u32 flags; + uae_u32 type; + struct debugmemallocs *section; + void *data; +}; +static struct debugsymbol **symbols; +static int symbolcnt; + +struct libname +{ + TCHAR *name; + uae_char *aname; + uae_u32 id; + uae_u32 base; +}; +static struct libname *libnames; +static int libnamecnt; +struct libsymbol +{ + struct libname *lib; + TCHAR *name; + uae_u32 value; +}; +static struct libsymbol *libsymbols; +static int libsymbolcnt; + +struct stackvar +{ + TCHAR *name; + uae_u32 offset; + struct debugsymbol *func; +}; +static struct stackvar **stackvars; +static int stackvarcnt; + +#define DEBUGALLOC_HUNK 1 +#define DEBUGALLOC_ALLOCMEM 2 +#define DEBUGALLOC_ALLOCVEC 3 +#define DEBUGALLOC_SEG 4 + +struct debugmemallocs +{ + uae_u16 type; + uae_u32 id; + uae_u16 internalid; + uae_u32 parentid; + uae_u32 idtype; + uaecptr start; + uae_u32 size; + uae_u32 start_page; + uae_u32 pages; + uaecptr pc; + uae_u32 data; + uae_u32 relative_start; +}; + +static struct debugmemallocs **allocs; +static int alloccnt; + +#define HUNK_GAP 32768 +#define PAGE_SIZE 256 +#define PAGE_SIZE_MASK (PAGE_SIZE - 1) + +#define DEBUGMEM_READ 0x01 +#define DEBUGMEM_WRITE 0x02 +#define DEBUGMEM_FETCH 0x04 +#define DEBUGMEM_INITIALIZED 0x08 +#define DEBUGMEM_STARTBLOCK 0x10 +#define DEBUGMEM_ALLOCATED 0x40 +#define DEBUGMEM_INUSE 0x80 +#define DEBUGMEM_PARTIAL 0x100 +#define DEBUGMEM_NOSTACKCHECK 0x200 +#define DEBUGMEM_STACK 0x1000 + +struct debugmemdata +{ + uae_u16 id; + uae_u16 flags; + uae_u8 unused_start; + uae_u8 unused_end; + uae_u8 state[PAGE_SIZE]; +}; + +static struct debugmemdata **dmd; +static int totalmemdata; + +struct debugsegtracker +{ + TCHAR *name; + uae_u32 allocid; + uaecptr resident; +}; +static struct debugsegtracker **dsegt; +static int segtrackermax; +static uae_u32 inhibit_break, last_break; + +bool debugmem_break(int type) +{ + if (inhibit_break & (1 << type)) + return false; + last_break = type; + activate_debugger_new(); + return true; +} + +bool debugmem_inhibit_break(int mode) +{ + if (mode < 0) { + inhibit_break = 0; + return true; + } else if (mode > 0) { + inhibit_break = 0xffffffff; + return true; + } else { + inhibit_break ^= 1 << last_break; + } + return (inhibit_break & (1 << last_break)) != 0; +} + +static void debugreportsegment(struct debugsegtracker *seg, bool verbose) +{ + struct debugmemallocs *alloc = allocs[seg->allocid]; + int parentid = alloc->id; + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + struct debugmemallocs *a = allocs[i]; + if (a->parentid == parentid) { + if (verbose) { + console_out_f(_T("Segment %d (%s): %08x %08x - %08x (%d)\n"), + a->internalid, seg->name, a->idtype, a->start, a->start + a->size - 1, a->size); + } else { + console_out_f(_T("Segment %d: %08x %08x - %08x (%d)\n"), + a->internalid, a->idtype, a->start, a->start + a->size - 1, a->size); + } + } + } +} + +static void debugreportalloc(struct debugmemallocs *a) +{ + uae_u32 off = debugmem_bank.start; + if (a->type == DEBUGALLOC_HUNK) { + console_out_f(_T("Segment %d: %08x %08x - %08x (%d)\n"), + a->id, a->idtype, a->start + off, a->start + off + a->size - 1, a->size); + } else if (a->type == DEBUGALLOC_ALLOCMEM) { + console_out_f(_T("AllocMem ID=%d: %08x %08x - %08x (%d) AllocFlags: %08x PC: %08x\n"), + a->id, a->idtype, a->start + off, a->start + off + a->size - 1, a->size, a->data, a->pc); + } else if (a->type == DEBUGALLOC_ALLOCVEC) { + console_out_f(_T("AllocVec allocation ID=%d: %08x %08x - %08x (%d) AllocFlags: %08x PC: %08x\n"), + a->id, a->idtype, a->start + off, a->start + off + a->size - 1, a->size, a->data, a->pc); + } else if (a->type == DEBUGALLOC_SEG) { + static int lastsegment; + struct debugsegtracker *sg = NULL; + const TCHAR *name = _T(""); + for (int i = 0; i < MAX_DEBUGSEGS; i++) { + sg = dsegt[(i + lastsegment) % MAX_DEBUGSEGS]; + if (sg->allocid == a->parentid) { + name = sg->name; + lastsegment = i; + break; + } + } + console_out_f(_T("Segment %d (%s): %08x %08x - %08x (%d)\n"), + a->internalid, name, a->idtype, a->start, a->start + a->size - 1, a->size); + } +} + +static void debugreport(struct debugmemdata *dm, uaecptr addr, int rwi, int size, const TCHAR *msg) +{ + int offset = addr & PAGE_SIZE_MASK; + uaecptr addr_start = addr & ~PAGE_SIZE_MASK; + uae_u8 state = dm->state[offset]; + + console_out_f(_T("Invalid access. Addr=%08x RW=%c Size=%d: %s\n"), addr, (rwi & DEBUGMEM_WRITE) ? 'W' : 'R', size, msg); + console_out_f(_T("Page: %08x - %08x. State=%c Modified=%c, Start=%02X, End=%02X\n"), + addr_start, addr_start + PAGE_SIZE - 1, + !(state & (DEBUGMEM_ALLOCATED | DEBUGMEM_INUSE)) ? 'I' : (state & DEBUGMEM_WRITE) ? 'W' : 'R', + (state & DEBUGMEM_WRITE) ? '*' : (state & DEBUGMEM_INITIALIZED) ? '+' : '-', + dm->unused_start, PAGE_SIZE - dm->unused_end); + debugmem_break(1); +} + +#if 0 +static uae_u32 debug_get_disp_ea(uaecptr pc, uae_u32 base) +{ + uae_u16 dp = get_word_debug(pc); + pc += 2; + int reg = (dp >> 12) & 15; + uae_s32 regd = regs.regs[reg]; + if ((dp & 0x800) == 0) + regd = (uae_s32)(uae_s16)regd; + regd <<= (dp >> 9) & 3; + if (dp & 0x100) { + uae_s32 outer = 0; + if (dp & 0x80) base = 0; + if (dp & 0x40) regd = 0; + + if ((dp & 0x30) == 0x20) { + base += (uae_s32)(uae_s16)get_word_debug(pc); + pc += 2; + } + if ((dp & 0x30) == 0x30) { + base += get_long_debug(pc); + pc += 4; + } + + if ((dp & 0x3) == 0x2) { + outer = (uae_s32)(uae_s16)get_word_debug(pc); + pc += 2; + } + if ((dp & 0x3) == 0x3) { + outer = get_long_debug(pc); + pc += 4; + } + + if ((dp & 0x4) == 0) + base += regd; + if (dp & 0x3) + base = get_long_debug(base); + if (dp & 0x4) + base += regd; + + return base + outer; + } else { + return base + (uae_s32)((uae_s8)dp) + regd; + } +} + +static uaecptr calc_jsr(void) +{ + uae_u16 opcode = regs.opcode; + uaecptr pc = regs.instruction_pc; + if ((opcode & 0xff00) == 0x6100) { + uae_u8 o = opcode & 0xff; + if (o == 0) { + return pc + (uae_s16)get_word_debug(pc + 2) + 2; + } else if (o == 0xff) { + return pc + (uae_s32)get_long_debug(pc + 2) + 2; + } else { + return pc + (uae_s8)o + 2; + } + } else if ((opcode & 0xffc0) == 0x4e80) { + int reg = opcode & 7; + int mode = (opcode >> 3) & 7; + switch (mode) + { + case 2: + return m68k_areg(regs, reg); + case 5: + return m68k_areg(regs, reg) + (uae_s16)get_word_debug(pc + 2); + case 6: + return debug_get_disp_ea(pc + 2, m68k_areg(regs, reg)); + case 7: + if (reg == 0) + return (uae_u32)(uae_s16)get_word_debug(pc + 2); + if (reg == 1) + return get_long_debug(pc + 2); + if (reg == 2) + return pc + (uae_s16)get_word_debug(pc + 2) + 2; + if (reg == 3) + return debug_get_disp_ea(pc + 2, pc + 2); + break; + } + } + return 0xffffffff; +} +#endif + +void branch_stack_pop_rte(uaecptr oldpc) +{ + if (!stackframes) + return; + uaecptr newpc = m68k_getpc(); + bool found = false; + for (int i = stackframecntsuper - 1; i >= 0; i--) { + struct debugstackframe *sf = &stackframessuper[i]; + if (sf->next_pc == newpc) { + stackframecntsuper = i; + found = true; + break; + } + } + if (found) { + if (break_stack_pop) { + break_stack_pop = false; + debugmem_break(0); + } + } else { + // if no match, it probably was stack switch to other address, + // assume it matched.. + if (stackframecntsuper > 0) + stackframecntsuper--; + } + if (found && break_stack_pop && break_stack_s) { + break_stack_push = false; + break_stack_pop = false; + debugmem_break(0); + } +} + +void branch_stack_pop_rts(uaecptr oldpc) +{ + if (!stackframes) + return; + if (!stackframemode) { + if (debug_waiting || (!regs.s && get_long_host(exec_thistask) != debug_task)) + return; + } + int cnt = regs.s ? stackframecntsuper : stackframecnt; + uaecptr newpc = m68k_getpc(); + bool found = false; + for (int i = cnt - 1; i >= 0; i--) { + struct debugstackframe *sf = regs.s ? &stackframessuper[i] : &stackframes[i]; + if (sf->next_pc == newpc) { + cnt = i; + found = true; + break; + } + } + if (regs.s) { + stackframecntsuper = cnt; + } else { + stackframecnt = cnt; + stackframecntsuper = 0; + } + if (found && break_stack_pop && ((break_stack_s && regs.s) || (!break_stack_s && !regs.s))) { + break_stack_push = false; + break_stack_pop = false; + debugmem_break(0); + } +} + +void branch_stack_push(uaecptr oldpc, uaecptr newpc) +{ + if (!stackframes) + return; + if (!stackframemode) { + if (debug_waiting || (!regs.s && get_long_host(exec_thistask) != debug_task)) + return; + } + int cnt = regs.s ? stackframecntsuper : stackframecnt; + struct debugstackframe *sf = regs.s ? &stackframessuper[cnt] : &stackframes[cnt]; + sf->current_pc = regs.instruction_pc; + sf->next_pc = newpc; + sf->stack = m68k_areg(regs, 7); + sf->branch_pc = m68k_getpc(); + MakeSR(); + sf->sr = regs.sr; + memcpy(sf->regs, regs.regs, sizeof(uae_u32) * 16); + if (regs.s) { + stackframecntsuper++; + } else { + stackframecnt++; + stackframecntsuper = 0; + } + if (break_stack_push && ((break_stack_s && regs.s) || (!break_stack_s && !regs.s))) { + break_stack_push = false; + break_stack_pop = false; + debugmem_break(11); + } +} + +bool debugmem_break_stack_pop(void) +{ + if (!stackframes) + return false; + break_stack_s = regs.s != 0; + break_stack_pop = true; + return true; +} + +bool debugmem_break_stack_push(void) +{ + if (!stackframes) + return false; + break_stack_s = regs.s != 0; + break_stack_pop = true; + break_stack_push = true; + return true; +} + +static bool debugmem_func(uaecptr addr, int rwi, int size, uae_u32 val) +{ + bool ret = true; + uaecptr oaddr = addr; + struct debugmemdata *dmfirst = NULL; + + if (debug_waiting && (rwi & DEBUGMEM_FETCH)) { + // first instruction? + if (addr == debugmem_bank.start + HUNK_GAP + 8) { + debugmem_break(2); + debug_waiting = false; + } + } + + // in some situations addr may already have start substracted + if (addr >= debugmem_bank.start) { + addr -= debugmem_bank.start; + } + + for (int i = 0; i < size; i++) { + int offset = addr & PAGE_SIZE_MASK; + int page = addr / PAGE_SIZE; + struct debugmemdata *dm = dmd[page]; + uae_u8 state = dm->state[offset]; + + if (!i) + dmfirst = dm; + + if (!(state & DEBUGMEM_INUSE)) { + debugreport(dm, oaddr, rwi, size, _T("Accessing invalid memory")); + return false; + } + + if (!(rwi & DEBUGMEM_NOSTACKCHECK) || ((rwi & DEBUGMEM_NOSTACKCHECK) && !(dm->flags & DEBUGMEM_STACK))) { + if ((rwi & DEBUGMEM_FETCH) && !(state & DEBUGMEM_INITIALIZED)) { + debugreport(dm, oaddr, rwi, size, _T("Instruction fetch from uninitialized memory")); + return false; + } + + if ((rwi & DEBUGMEM_FETCH) && (state & DEBUGMEM_WRITE) && !(state & DEBUGMEM_FETCH)) { + debugreport(dm, oaddr, rwi, size, _T("Instruction fetch from memory that was modified")); + return false; + } + } + + if ((rwi & DEBUGMEM_READ) && !(state & DEBUGMEM_INITIALIZED) && !(state & DEBUGMEM_WRITE)) { + debugreport(dm, oaddr, rwi, size, _T("Reading uninitialized memory")); + return false; + } + + if (dm->flags & DEBUGMEM_PARTIAL) { + if (offset < dm->unused_start) { + debugreport(dm, oaddr, rwi, size, _T("Reading from partially invalid page (low)")); + return false; + } + if (offset >= PAGE_SIZE - dm->unused_end) { + debugreport(dm, oaddr, rwi, size, _T("Reading from partially invalid page (high)")); + return false; + } + } + if ((state | rwi) != state) { + //console_out_f(_T("addr %08x %d/%d (%02x -> %02x) PC=%08x\n"), addr, i, size, state, rwi, M68K_GETPC); + dm->state[offset] |= rwi; + + } + addr++; + } + + return ret; +} + +static uae_u32 REGPARAM2 debugmem_lget(uaecptr addr) +{ + uae_u32 v = 0xdeadf00d; + if (debugmem_func(addr, DEBUGMEM_READ, 4, 0)) + v = debugmem_func_lget(addr); + return v; +} +static uae_u32 REGPARAM2 debugmem_wget(uaecptr addr) +{ + uae_u32 v = 0xd00d; + if (debugmem_func(addr, DEBUGMEM_READ, 2, 0)) + v = debugmem_func_wget(addr); + return v; +} +static uae_u32 REGPARAM2 debugmem_bget(uaecptr addr) +{ + uae_u32 v = 0xdd; + if (debugmem_func(addr, DEBUGMEM_READ, 1, 0)) + v = debugmem_func_bget(addr); + return v; +} +static uae_u32 REGPARAM2 debugmem_lgeti(uaecptr addr) +{ + uae_u32 v = 0x4afc4afc; + if (debugmem_func(addr, DEBUGMEM_READ | DEBUGMEM_FETCH, 4, 0)) + v = debugmem_func_lgeti(addr); + return v; +} +static uae_u32 REGPARAM2 debugmem_wgeti(uaecptr addr) +{ + uae_u32 v = 0x4afc; + if (debugmem_func(addr, DEBUGMEM_READ | DEBUGMEM_FETCH, 2, 0)) + v = debugmem_func_wgeti(addr); + return v; +} +static void REGPARAM2 debugmem_lput(uaecptr addr, uae_u32 v) +{ + if (debugmem_func(addr, DEBUGMEM_WRITE, 4, v)) + debugmem_func_lput(addr, v); +} +static void REGPARAM2 debugmem_wput(uaecptr addr, uae_u32 v) +{ + if (debugmem_func(addr, DEBUGMEM_WRITE, 2, v)) + debugmem_func_wput(addr, v); +} +static void REGPARAM2 debugmem_bput(uaecptr addr, uae_u32 v) +{ + if (debugmem_func(addr, DEBUGMEM_WRITE, 1, v)) + debugmem_func_bput(addr, v); +} +static uae_u8 *REGPARAM2 debugmem_xlate(uaecptr addr) +{ + if (debug_waiting) + debugmem_func(addr, DEBUGMEM_FETCH | DEBUGMEM_READ | DEBUGMEM_NOSTACKCHECK, 2, 0); + addr -= debugmem_bank.start & debugmem_bank.mask; + addr &= debugmem_bank.mask; + return debugmem_bank.baseaddr + addr; +} + +static int debugmem_free(uaecptr addr, uae_u32 size) +{ + uaecptr oaddr = addr; + addr -= debugmem_bank.start; + int page = addr / PAGE_SIZE; + struct debugmemdata *dm = dmd[page]; + bool ok = true; + + if (!(dm->flags & DEBUGMEM_ALLOCATED)) { + console_out_f(_T("Invalid memory free (%08x %d) Start address points to unallocated memory\n"), oaddr, size); + ok = false; + } else if (!(dm->flags & DEBUGMEM_STARTBLOCK)) { + console_out_f(_T("Invalid memory free (%08x %d) Start address points to allocated memory but not start of allocated memory\n"), oaddr, size); + ok = false; + } else { + struct debugmemallocs *dma = allocs[dm->id]; + if (dma->start == addr && dma->size == size) { + // it was valid! + for (int i = 0; i < dma->pages; i++) { + struct debugmemdata *dm2 = dmd[page + i]; + memset(dm2, 0, sizeof(struct debugmemdata)); + } + memset(debugmem_bank.baseaddr + dma->start_page * PAGE_SIZE, 0x95, dma->pages * PAGE_SIZE); + memset(dma, 0, sizeof(struct debugmemallocs)); + return dm->id; + } + console_out_f(_T("Invalid memory free (%08x %d) ID=%d Start address points to start of allocated memory but size does not match allocation size (%d <> %d)\n"), + oaddr, size, dm->id, size, dma->size); + } + + // report free memory error + int end = (size + PAGE_SIZE - 1) & ~PAGE_SIZE_MASK; + int allocid = -1; + for (int i = 0; i < end; i++) { + if (page + i >= totalmemdata) { + console_out_f(_T("Free end address is out of range\n")); + ok = false; + break; + } + struct debugmemdata *dm2 = dmd[page + i]; + if ((dm2->flags & DEBUGMEM_ALLOCATED) && allocid != page + i) { + struct debugmemallocs *dma = allocs[dm2->id]; + console_out_f(_T("Conflicts with existing allocation ID=%d (%08x - %08x %d)\n"), + dm->id, dma->start, dma->start + dma->size - 1, dma->size); + debugreportalloc(dma); + allocid = page + i; + } + } + debugmem_break(3); + return 0; +} + + +static uae_u32 REGPARAM2 debugmem_chipmem_lget(uaecptr addr) +{ + uae_u32 *m; + + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -4); + addr &= chipmem_bank.mask; + m = (uae_u32 *)(chipmem_bank.baseaddr + addr); + return do_get_mem_long(m); +} + +static uae_u32 REGPARAM2 debugmem_chipmem_wget(uaecptr addr) +{ + uae_u16 *m, v; + + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -2); + addr &= chipmem_bank.mask; + m = (uae_u16 *)(chipmem_bank.baseaddr + addr); + v = do_get_mem_word(m); + return v; +} + +static uae_u32 REGPARAM2 debugmem_chipmem_bget(uaecptr addr) +{ + uae_u8 v; + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -1); + addr &= chipmem_bank.mask; + v = chipmem_bank.baseaddr[addr]; + return v; +} + +void REGPARAM2 debugmem_chipmem_lput(uaecptr addr, uae_u32 l) +{ + if (addr < debugmem_chiplimit) { + debugmem_chiphit(addr, l, 4); + } else { + uae_u32 *m; + addr &= chipmem_bank.mask; + m = (uae_u32 *)(chipmem_bank.baseaddr + addr); + do_put_mem_long(m, l); + } +} + +void REGPARAM2 debugmem_chipmem_wput(uaecptr addr, uae_u32 w) +{ + if (addr < debugmem_chiplimit) { + debugmem_chiphit(addr, w, 2); + } else { + uae_u16 *m; + addr &= chipmem_bank.mask; + m = (uae_u16 *)(chipmem_bank.baseaddr + addr); + do_put_mem_word(m, w); + } +} + +void REGPARAM2 debugmem_chipmem_bput(uaecptr addr, uae_u32 b) +{ + if (addr < debugmem_chiplimit) { + debugmem_chiphit(addr, b, 1); + } else { + addr &= chipmem_bank.mask; + chipmem_bank.baseaddr[addr] = b; + } +} + +static int REGPARAM2 debugmem_chipmem_check(uaecptr addr, uae_u32 size) +{ + addr &= chipmem_bank.mask; + return (addr + size) <= chipmem_bank.reserved_size; +} + +static uae_u8 *REGPARAM2 debugmem_chipmem_xlate(uaecptr addr) +{ + addr &= chipmem_bank.mask; + return chipmem_bank.baseaddr + addr; +} + +static addrbank debugmem_chipmem_bank = { + debugmem_chipmem_lget, debugmem_chipmem_wget, debugmem_chipmem_bget, + debugmem_chipmem_lput, debugmem_chipmem_wput, debugmem_chipmem_bput, + debugmem_chipmem_xlate, debugmem_chipmem_check, NULL, _T("chip"), _T("Debug Chip memory"), + debugmem_chipmem_lget, debugmem_chipmem_wget, + ABFLAG_RAM | ABFLAG_THREADSAFE | ABFLAG_CHIPRAM | ABFLAG_CACHE_ENABLE_BOTH, 0, 0 +}; + +static void setchipbank(bool activate) +{ + if (activate) { + map_banks(&debugmem_chipmem_bank, 0, 1, 0); + } else { + map_banks(&chipmem_bank, 0, 1, 0); + } +} + +static struct debugmemallocs *getallocblock(void) +{ + int round = 0; + alloccnt++; + if (alloccnt >= MAX_DEBUGMEMALLOCS) { + alloccnt = 1; + } + while (allocs[alloccnt]->id != 0) { + alloccnt++; + if (alloccnt >= MAX_DEBUGMEMALLOCS) { + alloccnt = 1; + if (round) { + console_out_f(_T("debugmem out of alloc blocks!\n")); + return NULL; + } + round++; + } + } + struct debugmemallocs *dm = allocs[alloccnt]; + dm->id = alloccnt; + return dm; +} + +static struct debugmemallocs *debugmem_allocate(uae_u32 size, uae_u32 flags, uae_u32 parentid) +{ + struct debugmemallocs *dm = getallocblock(); + if (!dm) + return NULL; + int offset = debugmemptr / PAGE_SIZE; + bool gotit = true; + int totalsize = 0; + int extrasize = 0; + for (extrasize = HUNK_GAP; extrasize >= PAGE_SIZE; extrasize /= 2) { + totalsize = (extrasize + size + PAGE_SIZE - 1) & ~PAGE_SIZE_MASK; + for (int i = 0; i < totalmemdata; i++) { + struct debugmemdata *dm = dmd[offset]; + if (offset + totalsize / PAGE_SIZE >= totalmemdata) { + offset = 0; + continue; + } + gotit = true; + // extra + size continous space available? + if (!(dm->flags & DEBUGMEM_ALLOCATED)) { + for (int j = 0; j < totalsize / PAGE_SIZE; j++) { + struct debugmemdata *dm2 = dmd[offset + j]; + if (dm->flags & DEBUGMEM_ALLOCATED) { + gotit = false; + break; + } + } + } + if (gotit) + break; + offset++; + offset = offset % totalmemdata; + } + if (gotit) + break; + } + if (!gotit || !totalsize || !extrasize) { + console_out_f(_T("debugmem out of free space! Alloc size %d, flags %08x\n"), size, flags); + return 0; + } + dm->parentid = parentid; + dm->start_page = offset; + dm->pages = totalsize / PAGE_SIZE; + for (int j = 0; j < dm->pages; j++) { + struct debugmemdata *dm2 = dmd[offset + j]; + dm2->flags |= DEBUGMEM_ALLOCATED; + dm2->id = dm->id; + } + memset(debugmem_bank.baseaddr + offset * PAGE_SIZE, 0xa3, totalsize); + int startoffset = extrasize / PAGE_SIZE; + dm->start = (offset + startoffset) * PAGE_SIZE; + dm->size = size; + dm->pc = M68K_GETPC; + for (int j = 0; j < (size + PAGE_SIZE - 1) / PAGE_SIZE; j++) { + struct debugmemdata *dm2 = dmd[offset + startoffset + j]; + dm2->flags |= DEBUGMEM_INUSE | flags; + if (j == 0) { + dm2->flags |= DEBUGMEM_STARTBLOCK; + } + memset(dm2->state, ((flags & DEBUGMEM_INITIALIZED) ? DEBUGMEM_INITIALIZED : 0) | DEBUGMEM_INUSE, PAGE_SIZE); + uae_u8 filler = (flags & DEBUGMEM_INITIALIZED) ? 0x00 : 0x99; + memset(debugmem_bank.baseaddr + (offset + startoffset + j) * PAGE_SIZE, filler, PAGE_SIZE); + if (j == (size + PAGE_SIZE - 1) / PAGE_SIZE - 1) { + if (size & PAGE_SIZE_MASK) { + dm2->unused_end = PAGE_SIZE - (size & PAGE_SIZE_MASK); + dm2->flags |= DEBUGMEM_PARTIAL; + memset(dm2->state + (PAGE_SIZE - dm2->unused_end), 0, dm2->unused_end); + memset(debugmem_bank.baseaddr + (offset + startoffset + j) * PAGE_SIZE + (PAGE_SIZE - dm2->unused_end), 0x97, dm2->unused_end); + } + } + } + debugmemptr = offset * PAGE_SIZE + extrasize + ((size + PAGE_SIZE - 1) & ~PAGE_SIZE_MASK); + return dm; +} + +static int debugmem_unreserve(uaecptr addr, uae_u32 size, bool noerror) +{ + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + struct debugmemallocs *alloc = allocs[i]; + if (alloc->type != DEBUGALLOC_SEG) + continue; + if (alloc->start == addr && alloc->size == size) { + int id = alloc->parentid; + memset(alloc, 0, sizeof(struct debugmemallocs)); + return id; + } + if (alloc->start == addr) { + console_out_f(_T("Invalid memory unreserve %08x - %08x %d. Start address points to start of reserved memory but size does not match allocation size (%d <> %d)\n"), + addr, addr + size - 1, size, size, alloc->size); + return 0; + } + } + if (!noerror) + console_out_f(_T("Invalid memory unreserve %08x - %08x %d\n"), addr, addr + size - 1, size); + return 0; +} + +// 0 = allocmem +// 1 = allocvec + +uaecptr debugmem_allocmem(int mode, uae_u32 size, uae_u32 flags, uae_u32 caller) +{ + if (!debugmem_bank.baseaddr || !size) + return 0; + if (flags & 2) // MEMF_CHIP? + return 0; + uae_u16 aflags = DEBUGMEM_READ | DEBUGMEM_WRITE; + if (flags & 0x10000) // MEMF_CLEAR + aflags |= DEBUGMEM_INITIALIZED; + if (mode) + size += 4; + struct debugmemallocs *dm = debugmem_allocate(size, aflags, 0); + if (!dm) + return 0; + dm->type = mode ? DEBUGALLOC_ALLOCVEC : DEBUGALLOC_ALLOCMEM; + dm->pc = caller; + debugreportalloc(dm); + uaecptr mem = dm->start + debugmem_bank.start; + if (mode) { + put_long(mem, size); + mem += 4; + } + return mem; +} + +uae_u32 debugmem_freemem(int mode, uaecptr addr, uae_u32 size, uae_u32 caller) +{ + if (!debugmem_bank.baseaddr || addr < debugmem_bank.start) + return 0; + if (mode > 0) { + addr -= 4; + size = get_long(addr); + } + int id = debugmem_free(addr, size); + if (id) { + console_out_f(_T("ID=%d: %s(%08x,%d) %08x - %08x PC=%08x\n"), id, mode ? _T("FreeVec") : _T("AllocMem"), addr, size, addr, addr + size - 1, caller); + } + return 1; +} + +static struct debugmemallocs *debugmem_reserve(uaecptr addr, uae_u32 size, uae_u32 parentid) +{ + struct debugmemallocs *dm = getallocblock(); + if (!dm) + return NULL; + dm->type = DEBUGALLOC_SEG; + dm->parentid = parentid; + dm->start = addr; + dm->size = size; + return dm; +} + +uae_u32 debugmem_exit(void) +{ + bool err = false; + console_out_f(_T("Debugged program exited\n")); + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + struct debugmemallocs *dma = allocs[i]; + if (dma->type == DEBUGALLOC_ALLOCMEM || dma->type == DEBUGALLOC_ALLOCVEC) { + err = true; + console_out_f(_T("Memory allocation (%08x,%d) %08x - %08x was not freed.\n"), + dma->start + debugmem_bank.start, dma->size, + dma->start + debugmem_bank.start, dma->start + (dma->size - 1) + debugmem_bank.start); + } + } + if (err) { + debugmem_break(4); + } + + debugmem_trace = false; + debugmem_active = false; + debugmem_chiplimit = 0; + chipmem_setindirect(); + setchipbank(false); + return 1; +} + +static uae_u32 gl(uae_u8 *p) +{ + return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | (p[3]); +} + +static struct debugcodefile *loadcodefile(const TCHAR *path, const TCHAR *name) +{ + TCHAR fpath[MAX_DPATH]; + fpath[0] = 0; + if (path) + _tcscat(fpath, path); + _tcscat(fpath, name); + struct zfile *zf = zfile_fopen(fpath, _T("rb")); + if (!zf) { + console_out_f(_T("Couldn't open source file '%s'\n"), fpath); + return NULL; + } + int length; + uae_u8 *data2 = zfile_getdata(zf, 0, -1, &length); + if (!data2) { + zfile_fclose(zf); + console_out_f(_T("Couldn't read source file '%s'\n"), fpath); + return NULL; + } + uae_u8 *data = xcalloc(uae_u8, length + 1); + memcpy(data, data2, length); + xfree(data2); + zfile_fclose(zf); + struct debugcodefile *cf = codefiles[codefilecnt]; + if (!cf) { + cf = codefiles[codefilecnt] = xcalloc(struct debugcodefile, 1); + } + codefilecnt++; + cf->name = my_strdup(name); + cf->data = data; + cf->length = length; + cf->lines = 1; + for (int i = 0; i < length; i++) { + if (data[i] == 0) { + data[i] = 32; + } + if (data[i] == 10) { + data[i] = 0; + cf->lines++; + } + } + cf->lineptr = xcalloc(uae_u8*, 1 + cf->lines + 2); + int linecnt = 1; + int lasti = 0; + for (int i = 0; i <= length; i++) { + if (data[i] == 0) { + uae_u8 *s = &data[lasti]; + lasti = i + 1; + if (strlen((char*)s) >= MAX_SOURCELINELEN) { + s[MAX_SOURCELINELEN] = 0; + } + cf->lineptr[linecnt++] = s; + int len = strlen((char*)s); + if (len > 0 && s[len - 1] == 13) + s[len - 1] = 0; + } + } + console_out_f(_T("Loaded source file '%s', %d bytes, %d lines\n"), fpath, cf->length, cf->lines); + return cf; +} + +static uae_u32 maptohunks(uae_u32 offset) +{ + for (int i = 1; i <= executable_last_segment; i++) { + struct debugmemallocs *alloc = allocs[i]; + if (offset >= alloc->relative_start && offset < alloc->relative_start + alloc->size) { + uae_u32 address = offset - alloc->relative_start + alloc->start + debugmem_bank.start + 8; + return address; + } + } + return 0xffffffff; +} + +static struct debugsymbol *issymbol(const TCHAR *name) +{ + for (int i = 0; i < symbolcnt; i++) { + struct debugsymbol *ds = symbols[i]; + if (!_tcsicmp(ds->name, name)) { + return ds; + } + } + return NULL; +} + + +static struct stab *findstab(uae_u8 type, int *idxp) +{ + int idx = idxp ? *idxp : 0; + while (idx < stabscount) { + if (stabs[idx].type == type) { + if (idxp) + *idxp = idx + 1; + return &stabs[idx]; + } + idx++; + } + return NULL; +} + +static void parse_stabs(void) +{ + TCHAR *path = NULL; + struct stab *s; + int idx; + + idx = 0; + for (;;) { + s = findstab(N_SO, &idx); + if (!s) + break; + if (s->string && s->string[_tcslen(s->string) - 1] == '/') { + path = s->string; + break; + } + } + idx = 0; + while (idx < stabscount) { + s = &stabs[idx++]; + if (!s) + break; + if (s->type == N_SO && s->string && s->string[_tcslen(s->string) - 1] != '/') { + struct debugcodefile *cf = loadcodefile(NULL, s->string); + if (!cf) { + cf = loadcodefile(path, s->string); + if (!cf) { + if (!_tcsnicmp(path, _T("/cygdrive/"), 10)) { + TCHAR path2[MAX_DPATH]; + _stprintf(path2, _T("%c:/%s"), path[10], path + 12); + cf = loadcodefile(path2, s->string); + if (!cf) { + console_out_f(_T("Failed to load '%s'\n"), s->string); + continue; + } + } + } + } + int linecnt = 0; + struct debugsymbol *last_func = NULL; + while (idx < stabscount) { + TCHAR stripname[256]; + int type = 0; + TCHAR mode = 0; + s = &stabs[idx++]; + if (s->type == N_SO) + break; + if (s->string) { + _tcscpy(stripname, s->string); + const TCHAR *ss = _tcschr(s->string, ':'); + if (ss) { + mode = ss[1]; + type = _tstol(ss + 2); + stripname[ss - s->string] = 0; + } + } + + switch(s->type) + { + case N_SLINE: + case N_DSLINE: + if (s->val >= linemapsize) { + console_out_f(_T("Line address larger than segment size!? %08x >= %08x\n"), s->val, linemapsize); + return; + } + linemap[s->val].file = cf; + linemap[s->val].line = s->desc; + //write_log(_T("%08x %d %s\n"), s->val, s->desc, cf->name); + linecnt++; + break; + case N_FUN: + case N_STSYM: + case N_LCSYM: + { + if (s->string) { + struct debugsymbol *ds = issymbol(s->string); + if (!ds) { + uae_u32 addr = maptohunks(s->val); + if (addr != 0xffffffff) { + ds = symbols[symbolcnt++]; + ds->name = my_strdup(stripname); + ds->value = addr; + ds->flags = mode == mode > 'Z' ? SYMBOL_LOCAL : SYMBOL_GLOBAL; + } + } + if (ds) { + if (mode == 'F' || mode == 'f') + ds->type = SYMBOLTYPE_FUNC; + if (s->type == N_FUN) { + last_func = ds; + } + } + } + } + break; + case N_GSYM: + { + for (int i = 0; i < symbolcnt; i++) { + struct debugsymbol *ds = symbols[i]; + if (ds->name[0] == '_' && !_tcscmp(ds->name + 1, stripname)) { + ds->flags = SYMBOL_GLOBAL; + break; + } + } + } + break; + case N_LSYM: + { + // type? + const TCHAR *ts = _tcschr(s->string, '='); + if (ts) { + const TCHAR *tts = _tcschr(s->string, ':'); + if (tts) { + int tid = _tstol(tts + 2); + if (tid > 0) { + if (!cf->stabtypes) { + cf->stabtypecount = 1000; + cf->stabtypes = xcalloc(struct stabtype, cf->stabtypecount); + } + if (tid < cf->stabtypecount) { + struct stabtype *st = &cf->stabtypes[tid]; + st->name = my_strdup(s->string); + st->name[tts - s->string] = 0; + st->id = tid; + } + } + } + } else if (last_func) { + // stack variable + if (stackvarcnt < MAX_STACKVARS) { + struct stackvar *sv = stackvars[stackvarcnt++]; + sv->func = last_func; + sv->name = my_strdup(stripname); + sv->offset = s->val; + if (!last_func->data) + last_func->data = sv; + } + } + } + break; + case N_LBRAC: + case N_RBRAC: + break; + case N_ROSYM: + case N_RSYM: + //console_out_f(_T("%02x %02x %04x %08x %s\n"), s->type, s->other, s->desc, s->val, s->string); + break; + default: + //console_out_f(_T("%02x %02x %04x %08x %s\n"), s->type, s->other, s->desc, s->val, s->string); + break; + } + } + } + } + /* + int prev = -1; + for (int i = 0; i < linemapsize; i++) { + struct linemapping *lm = &linemap[i]; + if (lm->line >= 0) { + prev = i; + } else if (prev >= 0 && lm->line < 0) { + lm->file = linemap[prev].file; + lm->line = linemap[prev].line; + } + + } + */ +} + +uaecptr debugmem_reloc(uaecptr exeaddress, uae_u32 len, uaecptr task, uae_u32 *stack) +{ + uae_u8 *p = get_real_address(exeaddress); + uae_u8 *lastptr = NULL; + struct debugmemallocs *hunks[1000]; + uae_u32 lens[1000], memtypes[1000]; + uae_u32 parentid = 0; + + debugmem_init(); + if (!debugmem_initialized) + return 0; + + console_out_f(_T("Loading executable, exe=%08x\n"), exeaddress); + + if (gl(p) != 0x3f3) { + console_out_f(_T("HUNK_HEADER not found!\n")); + return 0; + } + p += 4; + if (gl(p) != 0) { + console_out_f(_T("Long word after HUNK_HEADER is not zero!\n")); + return 0; + } + p += 4; + int hunkcnt = gl(p); + int first = gl(p + 4); + int last = gl(p + 8); + if (hunkcnt > 1000 || (last - first + 1) > 1000) { + console_out_f(_T("Too many hunks.\n")); + return 0; + } + if (first > last) { + console_out_f(_T("First hunk larger than last hunk (%d > %d).\n"), first, last); + return 0; + } + p += 12; + uae_u32 relative_start = 0; + for (int i = first; i <= last; i++) { + uae_u32 len = gl(p); + p += 4; + memtypes[i] = 0; + if ((len & 0xc0000000) == 0xc0000000) { + memtypes[i] = gl(p); + p += 4; + } else if (len & 0x40000000) { + memtypes[i] = 0x40000000; + } else { + memtypes[i] = len & 0xc0000000; + } + len &= ~(0x80000000 | 0x40000000); + lens[i] = len * 4; + struct debugmemallocs *dma = debugmem_allocate(lens[i] + 8, DEBUGMEM_READ | DEBUGMEM_WRITE | DEBUGMEM_FETCH | DEBUGMEM_INITIALIZED, parentid); + hunks[i] = dma; + dma->type = DEBUGALLOC_HUNK; + dma->relative_start = relative_start; + relative_start += lens[i]; + if (!hunks[i]) { + console_out_f(_T("Hunk #%d memory allocation failed, size %d\n"), i, len + 8); + return 0; + } + if (!parentid) { + parentid = hunks[i]->id; + } + linemapsize += lens[i]; + } + for (int i = first; i <= last; i++) { + struct debugmemallocs *memdm = hunks[i]; + uae_u32 len = lens[i]; + uae_u32 hunktype = gl(p) & ~0xc0000000; + uae_u32 hunklen = gl(p + 4); + hunklen *= 4; + p += 8; + uae_u32 memflags = 0; + if (hunktype != 0x3e9 && hunktype != 0x3ea && hunktype != 0x3eb) { + console_out_f(_T("Unknown hunk #%d %08x.\n"), i, hunktype); + return 0; + } + memdm->idtype = hunktype | memtypes[i]; + if (hunklen > len) { + console_out_f(_T("Hunk #%d contents (%d) larger than allocation (%d)!\n"), i, hunklen, len); + return 0; + } + uae_u8 *mem = memdm->start + debugmem_bank.baseaddr; + uaecptr memaddr = memdm->start + debugmem_bank.start; + if (hunktype != 0x3eb) { + for (int c = 0; c < hunklen; c++) { + put_byte_host(mem + 8 + c, *p++); + } + } + put_long_host(mem, len / 4); + if (lastptr) { + put_long_host(lastptr, memaddr / 4 + 1); + } + lastptr = mem + 4; + if (gl(p) == 0x3ec) { // hunk reloc + if (hunktype == 0x3eb) { + console_out_f(_T("HUNK_BSS with HUNK_RELOC32!\n")); + return 0; + } + p += 4; + for (;;) { + int reloccnt = gl(p); + p += 4; + if (!reloccnt) + break; + int relochunk = gl(p); + p += 4; + if (relochunk > last) { + console_out_f(_T("HUNK_RELOC hunk #%d is larger than last hunk (%d)!\n"), relochunk, last); + return 0; + } + uaecptr hunkptr = hunks[relochunk]->start + debugmem_bank.start + 8; + uae_u8 *currenthunk = mem + 8; + for (int j = 0; j < reloccnt; j++) { + uae_u32 reloc = gl(p); + p += 4; + if (reloc >= len - 3) { + console_out_f(_T("HUNK_RELOC hunk #%d offset %d larger than hunk lenght %d!\n"), i, reloc, len); + return 0; + } + put_long_host(currenthunk + reloc, get_long_host(currenthunk + reloc) + hunkptr); + } + } + } + + for (;;) { + + if (gl(p) == 0x3f0) { // hunk symbol + + int symcnt = 0; + p += 4; + for (;;) { + int size = gl(p); + p += 4; + if (!size) + break; + struct debugsymbol *ds = symbols[symbolcnt++]; + ds->name = au((char*)p); + p += 4 * size; + ds->value = gl(p) + hunks[i]->start + 8 + debugmem_bank.start; + ds->allocid = hunks[i]->id; + ds->section = hunks[i]; + ds->flags = SYMBOL_GLOBAL; + p += 4; + symcnt++; + } + console_out_f(_T("Hunk %d: %d symbols loaded.\n"), i, symcnt); + + } else if (gl(p) == 0x3f1) { // hunk debug + + p += 4; + int size = gl(p); + p += 4; + uae_u8 *p2 = p; + if (size >= 12) { + if (gl(p) == 0x0000010b) { // "ZMAGIC" + p += 4; + int symtab_size = gl(p); + p += 4; + int stringtab_size = gl(p); + p += 4; + uae_u8 *stringtab = p + symtab_size; + if (!stabs) { + stabs = xcalloc(struct stab, symtab_size / 12); + } else { + stabs = xrealloc(struct stab, stabs, stabscount + symtab_size / 12); + } + for (int i = 0; i <= symtab_size - 12; i += 12, p += 12) { + struct stab *s = &stabs[stabscount++]; + TCHAR *str = NULL; + int string_idx = gl(p); + uae_u8 type = p[4]; + uae_u8 other = p[5]; + uae_u16 desc = (p[6] << 8) | p[7]; + uae_u32 value = gl(p + 8); + if (string_idx) { + uae_char *s = (uae_char*)stringtab + string_idx; + str = au(s); + } + s->type = type; + s->other = other; + s->desc = desc; + s->val = value; + s->string = str; + } + console_out_f(_T("%d stabs loaded.\n"), symtab_size / 12); + } else { + console_out_f(_T("HUNK_DEBUG is not in expected format\n")); + } + } + p = p2 + 4 * size; + + } else if (gl(p) == 0x3f2) { + + p += 4; + + } else { + + break; + + } + } + } + if (gl(p - 4) != 0x3f2) { + console_out_f(_T("HUNK_END not found, got %08x\n"), gl(p - 4)); + return 0; + } + struct debugmemallocs *stackmem = debugmem_allocate(*stack, DEBUGMEM_READ | DEBUGMEM_WRITE | DEBUGMEM_INITIALIZED | DEBUGMEM_STACK, parentid); + if (!stackmem) + return 0; + stackmem->type = DEBUGALLOC_HUNK; + stackmem->idtype = 0xffff; + *stack = stackmem->start + debugmem_bank.start; + executable_last_segment = alloccnt; + + linemap = xcalloc(struct linemapping, linemapsize + 1); + for (int i = 0; i < linemapsize + 1; i++) { + linemap[i].line = -1; + } + + parse_stabs(); + for (int i = 1; i <= executable_last_segment; i++) { + debugreportalloc(allocs[i]); + } + + console_out_f(_T("Executable load complete.\n")); + + uaecptr execbase = get_long_debug(4); + exec_thistask = get_real_address(execbase + 276); + + setchipbank(true); + chipmem_setindirect(); + debugger_scan_libraries(); + + debug_waiting = true; + debug_task = task; + debugmem_trace = true; + debugmem_active = true; + return hunks[first]->start + debugmem_bank.start + 8; +} + +static uae_char *gethunktext(uae_u8 *p, uae_char *namebuf, int len) +{ + memcpy(namebuf, p, len); + namebuf[len] = 0; + return namebuf; +} + +static void scan_library_list(uaecptr v, int *cntp) +{ + while ((v = get_long_debug(v))) { + uae_u32 v2; + uae_u8 *p; + addrbank *b = &get_mem_bank(v); + if (!b || !b->check(v, 32) || !(b->flags & ABFLAG_RAM)) + return; + v2 = get_long_debug(v + 10); // name + b = &get_mem_bank(v2); + if (!b || !b->check(v2, 20)) + return; + if (!(b->flags & ABFLAG_ROM) && !(b->flags & ABFLAG_ROMIN) && !(b->flags & ABFLAG_RAM)) + return; + p = b->xlateaddr(v2); + struct libname *found = NULL; + for (int i = 0; i < libnamecnt; i++) { + struct libname *name = &libnames[i]; + char n[256]; + sprintf(n, "%s.library", name->aname); + if (!strcmp((char*)p, n)) { + name->base = v; + found = name; + break; + } + sprintf(n, "%s.device", name->aname); + if (!strcmp((char*)p, n)) { + name->base = v; + found = name; + break; + } + sprintf(n, "%s.resource", name->aname); + if (!strcmp((char*)p, n)) { + name->base = v; + found = name; + break; + } + } + if (found) { + (*cntp)++; + //console_out_f(_T("%08x = '%s'\n"), found->base, found->name); + } + } +} + +void debugger_scan_libraries(void) +{ + if (!libnamecnt) + return; + uaecptr v = get_long_debug(4); + addrbank *b = &get_mem_bank(v); + if (!b || !b->check(v, 400) || !(b->flags & ABFLAG_RAM)) + return; + int cnt = 0; + scan_library_list(v + 378, &cnt); + scan_library_list(v + 350, &cnt); + scan_library_list(v + 336, &cnt); + console_out_f(_T("%d libraries matched with library symbols.\n"), cnt); +} + + +bool debugger_get_library_symbol(uaecptr base, uaecptr addr, TCHAR *out) +{ + for (int i = 0; i < libnamecnt; i++) { + struct libname *name = &libnames[i]; + if (name->base == base) { + for (int j = 0; j < libsymbolcnt; j++) { + struct libsymbol *lvo = &libsymbols[j]; + if (lvo->lib == name) { + if (lvo->value == addr) { + _stprintf(out, _T("%s/%s"), name->name, lvo->name); + return true; + } + } + } + } + } + return false; +} + +static bool debugger_load_fd(void) +{ + TCHAR plugin_path[MAX_DPATH]; + TCHAR path[MAX_DPATH]; + uae_char line[256]; + struct my_opendir_s *h; + struct zfile *zf = NULL; + + if (fds_loaded) + return true; + fds_loaded = true; + + if (!get_plugin_path(plugin_path, sizeof plugin_path / sizeof(TCHAR), _T("debugger\\fd"))) + return false; + h = my_opendir(plugin_path); + if (!h) + return false; + + for (;;) { + TCHAR filename[MAX_DPATH]; + if (!my_readdir(h, filename)) + break; + if (_tcslen(filename) < 3 || _tcsicmp(filename + _tcslen(filename) - 3, _T(".fd"))) + continue; + + _tcscpy(path, plugin_path); + _tcscat(path, filename); + zf = zfile_fopen(path, _T("rb")); + if (!zf) + continue; + + int cnt = 0; + int bias = -1; + struct libname *lvo = NULL; + uae_u32 lvoid = 1; + if (libnamecnt > 0) { + lvoid = libnames[libnamecnt - 1].id; + } + for (;;) { + if (!zfile_fgetsa(line, sizeof(line), zf)) + break; + for (;;) { + int len = strlen(line); + if (len < 1) + break; + char c = line[len - 1]; + if (c != 10 && c != 13 && c != 32 && c != '\t') + break; + line[len - 1] = 0; + } + if (line[0] == '#' && line[1] == '#') { + char *p1 = &line[2]; + char *p2 = strchr(p1, ' '); + if (p2) { + *p2 = 0; + p2++; + } + if (!strcmp(p1, "base")) { + if (p2[0] == '_') + p2++; + lvo = &libnames[libnamecnt++]; + TCHAR *name2 = au(p2); + lvo->name = name2; + lvo->aname = strdup(p2); + lvo->id = lvoid++; + cnt = 0; + } else if (!strcmp(p1, "bias")) { + bias = atol(p2); + } + continue; + } + if (line[0] == '*' || line[0] == '#') + continue; + if (bias < 0 || !lvo) + continue; + char *p3 = strchr(line, '('); + if (p3) + *p3 = 0; + TCHAR *name2 = au(line); + struct libsymbol *ls = &libsymbols[libsymbolcnt++]; + ls->name = name2; + ls->value = -bias; + ls->lib = lvo; + bias += 6; + cnt++; + } + if (lvo) + console_out_f(_T("Loaded '%s', %d LVOs\n"), lvo->name, cnt); + zfile_fclose(zf); + } + my_closedir(h); + return true; +} + +static bool debugger_load_library(const TCHAR *name) +{ + TCHAR plugin_path[MAX_DPATH]; + uae_char namebuf[256]; + bool ret = false; + int filelen; + struct zfile *zf = NULL; + + if (libraries_loaded) + return true; + libraries_loaded = true; + + if (get_plugin_path(plugin_path, sizeof plugin_path / sizeof(TCHAR), _T("debugger"))) { + _tcscat(plugin_path, name); + zf = zfile_fopen(plugin_path, _T("rb")); + } + if (!zf) { + zf = zfile_fopen(name, _T("rb")); + if (!zf) { + console_out_f(_T("Couldn't open '%s'\n"), name); + return false; + } + } + uae_u8 *file = zfile_getdata(zf, 0, -1, &filelen); + zfile_fclose(zf); + + uae_u32 len; + uae_u8 *p = file; + if (gl(p) != 0x03e7) { + console_out_f(_T("'%s' is not a library\n"), name); + goto end; + } + + if (!libnames) { + libnames = xcalloc(struct libname, 1000); + libsymbols = xcalloc(struct libsymbol, 10000); + } + + struct libname *lvo = NULL; + int lvoid = 1; + for (;;) { + if (p == file + filelen) { + ret = true; + goto end; + } + if (p == file + filelen) { + goto end; + } + uae_u32 hunk = gl(p); + p += 4; + switch (hunk) + { + case 0x3e7: // HUNK_UNIT + { + lvo = NULL; + len = gl(p) * 4; + p += 4; + uae_char *name = gethunktext(p, namebuf, len); + if (strlen(name) > 4 && !strcmp(&name[strlen(name) - 4], "_LVO")) { + name[strlen(name) - 4] = 0; + lvo = &libnames[libnamecnt++]; + TCHAR *name2 = au(name); + lvo->name = name2; + lvo->aname = strdup(name); + lvo->id = lvoid++; + } + p += len; + } + break; + case 0x3e8: // HUNK_NAME + { + len = gl(p) * 4; + p += 4; + uae_char *name = gethunktext(p, namebuf, len); + p += len; + } + break; + case 0x3e9: // HUNK_CODE + case 0x3ea: // HUNK_DATA + { + len = gl(p) * 4; + p += 4 + len; + } + break; + case 0x3eb: // HUNK_BSS + { + p += 4; + } + break; + case 0x3f2: // HUNK_END + break; + case 0x3ef: // HUNK_EXT + { + for (;;) { + len = gl(p); + p += 4; + if (!len) + break; + uae_u8 type = len >> 24; + len &= 0xffffff; + len *= 4; + if (type == 2) { + uae_u8 *p2 = p; + p += len; + uae_u32 value = gl(p); + p += 4; + if (lvo) { + uae_char *name = gethunktext(p2, namebuf, len); + if (!strncmp(name, "_LVO", 4)) { + TCHAR *name2 = au(name + 4); + struct libsymbol *ls = &libsymbols[libsymbolcnt++]; + ls->name = name2; + ls->value = value; + ls->lib = lvo; + } + } + } else if (type & 0x80) { + p += len; + len = gl(p) * 4; // number of references + p += 4; + p += len; + } else { + p += len; + p += 4; + } + } + } + break; + case 0x3ec: // HUNK_RELOC + { + for (;;) { + int reloccnt = gl(p); + p += 4; + if (!reloccnt) + break; + p += (1 + reloccnt) * 4; + } + } + break; + case 0x3f1: // HUNK_DEBUG + { + len = gl(p) * 4; + p += 4; + p += len; + } + break; + default: + console_out_f(_T("Unknown hunk %08x\n"), hunk); + goto end; + } + } +end: + if (ret) + console_out_f(_T("Loaded '%s', %ld libraries, %ld LVOs.\n"), name, libnamecnt, libsymbolcnt); + xfree(file); + return ret; +} + +bool debugger_load_libraries(void) +{ + debugger_load_library(_T("amiga.lib")); + debugger_load_fd(); + return true; +} + + +void debugmem_addsegs(TrapContext *ctx, uaecptr seg, uaecptr name, uae_u32 lock) +{ + uae_u8 *file = NULL; + int filelen; + bool hasfile = false; + int fileoffset = 0; + int segmentid; + + if (!debugmem_initialized) + debugmem_init(); + if (!seg || !debugmem_initialized) + return; + seg *= 4; + uaecptr seg2 = seg; + uaecptr resident = 0; + while (seg) { + uaecptr next = get_long(seg) * 4; + uaecptr len = get_long(seg - 4) * 4; + for (int i = 0; i < len - 26; i += 2) { + uae_u16 w = get_word(seg + 4 + i); + if (w == 0x4afc) { + uae_u32 l = get_long(seg + 4 + i + 2); + if (l == seg + 4 + i) { + resident = seg + 4 + i; + seg = 0; + break; + } + } + } + seg = next; + } + if (!resident) + return; + console_out_f(_T("Adding segment %08x, Resident %08x.\n"), seg2, resident); + struct debugsegtracker *sg = NULL; + for (segmentid = 0; segmentid < MAX_DEBUGSEGS; segmentid++) { + if (!dsegt[segmentid]->allocid) { + sg = dsegt[segmentid]; + if (segmentid >= segtrackermax) + segtrackermax = segmentid + 1; + break; + } + } + if (!sg) + return; + sg->resident = resident; + if (name) { + uae_char aname[256]; + TCHAR nativepath[MAX_DPATH]; + nativepath[0] = 0; + strcpyah_safe(aname, name, sizeof aname); + sg->name = au(aname); + if (lock && !get_native_path(ctx, lock, nativepath)) { + struct zfile *zf = zfile_fopen(nativepath, _T("rb")); + if (zf) { + file = zfile_getdata(zf, 0, -1, &filelen); + zfile_fclose(zf); + + } + while (file) { + if (gl(file) != 0x03f3) + break; + if (gl(file + 4) != 0x0) + break; + int hunks = gl(file + 8); + hasfile = true; + fileoffset = 5 * 4 + hunks * 4; + break; + } + } + console_out_f(_T("Name '%s', native path '%s'\n"), sg->name, nativepath[0] ? nativepath : _T("")); + } else { + sg->name = my_strdup(_T("")); + } + int parentid = 0; + int cnt = 1; + seg = seg2; + while (seg) { + uaecptr next = get_long(seg) * 4; + uaecptr len = get_long(seg - 4) * 4; + struct debugmemallocs *dm = debugmem_reserve(seg, len, parentid); + if (!parentid) { + sg->allocid = dm->id; + parentid = dm->id; + dm->parentid = dm->id; + } + if (hasfile) { + dm->idtype = gl(&file[fileoffset]); + fileoffset += 4; + int hunklen = gl(&file[fileoffset]); + fileoffset += 4; + if (dm->idtype == 0x3e9 || dm->idtype == 0x3ea) { + fileoffset += hunklen * 4; + } + for (;;) { + uae_u32 hunktype = gl(&file[fileoffset]); + if (hunktype == 0x3e9 || hunktype == 0x3ea || hunktype == 0x3eb) + break; + if (hunktype == 0x3ec) { + fileoffset += 4; + for (;;) { + int reloccnt = gl(&file[fileoffset]); + fileoffset += 4; + if (!reloccnt) + break; + fileoffset += (1 + reloccnt) * 4; + } + } else if (hunktype == 0x3f0) { + int symcnt = 0; + fileoffset += 4; + for (;;) { + int size = gl(&file[fileoffset]); + fileoffset += 4; + if (!size) + break; + struct debugsymbol *ds = symbols[symbolcnt++]; + ds->name = au((char*)&file[fileoffset]); + fileoffset += 4 * size; + ds->value = gl(&file[fileoffset]) + seg + 4; + ds->segment = segmentid; + ds->section = dm; + fileoffset += 4; + symcnt++; + } + console_out_f(_T("%d symbols loaded.\n"), symcnt); + } else if (hunktype == 0x3f1) { + fileoffset += 4; + int debugsize = gl(&file[fileoffset]); + fileoffset += 4; + fileoffset += debugsize * 4; + } else if (hunktype == 0x3f2) { + fileoffset += 4; + } else { + break; + } + if (fileoffset >= filelen) + break; + } + } + dm->internalid = cnt++; + debugreportalloc(dm); + seg = next; + } + xfree(file); + console_out_f(_T("Segment '%s' %08x added.\n"), sg->name, seg2); +} + +void debugmem_remsegs(uaecptr seg) +{ + int parentid = 0; + if (!seg || !debugmem_initialized) + return; + seg *= 4; + uaecptr seg2 = seg; + while (seg) { + uaecptr next = get_long(seg) * 4; + uaecptr len = get_long(seg - 4) * 4; + parentid = debugmem_unreserve(seg, len, true); + if (!parentid) { + if (seg2 == seg) + return; + debugmem_break(5); + return; + } + seg = next; + } + console_out_f(_T("Freeing segment %08x...\n"), seg); + struct debugmemallocs *nextavail = NULL; + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + struct debugmemallocs *alloc = allocs[i]; + if (alloc->parentid == parentid) { + console_out_f(_T("Segment not freed: ")); + debugreportalloc(alloc); + nextavail = alloc; + } + } + struct debugsegtracker *sg = NULL; + for (int i = 0; i < MAX_DEBUGSEGS; i++) { + if (dsegt[i]->allocid == parentid) { + sg = dsegt[i]; + if (nextavail) + sg->allocid = nextavail->id; + break; + } + } + if (!sg) { + return; + } + if (!nextavail) { + console_out_f(_T("Segment '%s' %08x freed.\n"), sg->name, seg2); + xfree(sg->name); + memset(sg, 0, sizeof(struct debugsegtracker)); + } else { + console_out_f(_T("Segment '%s' %08x partially freed.\n"), sg->name, seg2); + } +} + +static void allocate_stackframebuffers(void) +{ + if (!stackframes) { + stackframes = xcalloc(struct debugstackframe, MAX_STACKFRAMES); + stackframessuper = xcalloc(struct debugstackframe, MAX_STACKFRAMES); + } + stackframecnt = 0; + stackframecntsuper = 0; +} + +void debugmem_init(void) +{ + debug_waiting = false; + if (!debugmem_bank.baseaddr) { + int size = 0x10000000; + for (uae_u32 mem = 0x70000000; mem < 0xf0000000; mem += size) { + if (get_mem_bank_real(mem) == &dummy_bank && get_mem_bank_real(mem + size - 65536) == &dummy_bank) { + debugmem_bank.reserved_size = size; + debugmem_bank.mask = debugmem_bank.reserved_size - 1; + debugmem_bank.start = mem; + if (!mapped_malloc(&debugmem_bank)) { + console_out_f(_T("Failed to automatically allocate debugmem (mapped_malloc)!\n")); + return; + } + map_banks(&debugmem_bank, debugmem_bank.start >> 16, debugmem_bank.allocated_size >> 16, 0); + console_out_f(_T("Automatically allocated debugmem location: %08x - %08x %08x\n"), + debugmem_bank.start, debugmem_bank.start + debugmem_bank.allocated_size - 1, debugmem_bank.allocated_size); + break; + } + } + if (!debugmem_bank.baseaddr) { + console_out_f(_T("Failed to automatically allocate debugmem (no space)!\n")); + return; + } + } + memset(debugmem_bank.baseaddr, 0xa5, debugmem_bank.allocated_size); + if (!debugmem_func_lgeti) { + + debugmem_func_lgeti = debugmem_bank.lgeti; + debugmem_func_wgeti = debugmem_bank.wgeti; + debugmem_func_lget = debugmem_bank.lget; + debugmem_func_wget = debugmem_bank.wget; + debugmem_func_bget = debugmem_bank.bget; + debugmem_func_lput = debugmem_bank.lput; + debugmem_func_wput = debugmem_bank.wput; + debugmem_func_bput = debugmem_bank.bput; + debugmem_func_xlate = debugmem_bank.xlateaddr; + + debugmem_bank.lgeti = debugmem_lgeti; + debugmem_bank.wgeti = debugmem_wgeti; + debugmem_bank.lget = debugmem_lget; + debugmem_bank.wget = debugmem_wget; + debugmem_bank.bget = debugmem_bget; + debugmem_bank.lput = debugmem_lput; + debugmem_bank.wput = debugmem_wput; + debugmem_bank.bput = debugmem_bput; + debugmem_bank.xlateaddr = debugmem_xlate; + } + alloccnt = 0; + if (!allocs) { + allocs = xcalloc(struct debugmemallocs*, MAX_DEBUGMEMALLOCS); + struct debugmemallocs *a = xcalloc(struct debugmemallocs, MAX_DEBUGMEMALLOCS); + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + allocs[i] = a + i; + } + } + if (dmd) { + xfree(dmd[0]); + xfree(dmd); + } + totalmemdata = debugmem_bank.allocated_size / PAGE_SIZE; + dmd = xcalloc(struct debugmemdata*, totalmemdata); + struct debugmemdata *d = xcalloc(struct debugmemdata, totalmemdata); + for (int i = 0; i < totalmemdata; i++) { + dmd[i] = d + i; + } + debugmemptr = 0; + if (!dsegt) { + dsegt = xcalloc(struct debugsegtracker*, MAX_DEBUGSEGS); + struct debugsegtracker *sg = xcalloc(struct debugsegtracker, MAX_DEBUGSEGS); + for (int i = 0; i < MAX_DEBUGSEGS; i++) { + dsegt[i] = sg + i; + } + } + if (!symbols) { + symbols = xcalloc(struct debugsymbol*, MAX_DEBUGSYMS); + struct debugsymbol *sg = xcalloc(struct debugsymbol, MAX_DEBUGSYMS); + for (int i = 0; i < MAX_DEBUGSYMS; i++) { + symbols[i] = sg + i; + } + } + if (!stackvars) { + stackvars = xcalloc(struct stackvar*, MAX_STACKVARS); + struct stackvar *sg = xcalloc(struct stackvar, MAX_STACKVARS); + for (int i = 0; i < MAX_STACKVARS; i++) { + stackvars[i] = sg + i; + } + } + if (!codefiles) { + codefiles = xcalloc(struct debugcodefile*, MAX_DEBUGCODEFILES); + } + for (int i = 0; i < MAX_DEBUGMEMALLOCS; i++) { + memset(allocs[i], 0, sizeof(struct debugmemallocs)); + } + for (int i = 0; i < totalmemdata; i++) { + memset(dmd[i], 0, sizeof(struct debugmemdata)); + } + for (int i = 0; i < MAX_DEBUGSEGS; i++) { + xfree(dsegt[i]->name); + memset(dsegt[i], 0, sizeof(struct debugsegtracker)); + } + for (int i = 0; i < MAX_DEBUGSYMS; i++) { + xfree(symbols[i]->name); + memset(symbols[i], 0, sizeof(struct debugsymbol)); + } + for (int i = 0; i < MAX_STACKVARS; i++) { + xfree(stackvars[i]->name); + memset(stackvars[i], 0, sizeof(struct stackvar)); + } + for (int i = 0; i < codefilecnt; i++) { + struct debugcodefile *cf = codefiles[i]; + xfree(cf->lineptr); + xfree(cf->data); + xfree(cf->stabtypes); + memset(cf, 0, sizeof(struct debugcodefile)); + } + xfree(stabs); + stabs = NULL; + allocate_stackframebuffers(); + + debugmem_active = false; + stabscount = 0; + linemapsize = 0; + codefilecnt = 0; + symbolcnt = 0; + executable_last_segment = 0; + segtrackermax = 0; + debugmem_initialized = true; + debugmem_chiplimit = 0x400; + debugstack_word_state = 0; + + debugger_load_libraries(); +} + +void debugmem_disable(void) +{ + if (!debugmem_initialized) + return; + debugmem_bank.lgeti = debugmem_func_lgeti; + debugmem_bank.wgeti = debugmem_func_wgeti; + debugmem_bank.lget = debugmem_func_lget; + debugmem_bank.wget = debugmem_func_wget; + debugmem_bank.bget = debugmem_func_bget; + debugmem_bank.lput = debugmem_func_lput; + debugmem_bank.wput = debugmem_func_wput; + debugmem_bank.bput = debugmem_func_bput; + debugmem_bank.xlateaddr = debugmem_func_xlate; + debugmem_mapped = false; +} +void debugmem_enable(void) +{ + if (!debugmem_initialized) + return; + debugmem_bank.lgeti = debugmem_lgeti; + debugmem_bank.wgeti = debugmem_wgeti; + debugmem_bank.lget = debugmem_lget; + debugmem_bank.wget = debugmem_wget; + debugmem_bank.bget = debugmem_bget; + debugmem_bank.lput = debugmem_lput; + debugmem_bank.wput = debugmem_wput; + debugmem_bank.bput = debugmem_bput; + debugmem_bank.xlateaddr = debugmem_xlate; + debugmem_mapped = true; +} + +static struct debugsegtracker *findsegment(uaecptr addr, struct debugmemallocs **allocp) +{ + for (int i = 0; i < segtrackermax; i++) { + struct debugsegtracker *seg = dsegt[i]; + if (!seg->allocid) + continue; + struct debugmemallocs *alloc = allocs[seg->allocid]; + if (addr >= alloc->start && addr < alloc->start + alloc->size) { + if (allocp) + *allocp = alloc; + return seg; + } + } + return NULL; +} + +static struct debugmemallocs *ismysegment(uaecptr addr) +{ + if (addr < debugmem_bank.start) + return NULL; + addr -= debugmem_bank.start; + if (addr >= debugmem_bank.allocated_size) + return false; + for (int i = 1; i <= executable_last_segment; i++) { + struct debugmemallocs *alloc = allocs[i]; + if (addr >= alloc->start && addr < alloc->start + alloc->size) + return alloc; + } + return NULL; +} + +bool debugmem_get_symbol_value(const TCHAR *name, uae_u32 *valp) +{ + for (int i = 0; i < symbolcnt; i++) { + struct debugsymbol *ds = symbols[i]; + if (!_tcscmp(ds->name, name)) { + *valp = ds->value; + return true; + } + } + for (int i = 0; i < symbolcnt; i++) { + struct debugsymbol *ds = symbols[i]; + if (!_tcsicmp(ds->name, name)) { + *valp = ds->value; + return true; + } + } + return false; +} + +int debugmem_get_symbol(uaecptr addr, TCHAR *out, int maxsize) +{ + if (out) + out[0] = 0; + int found = 0; + for (int i = 0; i < symbolcnt; i++) { + struct debugsymbol *ds = symbols[i]; + if (ds->value == addr) { + if (out) { + TCHAR txt[256]; + _tcscpy(txt, ds->name); + + if ((ds->type == SYMBOLTYPE_FUNC) || !(ds->flags & SYMBOL_GLOBAL)) { + _tcscat(txt, _T(" (")); + if (!(ds->flags & SYMBOL_GLOBAL)) + _tcscat(txt, _T("L")); + if (ds->type == SYMBOLTYPE_FUNC) + _tcscat(txt, _T("F")); + _tcscat(txt, _T(")")); + } + +#if 0 + if ((ds->flags & SYMBOL_FUNC) && ds->data) { + bool first = true; + struct stackvar *sv = (struct stackvar*)ds->data; + TCHAR *p = txt + _tcslen(txt); + *p++ = '\n'; + *p++ = '-'; + *p = 0; + int size = sizeof(txt) / sizeof(TCHAR) - _tcslen(txt); + while (sv->func == ds) { + TCHAR txt2[256]; + TCHAR *p2 = txt2; + if (!first) + *p2++ = ','; + first = false; + _stprintf(p2, _T("%s:+%05X"), sv->name, sv->offset); + if (size <= _tcslen(txt2)) + break; + size -= _tcslen(txt2); + _tcscat(txt, txt2); + p += _tcslen(txt); + sv++; + } + *p = 0; + } +#endif + + if (maxsize > _tcslen(txt)) { + if (found) + _tcscat(out, _T("\n")); + _tcscat(out, txt); + maxsize -= _tcslen(txt); + } + } + found = i + 1; + } + } + return found; +} + +struct debugcodefile *last_codefile; + +int debugmem_get_sourceline(uaecptr addr, TCHAR *out, int maxsize) +{ + if (addr < debugmem_bank.start) + return -1; + addr -= debugmem_bank.start; + if (addr >= debugmem_bank.allocated_size) + return -1; + if (out) + out[0] = 0; + for (int i = 1; i <= executable_last_segment; i++) { + struct debugmemallocs *alloc = allocs[i]; + if (addr >= alloc->start && addr < alloc->start + alloc->size) { + int offset = addr - alloc->start + alloc->relative_start - 8; + if (offset < 0) + return -1; + struct linemapping *lm = &linemap[offset]; + int line = lm->line; + if (line < 0) + return -1; + if (!out) + return line; + int lastline = line; + for (;;) { + offset++; + if (offset >= linemapsize) + break; + struct linemapping *lm2 = &linemap[offset]; + if (!lm2->file) + continue; + if (lm2->file != lm->file) + break; + if (lm2->line <= 0) + continue; + lastline = lm2->line; + break; + } + struct debugcodefile *cf = lm->file; + if (cf->lineptr[line] && cf->lineptr[line][0]) { + if (last_codefile != cf) { + TCHAR txt[256]; + last_codefile = cf; + _stprintf(txt, _T("Source file: %s\n"), cf->name); + if (maxsize > _tcslen(txt)) { + _tcscat(out, txt); + maxsize -= _tcslen(txt); + } + } + if (lastline - line > 10) + lastline = line + 10; + for (int j = line; j < lastline; j++) { + TCHAR txt[256]; + TCHAR *s = au((uae_char*)cf->lineptr[j]); + if (maxsize > 6 + _tcslen(s) + 2) { + _stprintf(txt, _T("%5d %s\n"), j, s); + _tcscat(out, txt); + maxsize -= _tcslen(txt) + 2; + } + xfree(s); + } + return line; + } + return -1; + } + } + return -1; +} + +int debugmem_get_segment(uaecptr addr, bool *exact, bool *ext, TCHAR *out, TCHAR *name) +{ + if (out) + out[0] = 0; + if (name) + name[0] = 0; + if (exact) + *exact = false; + struct debugmemallocs *alloc = ismysegment(addr); + if (alloc) { + if (exact && alloc->start + 8 + debugmem_bank.start == addr) + *exact = true; + if (out) + _stprintf(out, _T("[%06X]"), ((addr - debugmem_bank.start) - (alloc->start + 8)) & 0xffffff); + if (name) + _stprintf(name, _T("Segment %d: %08x %08x-%08x"), + alloc->id, alloc->idtype, alloc->start + debugmem_bank.start, alloc->start + alloc->size - 1 + debugmem_bank.start); + if (ext) + *ext = false; + return alloc->id; + } else { + struct debugmemallocs *alloc; + struct debugsegtracker *seg = findsegment(addr, &alloc); + if (seg) { + if (out) + _stprintf(out, _T("[%06X]"), ((addr - debugmem_bank.start) - (alloc->start + 8)) & 0xffffff); + if (name) + _stprintf(name, _T("Segment %d ('%s') %08x %08x-%08x"), + alloc->internalid, seg->name, alloc->idtype, alloc->start, alloc->start + alloc->size - 1); + if (ext) + *ext = true; + return alloc->id; + } + } + return 0; +} + +bool debugmem_list_segment(int mode, uaecptr addr) +{ + if (mode) { + for (int i = 0; i < segtrackermax; i++) { + struct debugsegtracker *seg = dsegt[i]; + if (!seg->allocid) + continue; + console_out_f(_T("Load module '%s':\n"), seg->name); + debugreportsegment(seg, true); + } + } else { + if (addr == 0xffffffff) { + if (!executable_last_segment) { + console_out(_T("No executable loaded\n")); + return false; + } + for (int i = 1; i <= executable_last_segment; i++) { + debugreportalloc(allocs[i]); + } + return true; + } else { + struct debugsegtracker *seg = findsegment(addr, NULL); + if (seg) { + debugreportsegment(seg, false); + return true; + } + if (ismysegment(addr)) { + for (int i = 1; i <= executable_last_segment; i++) { + debugreportalloc(allocs[i]); + } + return true; + } + } + } + return false; +} + +bool debugmem_get_range(uaecptr *start, uaecptr *end) +{ + if (!executable_last_segment) + return false; + *start = allocs[1]->start + debugmem_bank.start; + *end = allocs[executable_last_segment - 1]->start + allocs[executable_last_segment - 1]->size + debugmem_bank.start; + return true; +} + +bool debugmem_isactive(void) +{ + return executable_last_segment != 0; +} + +uae_u32 debugmem_chiphit(uaecptr addr, uae_u32 v, int size) +{ + static int recursive; + if (recursive) { + return 0xdeadf00d; + } + recursive++; + bool dbg = false; + if (size > 0) { + if (debugmem_active) { + console_out_f(_T("%s write to %08x, value = %08x\n"), size == 4 ? _T("Long") : (size == 2 ? _T("Word") : _T("Byte")), addr, v); + dbg = debugmem_break(6); + } + } else { + size = -size; + // execbase? + if (size == 4 && addr == 4) { + recursive--; + return do_get_mem_long((uae_u32*)(chipmem_bank.baseaddr + 4)); + } + // exception vectors + if (regs.vbr < 0x100) { + // vbr == 0 so skip aligned long reads + if (size == 4 && addr >= regs.vbr + 8 && addr < regs.vbr + 0x100) { + recursive--; + return do_get_mem_long((uae_u32*)(chipmem_bank.baseaddr + addr)); + } + } + if (debugmem_active) { + console_out_f(_T("%s read from %08x\n"), size == 4 ? _T("Long") : (size == 2 ? _T("Word") : _T("Byte")), addr); + dbg = debugmem_break(7); + } + } + if (debugmem_active) { + if (!dbg) + m68k_dumpstate(0, 0xffffffff); + } + recursive--; + return 0xdeadf00d; +} + +bool debugmem_extinvalidmem(uaecptr addr, uae_u32 v, int size) +{ + static int recursive; + bool dbg = false; + if (!debugmem_bank.baseaddr || !debugmem_active) + return false; + if (recursive) { + return true; + } + recursive++; + if (size > 0) { + console_out_f(_T("%s write to %08x, value = %08x\n"), size == 4 ? _T("Long") : (size == 2 ? _T("Word") : _T("Byte")), addr, v); + dbg = debugmem_break(8); + } else { + size = -size; + console_out_f(_T("%s read from %08x\n"), size == 4 ? _T("Long") : (size == 2 ? _T("Word") : _T("Byte")), addr, v); + dbg = debugmem_break(9); + } + if (!dbg) + m68k_dumpstate(0, 0xffffffff); + recursive--; + return true; +} + +bool debugmem_enable_stackframe(bool enable) +{ + if (enable && !stackframemode) { + stackframemode = 1; + console_out(_T("Full stack frame tracking enabled.\n")); + allocate_stackframebuffers(); + return true; + } else if (!enable && stackframemode) { + stackframemode = 0; + console_out(_T("Full stack frame tracking disabled.\n")); + return true; + } + return false; +} + +bool debugmem_list_stackframe(bool super) +{ + if (!debugmem_bank.baseaddr && !stackframemode) { + return false; + } + int cnt = super ? stackframecntsuper : stackframecnt; + if (!cnt) + return false; + for (int i = 0; i < cnt; i++) { + struct debugstackframe *sf = super ? &stackframessuper[i] : &stackframes[i]; + console_out_f(_T("%08x -> %08x SP=%08x"), sf->current_pc, sf->branch_pc, sf->stack); + if (sf->sr & 0x2000) + console_out_f(_T(" SR=%04x"), sf->sr); + TCHAR txt1[256], txt2[256]; + if (debugmem_get_segment(sf->branch_pc, NULL, NULL, txt1, txt2)) { + console_out_f(_T(" %s %s"), txt1, txt2); + } + if (debugmem_get_symbol(sf->branch_pc, txt1, sizeof(txt1) / sizeof(TCHAR))) { + console_out_f(_T(" %s"), txt1); + } + console_out_f(_T("\n")); + uae_u32 sregs[16]; + memcpy(sregs, regs.regs, sizeof(uae_u32) * 16); + memcpy(regs.regs, sf->regs, sizeof(uae_u32) * 16); + m68k_disasm(sf->current_pc, NULL, 0xffffffff, 2); + memcpy(regs.regs, sregs, sizeof(uae_u32) * 16); + console_out_f(_T("\n")); + } + return true; +} \ No newline at end of file diff --git a/enforcer.cpp b/enforcer.cpp index eea84423..6ed5d0bc 100644 --- a/enforcer.cpp +++ b/enforcer.cpp @@ -336,7 +336,7 @@ static void enforcer_display_hit (const TCHAR *addressmode, uae_u32 pc, uaecptr if (bestpc_idxs[i] == -1) { for (j = 0; j < 5; j++) { pospc -= 2; - sm68k_disasm (buf, NULL, pospc, &nextpc); + sm68k_disasm (buf, NULL, pospc, &nextpc, 0xffffffff); if (nextpc == temppc) { bestpc_idxs[i] = j; bestpc_array[i][j] = bestpc = pospc; @@ -383,7 +383,7 @@ static void enforcer_display_hit (const TCHAR *addressmode, uae_u32 pc, uaecptr continue; } - sm68k_disasm (buf, instrcode, bestpc, NULL); + sm68k_disasm (buf, instrcode, bestpc, NULL, 0xffffffff); _stprintf (lines[i], _T("%08x : %-20s %s\n"), bestpc, instrcode, buf); temppc = bestpc; } @@ -397,7 +397,7 @@ static void enforcer_display_hit (const TCHAR *addressmode, uae_u32 pc, uaecptr /* Now the instruction after the pc including the pc */ temppc = pc; for (i = 0; i < (INSTRUCTIONLINES + 1) / 2; i++) { - sm68k_disasm (buf, instrcode, temppc, &nextpc); + sm68k_disasm (buf, instrcode, temppc, &nextpc, 0xffffffff); _stprintf (enforcer_buf_ptr, _T("%08x : %s %-20s %s\n"), temppc, (i == 0 ? _T("*") : _T(" ")), instrcode, buf); enforcer_buf_ptr += _tcslen (enforcer_buf_ptr); diff --git a/filesys.cpp b/filesys.cpp index 6e632631..7898bdb0 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -65,6 +65,7 @@ #include "cpuboard.h" #include "rommgr.h" #include "debug.h" +#include "debugmem.h" #ifdef RETROPLATFORM #include "rp.h" #endif @@ -8914,6 +8915,43 @@ static uae_u32 REGPARAM2 mousehack_done (TrapContext *ctx) } else if (mode == 102) { uaecptr ret = consolehook_beginio(ctx, trap_get_areg(ctx, 1)); trap_put_long(ctx, trap_get_areg(ctx, 7) + 4 * 4, ret); + } else if (mode == 200) { + uae_u32 v; + // a0 = data, d0 = length, a1 = task, d2 = stack size (in), stack ptr (out) + uae_u32 stack = trap_get_dreg(ctx, 2); + v = debugmem_reloc(trap_get_areg(ctx, 0), trap_get_dreg(ctx, 0), trap_get_areg(ctx, 1), &stack); + trap_set_dreg(ctx, 2, stack); + return v; + } else if (mode == 201) { + debugmem_break(8); + return 1; + } else if (mode == 202) { + // a0 = segment, a1 = name, d2 = lock + debugmem_addsegs(ctx, trap_get_areg(ctx, 0), trap_get_areg(ctx, 1), trap_get_dreg(ctx, 2)); + return 1; + } else if (mode == 203) { + debugmem_remsegs(trap_get_areg(ctx, 0)); + return 1; + } else if (mode == 204 || mode == 206) { + // d0 = size, a1 = flags + uae_u32 v = debugmem_allocmem(mode == 206, trap_get_dreg(ctx, 0), trap_get_areg(ctx, 1), trap_get_areg(ctx, 0)); + if (v) { + trap_set_areg(ctx, 0, v); + return v; + } else { + trap_set_areg(ctx, 0, 0); + return trap_get_dreg(ctx, 0); + } + } else if (mode == 205 || mode == 207) { + return debugmem_freemem(mode == 207, trap_get_areg(ctx, 1), trap_get_dreg(ctx, 0), trap_get_areg(ctx, 0)); + } else if (mode == 208) { + // enable segtrack: bit 0 set + return currprefs.debugging_features ? 1 : 0; + } else if (mode == 209) { + // called if segtrack was enabled + return 0; + } else if (mode == 299) { + return debugmem_exit(); } else { write_log (_T("Unknown mousehack hook %d\n"), mode); } @@ -9075,7 +9113,7 @@ void filesys_install (void) dw (RTS); org (rtarea_base + 0xFF38); - calltrap (deftrap2 (mousehack_done, 0, _T("mousehack_done"))); + calltrap (deftrapres(mousehack_done, 0, _T("misc_funcs"))); dw (RTS); org (rtarea_base + 0xFF40); diff --git a/filesys_bootrom.cpp b/filesys_bootrom.cpp index f0e56dba..b7ef6cc1 100644 --- a/filesys_bootrom.cpp +++ b/filesys_bootrom.cpp @@ -1,1297 +1,1333 @@ - db(0x00); db(0x00); db(0x0a); db(0x89); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x60); db(0x02); db(0x00); db(0x0c); db(0x60); db(0x00); db(0x0d); db(0xf8); - db(0x00); db(0x00); db(0x0b); db(0x5e); db(0x00); db(0x00); db(0x00); db(0xc6); - db(0x00); db(0x00); db(0x21); db(0x16); db(0x00); db(0x00); db(0x00); db(0x30); - db(0x00); db(0x00); db(0x05); db(0x96); db(0x00); db(0x00); db(0x1c); db(0xc0); - db(0x00); db(0x00); db(0x00); db(0x82); db(0x00); db(0x00); db(0x1d); db(0x1c); - db(0x00); db(0x00); db(0x1d); db(0xca); db(0x00); db(0x00); db(0x21); db(0xe0); - db(0x43); db(0xfa); db(0x29); db(0x62); db(0x4e); db(0xae); db(0xff); db(0xa0); + db(0x00); db(0x00); db(0x0a); db(0xd7); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x60); db(0x02); db(0x00); db(0x0c); db(0x60); db(0x00); db(0x0d); db(0xfc); + db(0x00); db(0x00); db(0x0b); db(0x62); db(0x00); db(0x00); db(0x00); db(0xca); + db(0x00); db(0x00); db(0x21); db(0x1a); db(0x00); db(0x00); db(0x00); db(0x30); + db(0x00); db(0x00); db(0x05); db(0x9a); db(0x00); db(0x00); db(0x1c); db(0xc4); + db(0x00); db(0x00); db(0x00); db(0x82); db(0x00); db(0x00); db(0x1d); db(0x20); + db(0x00); db(0x00); db(0x1d); db(0xce); db(0x00); db(0x00); db(0x21); db(0xe4); + db(0x43); db(0xfa); db(0x2a); db(0x82); db(0x4e); db(0xae); db(0xff); db(0xa0); db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x16); db(0x20); db(0x40); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x07); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x07); - db(0xe5); db(0x89); db(0x2e); db(0x01); db(0x60); db(0x00); db(0x0d); db(0xaa); + db(0xe5); db(0x89); db(0x2e); db(0x01); db(0x60); db(0x00); db(0x0d); db(0xae); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x04); db(0x00); db(0x00); db(0x00); db(0x02); db(0x4a); db(0xfc); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x29); db(0xbc); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x28); db(0xce); db(0x00); db(0x00); db(0x00); db(0x00); db(0xff); db(0xff); + db(0x2a); db(0xf4); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x29); db(0xee); db(0x00); db(0x00); db(0x00); db(0x00); db(0xff); db(0xff); db(0xff); db(0x98); db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x43); db(0xfa); db(0x29); db(0x26); db(0x70); db(0x00); + db(0x00); db(0x04); db(0x43); db(0xfa); db(0x2a); db(0x46); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x27); db(0xc4); db(0x20); db(0x81); - db(0x43); db(0xfa); db(0x28); db(0xfe); db(0x70); db(0x00); db(0x4e); db(0xae); + db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x28); db(0xe4); db(0x20); db(0x81); + db(0x43); db(0xfa); db(0x2a); db(0x1e); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x22); db(0x00); db(0x30); db(0x3c); db(0x3f); db(0xf4); - db(0x61); db(0x00); db(0x27); db(0xae); db(0x20); db(0x81); db(0x61); db(0x00); - db(0x16); db(0x6c); db(0x61); db(0x00); db(0x1a); db(0x32); db(0x4c); db(0xdf); - db(0x7c); db(0xfc); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0xff); db(0xfe); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x30); db(0x3c); - db(0xff); db(0xec); db(0x61); db(0x00); db(0x27); db(0x8c); db(0x2a); db(0x50); - db(0x7a); db(0x00); db(0x70); db(0x00); db(0x0c); db(0x6e); db(0x00); db(0x21); - db(0x00); db(0x14); db(0x65); db(0x1c); db(0x43); db(0xfa); db(0x28); db(0xdd); - db(0x70); db(0x24); db(0x7a); db(0x01); db(0x4e); db(0xae); db(0xfd); db(0xd8); - db(0x4a); db(0x80); db(0x66); db(0x0c); db(0x43); db(0xfa); db(0x28); db(0xcd); - db(0x70); db(0x00); db(0x7a); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); - db(0x28); db(0x40); db(0x4a); db(0xad); db(0x01); db(0x0c); db(0x67); db(0x00); - db(0x00); db(0x62); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); - db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x26); db(0x40); db(0x27); db(0x4c); db(0x01); db(0xa8); - db(0x7c); db(0x00); db(0xbc); db(0x6d); db(0x01); db(0x0e); db(0x64); db(0x32); - db(0x2f); db(0x06); db(0x2e); db(0x2d); db(0x01); db(0x10); db(0x4a); db(0x45); - db(0x67); db(0x04); db(0x08); db(0xc7); db(0x00); db(0x02); db(0x2f); db(0x0b); - db(0x20); db(0x4b); db(0x61); db(0x00); db(0x0a); db(0x22); db(0x26); db(0x5f); - db(0x27); db(0x41); db(0x01); db(0xa4); db(0x0c); db(0x80); db(0xff); db(0xff); - db(0xff); db(0xfe); db(0x67); db(0x08); db(0x48); db(0x46); db(0x52); db(0x46); - db(0x48); db(0x46); db(0x60); db(0xd6); db(0x2c); db(0x1f); db(0x52); db(0x46); - db(0x60); db(0xc8); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x22); db(0x4b); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); db(0x4e); db(0xae); - db(0xff); db(0x2e); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x0c); - db(0x67); db(0x06); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x62); - db(0x0c); db(0x6e); db(0x00); db(0x22); db(0x00); db(0x14); db(0x65); db(0x00); - db(0x00); db(0x9e); db(0x78); db(0x03); db(0x0c); db(0x6e); db(0x00); db(0x24); - db(0x00); db(0x14); db(0x65); db(0x04); db(0x00); db(0x44); db(0x01); db(0x00); - db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x26); db(0xca); - db(0x4e); db(0x90); db(0x2a); db(0x00); db(0x20); db(0x49); db(0x20); db(0x01); - db(0x67); db(0x0c); db(0x22); db(0x04); db(0x74); db(0xfb); db(0x43); db(0xfa); - db(0x28); db(0x41); db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x0c); db(0x85); - db(0x00); db(0x40); db(0x00); db(0x00); db(0x65); db(0x26); db(0xba); db(0xae); - db(0x00); db(0x3e); db(0x67); db(0x20); db(0x4e); db(0xae); db(0xff); db(0x88); - db(0x2d); db(0x45); db(0x00); db(0x3e); db(0x70); db(0x00); db(0x72); db(0x17); - db(0x41); db(0xee); db(0x00); db(0x22); db(0xd0); db(0x58); db(0x51); db(0xc9); - db(0xff); db(0xfc); db(0x46); db(0x40); db(0x3d); db(0x40); db(0x00); db(0x52); - db(0x4e); db(0xae); db(0xff); db(0x82); db(0x43); db(0xf9); db(0x00); db(0x21); - db(0x00); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xea); db(0x4a); db(0x80); - db(0x66); db(0x18); db(0x22); db(0x04); db(0x74); db(0xf6); db(0x20); db(0x7c); - db(0x00); db(0x20); db(0x00); db(0x00); db(0x20); db(0x05); db(0x90); db(0x88); - db(0x65); db(0x08); db(0x67); db(0x06); db(0x93); db(0xc9); db(0x4e); db(0xae); - db(0xfd); db(0x96); db(0x41); db(0xfa); db(0x27); db(0x39); db(0x43); db(0xfa); - db(0x00); db(0x5a); db(0x70); db(0x0a); db(0x61); db(0x00); db(0x0f); db(0x64); - db(0x22); db(0x40); db(0x72); db(0x01); db(0x30); db(0x3c); db(0xff); db(0x48); - db(0x61); db(0x00); db(0x26); db(0x46); db(0x4e); db(0x90); db(0x4c); db(0xdf); - db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3c); db(0x22); - db(0x7a); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x00); - db(0x28); db(0x01); db(0x26); db(0x09); db(0x24); db(0x48); db(0x43); db(0xfa); - db(0x27); db(0x5c); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); - db(0x4a); db(0x80); db(0x67); db(0x16); db(0x2c); db(0x40); db(0x22); db(0x0a); - db(0xe4); db(0x8b); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x2a); db(0x00); - db(0x22); db(0x4e); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); - db(0xfe); db(0x62); db(0x20); db(0x05); db(0x4c); db(0xdf); db(0x44); db(0x3c); - db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x00); - db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); - db(0x41); db(0xfa); db(0x26); db(0xfc); db(0x43); db(0xfa); db(0x00); db(0x16); - db(0x70); db(0x0f); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x1f); db(0x40); - db(0x61); db(0x00); db(0xff); db(0xa2); db(0x60); db(0xdc); db(0x00); db(0x00); + db(0x61); db(0x00); db(0x28); db(0xce); db(0x20); db(0x81); db(0x61); db(0x00); + db(0x16); db(0x70); db(0x61); db(0x00); db(0x1a); db(0x36); db(0x61); db(0x00); + db(0x22); db(0x1a); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x70); db(0x00); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x30); db(0x3c); db(0xff); db(0xec); db(0x61); db(0x00); + db(0x28); db(0xa8); db(0x2a); db(0x50); db(0x7a); db(0x00); db(0x70); db(0x00); + db(0x0c); db(0x6e); db(0x00); db(0x21); db(0x00); db(0x14); db(0x65); db(0x1c); + db(0x43); db(0xfa); db(0x29); db(0xf9); db(0x70); db(0x24); db(0x7a); db(0x01); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x66); db(0x0c); + db(0x43); db(0xfa); db(0x29); db(0xe9); db(0x70); db(0x00); db(0x7a); db(0x00); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40); db(0x4a); db(0xad); + db(0x01); db(0x0c); db(0x67); db(0x00); db(0x00); db(0x62); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x02); db(0x38); db(0x22); db(0x3c); db(0x00); db(0x01); + db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); + db(0x27); db(0x4c); db(0x01); db(0xa8); db(0x7c); db(0x00); db(0xbc); db(0x6d); + db(0x01); db(0x0e); db(0x64); db(0x32); db(0x2f); db(0x06); db(0x2e); db(0x2d); + db(0x01); db(0x10); db(0x4a); db(0x45); db(0x67); db(0x04); db(0x08); db(0xc7); + db(0x00); db(0x02); db(0x2f); db(0x0b); db(0x20); db(0x4b); db(0x61); db(0x00); + db(0x0a); db(0x22); db(0x26); db(0x5f); db(0x27); db(0x41); db(0x01); db(0xa4); + db(0x0c); db(0x80); db(0xff); db(0xff); db(0xff); db(0xfe); db(0x67); db(0x08); + db(0x48); db(0x46); db(0x52); db(0x46); db(0x48); db(0x46); db(0x60); db(0xd6); + db(0x2c); db(0x1f); db(0x52); db(0x46); db(0x60); db(0xc8); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x22); db(0x4b); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0x02); db(0x38); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x20); db(0x0c); db(0x67); db(0x06); db(0x22); db(0x4c); + db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x0c); db(0x6e); db(0x00); db(0x22); + db(0x00); db(0x14); db(0x65); db(0x00); db(0x00); db(0x9e); db(0x78); db(0x03); + db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x04); + db(0x00); db(0x44); db(0x01); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x80); + db(0x61); db(0x00); db(0x27); db(0xe6); db(0x4e); db(0x90); db(0x2a); db(0x00); + db(0x20); db(0x49); db(0x20); db(0x01); db(0x67); db(0x0c); db(0x22); db(0x04); + db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x29); db(0x5d); db(0x4e); db(0xae); + db(0xfd); db(0x96); db(0x0c); db(0x85); db(0x00); db(0x40); db(0x00); db(0x00); + db(0x65); db(0x26); db(0xba); db(0xae); db(0x00); db(0x3e); db(0x67); db(0x20); + db(0x4e); db(0xae); db(0xff); db(0x88); db(0x2d); db(0x45); db(0x00); db(0x3e); + db(0x70); db(0x00); db(0x72); db(0x17); db(0x41); db(0xee); db(0x00); db(0x22); + db(0xd0); db(0x58); db(0x51); db(0xc9); db(0xff); db(0xfc); db(0x46); db(0x40); + db(0x3d); db(0x40); db(0x00); db(0x52); db(0x4e); db(0xae); db(0xff); db(0x82); + db(0x43); db(0xf9); db(0x00); db(0x21); db(0x00); db(0x00); db(0x4e); db(0xae); + db(0xfd); db(0xea); db(0x4a); db(0x80); db(0x66); db(0x18); db(0x22); db(0x04); + db(0x74); db(0xf6); db(0x20); db(0x7c); db(0x00); db(0x20); db(0x00); db(0x00); + db(0x20); db(0x05); db(0x90); db(0x88); db(0x65); db(0x08); db(0x67); db(0x06); + db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x41); db(0xfa); + db(0x28); db(0x55); db(0x43); db(0xfa); db(0x00); db(0x5a); db(0x70); db(0x0a); + db(0x61); db(0x00); db(0x0f); db(0x64); db(0x22); db(0x40); db(0x72); db(0x01); + db(0x30); db(0x3c); db(0xff); db(0x48); db(0x61); db(0x00); db(0x27); db(0x62); + db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); + db(0x48); db(0xe7); db(0x3c); db(0x22); db(0x7a); db(0x00); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x24); db(0x00); db(0x28); db(0x01); db(0x26); db(0x09); + db(0x24); db(0x48); db(0x43); db(0xfa); db(0x28); db(0x78); db(0x70); db(0x00); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x67); db(0x16); + db(0x2c); db(0x40); db(0x22); db(0x0a); db(0xe4); db(0x8b); db(0x4e); db(0xae); + db(0xff); db(0x76); db(0x2a); db(0x00); db(0x22); db(0x4e); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x20); db(0x05); + db(0x4c); db(0xdf); db(0x44); db(0x3c); db(0x4e); db(0x75); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); + db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); db(0x28); db(0x18); + db(0x43); db(0xfa); db(0x00); db(0x16); db(0x70); db(0x0f); db(0x22); db(0x3c); + db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); db(0xff); db(0xa2); + db(0x60); db(0xdc); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10); + db(0x00); db(0x00); db(0x00); db(0x00); db(0x72); db(0x02); db(0x30); db(0x3c); + db(0xff); db(0x48); db(0x61); db(0x00); db(0x26); db(0xd4); db(0x4e); db(0x90); + db(0x22); db(0x00); db(0x6b); db(0x04); db(0x61); db(0x00); db(0x0a); db(0xb6); + db(0x70); db(0x00); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); + db(0xfe); db(0xc2); db(0x7e); db(0x00); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0xf0); db(0x00); db(0x61); db(0x00); db(0x26); db(0xbc); db(0x22); db(0x48); + db(0x20); db(0x3c); db(0x00); db(0x00); db(0x40); db(0x00); db(0x61); db(0x00); + db(0x26); db(0xb0); db(0x7c); db(0x03); db(0x4a); db(0x29); db(0x00); db(0x03); + db(0x67); db(0x42); db(0x0c); db(0x29); db(0x00); db(0xfd); db(0x00); db(0x07); + db(0x66); db(0x3a); db(0x52); db(0x87); db(0x49); db(0xe8); db(0x00); db(0x54); + db(0x4b); db(0xe9); db(0x00); db(0x04); db(0x48); db(0xe7); db(0x03); db(0xce); + db(0x38); db(0x15); db(0x4c); db(0xd4); db(0x07); db(0x00); db(0x4c); db(0xd4); + db(0x00); db(0x07); db(0x0c); db(0x44); db(0x00); db(0x12); db(0x66); db(0x06); + db(0x61); db(0x00); db(0x1d); db(0x9a); db(0x60); db(0x0a); db(0x0c); db(0x44); + db(0x00); db(0x13); db(0x66); db(0x04); db(0x61); db(0x00); db(0x1d); db(0xa8); + db(0x4c); db(0xdf); db(0x73); db(0xc0); db(0x28); db(0x80); db(0x1b); db(0x7c); + db(0x00); db(0x02); db(0x00); db(0x03); db(0xd0); db(0xfc); db(0x20); db(0x00); + db(0xd2); db(0xfc); db(0x00); db(0x08); db(0x51); db(0xce); db(0xff); db(0xae); + db(0x4a); db(0x87); db(0x67); db(0x00); db(0xff); db(0x84); db(0x60); db(0x00); + db(0xff); db(0x8a); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); + db(0x61); db(0x04); db(0x60); db(0xf2); db(0x4e); db(0x75); db(0x7e); db(0x0a); + db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x26); db(0x22); + db(0x20); db(0x07); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0xec); + db(0x7e); db(0x0b); db(0x0c); db(0x40); db(0x00); db(0x01); db(0x6d); db(0x00); + db(0xff); db(0xe8); db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0x92); + db(0x60); db(0xde); db(0x0c); db(0x40); db(0x00); db(0x02); db(0x6e); db(0x08); + db(0x20); db(0x01); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x60); db(0xd0); + db(0x0c); db(0x40); db(0x00); db(0x03); db(0x6e); db(0x06); db(0x4e); db(0xae); + db(0xfe); db(0x86); db(0x60); db(0xc4); db(0x0c); db(0x40); db(0x00); db(0x04); + db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xff); db(0x4c); db(0x60); db(0xb8); + db(0x0c); db(0x40); db(0x00); db(0x05); db(0x6e); db(0x46); db(0x48); db(0xe7); + db(0x00); db(0xc0); db(0x70); db(0x26); db(0x22); db(0x3c); db(0x00); db(0x01); + db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4c); db(0xdf); + db(0x03); db(0x00); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x08); + db(0x00); db(0x08); db(0x25); db(0x48); db(0x00); db(0x0e); db(0x35); db(0x7c); + db(0x00); db(0x26); db(0x00); db(0x12); db(0x25); db(0x7c); db(0x40); db(0x00); + db(0x00); db(0x00); db(0x00); db(0x14); db(0x35); db(0x7c); db(0x12); db(0x34); + db(0x00); db(0x18); db(0x25); db(0x49); db(0x00); db(0x1a); db(0x20); db(0x69); + db(0x00); db(0x10); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xfe); db(0x92); + db(0x60); db(0x00); db(0xff); db(0x6e); db(0x0c); db(0x40); db(0x00); db(0x06); + db(0x6e); db(0x00); db(0xff); db(0x66); db(0x41); db(0xfa); db(0x27); db(0x3f); + db(0x43); db(0xfa); db(0x00); db(0x42); db(0x70); db(0x01); db(0x22); db(0x3c); + db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00); db(0xfe); db(0x32); + db(0x22); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); + db(0x25); db(0x70); db(0x70); db(0x14); db(0x4e); db(0x90); db(0x60); db(0x00); + db(0xff); db(0x40); db(0x70); db(0x00); db(0x20); db(0x59); db(0x4a); db(0x10); + db(0x67); db(0x10); db(0x2c); db(0x59); db(0x22); db(0x51); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xbc); + db(0x70); db(0x01); db(0x4a); db(0x40); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x72); db(0x02); db(0x30); db(0x3c); db(0xff); db(0x48); db(0x61); db(0x00); - db(0x25); db(0xb8); db(0x4e); db(0x90); db(0x22); db(0x00); db(0x6b); db(0x04); - db(0x61); db(0x00); db(0x0a); db(0xb6); db(0x70); db(0x00); db(0x4e); db(0x75); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x7e); db(0x00); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0xf0); db(0x00); db(0x61); db(0x00); - db(0x25); db(0xa0); db(0x22); db(0x48); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0x40); db(0x00); db(0x61); db(0x00); db(0x25); db(0x94); db(0x7c); db(0x03); - db(0x4a); db(0x29); db(0x00); db(0x03); db(0x67); db(0x42); db(0x0c); db(0x29); - db(0x00); db(0xfd); db(0x00); db(0x07); db(0x66); db(0x3a); db(0x52); db(0x87); - db(0x49); db(0xe8); db(0x00); db(0x54); db(0x4b); db(0xe9); db(0x00); db(0x04); - db(0x48); db(0xe7); db(0x03); db(0xce); db(0x38); db(0x15); db(0x4c); db(0xd4); - db(0x07); db(0x00); db(0x4c); db(0xd4); db(0x00); db(0x07); db(0x0c); db(0x44); - db(0x00); db(0x12); db(0x66); db(0x06); db(0x61); db(0x00); db(0x1d); db(0x9a); - db(0x60); db(0x0a); db(0x0c); db(0x44); db(0x00); db(0x13); db(0x66); db(0x04); - db(0x61); db(0x00); db(0x1d); db(0xa8); db(0x4c); db(0xdf); db(0x73); db(0xc0); - db(0x28); db(0x80); db(0x1b); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x03); - db(0xd0); db(0xfc); db(0x20); db(0x00); db(0xd2); db(0xfc); db(0x00); db(0x08); - db(0x51); db(0xce); db(0xff); db(0xae); db(0x4a); db(0x87); db(0x67); db(0x00); - db(0xff); db(0x84); db(0x60); db(0x00); db(0xff); db(0x8a); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); - db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x61); db(0x04); db(0x60); db(0xf2); - db(0x4e); db(0x75); db(0x7e); db(0x0a); db(0x30); db(0x3c); db(0xff); db(0x50); - db(0x61); db(0x00); db(0x25); db(0x06); db(0x20); db(0x07); db(0x4e); db(0x90); - db(0x4a); db(0x80); db(0x67); db(0xec); db(0x7e); db(0x0b); db(0x0c); db(0x40); - db(0x00); db(0x01); db(0x6d); db(0x00); db(0xff); db(0xe8); db(0x6e); db(0x06); - db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0xde); db(0x0c); db(0x40); - db(0x00); db(0x02); db(0x6e); db(0x08); db(0x20); db(0x01); db(0x4e); db(0xae); - db(0xfe); db(0xbc); db(0x60); db(0xd0); db(0x0c); db(0x40); db(0x00); db(0x03); - db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0x86); db(0x60); db(0xc4); - db(0x0c); db(0x40); db(0x00); db(0x04); db(0x6e); db(0x06); db(0x4e); db(0xae); - db(0xff); db(0x4c); db(0x60); db(0xb8); db(0x0c); db(0x40); db(0x00); db(0x05); - db(0x6e); db(0x46); db(0x48); db(0xe7); db(0x00); db(0xc0); db(0x70); db(0x26); - db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x4c); db(0xdf); db(0x03); db(0x00); db(0x24); db(0x40); - db(0x15); db(0x7c); db(0x00); db(0x08); db(0x00); db(0x08); db(0x25); db(0x48); - db(0x00); db(0x0e); db(0x35); db(0x7c); db(0x00); db(0x26); db(0x00); db(0x12); - db(0x25); db(0x7c); db(0x40); db(0x00); db(0x00); db(0x00); db(0x00); db(0x14); - db(0x35); db(0x7c); db(0x12); db(0x34); db(0x00); db(0x18); db(0x25); db(0x49); - db(0x00); db(0x1a); db(0x20); db(0x69); db(0x00); db(0x10); db(0x22); db(0x4a); - db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0x00); db(0xff); db(0x6e); - db(0x0c); db(0x40); db(0x00); db(0x06); db(0x6e); db(0x00); db(0xff); db(0x66); - db(0x41); db(0xfa); db(0x26); db(0x23); db(0x43); db(0xfa); db(0x00); db(0x42); - db(0x70); db(0x01); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x27); db(0x10); - db(0x61); db(0x00); db(0xfe); db(0x32); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0xff); db(0x50); db(0x61); db(0x00); db(0x24); db(0x54); db(0x70); db(0x14); - db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x40); db(0x70); db(0x00); - db(0x20); db(0x59); db(0x4a); db(0x10); db(0x67); db(0x10); db(0x2c); db(0x59); - db(0x22); db(0x51); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); - db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x70); db(0x01); db(0x4a); db(0x40); - db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x43); db(0xfa); db(0x25); db(0x62); db(0x70); db(0x00); db(0x4e); db(0xae); - db(0xfd); db(0xd8); db(0x2a); db(0x40); db(0xcb); db(0x4e); db(0x60); db(0x0e); - db(0xcb); db(0x4e); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); - db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0xcb); db(0x4e); db(0x30); db(0x3c); - db(0xff); db(0x50); db(0x61); db(0x00); db(0x23); db(0xfc); db(0x70); db(0x15); - db(0x4e); db(0x90); db(0x2e); db(0x08); db(0x67); db(0xe2); db(0x28); db(0x4f); - db(0x4f); db(0xef); db(0xfd); db(0xd8); db(0x2c); db(0x0f); db(0x24); db(0x46); - db(0x47); db(0xea); db(0x00); db(0x28); db(0x22); db(0x4b); db(0x20); db(0x47); - db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x20); db(0x47); db(0x42); db(0x10); - db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x21); db(0x41); db(0xfa); - db(0x24); db(0x50); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); - db(0x03); db(0xed); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x24); db(0xc0); - db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x22); db(0x41); db(0xfa); - db(0x24); db(0x38); db(0x22); db(0x08); db(0x4e); db(0xae); db(0xff); db(0xe2); - db(0x24); db(0xc0); db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x23); - db(0x70); db(0xff); db(0x24); db(0xc0); db(0x42); db(0x9a); db(0x42); db(0x92); - db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x64); db(0x20); - db(0x24); db(0x46); db(0x22); db(0x0b); db(0x74); db(0x00); db(0x26); db(0x2a); - db(0x00); db(0x0c); db(0x4e); db(0xae); db(0xff); db(0x22); db(0x22); db(0x2a); - db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x22); db(0x2a); - db(0x00); db(0x0c); db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x60); db(0x08); - db(0x22); db(0x0b); db(0x24); db(0x06); db(0x4e); db(0xae); db(0xfd); db(0xa2); - db(0x2e); db(0x4c); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); - db(0x23); db(0x68); db(0x70); db(0x16); db(0x4e); db(0x90); db(0x60); db(0x00); - db(0xff); db(0x50); db(0x48); db(0xe7); db(0xf0); db(0xf8); db(0x24); db(0x00); - db(0x26); db(0x01); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x12); - db(0x61); db(0x00); db(0x23); db(0x4e); db(0x20); db(0x02); db(0x24); db(0x03); - db(0x4e); db(0x90); db(0x24); db(0x40); db(0x70); db(0x2a); db(0x22); db(0x3c); - db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x28); db(0x40); db(0x47); db(0xec); db(0x00); db(0x16); db(0x22); db(0x4b); - db(0x22); db(0xca); db(0x22); db(0xc2); db(0x22); db(0xc3); db(0x30); db(0x3c); - db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x23); db(0x34); db(0x22); db(0xc8); - db(0x30); db(0x3c); db(0x3f); db(0xf0); db(0x61); db(0x00); db(0x23); db(0x2a); - db(0x22); db(0xc8); db(0x29); db(0x4b); db(0x00); db(0x0e); db(0x19); db(0x7c); - db(0x00); db(0x02); db(0x00); db(0x08); db(0x19); db(0x7c); db(0x00); db(0xf6); - db(0x00); db(0x09); db(0x41); db(0xfa); db(0x23); db(0xdb); db(0x29); db(0x48); - db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x00); db(0x14); db(0x29); db(0x48); - db(0x00); db(0x12); db(0x22); db(0x4c); db(0x70); db(0x05); db(0x4e); db(0xae); - db(0xff); db(0x58); db(0x4c); db(0xdf); db(0x1f); db(0x0f); db(0x4e); db(0x75); - db(0x20); db(0x51); db(0x52); db(0x90); db(0x20); db(0x69); db(0x00); db(0x0c); - db(0x20); db(0x10); db(0x67); db(0x1e); db(0x20); db(0x40); db(0x0c); db(0x68); - db(0x00); db(0x1f); db(0x00); db(0x14); db(0x65); db(0x14); db(0x4a); db(0xa8); - db(0x00); db(0x22); db(0x67); db(0x0e); db(0x4a); db(0xa8); db(0x00); db(0x3c); - db(0x67); db(0x08); db(0x22); db(0x69); db(0x00); db(0x10); db(0x22); db(0xa8); - db(0x00); db(0x44); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0xf1); db(0xe0); db(0x2e); db(0x00); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0xff); db(0xfc); db(0x61); db(0x00); db(0x22); db(0xbc); db(0x24); db(0x48); - db(0x74); db(0x00); db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x10); - db(0x41); db(0xfa); db(0x23); db(0x9e); db(0x43); db(0xfa); db(0xfd); db(0x78); - db(0x70); db(0x14); db(0x61); db(0x00); db(0x0b); db(0xb6); db(0x24); db(0x00); - db(0x76); db(0x00); db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x10); - db(0x41); db(0xfa); db(0x23); db(0x94); db(0x43); db(0xfa); db(0xfc); db(0xda); - db(0x70); db(0x19); db(0x61); db(0x00); db(0x0b); db(0x9e); db(0x26); db(0x00); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x26); db(0x7e); + db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2a); db(0x40); + db(0xcb); db(0x4e); db(0x60); db(0x0e); db(0xcb); db(0x4e); db(0x70); db(0x00); + db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); + db(0xcb); db(0x4e); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); + db(0x25); db(0x18); db(0x70); db(0x15); db(0x4e); db(0x90); db(0x2e); db(0x08); + db(0x67); db(0xe2); db(0x28); db(0x4f); db(0x4f); db(0xef); db(0xfd); db(0xd8); + db(0x2c); db(0x0f); db(0x24); db(0x46); db(0x47); db(0xea); db(0x00); db(0x28); + db(0x22); db(0x4b); db(0x20); db(0x47); db(0x12); db(0xd8); db(0x66); db(0xfc); + db(0x20); db(0x47); db(0x42); db(0x10); db(0x24); db(0xfc); db(0x80); db(0x00); + db(0x00); db(0x21); db(0x41); db(0xfa); db(0x25); db(0x6c); db(0x22); db(0x08); + db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed); db(0x4e); db(0xae); + db(0xff); db(0xe2); db(0x24); db(0xc0); db(0x24); db(0xfc); db(0x80); db(0x00); + db(0x00); db(0x22); db(0x41); db(0xfa); db(0x25); db(0x54); db(0x22); db(0x08); + db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x24); db(0xc0); db(0x24); db(0xfc); + db(0x80); db(0x00); db(0x00); db(0x23); db(0x70); db(0xff); db(0x24); db(0xc0); + db(0x42); db(0x9a); db(0x42); db(0x92); db(0x0c); db(0x6e); db(0x00); db(0x24); + db(0x00); db(0x14); db(0x64); db(0x20); db(0x24); db(0x46); db(0x22); db(0x0b); + db(0x74); db(0x00); db(0x26); db(0x2a); db(0x00); db(0x0c); db(0x4e); db(0xae); + db(0xff); db(0x22); db(0x22); db(0x2a); db(0x00); db(0x04); db(0x4e); db(0xae); + db(0xff); db(0xdc); db(0x22); db(0x2a); db(0x00); db(0x0c); db(0x4e); db(0xae); + db(0xff); db(0xdc); db(0x60); db(0x08); db(0x22); db(0x0b); db(0x24); db(0x06); + db(0x4e); db(0xae); db(0xfd); db(0xa2); db(0x2e); db(0x4c); db(0x30); db(0x3c); + db(0xff); db(0x50); db(0x61); db(0x00); db(0x24); db(0x84); db(0x70); db(0x16); + db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x50); db(0x48); db(0xe7); + db(0xf0); db(0xf8); db(0x24); db(0x00); db(0x26); db(0x01); db(0x30); db(0x3c); + db(0xff); db(0x38); db(0x72); db(0x12); db(0x61); db(0x00); db(0x24); db(0x6a); + db(0x20); db(0x02); db(0x24); db(0x03); db(0x4e); db(0x90); db(0x24); db(0x40); db(0x70); db(0x2a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xe9); - db(0x00); db(0x1a); db(0x20); db(0xca); db(0x20); db(0xce); db(0x20); db(0xc2); - db(0x20); db(0x83); db(0x41); db(0xfa); db(0x23); db(0x42); db(0x23); db(0x48); - db(0x00); db(0x0a); db(0x45); db(0xe9); db(0x00); db(0x1a); db(0x23); db(0x4a); - db(0x00); db(0x0e); db(0x41); db(0xfa); db(0xfe); db(0x02); db(0x23); db(0x48); - db(0x00); db(0x12); db(0x33); db(0x7c); db(0x02); db(0x14); db(0x00); db(0x08); - db(0x70); db(0x03); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x20); db(0x02); - db(0x22); db(0x03); db(0x61); db(0x00); db(0xfe); db(0xd6); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x04); db(0x61); db(0x00); db(0x22); db(0x2a); - db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x04); db(0x61); db(0x00); - db(0x0b); db(0x9e); db(0x4c); db(0xdf); db(0x07); db(0x8f); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0xc0); db(0xf2); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x24); db(0x48); db(0x26); db(0x49); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0x00); db(0xbe); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40); db(0x70); db(0x00); - db(0x43); db(0xeb); db(0x01); db(0xac); db(0x11); db(0xb1); db(0x00); db(0x00); - db(0x00); db(0x0e); db(0x52); db(0x40); db(0x0c); db(0x40); db(0x00); db(0x8c); - db(0x66); db(0xf2); db(0x20); db(0x0a); db(0xe4); db(0x88); db(0x21); db(0x40); - db(0x00); db(0x36); db(0x22); db(0x48); db(0x41); db(0xfa); db(0x22); db(0xc0); - db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b); db(0x01); db(0x9c); - db(0x41); db(0xe8); db(0x00); db(0x12); db(0x4e); db(0xae); db(0xff); db(0x10); - db(0x4c); db(0xdf); db(0x4f); db(0x03); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0x7f); db(0x7e); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x48); - db(0x0c); db(0x9a); db(0x00); db(0x00); db(0x03); db(0xf3); db(0x66); db(0x00); - db(0x01); db(0x06); db(0x50); db(0x8a); db(0x2e); db(0x2a); db(0x00); db(0x04); - db(0x9e); db(0x92); db(0x50); db(0x8a); db(0x52); db(0x87); db(0x26); db(0x4a); - db(0x20); db(0x07); db(0xe5); db(0x88); db(0xd7); db(0xc0); db(0x28); db(0x4a); - db(0x9b); db(0xcd); db(0x7c); db(0x00); db(0x24); db(0x12); db(0x72); db(0x01); - db(0x08); db(0x02); db(0x00); db(0x1e); db(0x67); db(0x04); db(0x08); db(0xc1); - db(0x00); db(0x01); db(0x08); db(0xc1); db(0x00); db(0x10); db(0xe5); db(0x8a); - db(0x66); db(0x04); db(0x42); db(0x9a); db(0x60); db(0x20); db(0x50); db(0x82); - db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); - db(0x67); db(0x00); db(0x00); db(0xc4); db(0x20); db(0x40); db(0x20); db(0xc2); - db(0x24); db(0xc8); db(0x22); db(0x0d); db(0x67); db(0x06); db(0x20); db(0x08); - db(0xe4); db(0x88); db(0x2a); db(0x80); db(0x2a); db(0x48); db(0x52); db(0x86); - db(0xbe); db(0x86); db(0x66); db(0xc0); db(0x7c); db(0x00); db(0x22); db(0x06); - db(0xe5); db(0x89); db(0x20); db(0x74); db(0x18); db(0x00); db(0x58); db(0x88); - db(0x26); db(0x1b); db(0x28); db(0x1b); db(0xe5); db(0x8c); db(0x0c); db(0x83); - db(0x00); db(0x00); db(0x03); db(0xe9); db(0x67); db(0x08); db(0x0c); db(0x83); - db(0x00); db(0x00); db(0x03); db(0xea); db(0x66); db(0x0c); db(0x20); db(0x04); - db(0x4a); db(0x80); db(0x67); db(0x0e); db(0x10); db(0xdb); db(0x53); db(0x80); - db(0x60); db(0xf6); db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xeb); - db(0x66); db(0x74); db(0x26); db(0x1b); db(0x0c); db(0x83); db(0x00); db(0x00); - db(0x03); db(0xec); db(0x66); db(0x24); db(0x22); db(0x06); db(0xe5); db(0x89); - db(0x20); db(0x74); db(0x18); db(0x00); db(0x58); db(0x88); db(0x20); db(0x1b); - db(0x67); db(0xe8); db(0x22); db(0x1b); db(0xe5); db(0x89); db(0x26); db(0x34); - db(0x18); db(0x00); db(0x58); db(0x83); db(0x24); db(0x1b); db(0xd7); db(0xb0); - db(0x28); db(0x00); db(0x53); db(0x80); db(0x66); db(0xf6); db(0x60); db(0xe6); - db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xf0); db(0x66); db(0x12); - db(0x20); db(0x1b); db(0x67); db(0xc6); db(0x02); db(0x80); db(0x00); db(0xff); - db(0xff); db(0xff); db(0x52); db(0x80); db(0xe5); db(0x88); db(0xd7); db(0xc0); - db(0x60); db(0xee); db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xf1); - db(0x66); db(0x08); db(0x20); db(0x1b); db(0xe5); db(0x88); db(0xd7); db(0xc0); - db(0x60); db(0xa8); db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xf2); - db(0x66); db(0x14); db(0x52); db(0x86); db(0xbe); db(0x86); db(0x66); db(0x00); - db(0xff); db(0x66); db(0x7e); db(0x01); db(0x20); db(0x54); db(0x20); db(0x07); - db(0x4c); db(0xdf); db(0x7e); db(0xfe); db(0x4e); db(0x75); db(0x91); db(0xc8); - db(0x7e); db(0x00); db(0x60); db(0xf2); db(0x48); db(0xe7); db(0x40); db(0xf2); - db(0x26); db(0x48); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x41); db(0xee); - db(0x01); db(0x50); db(0x20); db(0x50); db(0x4a); db(0x90); db(0x67); db(0x1a); - db(0x22); db(0x68); db(0x00); db(0x0a); db(0x45); db(0xfa); db(0x22); db(0x0f); - db(0x10); db(0x19); db(0x12); db(0x1a); db(0xb0); db(0x01); db(0x66); db(0x06); - db(0x4a); db(0x00); db(0x67); db(0x46); db(0x60); db(0xf2); db(0x20); db(0x50); - db(0x60); db(0xe2); db(0x70); db(0x20); db(0x22); db(0x3c); db(0x00); db(0x01); - db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x24); db(0x40); - db(0x15); db(0x7c); db(0x00); db(0x08); db(0x00); db(0x08); db(0x41); db(0xfa); - db(0x21); db(0xe5); db(0x25); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); - db(0x21); db(0x3e); db(0x25); db(0x48); db(0x00); db(0x0e); db(0x41); db(0xea); - db(0x00); db(0x12); db(0x20); db(0x88); db(0x58); db(0x90); db(0x21); db(0x48); - db(0x00); db(0x08); db(0x41); db(0xee); db(0x01); db(0x50); db(0x22); db(0x4a); - db(0x4e); db(0xae); db(0xff); db(0x0a); db(0x20); db(0x4a); db(0x27); db(0x48); - db(0x01); db(0xa0); db(0x20); db(0x08); db(0x4c); db(0xdf); db(0x4f); db(0x02); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x01); db(0x02); db(0x2e); db(0x00); - db(0x4a); db(0x2b); db(0x00); db(0x60); db(0x67); db(0x7c); db(0x2c); db(0x6b); - db(0x00); db(0xa0); db(0x0c); db(0x6e); db(0x00); db(0x25); db(0x00); db(0x14); - db(0x65); db(0x3e); db(0x72); db(0x0e); db(0x4e); db(0xae); db(0xfd); db(0x66); - db(0x02); db(0x80); db(0xff); db(0xff); db(0xff); db(0xfe); db(0x67); db(0x62); - db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x0a); db(0x41); db(0xeb); - db(0x00); db(0x20); db(0x22); db(0x08); db(0x4e); db(0xae); db(0xfd); db(0x5a); - db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x12); db(0x4a); db(0x2b); - db(0x00); db(0x9e); db(0x66); db(0x0c); db(0x50); db(0xeb); db(0x00); db(0x9e); - db(0x22); db(0x2b); db(0x00); db(0xb4); db(0x4e); db(0xae); db(0xfd); db(0x5a); - db(0x72); db(0x0e); db(0x4e); db(0xae); db(0xfd); db(0x6c); db(0x60); db(0x32); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x7c); - db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x08); db(0x41); db(0xeb); - db(0x00); db(0x20); db(0x61); db(0x00); db(0x00); db(0xac); db(0x08); db(0x07); - db(0x00); db(0x01); db(0x67); db(0x12); db(0x4a); db(0x2b); db(0x00); db(0x9e); - db(0x66); db(0x0c); db(0x50); db(0xeb); db(0x00); db(0x9e); db(0x20); db(0x6b); - db(0x00); db(0xb4); db(0x61); db(0x00); db(0x00); db(0x94); db(0x4e); db(0xae); - db(0xff); db(0x76); db(0x4c); db(0xdf); db(0x40); db(0x80); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x01); db(0x22); db(0x2e); db(0x00); db(0x2c); db(0x6b); - db(0x00); db(0xa0); db(0x0c); db(0x6e); db(0x00); db(0x25); db(0x00); db(0x14); - db(0x65); db(0x3e); db(0x72); db(0x0e); db(0x4e); db(0xae); db(0xfd); db(0x66); - db(0x02); db(0x80); db(0xff); db(0xff); db(0xff); db(0xfe); db(0x67); db(0x62); - db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x0a); db(0x41); db(0xeb); - db(0x00); db(0x20); db(0x22); db(0x08); db(0x4e); db(0xae); db(0xfd); db(0x60); - db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x12); db(0x4a); db(0x2b); - db(0x00); db(0x9e); db(0x67); db(0x0c); db(0x42); db(0x2b); db(0x00); db(0x9e); - db(0x22); db(0x2b); db(0x00); db(0xb4); db(0x4e); db(0xae); db(0xfd); db(0x60); - db(0x72); db(0x0e); db(0x4e); db(0xae); db(0xfd); db(0x6c); db(0x60); db(0x32); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x7c); - db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x08); db(0x41); db(0xeb); - db(0x00); db(0x20); db(0x61); db(0x00); db(0x00); db(0x44); db(0x08); db(0x07); - db(0x00); db(0x01); db(0x67); db(0x12); db(0x4a); db(0x2b); db(0x00); db(0x9e); - db(0x67); db(0x0c); db(0x42); db(0x2b); db(0x00); db(0x9e); db(0x20); db(0x6b); - db(0x00); db(0xb4); db(0x61); db(0x00); db(0x00); db(0x2c); db(0x4e); db(0xae); - db(0xff); db(0x76); db(0x4c); db(0xdf); db(0x44); db(0x80); db(0x4e); db(0x75); - db(0x22); db(0x48); db(0x20); db(0x6b); db(0x00); db(0xa0); db(0x20); db(0x68); - db(0x00); db(0x22); db(0x20); db(0x68); db(0x00); db(0x18); db(0xd1); db(0xc8); - db(0xd1); db(0xc8); db(0x22); db(0xa8); db(0x00); db(0x04); db(0x20); db(0x09); - db(0xe4); db(0x88); db(0x21); db(0x40); db(0x00); db(0x04); db(0x4e); db(0x75); - db(0x24); db(0x48); db(0x20); db(0x6b); db(0x00); db(0xa0); db(0x20); db(0x68); - db(0x00); db(0x22); db(0x20); db(0x68); db(0x00); db(0x18); db(0xd1); db(0xc8); - db(0xd1); db(0xc8); db(0x22); db(0x68); db(0x00); db(0x04); db(0xd3); db(0xc9); - db(0xd3); db(0xc9); db(0xb3); db(0xca); db(0x66); db(0x06); db(0x21); db(0x52); - db(0x00); db(0x04); db(0x60); db(0x18); db(0x20); db(0x09); db(0x67); db(0x0e); - db(0x20); db(0x11); db(0xd0); db(0x80); db(0xd0); db(0x80); db(0xb5); db(0xc0); - db(0x67); db(0x04); db(0x22); db(0x40); db(0x60); db(0xee); db(0x20); db(0x09); - db(0x67); db(0x02); db(0x22); db(0x92); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0x20); db(0x22); db(0x74); db(0x16); db(0x9f); db(0xc2); db(0x24); db(0x4f); - db(0x32); db(0x02); db(0x42); db(0x32); db(0x10); db(0xff); db(0x53); db(0x41); - db(0x66); db(0xf8); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x72); db(0x0f); - db(0x4a); db(0x80); db(0x67); db(0x02); db(0x72); db(0x10); db(0x15); db(0x41); - db(0x00); db(0x04); db(0x35); db(0x7c); db(0x08); db(0x00); db(0x00); db(0x08); - db(0x22); db(0x6b); db(0x00); db(0xa4); db(0x33); db(0x7c); db(0x00); db(0x0b); - db(0x00); db(0x1c); db(0x23); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x16); - db(0x00); db(0x24); db(0x23); db(0x4a); db(0x00); db(0x28); db(0x13); db(0x7c); - db(0x00); db(0x01); db(0x00); db(0x1e); db(0x22); db(0x6b); db(0x00); db(0xa8); - db(0x33); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x13); db(0x7c); - db(0x00); db(0x01); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); - db(0x22); db(0x6b); db(0x00); db(0xa8); db(0x25); db(0x69); db(0x00); db(0x20); - db(0x00); db(0x0e); db(0x25); db(0x69); db(0x00); db(0x24); db(0x00); db(0x12); - db(0x22); db(0x6b); db(0x00); db(0xa4); db(0x4e); db(0xae); db(0xfe); db(0x38); - db(0xdf); db(0xc2); db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); - db(0x4a); db(0x00); db(0x67); db(0x26); db(0x4a); db(0x2b); db(0x00); db(0x60); - db(0x66); db(0x36); db(0x70); db(0x00); db(0x4a); db(0x33); db(0x00); db(0x61); - db(0x67); db(0x04); db(0x52); db(0x00); db(0x60); db(0xf6); db(0x17); db(0x40); - db(0x00); db(0x60); db(0x67); db(0x24); db(0x20); db(0x01); db(0x61); db(0x00); - db(0xfd); db(0xf2); db(0x70); db(0x01); db(0x61); db(0x00); db(0xff); db(0x60); - db(0x60); db(0x16); db(0x4a); db(0x2b); db(0x00); db(0x60); db(0x67); db(0x10); - db(0x42); db(0x2b); db(0x00); db(0x60); db(0x20); db(0x01); db(0x61); db(0x00); - db(0xfe); db(0x68); db(0x70); db(0x00); db(0x61); db(0x00); db(0xff); db(0x48); - db(0x4e); db(0x75); db(0x4a); db(0xac); db(0x00); db(0x14); db(0x67); db(0x0a); - db(0x70); db(0x00); db(0x72); db(0x01); db(0x61); db(0x00); db(0xff); db(0xb2); - db(0x4e); db(0x75); db(0x70); db(0x01); db(0x72); db(0x03); db(0x61); db(0x00); - db(0xff); db(0xa8); db(0x4e); db(0x75); db(0x20); db(0x2b); db(0x00); db(0xb8); - db(0x0c); db(0x80); db(0xff); db(0xff); db(0xff); db(0xff); db(0x67); db(0x18); - db(0x20); db(0x6b); db(0x00); db(0xb4); db(0x20); db(0x68); db(0x00); db(0x1c); - db(0xd1); db(0xc8); db(0xd1); db(0xc8); db(0x20); db(0x68); db(0x00); db(0x08); - db(0xd1); db(0xc8); db(0xd1); db(0xc8); db(0x21); db(0x40); db(0x00); db(0x28); - db(0x4e); db(0x75); db(0x61); db(0x00); db(0xff); db(0xd8); db(0x10); db(0x2b); - db(0x00); db(0xac); db(0x6b); db(0x0a); db(0x70); db(0x01); db(0x72); db(0x03); - db(0x61); db(0x00); db(0xff); db(0x6e); db(0x4e); db(0x75); db(0x72); db(0x01); - db(0x0c); db(0x00); db(0x00); db(0xfe); db(0x66); db(0x02); db(0x72); db(0x03); - db(0x70); db(0x00); db(0x61); db(0x00); db(0xff); db(0x5c); db(0x4e); db(0x75); - db(0x20); db(0x6c); db(0x00); db(0x24); db(0x4a); db(0x90); db(0x67); db(0x0c); - db(0x4a); db(0xa8); db(0x00); db(0x08); db(0x66); db(0x0a); db(0x4a); db(0xa8); - db(0x00); db(0x0c); db(0x66); db(0x04); db(0x70); db(0x01); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2a); db(0x48); db(0x24); db(0x6c); - db(0x00); db(0x18); db(0x2e); db(0x15); db(0x7a); db(0x00); db(0x4a); db(0x87); - db(0x67); db(0x70); db(0x20); db(0x0a); db(0x67); db(0x6c); db(0x7c); db(0x00); - db(0x22); db(0x2d); db(0x00); db(0x08); db(0x67); db(0x12); db(0x24); db(0x2a); - db(0x00); db(0x04); db(0x2c); db(0x6b); db(0x00); db(0xa0); db(0x4e); db(0xae); - db(0xfc); db(0x34); db(0x4a); db(0x80); db(0x66); db(0x02); db(0x50); db(0xc6); - db(0x22); db(0x2d); db(0x00); db(0x0c); db(0x67); db(0x1c); db(0x20); db(0x41); - db(0x22); db(0x4a); db(0x2f); db(0x0a); db(0x45); db(0xec); db(0x00); db(0x20); - db(0x48); db(0x7a); db(0x00); db(0x08); db(0x2f); db(0x28); db(0x00); db(0x08); - db(0x4e); db(0x75); db(0x24); db(0x5f); db(0x4a); db(0x80); db(0x66); db(0x02); - db(0x50); db(0xc6); db(0x4a); db(0x06); db(0x67); db(0x24); db(0x20); db(0x2a); - db(0x00); db(0x04); db(0x90); db(0x8a); db(0x4a); db(0x92); db(0x66); db(0x0a); - db(0x20); db(0x05); db(0x67); db(0x10); db(0x20); db(0x40); db(0x42); db(0x90); - db(0x60); db(0x0a); db(0x20); db(0x52); db(0x22); db(0x4a); db(0x22); db(0xd8); - db(0x59); db(0x80); db(0x6a); db(0xfa); db(0x53); db(0x95); db(0x53); db(0x87); - db(0x60); db(0x94); db(0x2a); db(0x0a); db(0x24); db(0x52); db(0x53); db(0x87); - db(0x60); db(0x8c); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x20); db(0x6c); - db(0x00); db(0x24); db(0x4a); db(0x90); db(0x4e); db(0x75); db(0x61); db(0x00); - db(0xfc); db(0x4c); db(0x21); db(0x40); db(0x01); db(0x9c); db(0x2f); db(0x08); - db(0x30); db(0x3c); db(0xff); db(0xec); db(0x61); db(0x00); db(0x1c); db(0xf2); - db(0x2a); db(0x50); db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); - db(0x1c); db(0xd8); db(0x22); db(0x48); db(0x20); db(0x5f); db(0x42); db(0xa8); - db(0x01); db(0x90); db(0x42); db(0xa8); db(0x01); db(0x94); db(0x4e); db(0x91); - db(0x26); db(0x00); db(0x0c); db(0x43); db(0xff); db(0xfe); db(0x67); db(0x00); - db(0xf6); db(0x92); db(0x20); db(0x28); db(0x01); db(0x90); db(0x67); db(0x14); - db(0x6b); db(0x12); db(0x2f); db(0x08); db(0x72); db(0x01); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x5f); - db(0x21); db(0x40); db(0x01); db(0x94); db(0x4a); db(0x83); db(0x6a); db(0x0e); - db(0x22); db(0x48); db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); - db(0x1c); db(0x98); db(0x4e); db(0x90); db(0x60); db(0x26); db(0x2c); db(0x4c); - db(0x2f); db(0x08); db(0x61); db(0x00); db(0x0f); db(0xf6); db(0x20); db(0x5f); - db(0x22); db(0x48); db(0x26); db(0x40); db(0x30); db(0x3c); db(0xff); db(0x20); - db(0x61); db(0x00); db(0x1c); db(0x7e); db(0x4e); db(0x90); db(0x70); db(0x00); - db(0x27); db(0x40); db(0x00); db(0x08); db(0x27); db(0x40); db(0x00); db(0x10); - db(0x27); db(0x40); db(0x00); db(0x20); db(0x20); db(0x69); db(0x01); db(0x94); - db(0x4a); db(0xa9); db(0x01); db(0x90); db(0x67); db(0x2c); db(0x20); db(0x08); - db(0x67); db(0x32); db(0x61); db(0x00); db(0xfa); db(0x9a); db(0x48); db(0xe7); - db(0x80); db(0xc0); db(0x20); db(0x29); db(0x01); db(0x90); db(0x22); db(0x69); - db(0x01); db(0x94); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); - db(0xff); db(0x2e); db(0x4c); db(0xdf); db(0x03); db(0x01); db(0x42); db(0xa9); - db(0x01); db(0x90); db(0x23); db(0x48); db(0x01); db(0x94); db(0x4a); db(0x80); - db(0x67); db(0x0a); db(0x4a); db(0xa9); db(0x01); db(0x98); db(0x67); db(0x04); - db(0x61); db(0x00); db(0xfa); db(0x16); db(0x4a); db(0x83); db(0x6b); db(0x00); - db(0xf5); db(0xfa); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x2f); db(0x09); - db(0x43); db(0xfa); db(0x1d); db(0xc7); db(0x4e); db(0xae); db(0xfe); db(0xda); - db(0x22); db(0x5f); db(0x22); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x18); - db(0x61); db(0x00); db(0x1c); db(0x0e); db(0x4e); db(0x90); db(0x20); db(0x03); - db(0x16); db(0x29); db(0x00); db(0x4f); db(0x4a); db(0x80); db(0x66); db(0x24); - db(0x27); db(0x7c); db(0x00); db(0x00); db(0x17); db(0x70); db(0x00); db(0x14); - db(0x41); db(0xfa); db(0xf3); db(0xa2); db(0x70); db(0xff); db(0x22); db(0x0c); - db(0x66); db(0x06); db(0x41); db(0xfa); db(0xf3); db(0xe4); db(0x70); db(0x00); - db(0x27); db(0x40); db(0x00); db(0x24); db(0x20); db(0x08); db(0xe4); db(0x88); - db(0x27); db(0x40); db(0x00); db(0x20); db(0x08); db(0x07); db(0x00); db(0x03); - db(0x66); db(0x48); db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x42); - db(0x0c); db(0x03); db(0x00); db(0x80); db(0x67); db(0x3c); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x70); db(0x14); db(0x22); db(0x3c); db(0x00); db(0x01); - db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); - db(0x30); db(0x3c); db(0x10); db(0x00); db(0x80); db(0x03); db(0x33); db(0x40); - db(0x00); db(0x08); db(0x23); db(0x6d); db(0x01); db(0x04); db(0x00); db(0x0a); - db(0x23); db(0x4b); db(0x00); db(0x10); db(0x41); db(0xec); db(0x00); db(0x4a); - db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x4e); db(0xae); db(0xfe); db(0xf2); - db(0x4e); db(0xae); db(0xff); db(0x76); db(0x72); db(0x00); db(0x70); db(0x00); - db(0x4e); db(0x75); db(0x76); db(0x00); db(0x24); db(0x49); db(0x20); db(0x4b); - db(0x72); db(0x00); db(0x22); db(0x41); db(0x08); db(0x07); db(0x00); db(0x01); - db(0x67); db(0x08); db(0x08); db(0x07); db(0x00); db(0x02); db(0x67); db(0x02); - db(0x72); db(0x01); db(0x70); db(0x80); db(0x2c); db(0x4c); db(0x61); db(0x00); - db(0x0f); db(0x92); db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x6a); - db(0x08); db(0x07); db(0x00); db(0x02); db(0x66); db(0x64); db(0x20); db(0x52); - db(0x74); db(0x02); db(0x52); db(0x82); db(0x4a); db(0x30); db(0x28); db(0xfd); - db(0x66); db(0xf8); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x06); db(0x82); - db(0x00); db(0x00); db(0x10); db(0x04); db(0x20); db(0x02); db(0x72); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x42); - db(0x20); db(0x52); db(0x24); db(0x40); db(0x22); db(0x4a); db(0x12); db(0xd8); - db(0x66); db(0xfc); db(0x13); db(0x7c); db(0x00); db(0x3a); db(0xff); db(0xff); - db(0x42); db(0x11); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); - db(0x1c); db(0x6c); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x2c); db(0x40); - db(0x22); db(0x0a); db(0x26); db(0x0f); db(0x4f); db(0xea); db(0x10); db(0x04); - db(0x4e); db(0xae); db(0xff); db(0x52); db(0x2e); db(0x43); db(0x26); db(0x01); - db(0x22); db(0x4e); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); - db(0xfe); db(0x62); db(0x22); db(0x4a); db(0x20); db(0x02); db(0x4e); db(0xae); - db(0xff); db(0x2e); db(0x22); db(0x03); db(0x70); db(0x00); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x01); db(0x7e); db(0x06); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x1c); db(0x5d); - db(0x70); db(0x24); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); - db(0x66); db(0x0e); db(0x08); db(0x87); db(0x00); db(0x02); db(0x43); db(0xfa); - db(0x1c); db(0x4b); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); - db(0x28); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x28); db(0x40); db(0x47); db(0xec); + db(0x00); db(0x16); db(0x22); db(0x4b); db(0x22); db(0xca); db(0x22); db(0xc2); + db(0x22); db(0xc3); db(0x30); db(0x3c); db(0x3f); db(0xf4); db(0x61); db(0x00); + db(0x24); db(0x50); db(0x22); db(0xc8); db(0x30); db(0x3c); db(0x3f); db(0xf0); + db(0x61); db(0x00); db(0x24); db(0x46); db(0x22); db(0xc8); db(0x29); db(0x4b); + db(0x00); db(0x0e); db(0x19); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); + db(0x19); db(0x7c); db(0x00); db(0xf6); db(0x00); db(0x09); db(0x41); db(0xfa); + db(0x24); db(0xf7); db(0x29); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); + db(0x00); db(0x14); db(0x29); db(0x48); db(0x00); db(0x12); db(0x22); db(0x4c); + db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x4c); db(0xdf); + db(0x1f); db(0x0f); db(0x4e); db(0x75); db(0x20); db(0x51); db(0x52); db(0x90); + db(0x20); db(0x69); db(0x00); db(0x0c); db(0x20); db(0x10); db(0x67); db(0x1e); + db(0x20); db(0x40); db(0x0c); db(0x68); db(0x00); db(0x1f); db(0x00); db(0x14); + db(0x65); db(0x14); db(0x4a); db(0xa8); db(0x00); db(0x22); db(0x67); db(0x0e); + db(0x4a); db(0xa8); db(0x00); db(0x3c); db(0x67); db(0x08); db(0x22); db(0x69); + db(0x00); db(0x10); db(0x22); db(0xa8); db(0x00); db(0x44); db(0x70); db(0x00); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xf1); db(0xe0); db(0x2e); db(0x00); + db(0x20); db(0x3c); db(0x00); db(0x00); db(0xff); db(0xfc); db(0x61); db(0x00); + db(0x23); db(0xd8); db(0x24); db(0x48); db(0x74); db(0x00); db(0x08); db(0x07); + db(0x00); db(0x00); db(0x67); db(0x10); db(0x41); db(0xfa); db(0x24); db(0xba); + db(0x43); db(0xfa); db(0xfd); db(0x78); db(0x70); db(0x14); db(0x61); db(0x00); + db(0x0b); db(0xb6); db(0x24); db(0x00); db(0x76); db(0x00); db(0x08); db(0x07); + db(0x00); db(0x01); db(0x67); db(0x10); db(0x41); db(0xfa); db(0x24); db(0xb0); + db(0x43); db(0xfa); db(0xfc); db(0xda); db(0x70); db(0x19); db(0x61); db(0x00); + db(0x0b); db(0x9e); db(0x26); db(0x00); db(0x70); db(0x2a); db(0x22); db(0x3c); + db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x22); db(0x40); db(0x41); db(0xe9); db(0x00); db(0x1a); db(0x20); db(0xca); + db(0x20); db(0xce); db(0x20); db(0xc2); db(0x20); db(0x83); db(0x41); db(0xfa); + db(0x24); db(0x5e); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x45); db(0xe9); + db(0x00); db(0x1a); db(0x23); db(0x4a); db(0x00); db(0x0e); db(0x41); db(0xfa); + db(0xfe); db(0x02); db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c); + db(0x02); db(0x14); db(0x00); db(0x08); db(0x70); db(0x03); db(0x4e); db(0xae); + db(0xff); db(0x58); db(0x20); db(0x02); db(0x22); db(0x03); db(0x61); db(0x00); + db(0xfe); db(0xd6); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x04); + db(0x61); db(0x00); db(0x23); db(0x46); db(0x4e); db(0x90); db(0x4a); db(0x80); + db(0x67); db(0x04); db(0x61); db(0x00); db(0x0b); db(0x9e); db(0x4c); db(0xdf); + db(0x07); db(0x8f); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xf2); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x48); db(0x26); db(0x49); + db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xbe); db(0x22); db(0x3c); + db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x20); db(0x40); db(0x70); db(0x00); db(0x43); db(0xeb); db(0x01); db(0xac); + db(0x11); db(0xb1); db(0x00); db(0x00); db(0x00); db(0x0e); db(0x52); db(0x40); + db(0x0c); db(0x40); db(0x00); db(0x8c); db(0x66); db(0xf2); db(0x20); db(0x0a); + db(0xe4); db(0x88); db(0x21); db(0x40); db(0x00); db(0x36); db(0x22); db(0x48); + db(0x41); db(0xfa); db(0x23); db(0xdc); db(0x23); db(0x48); db(0x00); db(0x0a); + db(0x20); db(0x6b); db(0x01); db(0x9c); db(0x41); db(0xe8); db(0x00); db(0x12); + db(0x4e); db(0xae); db(0xff); db(0x10); db(0x4c); db(0xdf); db(0x4f); db(0x03); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x7f); db(0x7e); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x24); db(0x48); db(0x0c); db(0x9a); db(0x00); db(0x00); + db(0x03); db(0xf3); db(0x66); db(0x00); db(0x01); db(0x06); db(0x50); db(0x8a); + db(0x2e); db(0x2a); db(0x00); db(0x04); db(0x9e); db(0x92); db(0x50); db(0x8a); + db(0x52); db(0x87); db(0x26); db(0x4a); db(0x20); db(0x07); db(0xe5); db(0x88); + db(0xd7); db(0xc0); db(0x28); db(0x4a); db(0x9b); db(0xcd); db(0x7c); db(0x00); + db(0x24); db(0x12); db(0x72); db(0x01); db(0x08); db(0x02); db(0x00); db(0x1e); + db(0x67); db(0x04); db(0x08); db(0xc1); db(0x00); db(0x01); db(0x08); db(0xc1); + db(0x00); db(0x10); db(0xe5); db(0x8a); db(0x66); db(0x04); db(0x42); db(0x9a); + db(0x60); db(0x20); db(0x50); db(0x82); db(0x20); db(0x02); db(0x4e); db(0xae); + db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0xc4); + db(0x20); db(0x40); db(0x20); db(0xc2); db(0x24); db(0xc8); db(0x22); db(0x0d); + db(0x67); db(0x06); db(0x20); db(0x08); db(0xe4); db(0x88); db(0x2a); db(0x80); + db(0x2a); db(0x48); db(0x52); db(0x86); db(0xbe); db(0x86); db(0x66); db(0xc0); + db(0x7c); db(0x00); db(0x22); db(0x06); db(0xe5); db(0x89); db(0x20); db(0x74); + db(0x18); db(0x00); db(0x58); db(0x88); db(0x26); db(0x1b); db(0x28); db(0x1b); + db(0xe5); db(0x8c); db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xe9); + db(0x67); db(0x08); db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xea); + db(0x66); db(0x0c); db(0x20); db(0x04); db(0x4a); db(0x80); db(0x67); db(0x0e); + db(0x10); db(0xdb); db(0x53); db(0x80); db(0x60); db(0xf6); db(0x0c); db(0x83); + db(0x00); db(0x00); db(0x03); db(0xeb); db(0x66); db(0x74); db(0x26); db(0x1b); + db(0x0c); db(0x83); db(0x00); db(0x00); db(0x03); db(0xec); db(0x66); db(0x24); + db(0x22); db(0x06); db(0xe5); db(0x89); db(0x20); db(0x74); db(0x18); db(0x00); + db(0x58); db(0x88); db(0x20); db(0x1b); db(0x67); db(0xe8); db(0x22); db(0x1b); + db(0xe5); db(0x89); db(0x26); db(0x34); db(0x18); db(0x00); db(0x58); db(0x83); + db(0x24); db(0x1b); db(0xd7); db(0xb0); db(0x28); db(0x00); db(0x53); db(0x80); + db(0x66); db(0xf6); db(0x60); db(0xe6); db(0x0c); db(0x83); db(0x00); db(0x00); + db(0x03); db(0xf0); db(0x66); db(0x12); db(0x20); db(0x1b); db(0x67); db(0xc6); + db(0x02); db(0x80); db(0x00); db(0xff); db(0xff); db(0xff); db(0x52); db(0x80); + db(0xe5); db(0x88); db(0xd7); db(0xc0); db(0x60); db(0xee); db(0x0c); db(0x83); + db(0x00); db(0x00); db(0x03); db(0xf1); db(0x66); db(0x08); db(0x20); db(0x1b); + db(0xe5); db(0x88); db(0xd7); db(0xc0); db(0x60); db(0xa8); db(0x0c); db(0x83); + db(0x00); db(0x00); db(0x03); db(0xf2); db(0x66); db(0x14); db(0x52); db(0x86); + db(0xbe); db(0x86); db(0x66); db(0x00); db(0xff); db(0x66); db(0x7e); db(0x01); + db(0x20); db(0x54); db(0x20); db(0x07); db(0x4c); db(0xdf); db(0x7e); db(0xfe); + db(0x4e); db(0x75); db(0x91); db(0xc8); db(0x7e); db(0x00); db(0x60); db(0xf2); + db(0x48); db(0xe7); db(0x40); db(0xf2); db(0x26); db(0x48); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x41); db(0xee); db(0x01); db(0x50); db(0x20); db(0x50); + db(0x4a); db(0x90); db(0x67); db(0x1a); db(0x22); db(0x68); db(0x00); db(0x0a); + db(0x45); db(0xfa); db(0x23); db(0x2b); db(0x10); db(0x19); db(0x12); db(0x1a); + db(0xb0); db(0x01); db(0x66); db(0x06); db(0x4a); db(0x00); db(0x67); db(0x46); + db(0x60); db(0xf2); db(0x20); db(0x50); db(0x60); db(0xe2); db(0x70); db(0x20); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x20); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x2c); - db(0x21); db(0x4c); db(0x01); db(0xa8); db(0x48); db(0xe7); db(0x00); db(0x8a); - db(0x61); db(0x00); db(0xfd); db(0xbc); db(0x4c); db(0xdf); db(0x51); db(0x00); - db(0x0c); db(0x80); db(0xff); db(0xff); db(0xff); db(0xfe); db(0x67); db(0x08); - db(0x48); db(0x46); db(0x52); db(0x46); db(0x48); db(0x46); db(0x60); db(0xe4); - db(0x22); db(0x48); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); - db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x22); db(0x4c); db(0x4e); db(0xae); - db(0xfe); db(0x62); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x4e); db(0x75); - db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x1a); db(0x7a); - db(0x70); db(0x03); db(0x4e); db(0x90); db(0x22); db(0x6b); db(0x00); db(0xa8); - db(0x23); db(0x40); db(0x00); db(0x20); db(0x67); db(0x16); db(0x70); db(0x00); - db(0x23); db(0x40); db(0x00); db(0x24); db(0x33); db(0x7c); db(0x00); db(0x0b); + db(0xff); db(0x3a); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x08); + db(0x00); db(0x08); db(0x41); db(0xfa); db(0x23); db(0x01); db(0x25); db(0x48); + db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x22); db(0x5a); db(0x25); db(0x48); + db(0x00); db(0x0e); db(0x41); db(0xea); db(0x00); db(0x12); db(0x20); db(0x88); + db(0x58); db(0x90); db(0x21); db(0x48); db(0x00); db(0x08); db(0x41); db(0xee); + db(0x01); db(0x50); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xff); db(0x0a); + db(0x20); db(0x4a); db(0x27); db(0x48); db(0x01); db(0xa0); db(0x20); db(0x08); + db(0x4c); db(0xdf); db(0x4f); db(0x02); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0x01); db(0x02); db(0x2e); db(0x00); db(0x4a); db(0x2b); db(0x00); db(0x60); + db(0x67); db(0x7c); db(0x2c); db(0x6b); db(0x00); db(0xa0); db(0x0c); db(0x6e); + db(0x00); db(0x25); db(0x00); db(0x14); db(0x65); db(0x3e); db(0x72); db(0x0e); + db(0x4e); db(0xae); db(0xfd); db(0x66); db(0x02); db(0x80); db(0xff); db(0xff); + db(0xff); db(0xfe); db(0x67); db(0x62); db(0x08); db(0x07); db(0x00); db(0x00); + db(0x67); db(0x0a); db(0x41); db(0xeb); db(0x00); db(0x20); db(0x22); db(0x08); + db(0x4e); db(0xae); db(0xfd); db(0x5a); db(0x08); db(0x07); db(0x00); db(0x01); + db(0x67); db(0x12); db(0x4a); db(0x2b); db(0x00); db(0x9e); db(0x66); db(0x0c); + db(0x50); db(0xeb); db(0x00); db(0x9e); db(0x22); db(0x2b); db(0x00); db(0xb4); + db(0x4e); db(0xae); db(0xfd); db(0x5a); db(0x72); db(0x0e); db(0x4e); db(0xae); + db(0xfd); db(0x6c); db(0x60); db(0x32); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x08); db(0x07); db(0x00); db(0x00); + db(0x67); db(0x08); db(0x41); db(0xeb); db(0x00); db(0x20); db(0x61); db(0x00); + db(0x00); db(0xac); db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x12); + db(0x4a); db(0x2b); db(0x00); db(0x9e); db(0x66); db(0x0c); db(0x50); db(0xeb); + db(0x00); db(0x9e); db(0x20); db(0x6b); db(0x00); db(0xb4); db(0x61); db(0x00); + db(0x00); db(0x94); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4c); db(0xdf); + db(0x40); db(0x80); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x01); db(0x22); + db(0x2e); db(0x00); db(0x2c); db(0x6b); db(0x00); db(0xa0); db(0x0c); db(0x6e); + db(0x00); db(0x25); db(0x00); db(0x14); db(0x65); db(0x3e); db(0x72); db(0x0e); + db(0x4e); db(0xae); db(0xfd); db(0x66); db(0x02); db(0x80); db(0xff); db(0xff); + db(0xff); db(0xfe); db(0x67); db(0x62); db(0x08); db(0x07); db(0x00); db(0x00); + db(0x67); db(0x0a); db(0x41); db(0xeb); db(0x00); db(0x20); db(0x22); db(0x08); + db(0x4e); db(0xae); db(0xfd); db(0x60); db(0x08); db(0x07); db(0x00); db(0x01); + db(0x67); db(0x12); db(0x4a); db(0x2b); db(0x00); db(0x9e); db(0x67); db(0x0c); + db(0x42); db(0x2b); db(0x00); db(0x9e); db(0x22); db(0x2b); db(0x00); db(0xb4); + db(0x4e); db(0xae); db(0xfd); db(0x60); db(0x72); db(0x0e); db(0x4e); db(0xae); + db(0xfd); db(0x6c); db(0x60); db(0x32); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x08); db(0x07); db(0x00); db(0x00); + db(0x67); db(0x08); db(0x41); db(0xeb); db(0x00); db(0x20); db(0x61); db(0x00); + db(0x00); db(0x44); db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x12); + db(0x4a); db(0x2b); db(0x00); db(0x9e); db(0x67); db(0x0c); db(0x42); db(0x2b); + db(0x00); db(0x9e); db(0x20); db(0x6b); db(0x00); db(0xb4); db(0x61); db(0x00); + db(0x00); db(0x2c); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4c); db(0xdf); + db(0x44); db(0x80); db(0x4e); db(0x75); db(0x22); db(0x48); db(0x20); db(0x6b); + db(0x00); db(0xa0); db(0x20); db(0x68); db(0x00); db(0x22); db(0x20); db(0x68); + db(0x00); db(0x18); db(0xd1); db(0xc8); db(0xd1); db(0xc8); db(0x22); db(0xa8); + db(0x00); db(0x04); db(0x20); db(0x09); db(0xe4); db(0x88); db(0x21); db(0x40); + db(0x00); db(0x04); db(0x4e); db(0x75); db(0x24); db(0x48); db(0x20); db(0x6b); + db(0x00); db(0xa0); db(0x20); db(0x68); db(0x00); db(0x22); db(0x20); db(0x68); + db(0x00); db(0x18); db(0xd1); db(0xc8); db(0xd1); db(0xc8); db(0x22); db(0x68); + db(0x00); db(0x04); db(0xd3); db(0xc9); db(0xd3); db(0xc9); db(0xb3); db(0xca); + db(0x66); db(0x06); db(0x21); db(0x52); db(0x00); db(0x04); db(0x60); db(0x18); + db(0x20); db(0x09); db(0x67); db(0x0e); db(0x20); db(0x11); db(0xd0); db(0x80); + db(0xd0); db(0x80); db(0xb5); db(0xc0); db(0x67); db(0x04); db(0x22); db(0x40); + db(0x60); db(0xee); db(0x20); db(0x09); db(0x67); db(0x02); db(0x22); db(0x92); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x20); db(0x22); db(0x74); db(0x16); + db(0x9f); db(0xc2); db(0x24); db(0x4f); db(0x32); db(0x02); db(0x42); db(0x32); + db(0x10); db(0xff); db(0x53); db(0x41); db(0x66); db(0xf8); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x72); db(0x0f); db(0x4a); db(0x80); db(0x67); db(0x02); + db(0x72); db(0x10); db(0x15); db(0x41); db(0x00); db(0x04); db(0x35); db(0x7c); + db(0x08); db(0x00); db(0x00); db(0x08); db(0x22); db(0x6b); db(0x00); db(0xa4); + db(0x33); db(0x7c); db(0x00); db(0x0b); db(0x00); db(0x1c); db(0x23); db(0x7c); + db(0x00); db(0x00); db(0x00); db(0x16); db(0x00); db(0x24); db(0x23); db(0x4a); + db(0x00); db(0x28); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e); + db(0x22); db(0x6b); db(0x00); db(0xa8); db(0x33); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e); - db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x4e); db(0x75); db(0x7e); db(0x00); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x93); db(0xc9); db(0x4e); db(0xae); - db(0xfe); db(0xda); db(0x20); db(0x40); db(0x4b); db(0xe8); db(0x00); db(0x5c); - db(0x43); db(0xfa); db(0x1b); db(0x82); db(0x4e); db(0xae); db(0xfe); db(0x68); - db(0x24); db(0x40); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xbc); - db(0x30); db(0x3c); db(0xff); db(0x40); db(0x61); db(0x00); db(0x1a); db(0x2a); - db(0x70); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x66); db(0x0c); - db(0x20); db(0x01); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x7c); db(0x00); - db(0x26); db(0x86); db(0x27); db(0x46); db(0x00); db(0x04); db(0x27); db(0x46); - db(0x00); db(0x08); db(0x27); db(0x4a); db(0x00); db(0xa0); db(0x50); db(0xeb); - db(0x00); db(0x9e); db(0x70); db(0xff); db(0x27); db(0x40); db(0x00); db(0xb8); - db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x27); db(0x40); - db(0x00); db(0xb0); db(0x41); db(0xfa); db(0x1a); db(0x0e); db(0x70); db(0x00); - db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0xcc); db(0x27); db(0x40); - db(0x00); db(0xa4); db(0x41); db(0xfa); db(0x1a); db(0x0b); db(0x70); db(0x00); - db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0xbc); db(0x27); db(0x40); - db(0x00); db(0xa8); db(0x7a); db(0x00); db(0x26); db(0x07); db(0x66); db(0x12); - db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x80); db(0x20); db(0x4d); - db(0x4e); db(0xae); db(0xfe); db(0x8c); db(0x28); db(0x40); db(0x26); db(0x2c); - db(0x00); db(0x0a); db(0x30); db(0x3c); db(0xff); db(0x40); db(0x61); db(0x00); - db(0x19); db(0xb0); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x24); db(0x00); - db(0x61); db(0x00); db(0xfb); db(0xc2); db(0x70); db(0x01); db(0x61); db(0x00); - db(0xf9); db(0x72); db(0x08); db(0x02); db(0x00); db(0x01); db(0x67); db(0x06); - db(0x70); db(0x01); db(0x61); db(0x00); db(0xfa); db(0xda); db(0x60); db(0x00); - db(0x01); db(0x44); db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x8c); - db(0x28); db(0x40); db(0x4a); db(0x80); db(0x66); db(0x10); db(0x70); db(0x00); - db(0x12); db(0x2d); db(0x00); db(0x0f); db(0x03); db(0xc0); db(0x08); db(0xc0); - db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x08); db(0x2b); - db(0x00); db(0x00); db(0x00); db(0xad); db(0x67); db(0x0a); db(0x61); db(0x00); - db(0xfe); db(0xe8); db(0x08); db(0xab); db(0x00); db(0x00); db(0x00); db(0xad); - db(0x08); db(0x2b); db(0x00); db(0x01); db(0x00); db(0xad); db(0x67); db(0x0a); - db(0x61); db(0x00); db(0x0c); db(0x60); db(0x08); db(0xab); db(0x00); db(0x01); - db(0x00); db(0xad); db(0x4a); db(0x2b); db(0x00); db(0xac); db(0x67); db(0x24); - db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x19); db(0x42); - db(0x70); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x04); - db(0x61); db(0x00); db(0xfb); db(0x78); db(0x42); db(0x2b); db(0x00); db(0xac); - db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x19); db(0x2a); - db(0x70); db(0x02); db(0x4e); db(0x90); db(0x20); db(0x0c); db(0x67); db(0x56); - db(0x0c); db(0x6c); db(0x00); db(0x26); db(0x00); db(0x12); db(0x66); db(0x4e); - db(0x0c); db(0xac); db(0x40); db(0x00); db(0x00); db(0x00); db(0x00); db(0x14); - db(0x66); db(0x44); db(0x0c); db(0x6c); db(0x12); db(0x34); db(0x00); db(0x18); - db(0x66); db(0x3c); db(0x20); db(0x6c); db(0x00); db(0x1a); db(0x20); db(0x28); - db(0x00); db(0x0c); db(0x02); db(0x80); db(0x80); db(0x00); db(0x00); db(0x08); - db(0x0c); db(0x80); db(0x80); db(0x00); db(0x00); db(0x08); db(0x66); db(0x1a); - db(0x02); db(0xa8); db(0x7f); db(0xff); db(0xff); db(0xff); db(0x00); db(0x0c); - db(0x20); db(0x68); db(0x00); db(0x10); db(0x22); db(0x4c); db(0x12); db(0xbc); - db(0x00); db(0x08); db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0x00); - db(0xff); db(0x4a); db(0x22); db(0x4c); db(0x70); db(0x26); db(0x4e); db(0xae); - db(0xff); db(0x2e); db(0x60); db(0x00); db(0xff); db(0x3e); db(0x74); db(0xfe); - db(0x20); db(0x0c); db(0x67); db(0x14); db(0x26); db(0x2c); db(0x00); db(0x0a); - db(0x66); db(0x42); db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x50); - db(0x61); db(0x00); db(0x18); db(0xb6); db(0x70); db(0x01); db(0x4e); db(0x90); - db(0x45); db(0xeb); db(0x00); db(0x04); db(0x20); db(0x52); db(0x20); db(0x08); - db(0x67); db(0x00); db(0xff); db(0x18); db(0x22); db(0x50); db(0x20); db(0x40); - db(0x20); db(0x28); db(0x00); db(0x04); db(0xb4); db(0x80); db(0x66); db(0x16); - db(0x48); db(0xe7); db(0x00); db(0xc0); db(0x28); db(0x68); db(0x00); db(0x0a); - db(0x61); db(0x4a); db(0x53); db(0x85); db(0x4c); db(0xdf); db(0x03); db(0x00); - db(0x24); db(0x89); db(0x20); db(0x49); db(0x60); db(0xd8); db(0x24); db(0x48); - db(0x20); db(0x49); db(0x60); db(0xd2); db(0x0c); db(0x85); db(0x00); db(0x00); - db(0x00); db(0x14); db(0x65); db(0x00); db(0x00); db(0x0a); db(0x70); db(0x01); - db(0x29); db(0x40); db(0x00); db(0x04); db(0x60); db(0x12); db(0x61); db(0x5e); - db(0x30); db(0x3c); db(0xff); db(0x30); db(0x61); db(0x00); db(0x18); db(0x62); - db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x0e); db(0x52); db(0x85); - db(0x28); db(0xab); db(0x00); db(0x04); db(0x27); db(0x4c); db(0x00); db(0x04); - db(0x60); db(0x00); db(0xfe); db(0xc0); db(0x28); db(0x43); db(0x61); db(0x04); - db(0x60); db(0x00); db(0xfe); db(0xb8); db(0x0c); db(0xac); db(0x00); db(0x00); - db(0x00); db(0x1f); db(0x00); db(0x08); db(0x66); db(0x04); db(0x61); db(0x00); - db(0xfa); db(0x3a); db(0x0c); db(0xac); db(0x00); db(0x00); db(0x04); db(0x09); - db(0x00); db(0x08); db(0x66); db(0x14); db(0x61); db(0x00); db(0xfa); db(0x92); - db(0x66); db(0x0e); db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); - db(0x18); db(0x20); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x60); db(0xec); - db(0x22); db(0x54); db(0x20); db(0x6c); db(0x00); db(0x04); db(0x29); db(0x4d); - db(0x00); db(0x04); db(0x4e); db(0xee); db(0xfe); db(0x92); db(0x2f); db(0x05); - db(0x7a); db(0xfc); db(0x24); db(0x53); db(0x2e); db(0x0a); db(0x22); db(0x0a); - db(0x67); db(0x00); db(0x00); db(0x0c); db(0x52); db(0x85); db(0x67); db(0x1e); - db(0x22); db(0x4a); db(0x24); db(0x52); db(0x60); db(0xf0); db(0x52); db(0x85); - db(0x67); db(0x3c); db(0x24); db(0x47); db(0x70); db(0x18); db(0x72); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x52); db(0x46); db(0x24); db(0x40); - db(0x24); db(0x87); db(0x2e); db(0x0a); db(0x60); db(0xe8); db(0x20); db(0x12); - db(0x67); db(0x24); db(0x20); db(0x40); db(0x20); db(0x10); db(0x67); db(0x1e); - db(0x20); db(0x40); db(0x20); db(0x10); db(0x67); db(0x18); db(0x70); db(0x00); - db(0x22); db(0x80); db(0x22); db(0x4a); db(0x24); db(0x51); db(0x70); db(0x18); - db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x06); db(0x86); db(0x00); db(0x01); - db(0x00); db(0x00); db(0x20); db(0x0a); db(0x66); db(0xec); db(0x26); db(0x87); - db(0x2a); db(0x1f); db(0x4e); db(0x75); db(0x20); db(0x88); db(0x58); db(0x90); - db(0x42); db(0xa8); db(0x00); db(0x04); db(0x21); db(0x48); db(0x00); db(0x08); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x20); db(0x22); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); - db(0x91); db(0xc8); db(0x24); db(0x00); db(0x6b); db(0x32); db(0x70); db(0x22); + db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x22); db(0x6b); db(0x00); db(0xa8); + db(0x25); db(0x69); db(0x00); db(0x20); db(0x00); db(0x0e); db(0x25); db(0x69); + db(0x00); db(0x24); db(0x00); db(0x12); db(0x22); db(0x6b); db(0x00); db(0xa4); + db(0x4e); db(0xae); db(0xfe); db(0x38); db(0xdf); db(0xc2); db(0x4c); db(0xdf); + db(0x44); db(0x04); db(0x4e); db(0x75); db(0x4a); db(0x00); db(0x67); db(0x26); + db(0x4a); db(0x2b); db(0x00); db(0x60); db(0x66); db(0x36); db(0x70); db(0x00); + db(0x4a); db(0x33); db(0x00); db(0x61); db(0x67); db(0x04); db(0x52); db(0x00); + db(0x60); db(0xf6); db(0x17); db(0x40); db(0x00); db(0x60); db(0x67); db(0x24); + db(0x20); db(0x01); db(0x61); db(0x00); db(0xfd); db(0xf2); db(0x70); db(0x01); + db(0x61); db(0x00); db(0xff); db(0x60); db(0x60); db(0x16); db(0x4a); db(0x2b); + db(0x00); db(0x60); db(0x67); db(0x10); db(0x42); db(0x2b); db(0x00); db(0x60); + db(0x20); db(0x01); db(0x61); db(0x00); db(0xfe); db(0x68); db(0x70); db(0x00); + db(0x61); db(0x00); db(0xff); db(0x48); db(0x4e); db(0x75); db(0x4a); db(0xac); + db(0x00); db(0x14); db(0x67); db(0x0a); db(0x70); db(0x00); db(0x72); db(0x01); + db(0x61); db(0x00); db(0xff); db(0xb2); db(0x4e); db(0x75); db(0x70); db(0x01); + db(0x72); db(0x03); db(0x61); db(0x00); db(0xff); db(0xa8); db(0x4e); db(0x75); + db(0x20); db(0x2b); db(0x00); db(0xb8); db(0x0c); db(0x80); db(0xff); db(0xff); + db(0xff); db(0xff); db(0x67); db(0x18); db(0x20); db(0x6b); db(0x00); db(0xb4); + db(0x20); db(0x68); db(0x00); db(0x1c); db(0xd1); db(0xc8); db(0xd1); db(0xc8); + db(0x20); db(0x68); db(0x00); db(0x08); db(0xd1); db(0xc8); db(0xd1); db(0xc8); + db(0x21); db(0x40); db(0x00); db(0x28); db(0x4e); db(0x75); db(0x61); db(0x00); + db(0xff); db(0xd8); db(0x10); db(0x2b); db(0x00); db(0xac); db(0x6b); db(0x0a); + db(0x70); db(0x01); db(0x72); db(0x03); db(0x61); db(0x00); db(0xff); db(0x6e); + db(0x4e); db(0x75); db(0x72); db(0x01); db(0x0c); db(0x00); db(0x00); db(0xfe); + db(0x66); db(0x02); db(0x72); db(0x03); db(0x70); db(0x00); db(0x61); db(0x00); + db(0xff); db(0x5c); db(0x4e); db(0x75); db(0x20); db(0x6c); db(0x00); db(0x24); + db(0x4a); db(0x90); db(0x67); db(0x0c); db(0x4a); db(0xa8); db(0x00); db(0x08); + db(0x66); db(0x0a); db(0x4a); db(0xa8); db(0x00); db(0x0c); db(0x66); db(0x04); + db(0x70); db(0x01); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); + db(0x2a); db(0x48); db(0x24); db(0x6c); db(0x00); db(0x18); db(0x2e); db(0x15); + db(0x7a); db(0x00); db(0x4a); db(0x87); db(0x67); db(0x70); db(0x20); db(0x0a); + db(0x67); db(0x6c); db(0x7c); db(0x00); db(0x22); db(0x2d); db(0x00); db(0x08); + db(0x67); db(0x12); db(0x24); db(0x2a); db(0x00); db(0x04); db(0x2c); db(0x6b); + db(0x00); db(0xa0); db(0x4e); db(0xae); db(0xfc); db(0x34); db(0x4a); db(0x80); + db(0x66); db(0x02); db(0x50); db(0xc6); db(0x22); db(0x2d); db(0x00); db(0x0c); + db(0x67); db(0x1c); db(0x20); db(0x41); db(0x22); db(0x4a); db(0x2f); db(0x0a); + db(0x45); db(0xec); db(0x00); db(0x20); db(0x48); db(0x7a); db(0x00); db(0x08); + db(0x2f); db(0x28); db(0x00); db(0x08); db(0x4e); db(0x75); db(0x24); db(0x5f); + db(0x4a); db(0x80); db(0x66); db(0x02); db(0x50); db(0xc6); db(0x4a); db(0x06); + db(0x67); db(0x24); db(0x20); db(0x2a); db(0x00); db(0x04); db(0x90); db(0x8a); + db(0x4a); db(0x92); db(0x66); db(0x0a); db(0x20); db(0x05); db(0x67); db(0x10); + db(0x20); db(0x40); db(0x42); db(0x90); db(0x60); db(0x0a); db(0x20); db(0x52); + db(0x22); db(0x4a); db(0x22); db(0xd8); db(0x59); db(0x80); db(0x6a); db(0xfa); + db(0x53); db(0x95); db(0x53); db(0x87); db(0x60); db(0x94); db(0x2a); db(0x0a); + db(0x24); db(0x52); db(0x53); db(0x87); db(0x60); db(0x8c); db(0x4c); db(0xdf); + db(0x7c); db(0xfc); db(0x20); db(0x6c); db(0x00); db(0x24); db(0x4a); db(0x90); + db(0x4e); db(0x75); db(0x61); db(0x00); db(0xfc); db(0x4c); db(0x21); db(0x40); + db(0x01); db(0x9c); db(0x2f); db(0x08); db(0x30); db(0x3c); db(0xff); db(0xec); + db(0x61); db(0x00); db(0x1e); db(0x0e); db(0x2a); db(0x50); db(0x30); db(0x3c); + db(0xff); db(0x28); db(0x61); db(0x00); db(0x1d); db(0xf4); db(0x22); db(0x48); + db(0x20); db(0x5f); db(0x42); db(0xa8); db(0x01); db(0x90); db(0x42); db(0xa8); + db(0x01); db(0x94); db(0x4e); db(0x91); db(0x26); db(0x00); db(0x0c); db(0x43); + db(0xff); db(0xfe); db(0x67); db(0x00); db(0xf6); db(0x92); db(0x20); db(0x28); + db(0x01); db(0x90); db(0x67); db(0x14); db(0x6b); db(0x12); db(0x2f); db(0x08); + db(0x72); db(0x01); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); + db(0xff); db(0x3a); db(0x20); db(0x5f); db(0x21); db(0x40); db(0x01); db(0x94); + db(0x4a); db(0x83); db(0x6a); db(0x0e); db(0x22); db(0x48); db(0x30); db(0x3c); + db(0xff); db(0x20); db(0x61); db(0x00); db(0x1d); db(0xb4); db(0x4e); db(0x90); + db(0x60); db(0x26); db(0x2c); db(0x4c); db(0x2f); db(0x08); db(0x61); db(0x00); + db(0x0f); db(0xf6); db(0x20); db(0x5f); db(0x22); db(0x48); db(0x26); db(0x40); + db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); db(0x1d); db(0x9a); + db(0x4e); db(0x90); db(0x70); db(0x00); db(0x27); db(0x40); db(0x00); db(0x08); + db(0x27); db(0x40); db(0x00); db(0x10); db(0x27); db(0x40); db(0x00); db(0x20); + db(0x20); db(0x69); db(0x01); db(0x94); db(0x4a); db(0xa9); db(0x01); db(0x90); + db(0x67); db(0x2c); db(0x20); db(0x08); db(0x67); db(0x32); db(0x61); db(0x00); + db(0xfa); db(0x9a); db(0x48); db(0xe7); db(0x80); db(0xc0); db(0x20); db(0x29); + db(0x01); db(0x90); db(0x22); db(0x69); db(0x01); db(0x94); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x4c); db(0xdf); + db(0x03); db(0x01); db(0x42); db(0xa9); db(0x01); db(0x90); db(0x23); db(0x48); + db(0x01); db(0x94); db(0x4a); db(0x80); db(0x67); db(0x0a); db(0x4a); db(0xa9); + db(0x01); db(0x98); db(0x67); db(0x04); db(0x61); db(0x00); db(0xfa); db(0x16); + db(0x4a); db(0x83); db(0x6b); db(0x00); db(0xf5); db(0xfa); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x2f); db(0x09); db(0x43); db(0xfa); db(0x1e); db(0xe3); + db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x22); db(0x5f); db(0x22); db(0x00); + db(0x30); db(0x3c); db(0xff); db(0x18); db(0x61); db(0x00); db(0x1d); db(0x2a); + db(0x4e); db(0x90); db(0x20); db(0x03); db(0x16); db(0x29); db(0x00); db(0x4f); + db(0x4a); db(0x80); db(0x66); db(0x24); db(0x27); db(0x7c); db(0x00); db(0x00); + db(0x17); db(0x70); db(0x00); db(0x14); db(0x41); db(0xfa); db(0xf3); db(0x9e); + db(0x70); db(0xff); db(0x22); db(0x0c); db(0x66); db(0x06); db(0x41); db(0xfa); + db(0xf3); db(0xe0); db(0x70); db(0x00); db(0x27); db(0x40); db(0x00); db(0x24); + db(0x20); db(0x08); db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x20); + db(0x08); db(0x07); db(0x00); db(0x03); db(0x66); db(0x48); db(0x08); db(0x07); + db(0x00); db(0x00); db(0x67); db(0x42); db(0x0c); db(0x03); db(0x00); db(0x80); + db(0x67); db(0x3c); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x14); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x91); db(0xc8); db(0x24); db(0x40); db(0x4a); db(0x80); - db(0x67); db(0x1e); db(0x15); db(0x7c); db(0x00); db(0x04); db(0x00); db(0x08); - db(0x15); db(0x42); db(0x00); db(0x0f); db(0x93); db(0xc9); db(0x4e); db(0xae); - db(0xfe); db(0xda); db(0x25); db(0x40); db(0x00); db(0x10); db(0x41); db(0xea); - db(0x00); db(0x14); db(0x61); db(0x00); db(0xff); db(0xb0); db(0x20); db(0x4a); - db(0x20); db(0x08); db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x20); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x4a); db(0x80); db(0x67); db(0x24); db(0x24); db(0x40); db(0x24); db(0x01); - db(0x66); db(0x02); db(0x74); db(0x30); db(0x20); db(0x02); db(0x22); db(0x3c); - db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x20); db(0x40); db(0x11); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x08); - db(0x31); db(0x42); db(0x00); db(0x12); db(0x21); db(0x4a); db(0x00); db(0x0e); - db(0x4a); db(0x80); db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x30); db(0x22); db(0x24); db(0x48); db(0x24); db(0x00); - db(0x26); db(0x01); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x61); db(0x00); - db(0xff); db(0x6a); db(0x22); db(0x03); db(0x61); db(0x00); db(0xff); db(0xb2); - db(0x67); db(0x18); db(0x20); db(0x4a); db(0x22); db(0x40); db(0x24); db(0x40); - db(0x20); db(0x02); db(0x72); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0x44); - db(0x22); db(0x00); db(0x70); db(0x00); db(0x4a); db(0x81); db(0x66); db(0x02); - db(0x20); db(0x0a); db(0x4a); db(0x80); db(0x4c); db(0xdf); db(0x44); db(0x0c); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x32); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x28); db(0x00); db(0x24); db(0x08); db(0x26); db(0x09); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0x08); db(0x5c); db(0x22); db(0x3c); + db(0xff); db(0x3a); db(0x22); db(0x40); db(0x30); db(0x3c); db(0x10); db(0x00); + db(0x80); db(0x03); db(0x33); db(0x40); db(0x00); db(0x08); db(0x23); db(0x6d); + db(0x01); db(0x04); db(0x00); db(0x0a); db(0x23); db(0x4b); db(0x00); db(0x10); + db(0x41); db(0xec); db(0x00); db(0x4a); db(0x4e); db(0xae); db(0xff); db(0x7c); + db(0x4e); db(0xae); db(0xfe); db(0xf2); db(0x4e); db(0xae); db(0xff); db(0x76); + db(0x72); db(0x00); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x76); db(0x00); + db(0x24); db(0x49); db(0x20); db(0x4b); db(0x72); db(0x00); db(0x22); db(0x41); + db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x08); db(0x08); db(0x07); + db(0x00); db(0x02); db(0x67); db(0x02); db(0x72); db(0x01); db(0x70); db(0x80); + db(0x2c); db(0x4c); db(0x61); db(0x00); db(0x0f); db(0x92); db(0x08); db(0x07); + db(0x00); db(0x01); db(0x67); db(0x6a); db(0x08); db(0x07); db(0x00); db(0x02); + db(0x66); db(0x64); db(0x20); db(0x52); db(0x74); db(0x02); db(0x52); db(0x82); + db(0x4a); db(0x30); db(0x28); db(0xfd); db(0x66); db(0xf8); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x06); db(0x82); db(0x00); db(0x00); db(0x10); db(0x04); + db(0x20); db(0x02); db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x4a); db(0x80); db(0x67); db(0x42); db(0x20); db(0x52); db(0x24); db(0x40); + db(0x22); db(0x4a); db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x13); db(0x7c); + db(0x00); db(0x3a); db(0xff); db(0xff); db(0x42); db(0x11); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x43); db(0xfa); db(0x1d); db(0x88); db(0x4e); db(0xae); + db(0xfe); db(0x68); db(0x2c); db(0x40); db(0x22); db(0x0a); db(0x26); db(0x0f); + db(0x4f); db(0xea); db(0x10); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x52); + db(0x2e); db(0x43); db(0x26); db(0x01); db(0x22); db(0x4e); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4a); + db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x22); db(0x03); + db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); + db(0x2c); db(0x01); db(0x7e); db(0x06); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x43); db(0xfa); db(0x1d); db(0x79); db(0x70); db(0x24); db(0x4e); db(0xae); + db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x66); db(0x0e); db(0x08); db(0x87); + db(0x00); db(0x02); db(0x43); db(0xfa); db(0x1d); db(0x67); db(0x70); db(0x00); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x02); db(0x38); db(0x22); db(0x3c); db(0x00); db(0x01); + db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40); + db(0x4a); db(0x80); db(0x67); db(0x2c); db(0x21); db(0x4c); db(0x01); db(0xa8); + db(0x48); db(0xe7); db(0x00); db(0x8a); db(0x61); db(0x00); db(0xfd); db(0xbc); + db(0x4c); db(0xdf); db(0x51); db(0x00); db(0x0c); db(0x80); db(0xff); db(0xff); + db(0xff); db(0xfe); db(0x67); db(0x08); db(0x48); db(0x46); db(0x52); db(0x46); + db(0x48); db(0x46); db(0x60); db(0xe4); db(0x22); db(0x48); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x02); db(0x38); db(0x4e); db(0xae); db(0xff); db(0x2e); + db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x4c); db(0xdf); + db(0x7c); db(0xfc); db(0x4e); db(0x75); db(0x30); db(0x3c); db(0xff); db(0x58); + db(0x61); db(0x00); db(0x1b); db(0x96); db(0x70); db(0x03); db(0x4e); db(0x90); + db(0x22); db(0x6b); db(0x00); db(0xa8); db(0x23); db(0x40); db(0x00); db(0x20); + db(0x67); db(0x16); db(0x70); db(0x00); db(0x23); db(0x40); db(0x00); db(0x24); + db(0x33); db(0x7c); db(0x00); db(0x0b); db(0x00); db(0x1c); db(0x13); db(0x7c); + db(0x00); db(0x01); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); + db(0x4e); db(0x75); db(0x7e); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x20); db(0x40); + db(0x4b); db(0xe8); db(0x00); db(0x5c); db(0x43); db(0xfa); db(0x1c); db(0x9e); + db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x24); db(0x40); db(0x22); db(0x3c); + db(0x00); db(0x00); db(0x00); db(0xbc); db(0x30); db(0x3c); db(0xff); db(0x40); + db(0x61); db(0x00); db(0x1b); db(0x46); db(0x70); db(0x01); db(0x4e); db(0x90); + db(0x4a); db(0x80); db(0x66); db(0x0c); db(0x20); db(0x01); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x34); db(0x24); db(0x40); - db(0x15); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x08); db(0x15); db(0x44); - db(0x00); db(0x09); db(0x25); db(0x42); db(0x00); db(0x0a); db(0x47); db(0xea); - db(0x00); db(0x5c); db(0x25); db(0x4b); db(0x00); db(0x3a); db(0x47); db(0xeb); - db(0x08); db(0x00); db(0x25); db(0x4b); db(0x00); db(0x3e); db(0x25); db(0x4b); - db(0x00); db(0x36); db(0x22); db(0x4a); db(0x24); db(0x43); db(0x97); db(0xcb); - db(0x24); db(0x09); db(0x4e); db(0xae); db(0xfe); db(0xe6); db(0x20); db(0x02); - db(0x4c); db(0xdf); db(0x4c); db(0x1c); db(0x4e); db(0x75); db(0x41); db(0xfa); - db(0x17); db(0x46); db(0x43); db(0xfa); db(0x01); db(0x50); db(0x70); db(0x13); - db(0x61); db(0x00); db(0xff); db(0x98); db(0x4e); db(0x75); db(0x9e); db(0xfc); - db(0x00); db(0x18); db(0x42); db(0x92); db(0x42); db(0xaa); db(0x00); db(0x0e); - db(0x42); db(0xaa); db(0x00); db(0x12); db(0x20); db(0x4a); db(0x22); db(0x4f); - db(0x70); db(0x05); db(0x22); db(0xd8); db(0x51); db(0xc8); db(0xff); db(0xfc); - db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x64); db(0x24); - db(0x22); db(0x6d); db(0x02); db(0x0c); db(0x33); db(0x7c); db(0x00); db(0x0a); - db(0x00); db(0x1c); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e); - db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x22); db(0x6d); db(0x02); db(0x0c); - db(0x2f); db(0x69); db(0x00); db(0x20); db(0x00); db(0x0e); db(0x2f); db(0x69); - db(0x00); db(0x24); db(0x00); db(0x12); db(0x22); db(0x6d); db(0x02); db(0x08); - db(0x33); db(0x7c); db(0x00); db(0x0b); db(0x00); db(0x1c); db(0x23); db(0x7c); - db(0x00); db(0x00); db(0x00); db(0x16); db(0x00); db(0x24); db(0x13); db(0x7c); - db(0x00); db(0x01); db(0x00); db(0x1e); db(0x23); db(0x4f); db(0x00); db(0x28); - db(0x4e); db(0xae); db(0xfe); db(0x38); db(0xde); db(0xfc); db(0x00); db(0x18); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xf8); db(0xfe); db(0x2a); db(0x48); - db(0x95); db(0xca); db(0x97); db(0xcb); db(0x99); db(0xcc); db(0x78); db(0x00); - db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x20); db(0x6d); db(0x00); db(0x14); - db(0x20); db(0x28); db(0x00); db(0x3c); db(0x67); db(0x5c); db(0x20); db(0x40); - db(0x41); db(0xe8); db(0x00); db(0x2c); db(0x28); db(0x48); db(0x4e); db(0xae); - db(0xfc); db(0xe8); db(0x72); db(0xff); db(0x74); db(0xff); db(0xb2); db(0x80); - db(0x67); db(0x48); db(0x26); db(0x00); db(0x2c); db(0x6d); db(0x00); db(0x14); - db(0x41); db(0xed); db(0x00); db(0xc0); db(0x70); db(0x66); db(0x4e); db(0xae); - db(0xff); db(0x7c); db(0x41); db(0xed); db(0x00); db(0xc0); db(0x38); db(0x28); - db(0x00); db(0x64); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x91); db(0xc8); - db(0x43); db(0xed); db(0x00); db(0x38); db(0x70); db(0x00); db(0x30); db(0x3c); - db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00); db(0x10); db(0x00); - db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c); db(0x72); db(0xff); - db(0x74); db(0xff); db(0x4a); db(0x80); db(0x6b); db(0x0c); db(0x45); db(0xed); - db(0x00); db(0x38); db(0x22); db(0x2a); db(0x00); db(0x32); db(0x24); db(0x2a); - db(0x00); db(0x36); db(0x20); db(0x2c); db(0x00); db(0x1c); db(0xb8); db(0x6d); - db(0x00); db(0x2c); db(0x66); db(0x12); db(0xb0); db(0xad); db(0x00); db(0x28); - db(0x66); db(0x0c); db(0xb2); db(0xad); db(0x00); db(0x20); db(0x66); db(0x06); - db(0xb4); db(0xad); db(0x00); db(0x24); db(0x67); db(0x40); db(0x2b); db(0x40); - db(0x00); db(0x28); db(0x2b); db(0x41); db(0x00); db(0x20); db(0x2b); db(0x42); - db(0x00); db(0x24); db(0x3b); db(0x44); db(0x00); db(0x2c); db(0x91); db(0xc8); - db(0x43); db(0xed); db(0x00); db(0x90); db(0x70); db(0x00); db(0x30); db(0x3c); - db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00); db(0x00); db(0x00); - db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c); db(0x4a); db(0x80); - db(0x6b); db(0x04); db(0x47); db(0xed); db(0x00); db(0x90); db(0x34); db(0x2d); - db(0x00); db(0x2c); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x01); - db(0x61); db(0x00); db(0x15); db(0x36); db(0x4e); db(0x90); db(0x4c); db(0xdf); - db(0x7f); db(0x1f); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x3e); db(0x2e); db(0x00); db(0x14); db(0x70); db(0xff); db(0x4e); db(0xae); - db(0xfe); db(0xb6); db(0x7c); db(0x00); db(0x01); db(0xc6); db(0x93); db(0xc9); - db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x24); db(0x40); db(0x70); db(0x14); - db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xfe); db(0xd4); db(0x70); db(0x00); - db(0x30); db(0x3c); db(0x02); db(0x14); db(0x22); db(0x3c); db(0x00); db(0x01); - db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2a); db(0x40); - db(0x30); db(0x3c); db(0x3e); db(0x00); db(0x61); db(0x00); db(0x15); db(0x02); - db(0x2b); db(0x48); db(0x02); db(0x10); db(0x28); db(0x48); db(0x47); db(0xed); - db(0x00); db(0x16); db(0x27); db(0x4e); db(0x00); db(0x10); db(0x27); db(0x4a); - db(0x00); db(0x08); db(0x27); db(0x46); db(0x00); db(0x0c); db(0x70); db(0xff); - db(0x37); db(0x40); db(0x00); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x05); db(0x61); db(0x00); db(0x14); db(0xcc); db(0x20); db(0x0c); - db(0x4e); db(0x90); db(0x43); db(0xed); db(0x00); db(0x00); db(0x13); db(0x7c); - db(0x00); db(0x02); db(0x00); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x05); - db(0x00); db(0x09); db(0x41); db(0xfa); db(0x15); db(0x7a); db(0x23); db(0x48); - db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x03); db(0x2e); db(0x23); db(0x48); - db(0x00); db(0x12); db(0x23); db(0x4d); db(0x00); db(0x0e); db(0x70); db(0x05); - db(0x4e); db(0xae); db(0xff); db(0x58); db(0x20); db(0x06); db(0x4e); db(0xae); - db(0xfe); db(0xc2); db(0x70); db(0x00); db(0x53); db(0xab); db(0x00); db(0x1c); - db(0x6a); db(0x06); db(0x70); db(0x0a); db(0x27); db(0x40); db(0x00); db(0x1c); - db(0x4a); db(0xab); db(0x00); db(0x14); db(0x66); db(0x22); db(0x4a); db(0xab); - db(0x00); db(0x1c); db(0x66); db(0xe0); db(0x43); db(0xfa); db(0x15); db(0xca); - db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); - db(0x00); db(0x14); db(0x67); db(0xd0); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x14); db(0x74); db(0x20); db(0x81); - db(0x4a); db(0xab); db(0x00); db(0x18); db(0x66); db(0x24); db(0x4a); db(0xab); - db(0x00); db(0x1c); db(0x66); db(0xb8); db(0x43); db(0xfa); db(0x15); db(0xb4); - db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); - db(0x00); db(0x18); db(0x67); db(0x00); db(0xff); db(0xa8); db(0x22); db(0x00); - db(0x30); db(0x3c); db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x14); db(0x4a); - db(0x20); db(0x81); db(0x4a); db(0xad); db(0x02); db(0x08); db(0x66); db(0x3a); - db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x8e); db(0x4e); db(0xae); - db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); - db(0x14); db(0x42); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); - db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x00); - db(0xff); db(0x74); db(0x41); db(0xfa); db(0x14); db(0x2e); db(0x70); db(0x00); - db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0xec); db(0x2b); db(0x40); - db(0x02); db(0x08); db(0x67); db(0x00); db(0x02); db(0x52); db(0x60); db(0x00); - db(0xff); db(0x5c); db(0x4a); db(0xad); db(0x02); db(0x0c); db(0x66); db(0x48); - db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x00); db(0xff); db(0x4e); - db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); - db(0x43); db(0xfa); db(0x14); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xec); - db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82); - db(0x67); db(0x00); db(0xff); db(0x32); db(0x41); db(0xfa); db(0x13); db(0xf9); - db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0xaa); - db(0x2b); db(0x40); db(0x02); db(0x0c); db(0x67); db(0x00); db(0x02); db(0x10); - db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x00); db(0x61); db(0x00); - db(0x13); db(0xb0); db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x0e); - db(0x0c); db(0x47); db(0x00); db(0x24); db(0x65); db(0x18); db(0x0c); db(0x47); - db(0x00); db(0x32); db(0x64); db(0x12); db(0x53); db(0xab); db(0x00); db(0x34); - db(0x6a); db(0x0c); db(0x20); db(0x4b); db(0x61); db(0x00); db(0xfd); db(0x8c); - db(0x70); db(0x32); db(0x27); db(0x40); db(0x00); db(0x34); db(0x45); db(0xed); - db(0x01); db(0x3c); db(0x10); db(0x2c); db(0x00); db(0x00); db(0x0c); db(0x47); - db(0x00); db(0x27); db(0x65); db(0x00); db(0x01); db(0x0a); db(0x08); db(0x00); - db(0x00); db(0x01); db(0x67); db(0x00); db(0x01); db(0x02); db(0x41); db(0xed); - db(0x01); db(0x68); db(0x25); db(0x48); db(0x00); db(0x0a); db(0x15); db(0x7c); - db(0x00); db(0x13); db(0x00); db(0x04); db(0x15); db(0x7c); db(0x00); db(0x03); - db(0x00); db(0x05); db(0x42); db(0x90); db(0x42); db(0xa8); db(0x00); db(0x04); - db(0x42); db(0xa8); db(0x00); db(0x08); db(0x42); db(0x68); db(0x00); db(0x0c); - db(0x42); db(0x6a); db(0x00); db(0x06); db(0x61); db(0x00); db(0x01); db(0xa2); - db(0x31); db(0x6c); db(0x00); db(0x0a); db(0x00); db(0x0e); db(0x42); db(0x68); - db(0x00); db(0x10); db(0x31); db(0x6c); db(0x00); db(0x0c); db(0x00); db(0x12); - db(0x42); db(0x68); db(0x00); db(0x14); db(0x31); db(0x6c); db(0x00); db(0x04); - db(0x00); db(0x16); db(0x42); db(0x68); db(0x00); db(0x18); db(0x31); db(0x6c); - db(0x00); db(0x06); db(0x00); db(0x1a); db(0x43); db(0xed); db(0x01); db(0x88); - db(0x21); db(0x49); db(0x00); db(0x1c); db(0x22); db(0xfc); db(0x80); db(0x03); - db(0xa0); db(0x06); db(0x30); db(0x2c); db(0x00); db(0x20); db(0x48); db(0xc0); - db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x22); db(0xfc); db(0x80); db(0x03); - db(0xa0); db(0x07); db(0x22); db(0xec); db(0x00); db(0x22); db(0x70); db(0x00); - db(0x30); db(0x2c); db(0x00); db(0x10); db(0x6b); db(0x08); db(0x22); db(0xfc); - db(0x80); db(0x03); db(0xa0); db(0x09); db(0x22); db(0xc0); db(0x30); db(0x2c); - db(0x00); db(0x12); db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03); - db(0xa0); db(0x0a); db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x08); - db(0x6b); db(0x14); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x02); - db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x0e); db(0x22); db(0xfc); - db(0x80); db(0x03); db(0xa0); db(0x01); db(0x22); db(0xc0); db(0x30); db(0x2c); - db(0x00); db(0x14); db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03); - db(0xa0); db(0x03); db(0x30); db(0x2c); db(0x00); db(0x1a); db(0x48); db(0xc0); - db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x16); - db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x04); - db(0x30); db(0x2c); db(0x00); db(0x1c); db(0x48); db(0xc0); db(0xe1); db(0x80); - db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x18); db(0x6b); db(0x10); - db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x05); db(0x30); db(0x2c); - db(0x00); db(0x1e); db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); - db(0x70); db(0x00); db(0x30); db(0x2c); db(0x00); db(0x26); db(0x6b); db(0x08); - db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x08); db(0x22); db(0xc0); - db(0x42); db(0x91); db(0x61); db(0x00); db(0xfc); db(0x02); db(0x10); db(0x2c); - db(0x00); db(0x00); db(0x08); db(0x00); db(0x00); db(0x01); db(0x66); db(0x08); - db(0x08); db(0x00); db(0x00); db(0x00); db(0x67); db(0x00); db(0xfd); db(0xc6); - db(0x20); db(0x6b); db(0x00); db(0x14); db(0x30); db(0x2c); db(0x00); db(0x28); - db(0x32); db(0x28); db(0x00); db(0x30); db(0xd2); db(0x41); db(0x90); db(0x41); - db(0x6a); db(0x02); db(0x70); db(0x00); db(0x35); db(0x40); db(0x00); db(0x0a); - db(0x30); db(0x2c); db(0x00); db(0x2a); db(0x32); db(0x28); db(0x00); db(0x2e); + db(0x26); db(0x40); db(0x7c); db(0x00); db(0x26); db(0x86); db(0x27); db(0x46); + db(0x00); db(0x04); db(0x27); db(0x46); db(0x00); db(0x08); db(0x27); db(0x4a); + db(0x00); db(0xa0); db(0x50); db(0xeb); db(0x00); db(0x9e); db(0x70); db(0xff); + db(0x27); db(0x40); db(0x00); db(0xb8); db(0x93); db(0xc9); db(0x4e); db(0xae); + db(0xfe); db(0xda); db(0x27); db(0x40); db(0x00); db(0xb0); db(0x41); db(0xfa); + db(0x1b); db(0x2a); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); + db(0x02); db(0xcc); db(0x27); db(0x40); db(0x00); db(0xa4); db(0x41); db(0xfa); + db(0x1b); db(0x27); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); + db(0x02); db(0xbc); db(0x27); db(0x40); db(0x00); db(0xa8); db(0x7a); db(0x00); + db(0x26); db(0x07); db(0x66); db(0x12); db(0x20); db(0x4d); db(0x4e); db(0xae); + db(0xfe); db(0x80); db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x8c); + db(0x28); db(0x40); db(0x26); db(0x2c); db(0x00); db(0x0a); db(0x30); db(0x3c); + db(0xff); db(0x40); db(0x61); db(0x00); db(0x1a); db(0xcc); db(0x70); db(0x00); + db(0x4e); db(0x90); db(0x24); db(0x00); db(0x61); db(0x00); db(0xfb); db(0xc2); + db(0x70); db(0x01); db(0x61); db(0x00); db(0xf9); db(0x72); db(0x08); db(0x02); + db(0x00); db(0x01); db(0x67); db(0x06); db(0x70); db(0x01); db(0x61); db(0x00); + db(0xfa); db(0xda); db(0x60); db(0x00); db(0x01); db(0x44); db(0x20); db(0x4d); + db(0x4e); db(0xae); db(0xfe); db(0x8c); db(0x28); db(0x40); db(0x4a); db(0x80); + db(0x66); db(0x10); db(0x70); db(0x00); db(0x12); db(0x2d); db(0x00); db(0x0f); + db(0x03); db(0xc0); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); + db(0xfe); db(0xc2); db(0x08); db(0x2b); db(0x00); db(0x00); db(0x00); db(0xad); + db(0x67); db(0x0a); db(0x61); db(0x00); db(0xfe); db(0xe8); db(0x08); db(0xab); + db(0x00); db(0x00); db(0x00); db(0xad); db(0x08); db(0x2b); db(0x00); db(0x01); + db(0x00); db(0xad); db(0x67); db(0x0a); db(0x61); db(0x00); db(0x0c); db(0x60); + db(0x08); db(0xab); db(0x00); db(0x01); db(0x00); db(0xad); db(0x4a); db(0x2b); + db(0x00); db(0xac); db(0x67); db(0x24); db(0x30); db(0x3c); db(0xff); db(0x58); + db(0x61); db(0x00); db(0x1a); db(0x5e); db(0x70); db(0x01); db(0x4e); db(0x90); + db(0x4a); db(0x80); db(0x67); db(0x04); db(0x61); db(0x00); db(0xfb); db(0x78); + db(0x42); db(0x2b); db(0x00); db(0xac); db(0x30); db(0x3c); db(0xff); db(0x58); + db(0x61); db(0x00); db(0x1a); db(0x46); db(0x70); db(0x02); db(0x4e); db(0x90); + db(0x20); db(0x0c); db(0x67); db(0x56); db(0x0c); db(0xac); db(0x40); db(0x00); + db(0x00); db(0x00); db(0x00); db(0x14); db(0x66); db(0x4c); db(0x0c); db(0x6c); + db(0x12); db(0x34); db(0x00); db(0x18); db(0x66); db(0x44); db(0x0c); db(0x6c); + db(0x00); db(0x26); db(0x00); db(0x12); db(0x66); db(0x3c); db(0x20); db(0x6c); + db(0x00); db(0x1a); db(0x20); db(0x28); db(0x00); db(0x0c); db(0x02); db(0x80); + db(0x80); db(0x00); db(0x00); db(0x08); db(0x0c); db(0x80); db(0x80); db(0x00); + db(0x00); db(0x08); db(0x66); db(0x1a); db(0x02); db(0xa8); db(0x7f); db(0xff); + db(0xff); db(0xff); db(0x00); db(0x0c); db(0x20); db(0x68); db(0x00); db(0x10); + db(0x22); db(0x4c); db(0x12); db(0xbc); db(0x00); db(0x08); db(0x4e); db(0xae); + db(0xfe); db(0x92); db(0x60); db(0x00); db(0xff); db(0x4a); db(0x22); db(0x4c); + db(0x70); db(0x26); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x60); db(0x00); + db(0xff); db(0x3e); db(0x74); db(0xfe); db(0x20); db(0x0c); db(0x67); db(0x14); + db(0x26); db(0x2c); db(0x00); db(0x0a); db(0x66); db(0x42); db(0x74); db(0xff); + db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x19); db(0xd2); + db(0x70); db(0x01); db(0x4e); db(0x90); db(0x45); db(0xeb); db(0x00); db(0x04); + db(0x20); db(0x52); db(0x20); db(0x08); db(0x67); db(0x00); db(0xff); db(0x18); + db(0x22); db(0x50); db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x04); + db(0xb4); db(0x80); db(0x66); db(0x16); db(0x48); db(0xe7); db(0x00); db(0xc0); + db(0x28); db(0x68); db(0x00); db(0x0a); db(0x61); db(0x4a); db(0x53); db(0x85); + db(0x4c); db(0xdf); db(0x03); db(0x00); db(0x24); db(0x89); db(0x20); db(0x49); + db(0x60); db(0xd8); db(0x24); db(0x48); db(0x20); db(0x49); db(0x60); db(0xd2); + db(0x0c); db(0x85); db(0x00); db(0x00); db(0x00); db(0x14); db(0x65); db(0x00); + db(0x00); db(0x0a); db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x04); + db(0x60); db(0x12); db(0x61); db(0x5e); db(0x30); db(0x3c); db(0xff); db(0x30); + db(0x61); db(0x00); db(0x19); db(0x7e); db(0x4e); db(0x90); db(0x4a); db(0x80); + db(0x67); db(0x0e); db(0x52); db(0x85); db(0x28); db(0xab); db(0x00); db(0x04); + db(0x27); db(0x4c); db(0x00); db(0x04); db(0x60); db(0x00); db(0xfe); db(0xc0); + db(0x28); db(0x43); db(0x61); db(0x04); db(0x60); db(0x00); db(0xfe); db(0xb8); + db(0x0c); db(0xac); db(0x00); db(0x00); db(0x00); db(0x1f); db(0x00); db(0x08); + db(0x66); db(0x04); db(0x61); db(0x00); db(0xfa); db(0x3a); db(0x0c); db(0xac); + db(0x00); db(0x00); db(0x04); db(0x09); db(0x00); db(0x08); db(0x66); db(0x14); + db(0x61); db(0x00); db(0xfa); db(0x92); db(0x66); db(0x0e); db(0x30); db(0x3c); + db(0xff); db(0x58); db(0x61); db(0x00); db(0x19); db(0x3c); db(0x70); db(0x00); + db(0x4e); db(0x90); db(0x60); db(0xec); db(0x22); db(0x54); db(0x20); db(0x6c); + db(0x00); db(0x04); db(0x29); db(0x4d); db(0x00); db(0x04); db(0x4e); db(0xee); + db(0xfe); db(0x92); db(0x2f); db(0x05); db(0x7a); db(0xfc); db(0x24); db(0x53); + db(0x2e); db(0x0a); db(0x22); db(0x0a); db(0x67); db(0x00); db(0x00); db(0x0c); + db(0x52); db(0x85); db(0x67); db(0x1e); db(0x22); db(0x4a); db(0x24); db(0x52); + db(0x60); db(0xf0); db(0x52); db(0x85); db(0x67); db(0x3c); db(0x24); db(0x47); + db(0x70); db(0x18); db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x52); db(0x46); db(0x24); db(0x40); db(0x24); db(0x87); db(0x2e); db(0x0a); + db(0x60); db(0xe8); db(0x20); db(0x12); db(0x67); db(0x24); db(0x20); db(0x40); + db(0x20); db(0x10); db(0x67); db(0x1e); db(0x20); db(0x40); db(0x20); db(0x10); + db(0x67); db(0x18); db(0x70); db(0x00); db(0x22); db(0x80); db(0x22); db(0x4a); + db(0x24); db(0x51); db(0x70); db(0x18); db(0x4e); db(0xae); db(0xff); db(0x2e); + db(0x06); db(0x86); db(0x00); db(0x01); db(0x00); db(0x00); db(0x20); db(0x0a); + db(0x66); db(0xec); db(0x26); db(0x87); db(0x2a); db(0x1f); db(0x4e); db(0x75); + db(0x20); db(0x88); db(0x58); db(0x90); db(0x42); db(0xa8); db(0x00); db(0x04); + db(0x21); db(0x48); db(0x00); db(0x08); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0x20); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0xff); + db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x91); db(0xc8); db(0x24); db(0x00); + db(0x6b); db(0x32); db(0x70); db(0x22); db(0x22); db(0x3c); db(0x00); db(0x01); + db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x91); db(0xc8); + db(0x24); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x1e); db(0x15); db(0x7c); + db(0x00); db(0x04); db(0x00); db(0x08); db(0x15); db(0x42); db(0x00); db(0x0f); + db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x25); db(0x40); + db(0x00); db(0x10); db(0x41); db(0xea); db(0x00); db(0x14); db(0x61); db(0x00); + db(0xff); db(0xb0); db(0x20); db(0x4a); db(0x20); db(0x08); db(0x4c); db(0xdf); + db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x20); db(0x22); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4a); db(0x80); db(0x67); db(0x24); + db(0x24); db(0x40); db(0x24); db(0x01); db(0x66); db(0x02); db(0x74); db(0x30); + db(0x20); db(0x02); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40); db(0x11); db(0x7c); + db(0x00); db(0x0a); db(0x00); db(0x08); db(0x31); db(0x42); db(0x00); db(0x12); + db(0x21); db(0x4a); db(0x00); db(0x0e); db(0x4a); db(0x80); db(0x4c); db(0xdf); + db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x30); db(0x22); + db(0x24); db(0x48); db(0x24); db(0x00); db(0x26); db(0x01); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x61); db(0x00); db(0xff); db(0x6a); db(0x22); db(0x03); + db(0x61); db(0x00); db(0xff); db(0xb2); db(0x67); db(0x18); db(0x20); db(0x4a); + db(0x22); db(0x40); db(0x24); db(0x40); db(0x20); db(0x02); db(0x72); db(0x00); + db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x22); db(0x00); db(0x70); db(0x00); + db(0x4a); db(0x81); db(0x66); db(0x02); db(0x20); db(0x0a); db(0x4a); db(0x80); + db(0x4c); db(0xdf); db(0x44); db(0x0c); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0x38); db(0x32); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x28); db(0x00); + db(0x24); db(0x08); db(0x26); db(0x09); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0x08); db(0x5c); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00); + db(0x00); db(0x34); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x01); + db(0x00); db(0x08); db(0x15); db(0x44); db(0x00); db(0x09); db(0x25); db(0x42); + db(0x00); db(0x0a); db(0x47); db(0xea); db(0x00); db(0x5c); db(0x25); db(0x4b); + db(0x00); db(0x3a); db(0x47); db(0xeb); db(0x08); db(0x00); db(0x25); db(0x4b); + db(0x00); db(0x3e); db(0x25); db(0x4b); db(0x00); db(0x36); db(0x22); db(0x4a); + db(0x24); db(0x43); db(0x97); db(0xcb); db(0x24); db(0x09); db(0x4e); db(0xae); + db(0xfe); db(0xe6); db(0x20); db(0x02); db(0x4c); db(0xdf); db(0x4c); db(0x1c); + db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x18); db(0x62); db(0x43); db(0xfa); + db(0x01); db(0x50); db(0x70); db(0x13); db(0x61); db(0x00); db(0xff); db(0x98); + db(0x4e); db(0x75); db(0x9e); db(0xfc); db(0x00); db(0x18); db(0x42); db(0x92); + db(0x42); db(0xaa); db(0x00); db(0x0e); db(0x42); db(0xaa); db(0x00); db(0x12); + db(0x20); db(0x4a); db(0x22); db(0x4f); db(0x70); db(0x05); db(0x22); db(0xd8); + db(0x51); db(0xc8); db(0xff); db(0xfc); db(0x0c); db(0x6e); db(0x00); db(0x24); + db(0x00); db(0x14); db(0x64); db(0x24); db(0x22); db(0x6d); db(0x02); db(0x0c); + db(0x33); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x13); db(0x7c); + db(0x00); db(0x01); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); + db(0x22); db(0x6d); db(0x02); db(0x0c); db(0x2f); db(0x69); db(0x00); db(0x20); + db(0x00); db(0x0e); db(0x2f); db(0x69); db(0x00); db(0x24); db(0x00); db(0x12); + db(0x22); db(0x6d); db(0x02); db(0x08); db(0x33); db(0x7c); db(0x00); db(0x0b); + db(0x00); db(0x1c); db(0x23); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x16); + db(0x00); db(0x24); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e); + db(0x23); db(0x4f); db(0x00); db(0x28); db(0x4e); db(0xae); db(0xfe); db(0x38); + db(0xde); db(0xfc); db(0x00); db(0x18); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0xf8); db(0xfe); db(0x2a); db(0x48); db(0x95); db(0xca); db(0x97); db(0xcb); + db(0x99); db(0xcc); db(0x78); db(0x00); db(0x2c); db(0x6d); db(0x00); db(0x18); + db(0x20); db(0x6d); db(0x00); db(0x14); db(0x20); db(0x28); db(0x00); db(0x3c); + db(0x67); db(0x5c); db(0x20); db(0x40); db(0x41); db(0xe8); db(0x00); db(0x2c); + db(0x28); db(0x48); db(0x4e); db(0xae); db(0xfc); db(0xe8); db(0x72); db(0xff); + db(0x74); db(0xff); db(0xb2); db(0x80); db(0x67); db(0x48); db(0x26); db(0x00); + db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x41); db(0xed); db(0x00); db(0xc0); + db(0x70); db(0x66); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xed); + db(0x00); db(0xc0); db(0x38); db(0x28); db(0x00); db(0x64); db(0x2c); db(0x6d); + db(0x00); db(0x18); db(0x91); db(0xc8); db(0x43); db(0xed); db(0x00); db(0x38); + db(0x70); db(0x00); db(0x30); db(0x3c); db(0x00); db(0x58); db(0x22); db(0x3c); + db(0x80); db(0x00); db(0x10); db(0x00); db(0x24); db(0x03); db(0x4e); db(0xae); + db(0xfd); db(0x0c); db(0x72); db(0xff); db(0x74); db(0xff); db(0x4a); db(0x80); + db(0x6b); db(0x0c); db(0x45); db(0xed); db(0x00); db(0x38); db(0x22); db(0x2a); + db(0x00); db(0x32); db(0x24); db(0x2a); db(0x00); db(0x36); db(0x20); db(0x2c); + db(0x00); db(0x1c); db(0xb8); db(0x6d); db(0x00); db(0x2c); db(0x66); db(0x12); + db(0xb0); db(0xad); db(0x00); db(0x28); db(0x66); db(0x0c); db(0xb2); db(0xad); + db(0x00); db(0x20); db(0x66); db(0x06); db(0xb4); db(0xad); db(0x00); db(0x24); + db(0x67); db(0x40); db(0x2b); db(0x40); db(0x00); db(0x28); db(0x2b); db(0x41); + db(0x00); db(0x20); db(0x2b); db(0x42); db(0x00); db(0x24); db(0x3b); db(0x44); + db(0x00); db(0x2c); db(0x91); db(0xc8); db(0x43); db(0xed); db(0x00); db(0x90); + db(0x70); db(0x00); db(0x30); db(0x3c); db(0x00); db(0x58); db(0x22); db(0x3c); + db(0x80); db(0x00); db(0x00); db(0x00); db(0x24); db(0x03); db(0x4e); db(0xae); + db(0xfd); db(0x0c); db(0x4a); db(0x80); db(0x6b); db(0x04); db(0x47); db(0xed); + db(0x00); db(0x90); db(0x34); db(0x2d); db(0x00); db(0x2c); db(0x30); db(0x3c); + db(0xff); db(0x38); db(0x72); db(0x01); db(0x61); db(0x00); db(0x16); db(0x52); + db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0x1f); db(0x4e); db(0x75); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x3e); db(0x2e); db(0x00); db(0x14); + db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x7c); db(0x00); + db(0x01); db(0xc6); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); + db(0x24); db(0x40); db(0x70); db(0x14); db(0x22); db(0x4a); db(0x4e); db(0xae); + db(0xfe); db(0xd4); db(0x70); db(0x00); db(0x30); db(0x3c); db(0x02); db(0x14); + db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); + db(0xff); db(0x3a); db(0x2a); db(0x40); db(0x30); db(0x3c); db(0x3e); db(0x00); + db(0x61); db(0x00); db(0x16); db(0x1e); db(0x2b); db(0x48); db(0x02); db(0x10); + db(0x28); db(0x48); db(0x47); db(0xed); db(0x00); db(0x16); db(0x27); db(0x4e); + db(0x00); db(0x10); db(0x27); db(0x4a); db(0x00); db(0x08); db(0x27); db(0x46); + db(0x00); db(0x0c); db(0x70); db(0xff); db(0x37); db(0x40); db(0x00); db(0x00); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x05); db(0x61); db(0x00); + db(0x15); db(0xe8); db(0x20); db(0x0c); db(0x4e); db(0x90); db(0x43); db(0xed); + db(0x00); db(0x00); db(0x13); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); + db(0x13); db(0x7c); db(0x00); db(0x05); db(0x00); db(0x09); db(0x41); db(0xfa); + db(0x16); db(0x96); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); + db(0x03); db(0x2e); db(0x23); db(0x48); db(0x00); db(0x12); db(0x23); db(0x4d); + db(0x00); db(0x0e); db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58); + db(0x20); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x70); db(0x00); + db(0x53); db(0xab); db(0x00); db(0x1c); db(0x6a); db(0x06); db(0x70); db(0x0a); + db(0x27); db(0x40); db(0x00); db(0x1c); db(0x4a); db(0xab); db(0x00); db(0x14); + db(0x66); db(0x22); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xe0); + db(0x43); db(0xfa); db(0x16); db(0xe6); db(0x70); db(0x00); db(0x4e); db(0xae); + db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x14); db(0x67); db(0xd0); + db(0x22); db(0x00); db(0x30); db(0x3c); db(0x3f); db(0xf4); db(0x61); db(0x00); + db(0x15); db(0x90); db(0x20); db(0x81); db(0x4a); db(0xab); db(0x00); db(0x18); + db(0x66); db(0x24); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xb8); + db(0x43); db(0xfa); db(0x16); db(0xd0); db(0x70); db(0x00); db(0x4e); db(0xae); + db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); + db(0xff); db(0xa8); db(0x22); db(0x00); db(0x30); db(0x3c); db(0x3f); db(0xf8); + db(0x61); db(0x00); db(0x15); db(0x66); db(0x20); db(0x81); db(0x4a); db(0xad); + db(0x02); db(0x08); db(0x66); db(0x3a); db(0x4a); db(0xab); db(0x00); db(0x1c); + db(0x66); db(0x8e); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); + db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x15); db(0x5e); db(0x4e); db(0xae); + db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); + db(0x4a); db(0x82); db(0x67); db(0x00); db(0xff); db(0x74); db(0x41); db(0xfa); + db(0x15); db(0x4a); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); + db(0xfc); db(0xec); db(0x2b); db(0x40); db(0x02); db(0x08); db(0x67); db(0x00); + db(0x02); db(0x52); db(0x60); db(0x00); db(0xff); db(0x5c); db(0x4a); db(0xad); + db(0x02); db(0x0c); db(0x66); db(0x48); db(0x4a); db(0xab); db(0x00); db(0x1c); + db(0x66); db(0x00); db(0xff); db(0x4e); db(0x4e); db(0xae); db(0xff); db(0x7c); + db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x15); db(0x29); + db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); + db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x00); db(0xff); db(0x32); + db(0x41); db(0xfa); db(0x15); db(0x15); db(0x70); db(0x00); db(0x72); db(0x00); + db(0x61); db(0x00); db(0xfc); db(0xaa); db(0x2b); db(0x40); db(0x02); db(0x0c); + db(0x67); db(0x00); db(0x02); db(0x10); db(0x30); db(0x3c); db(0xff); db(0x38); + db(0x72); db(0x00); db(0x61); db(0x00); db(0x14); db(0xcc); db(0x4e); db(0x90); + db(0x60); db(0x00); db(0xff); db(0x0e); db(0x0c); db(0x47); db(0x00); db(0x24); + db(0x65); db(0x18); db(0x0c); db(0x47); db(0x00); db(0x32); db(0x64); db(0x12); + db(0x53); db(0xab); db(0x00); db(0x34); db(0x6a); db(0x0c); db(0x20); db(0x4b); + db(0x61); db(0x00); db(0xfd); db(0x8c); db(0x70); db(0x32); db(0x27); db(0x40); + db(0x00); db(0x34); db(0x45); db(0xed); db(0x01); db(0x3c); db(0x10); db(0x2c); + db(0x00); db(0x00); db(0x0c); db(0x47); db(0x00); db(0x27); db(0x65); db(0x00); + db(0x01); db(0x0a); db(0x08); db(0x00); db(0x00); db(0x01); db(0x67); db(0x00); + db(0x01); db(0x02); db(0x41); db(0xed); db(0x01); db(0x68); db(0x25); db(0x48); + db(0x00); db(0x0a); db(0x15); db(0x7c); db(0x00); db(0x13); db(0x00); db(0x04); + db(0x15); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x05); db(0x42); db(0x90); + db(0x42); db(0xa8); db(0x00); db(0x04); db(0x42); db(0xa8); db(0x00); db(0x08); + db(0x42); db(0x68); db(0x00); db(0x0c); db(0x42); db(0x6a); db(0x00); db(0x06); + db(0x61); db(0x00); db(0x01); db(0xa2); db(0x31); db(0x6c); db(0x00); db(0x0a); + db(0x00); db(0x0e); db(0x42); db(0x68); db(0x00); db(0x10); db(0x31); db(0x6c); + db(0x00); db(0x0c); db(0x00); db(0x12); db(0x42); db(0x68); db(0x00); db(0x14); + db(0x31); db(0x6c); db(0x00); db(0x04); db(0x00); db(0x16); db(0x42); db(0x68); + db(0x00); db(0x18); db(0x31); db(0x6c); db(0x00); db(0x06); db(0x00); db(0x1a); + db(0x43); db(0xed); db(0x01); db(0x88); db(0x21); db(0x49); db(0x00); db(0x1c); + db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x06); db(0x30); db(0x2c); + db(0x00); db(0x20); db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); + db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x07); db(0x22); db(0xec); + db(0x00); db(0x22); db(0x70); db(0x00); db(0x30); db(0x2c); db(0x00); db(0x10); + db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x09); + db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x12); db(0x6b); db(0x08); + db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x0a); db(0x22); db(0xc0); + db(0x30); db(0x2c); db(0x00); db(0x08); db(0x6b); db(0x14); db(0x22); db(0xfc); + db(0x80); db(0x03); db(0xa0); db(0x02); db(0x22); db(0xc0); db(0x30); db(0x2c); + db(0x00); db(0x0e); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x01); + db(0x22); db(0xc0); db(0x30); db(0x2c); db(0x00); db(0x14); db(0x6b); db(0x10); + db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x03); db(0x30); db(0x2c); + db(0x00); db(0x1a); db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); + db(0x30); db(0x2c); db(0x00); db(0x16); db(0x6b); db(0x10); db(0x22); db(0xfc); + db(0x80); db(0x03); db(0xa0); db(0x04); db(0x30); db(0x2c); db(0x00); db(0x1c); + db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x30); db(0x2c); + db(0x00); db(0x18); db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03); + db(0xa0); db(0x05); db(0x30); db(0x2c); db(0x00); db(0x1e); db(0x48); db(0xc0); + db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x70); db(0x00); db(0x30); db(0x2c); + db(0x00); db(0x26); db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03); + db(0xa0); db(0x08); db(0x22); db(0xc0); db(0x42); db(0x91); db(0x61); db(0x00); + db(0xfc); db(0x02); db(0x10); db(0x2c); db(0x00); db(0x00); db(0x08); db(0x00); + db(0x00); db(0x01); db(0x66); db(0x08); db(0x08); db(0x00); db(0x00); db(0x00); + db(0x67); db(0x00); db(0xfd); db(0xc6); db(0x20); db(0x6b); db(0x00); db(0x14); + db(0x30); db(0x2c); db(0x00); db(0x28); db(0x32); db(0x28); db(0x00); db(0x30); db(0xd2); db(0x41); db(0x90); db(0x41); db(0x6a); db(0x02); db(0x70); db(0x00); - db(0x35); db(0x40); db(0x00); db(0x0c); db(0x08); db(0x2c); db(0x00); db(0x01); - db(0x00); db(0x00); db(0x67); db(0x42); db(0x36); db(0x3c); db(0x00); db(0x68); - db(0x74); db(0x01); db(0x28); db(0x2c); db(0x00); db(0x22); db(0x20); db(0x04); - db(0xc0); db(0x82); db(0x22); db(0x2b); db(0x00); db(0x04); db(0xc2); db(0x82); - db(0xb2); db(0x80); db(0x67); db(0x1c); db(0x35); db(0x7c); db(0x02); db(0x00); - db(0x00); db(0x04); db(0x32); db(0x03); db(0x4a); db(0x00); db(0x66); db(0x04); - db(0x08); db(0xc1); db(0x00); db(0x07); db(0x35); db(0x41); db(0x00); db(0x06); - db(0x61); db(0x00); db(0x00); db(0x56); db(0x61); db(0x00); db(0xfb); db(0x88); - db(0x52); db(0x43); db(0xd4); db(0x42); db(0x0c); db(0x42); db(0x00); db(0x08); - db(0x66); db(0xcc); db(0x27); db(0x44); db(0x00); db(0x04); db(0x08); db(0x2c); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x67); db(0x00); db(0xfd); db(0x46); - db(0x35); db(0x7c); db(0x04); db(0x00); db(0x00); db(0x04); db(0x42); db(0x6a); - db(0x00); db(0x06); db(0x61); db(0x00); db(0x00); db(0x2c); db(0x0c); db(0x6e); - db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x18); db(0x2f); db(0x0e); - db(0x2c); db(0x6d); db(0x02); db(0x08); db(0x2c); db(0x6e); db(0x00); db(0x14); - db(0x4e); db(0xae); db(0xff); db(0xd6); db(0x2c); db(0x5f); db(0x02); db(0x40); - db(0x7f); db(0xff); db(0x81); db(0x6a); db(0x00); db(0x08); db(0x61); db(0x00); - db(0xfb); db(0x3e); db(0x60); db(0x00); db(0xfd); db(0x10); db(0x4e); db(0x75); - db(0x22); db(0x2c); db(0x00); db(0x22); db(0x70); db(0x00); db(0x08); db(0x01); - db(0x00); db(0x00); db(0x67); db(0x04); db(0x08); db(0xc0); db(0x00); db(0x0e); - db(0x08); db(0x01); db(0x00); db(0x01); db(0x67); db(0x04); db(0x08); db(0xc0); - db(0x00); db(0x0d); db(0x08); db(0x01); db(0x00); db(0x02); db(0x67); db(0x04); - db(0x08); db(0xc0); db(0x00); db(0x0c); db(0x35); db(0x40); db(0x00); db(0x08); - db(0x4e); db(0x75); db(0x4a); db(0xa9); db(0x02); db(0x08); db(0x67); db(0x18); - db(0x4a); db(0xa9); db(0x02); db(0x0c); db(0x67); db(0x12); db(0x20); db(0x69); - db(0x02); db(0x10); db(0x30); db(0x28); db(0x00); db(0x02); db(0xb0); db(0x69); - db(0x00); db(0x16); db(0x67); db(0x18); db(0x33); db(0x40); db(0x00); db(0x16); - db(0x2f); db(0x09); db(0x2c); db(0x69); db(0x00); db(0x26); db(0x20); db(0x29); - db(0x00); db(0x22); db(0x22); db(0x69); db(0x00); db(0x1e); db(0x4e); db(0xae); - db(0xfe); db(0xbc); db(0x22); db(0x5f); db(0x53); db(0x69); db(0x00); db(0x46); - db(0x6a); db(0x10); db(0x33); db(0x7c); db(0x00); db(0x32); db(0x00); db(0x46); - db(0x30); db(0x3c); db(0xff); db(0xff); db(0x61); db(0x00); db(0x11); db(0x4a); - db(0x50); db(0xd0); db(0x41); db(0xf9); db(0x00); db(0xdf); db(0xf0); db(0x00); - db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x00); db(0x06); - db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x11); db(0x61); db(0x00); - db(0x11); db(0x20); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x00); - db(0x67); db(0x42); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); - db(0x00); db(0x00); db(0x00); db(0x88); db(0x22); db(0x3c); db(0x00); db(0x01); - db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); - db(0x67); db(0x00); db(0x00); db(0x40); db(0x2a); db(0x40); db(0x2b); db(0x4e); - db(0x00); db(0x14); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0e); - db(0x61); db(0x00); db(0x10); db(0xee); db(0x20); db(0x0d); db(0x4e); db(0x90); - db(0x41); db(0xfa); db(0x11); db(0x96); db(0x43); db(0xfa); db(0x01); db(0x12); - db(0x70); db(0xf6); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x27); db(0x10); - db(0x61); db(0x00); db(0xea); db(0xaa); db(0x70); db(0x00); db(0x4c); db(0xdf); - db(0x60); db(0x00); db(0x4e); db(0x75); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x0a); db(0x61); db(0x00); db(0x10); db(0xc4); db(0x4e); db(0x90); - db(0x4e); db(0x75); db(0x61); db(0xf0); db(0x20); db(0x0d); db(0x67); db(0x1c); - db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x20); db(0x2d); db(0x00); db(0x18); - db(0x67); db(0x06); db(0x22); db(0x40); db(0x4e); db(0xae); db(0xfe); db(0x62); - db(0x22); db(0x4d); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); - db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x70); db(0x00); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x38); db(0x3e); db(0x2c); db(0x6d); db(0x00); db(0x18); - db(0x41); db(0xfa); db(0x11); db(0x24); db(0x22); db(0x08); db(0x24); db(0x3c); - db(0x00); db(0x00); db(0x03); db(0xed); db(0x4e); db(0xae); db(0xff); db(0xe2); - db(0x28); db(0x00); db(0x67); db(0x4c); db(0x45); db(0xed); db(0x00); db(0x68); - db(0x42); db(0x92); db(0x34); db(0xaa); db(0x00); db(0x02); db(0x24); db(0x0a); - db(0x54); db(0x82); db(0x76); db(0x02); db(0x22); db(0x04); db(0x4e); db(0xae); - db(0xff); db(0xd6); db(0xb6); db(0x80); db(0x66); db(0x32); db(0x0c); db(0x92); - db(0x50); db(0x4e); db(0x54); db(0x52); db(0x66); db(0xe4); db(0x24); db(0x0a); - db(0x76); db(0x04); db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); - db(0x24); db(0x0a); db(0x76); db(0x20); db(0x22); db(0x04); db(0x4e); db(0xae); - db(0xff); db(0xd6); db(0xb6); db(0x80); db(0x66); db(0x12); db(0x4a); db(0x6a); - db(0x00); db(0x10); db(0x66); db(0xc4); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x10); db(0x61); db(0x00); db(0x10); db(0x34); db(0x4e); db(0x90); - db(0x22); db(0x04); db(0x67); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xdc); - db(0x4c); db(0xdf); db(0x7c); db(0x1c); db(0x4e); db(0x75); db(0x2c); db(0x6d); - db(0x00); db(0x18); db(0x41); db(0xfa); db(0x10); db(0x97); db(0x22); db(0x08); - db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac); db(0x22); db(0x00); - db(0x67); db(0x34); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); - db(0x00); db(0x14); db(0x45); db(0xed); db(0x00); db(0x38); db(0x70); db(0xff); - db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x15); db(0x40); db(0x00); db(0x14); - db(0x41); db(0xfa); db(0x10); db(0x8c); db(0x24); db(0x88); db(0x25); db(0x7c); - db(0x00); db(0x00); db(0x00); db(0x12); db(0x00); db(0x0c); db(0x25); db(0x6d); - db(0x00); db(0x08); db(0x00); db(0x10); db(0x2c); db(0x6d); db(0x00); db(0x18); - db(0x22); db(0x0a); db(0x4e); db(0xae); db(0xfc); db(0x88); db(0x2c); db(0x6d); - db(0x00); db(0x14); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x10); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x0d); db(0x61); db(0x00); db(0x0f); db(0xc4); db(0x4e); db(0x90); - db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xfe); db(0x2a); db(0x40); - db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x93); db(0xc9); db(0x4e); db(0xae); - db(0xfe); db(0xda); db(0x2b); db(0x40); db(0x00); db(0x08); db(0x43); db(0xfa); - db(0x10); db(0xec); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); - db(0x2b); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); db(0xfe); db(0xdc); - db(0x2c); db(0x40); db(0x72); db(0x32); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x41); db(0xfa); db(0x0f); db(0xed); db(0x22); db(0x08); db(0x74); db(0xfe); - db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0xea); - db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x72); db(0x32); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x0f); db(0xd7); + db(0x35); db(0x40); db(0x00); db(0x0a); db(0x30); db(0x2c); db(0x00); db(0x2a); + db(0x32); db(0x28); db(0x00); db(0x2e); db(0xd2); db(0x41); db(0x90); db(0x41); + db(0x6a); db(0x02); db(0x70); db(0x00); db(0x35); db(0x40); db(0x00); db(0x0c); + db(0x08); db(0x2c); db(0x00); db(0x01); db(0x00); db(0x00); db(0x67); db(0x42); + db(0x36); db(0x3c); db(0x00); db(0x68); db(0x74); db(0x01); db(0x28); db(0x2c); + db(0x00); db(0x22); db(0x20); db(0x04); db(0xc0); db(0x82); db(0x22); db(0x2b); + db(0x00); db(0x04); db(0xc2); db(0x82); db(0xb2); db(0x80); db(0x67); db(0x1c); + db(0x35); db(0x7c); db(0x02); db(0x00); db(0x00); db(0x04); db(0x32); db(0x03); + db(0x4a); db(0x00); db(0x66); db(0x04); db(0x08); db(0xc1); db(0x00); db(0x07); + db(0x35); db(0x41); db(0x00); db(0x06); db(0x61); db(0x00); db(0x00); db(0x56); + db(0x61); db(0x00); db(0xfb); db(0x88); db(0x52); db(0x43); db(0xd4); db(0x42); + db(0x0c); db(0x42); db(0x00); db(0x08); db(0x66); db(0xcc); db(0x27); db(0x44); + db(0x00); db(0x04); db(0x08); db(0x2c); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x67); db(0x00); db(0xfd); db(0x46); db(0x35); db(0x7c); db(0x04); db(0x00); + db(0x00); db(0x04); db(0x42); db(0x6a); db(0x00); db(0x06); db(0x61); db(0x00); + db(0x00); db(0x2c); db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); + db(0x65); db(0x18); db(0x2f); db(0x0e); db(0x2c); db(0x6d); db(0x02); db(0x08); + db(0x2c); db(0x6e); db(0x00); db(0x14); db(0x4e); db(0xae); db(0xff); db(0xd6); + db(0x2c); db(0x5f); db(0x02); db(0x40); db(0x7f); db(0xff); db(0x81); db(0x6a); + db(0x00); db(0x08); db(0x61); db(0x00); db(0xfb); db(0x3e); db(0x60); db(0x00); + db(0xfd); db(0x10); db(0x4e); db(0x75); db(0x22); db(0x2c); db(0x00); db(0x22); + db(0x70); db(0x00); db(0x08); db(0x01); db(0x00); db(0x00); db(0x67); db(0x04); + db(0x08); db(0xc0); db(0x00); db(0x0e); db(0x08); db(0x01); db(0x00); db(0x01); + db(0x67); db(0x04); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x08); db(0x01); + db(0x00); db(0x02); db(0x67); db(0x04); db(0x08); db(0xc0); db(0x00); db(0x0c); + db(0x35); db(0x40); db(0x00); db(0x08); db(0x4e); db(0x75); db(0x4a); db(0xa9); + db(0x02); db(0x08); db(0x67); db(0x18); db(0x4a); db(0xa9); db(0x02); db(0x0c); + db(0x67); db(0x12); db(0x20); db(0x69); db(0x02); db(0x10); db(0x30); db(0x28); + db(0x00); db(0x02); db(0xb0); db(0x69); db(0x00); db(0x16); db(0x67); db(0x18); + db(0x33); db(0x40); db(0x00); db(0x16); db(0x2f); db(0x09); db(0x2c); db(0x69); + db(0x00); db(0x26); db(0x20); db(0x29); db(0x00); db(0x22); db(0x22); db(0x69); + db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x22); db(0x5f); + db(0x53); db(0x69); db(0x00); db(0x46); db(0x6a); db(0x10); db(0x33); db(0x7c); + db(0x00); db(0x32); db(0x00); db(0x46); db(0x30); db(0x3c); db(0xff); db(0xff); + db(0x61); db(0x00); db(0x12); db(0x66); db(0x50); db(0xd0); db(0x41); db(0xf9); + db(0x00); db(0xdf); db(0xf0); db(0x00); db(0x70); db(0x00); db(0x4e); db(0x75); + db(0x48); db(0xe7); db(0x00); db(0x06); db(0x30); db(0x3c); db(0xff); db(0x38); + db(0x72); db(0x11); db(0x61); db(0x00); db(0x12); db(0x3c); db(0x4e); db(0x90); + db(0x08); db(0x00); db(0x00); db(0x00); db(0x67); db(0x42); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); + db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); + db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x40); + db(0x2a); db(0x40); db(0x2b); db(0x4e); db(0x00); db(0x14); db(0x30); db(0x3c); + db(0xff); db(0x38); db(0x72); db(0x0e); db(0x61); db(0x00); db(0x12); db(0x0a); + db(0x20); db(0x0d); db(0x4e); db(0x90); db(0x41); db(0xfa); db(0x12); db(0xb2); + db(0x43); db(0xfa); db(0x01); db(0x12); db(0x70); db(0xf6); db(0x22); db(0x3c); + db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00); db(0xea); db(0xaa); + db(0x70); db(0x00); db(0x4c); db(0xdf); db(0x60); db(0x00); db(0x4e); db(0x75); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0a); db(0x61); db(0x00); + db(0x11); db(0xe0); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x61); db(0xf0); + db(0x20); db(0x0d); db(0x67); db(0x1c); db(0x2c); db(0x6d); db(0x00); db(0x14); + db(0x20); db(0x2d); db(0x00); db(0x18); db(0x67); db(0x06); db(0x22); db(0x40); + db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4d); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x00); db(0x88); db(0x4e); db(0xae); db(0xff); db(0x2e); + db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e); + db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa); db(0x12); db(0x40); + db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed); + db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x28); db(0x00); db(0x67); db(0x4c); + db(0x45); db(0xed); db(0x00); db(0x68); db(0x42); db(0x92); db(0x34); db(0xaa); + db(0x00); db(0x02); db(0x24); db(0x0a); db(0x54); db(0x82); db(0x76); db(0x02); + db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80); + db(0x66); db(0x32); db(0x0c); db(0x92); db(0x50); db(0x4e); db(0x54); db(0x52); + db(0x66); db(0xe4); db(0x24); db(0x0a); db(0x76); db(0x04); db(0x22); db(0x04); + db(0x4e); db(0xae); db(0xff); db(0xd6); db(0x24); db(0x0a); db(0x76); db(0x20); + db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80); + db(0x66); db(0x12); db(0x4a); db(0x6a); db(0x00); db(0x10); db(0x66); db(0xc4); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x10); db(0x61); db(0x00); + db(0x11); db(0x50); db(0x4e); db(0x90); db(0x22); db(0x04); db(0x67); db(0x04); + db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x4c); db(0xdf); db(0x7c); db(0x1c); + db(0x4e); db(0x75); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa); + db(0x11); db(0xb3); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); + db(0xff); db(0xac); db(0x22); db(0x00); db(0x67); db(0x34); db(0x4e); db(0xae); + db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x45); db(0xed); + db(0x00); db(0x38); db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); + db(0x15); db(0x40); db(0x00); db(0x14); db(0x41); db(0xfa); db(0x11); db(0xa8); + db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x12); + db(0x00); db(0x0c); db(0x25); db(0x6d); db(0x00); db(0x08); db(0x00); db(0x10); + db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x22); db(0x0a); db(0x4e); db(0xae); + db(0xfc); db(0x88); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x4e); db(0x75); + db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0d); db(0x61); db(0x00); + db(0x10); db(0xe0); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00); + db(0xfe); db(0xfe); db(0x2a); db(0x40); db(0x2c); db(0x6d); db(0x00); db(0x14); + db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x2b); db(0x40); + db(0x00); db(0x08); db(0x43); db(0xfa); db(0x12); db(0x08); db(0x70); db(0x00); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2b); db(0x40); db(0x00); db(0x18); + db(0x67); db(0x00); db(0xfe); db(0xdc); db(0x2c); db(0x40); db(0x72); db(0x32); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x11); db(0x09); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac); - db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xa6); db(0x22); db(0x00); - db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14); - db(0x61); db(0x00); db(0xf7); db(0xb8); db(0x72); db(0x00); db(0x32); db(0x3c); - db(0x00); db(0x34); db(0x61); db(0x00); db(0xf7); db(0xfc); db(0x28); db(0x40); - db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0x86); db(0x70); db(0x00); - db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); - db(0x72); db(0x00); db(0x20); db(0x2d); db(0x00); db(0x0c); db(0x41); db(0xfa); - db(0x0f); db(0xb5); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x44); - db(0x4a); db(0x80); db(0x66); db(0xe2); db(0x20); db(0x6c); db(0x00); db(0x14); - db(0x0c); db(0x68); db(0x00); db(0x25); db(0x00); db(0x14); db(0x64); db(0x0c); - db(0x61); db(0x00); db(0xfe); db(0x4a); db(0x70); db(0x00); db(0x4e); db(0xae); - db(0xfe); db(0xc2); db(0x60); db(0xf8); db(0x61); db(0x00); db(0xfe); db(0xe8); - db(0x41); db(0xed); db(0x00); db(0x1c); db(0x29); db(0x48); db(0x00); db(0x28); - db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x24); db(0x39); db(0x7c); - db(0x00); db(0x0c); db(0x00); db(0x1c); db(0x2b); db(0x4d); db(0x00); db(0x2c); - db(0x41); db(0xfa); db(0x01); db(0x60); db(0x2b); db(0x48); db(0x00); db(0x24); - db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x0f); db(0x61); db(0x00); db(0x0e); db(0xda); - db(0x4e); db(0x90); db(0x4a); db(0xad); db(0x00); db(0x00); db(0x66); db(0x1c); - db(0x70); db(0x00); db(0x74); db(0x00); db(0x14); db(0x2d); db(0x00); db(0x4c); - db(0x05); db(0xc0); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); - db(0xfe); db(0xc2); db(0x05); db(0x00); db(0x67); db(0x06); db(0x61); db(0x00); - db(0xfe); db(0x20); db(0x60); db(0xe4); db(0x20); db(0x2d); db(0x00); db(0x00); - db(0x67); db(0x00); db(0x00); db(0x76); db(0x72); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x2b); db(0x40); db(0x00); db(0x04); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x0c); db(0x61); db(0x00); db(0x0e); db(0x9a); - db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x40); db(0x4a); db(0xad); - db(0x00); db(0x04); db(0x67); db(0x3a); db(0x39); db(0x7c); db(0x00); db(0x03); - db(0x00); db(0x1c); db(0x42); db(0x2c); db(0x00); db(0x1f); db(0x42); db(0xac); - db(0x00); db(0x20); db(0x29); db(0x6d); db(0x00); db(0x00); db(0x00); db(0x24); - db(0x29); db(0x6d); db(0x00); db(0x04); db(0x00); db(0x28); db(0x42); db(0xac); - db(0x00); db(0x2c); db(0x42); db(0xac); db(0x00); db(0x30); db(0x22); db(0x4c); - db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x2b); db(0x6c); db(0x00); db(0x30); - db(0x00); db(0x10); db(0x39); db(0x7c); db(0x00); db(0x04); db(0x00); db(0x1c); - db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x20); db(0x2d); - db(0x00); db(0x00); db(0x42); db(0xad); db(0x00); db(0x00); db(0x22); db(0x2d); - db(0x00); db(0x04); db(0x67); db(0x00); db(0xff); db(0x74); db(0x22); db(0x41); - db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x60); db(0x00); db(0xff); db(0x6a); - db(0x39); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x1c); db(0x41); db(0xed); - db(0x00); db(0x30); db(0x42); db(0x90); db(0x42); db(0xa8); db(0x00); db(0x04); - db(0x42); db(0x2c); db(0x00); db(0x1f); db(0x42); db(0xac); db(0x00); db(0x2c); - db(0x42); db(0xac); db(0x00); db(0x30); db(0x29); db(0x48); db(0x00); db(0x28); - db(0x70); db(0x08); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c); - db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x0c); db(0xad); db(0x46); db(0x4f); - db(0x52); db(0x4d); db(0x00); db(0x30); db(0x66); db(0x52); db(0x20); db(0x2d); - db(0x00); db(0x34); db(0x67); db(0x4c); db(0x6b); db(0x4a); db(0x2b); db(0x6c); - db(0x00); db(0x30); db(0x00); db(0x10); db(0x50); db(0x80); db(0x24); db(0x00); - db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); - db(0x67); db(0x36); db(0x24); db(0x40); db(0x20); db(0x4a); db(0x20); db(0xed); - db(0x00); db(0x30); db(0x20); db(0xed); db(0x00); db(0x34); db(0x29); db(0x48); - db(0x00); db(0x28); db(0x20); db(0x02); db(0x51); db(0x80); db(0x29); db(0x40); + db(0x4a); db(0x80); db(0x67); db(0xea); db(0x22); db(0x00); db(0x4e); db(0xae); + db(0xff); db(0xa6); db(0x72); db(0x32); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x41); db(0xfa); db(0x10); db(0xf3); db(0x22); db(0x08); db(0x74); db(0xfe); + db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0x00); + db(0xfe); db(0xa6); db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6); + db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x61); db(0x00); db(0xf7); db(0xb8); + db(0x72); db(0x00); db(0x32); db(0x3c); db(0x00); db(0x34); db(0x61); db(0x00); + db(0xf7); db(0xfc); db(0x28); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x00); + db(0xfe); db(0x86); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); + db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x72); db(0x00); db(0x20); db(0x2d); + db(0x00); db(0x0c); db(0x41); db(0xfa); db(0x10); db(0xd1); db(0x22); db(0x4c); + db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x4a); db(0x80); db(0x66); db(0xe2); + db(0x20); db(0x6c); db(0x00); db(0x14); db(0x0c); db(0x68); db(0x00); db(0x25); + db(0x00); db(0x14); db(0x64); db(0x0c); db(0x61); db(0x00); db(0xfe); db(0x4a); + db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x60); db(0xf8); + db(0x61); db(0x00); db(0xfe); db(0xe8); db(0x41); db(0xed); db(0x00); db(0x1c); + db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x01); db(0x29); db(0x40); + db(0x00); db(0x24); db(0x39); db(0x7c); db(0x00); db(0x0c); db(0x00); db(0x1c); + db(0x2b); db(0x4d); db(0x00); db(0x2c); db(0x41); db(0xfa); db(0x01); db(0x60); + db(0x2b); db(0x48); db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae); + db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0f); + db(0x61); db(0x00); db(0x0f); db(0xf6); db(0x4e); db(0x90); db(0x4a); db(0xad); + db(0x00); db(0x00); db(0x66); db(0x1c); db(0x70); db(0x00); db(0x74); db(0x00); + db(0x14); db(0x2d); db(0x00); db(0x4c); db(0x05); db(0xc0); db(0x08); db(0xc0); + db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x05); db(0x00); + db(0x67); db(0x06); db(0x61); db(0x00); db(0xfe); db(0x20); db(0x60); db(0xe4); + db(0x20); db(0x2d); db(0x00); db(0x00); db(0x67); db(0x00); db(0x00); db(0x76); + db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2b); db(0x40); + db(0x00); db(0x04); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0c); + db(0x61); db(0x00); db(0x0f); db(0xb6); db(0x4e); db(0x90); db(0x4a); db(0x80); + db(0x67); db(0x40); db(0x4a); db(0xad); db(0x00); db(0x04); db(0x67); db(0x3a); + db(0x39); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x1c); db(0x42); db(0x2c); + db(0x00); db(0x1f); db(0x42); db(0xac); db(0x00); db(0x20); db(0x29); db(0x6d); + db(0x00); db(0x00); db(0x00); db(0x24); db(0x29); db(0x6d); db(0x00); db(0x04); + db(0x00); db(0x28); db(0x42); db(0xac); db(0x00); db(0x2c); db(0x42); db(0xac); + db(0x00); db(0x30); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); + db(0x2b); db(0x6c); db(0x00); db(0x30); db(0x00); db(0x10); db(0x39); db(0x7c); + db(0x00); db(0x04); db(0x00); db(0x1c); db(0x22); db(0x4c); db(0x4e); db(0xae); + db(0xfe); db(0x38); db(0x20); db(0x2d); db(0x00); db(0x00); db(0x42); db(0xad); + db(0x00); db(0x00); db(0x22); db(0x2d); db(0x00); db(0x04); db(0x67); db(0x00); + db(0xff); db(0x74); db(0x22); db(0x41); db(0x4e); db(0xae); db(0xff); db(0x2e); + db(0x60); db(0x00); db(0xff); db(0x6a); db(0x39); db(0x7c); db(0x00); db(0x02); + db(0x00); db(0x1c); db(0x41); db(0xed); db(0x00); db(0x30); db(0x42); db(0x90); + db(0x42); db(0xa8); db(0x00); db(0x04); db(0x42); db(0x2c); db(0x00); db(0x1f); + db(0x42); db(0xac); db(0x00); db(0x2c); db(0x42); db(0xac); db(0x00); db(0x30); + db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x08); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); - db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0b); db(0x61); db(0x00); - db(0x0d); db(0xc0); db(0x20); db(0x2c); db(0x00); db(0x20); db(0x4e); db(0x90); - db(0x22); db(0x4a); db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e); - db(0x4a); db(0xac); db(0x00); db(0x20); db(0x67); db(0x00); db(0xfe); db(0xda); - db(0x41); db(0xed); db(0x00); db(0x30); db(0x29); db(0x48); db(0x00); db(0x28); - db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x24); db(0x42); db(0xac); - db(0x00); db(0x20); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); - db(0x60); db(0xde); db(0x41); db(0xe8); db(0xff); db(0xe4); db(0x20); db(0x29); - db(0x00); db(0x08); db(0xb0); db(0xa8); db(0x00); db(0x10); db(0x67); db(0x1a); - db(0x21); db(0x40); db(0x00); db(0x10); db(0x2f); db(0x0e); db(0x2c); db(0x68); - db(0x00); db(0x14); db(0x22); db(0x68); db(0x00); db(0x08); db(0x70); db(0x00); - db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xbc); - db(0x2c); db(0x5f); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x11); db(0x61); db(0x00); db(0x0d); db(0x54); db(0x4e); db(0x90); - db(0x08); db(0x00); db(0x00); db(0x01); db(0x67); db(0x38); db(0x74); db(0x00); - db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); - db(0x43); db(0xfa); db(0x0d); db(0x7a); db(0x4e); db(0xae); db(0xfe); db(0xec); - db(0x4a); db(0x80); db(0x67); db(0x1e); db(0x20); db(0x40); db(0x43); db(0xfa); - db(0x00); db(0x22); db(0x24); db(0x68); db(0xff); db(0xe4); db(0x21); db(0x49); - db(0xff); db(0xe4); db(0x22); db(0x48); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x65); db(0x61); db(0x00); db(0x0d); db(0x1c); db(0x4e); db(0x90); - db(0x74); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x20); db(0x02); - db(0x4e); db(0x75); db(0x59); db(0x8f); db(0x48); db(0xe7); db(0xc0); db(0x80); - db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x66); db(0x61); db(0x00); - db(0x0d); db(0x00); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x01); db(0x03); - db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x41); db(0xfa); - db(0x0e); db(0x27); db(0x43); db(0xfa); db(0x00); db(0x14); db(0x70); db(0x0f); - db(0x22); db(0x3c); db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); - db(0xe6); db(0xb4); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x10); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x70); db(0x00); db(0x43); db(0xfa); db(0x0e); db(0x10); db(0x4e); db(0xae); - db(0xfd); db(0xd8); db(0x2c); db(0x40); db(0x72); db(0x02); db(0x30); db(0x3c); - db(0xff); db(0x78); db(0x61); db(0x00); db(0x0c); db(0xbc); db(0x24); db(0x48); - db(0x72); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x81); db(0x67); db(0x0c); - db(0x26); db(0x41); db(0x4e); db(0xae); db(0xfe); db(0x08); db(0x72); db(0x02); - db(0x20); db(0x4b); db(0x4e); db(0x92); db(0x22); db(0x4e); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x4e); db(0x75); - db(0x4e); db(0x75); db(0xbc); db(0xfc); db(0x00); db(0x00); db(0x67); db(0x06); - db(0x4e); db(0xae); db(0xff); db(0x70); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0x3f); db(0x3e); db(0x24); db(0x48); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x22); db(0x3c); - db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x26); db(0x40); db(0x49); db(0xeb); db(0x00); db(0x2c); db(0x4b); db(0xec); - db(0x00); db(0x10); db(0x4d); db(0xed); db(0x00); db(0x44); db(0x22); db(0x4d); - db(0x41); db(0xea); db(0x00); db(0x10); db(0x70); db(0x10); db(0x22); db(0xd8); - db(0x51); db(0xc8); db(0xff); db(0xfc); db(0x20); db(0x4e); db(0x22); db(0x52); - db(0x52); db(0x88); db(0x10); db(0xd9); db(0x66); db(0xfc); db(0x20); db(0x08); - db(0x56); db(0x80); db(0x02); db(0x00); db(0x00); db(0xfc); db(0x2c); db(0x00); - db(0x20); db(0x08); db(0x55); db(0x80); db(0x90); db(0x8e); db(0x1c); db(0x80); - db(0x20); db(0x46); db(0x22); db(0x6a); db(0x00); db(0x04); db(0x52); db(0x88); - db(0x10); db(0xd9); db(0x66); db(0xfc); db(0x20); db(0x08); db(0x55); db(0x80); - db(0x90); db(0x86); db(0x20); db(0x46); db(0x10); db(0x80); db(0x28); db(0xaa); - db(0x00); db(0x08); db(0x20); db(0x06); db(0xe4); db(0x88); db(0x29); db(0x40); - db(0x00); db(0x04); db(0x41); db(0xea); db(0x00); db(0x10); db(0x20); db(0x0d); - db(0xe4); db(0x88); db(0x29); db(0x40); db(0x00); db(0x08); db(0x29); db(0x6a); - db(0x00); db(0x0c); db(0x00); db(0x0c); db(0x20); db(0x0c); db(0xe4); db(0x88); - db(0x27); db(0x40); db(0x00); db(0x1c); db(0x20); db(0x0e); db(0xe4); db(0x88); - db(0x27); db(0x40); db(0x00); db(0x28); db(0x70); db(0x0a); db(0x27); db(0x40); - db(0x00); db(0x18); db(0x27); db(0x7c); db(0x00); db(0x00); db(0x0f); db(0xa0); - db(0x00); db(0x14); db(0x20); db(0x0b); db(0x4c); db(0xdf); db(0x7c); db(0xfc); - db(0x4e); db(0x75); db(0xbc); db(0xfc); db(0x00); db(0x00); db(0x67); db(0x06); - db(0x4e); db(0xae); db(0xff); db(0x6a); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0x38); db(0x3e); db(0x24); db(0x48); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x43); db(0xfa); db(0x0d); db(0x0a); db(0x4e); db(0xae); db(0xfe); db(0x68); - db(0x2a); db(0x40); db(0x20); db(0x6d); db(0x00); db(0x22); db(0x20); db(0x28); - db(0x00); db(0x18); db(0xe5); db(0x88); db(0x26); db(0x40); db(0x24); db(0xab); - db(0x00); db(0x04); db(0x20); db(0x0a); db(0xe4); db(0x88); db(0x27); db(0x40); - db(0x00); db(0x04); db(0x22); db(0x4d); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x4c); db(0xdf); db(0x7c); db(0x1c); - db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x16); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x16); - db(0x24); db(0x01); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x93); db(0xc9); - db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x20); db(0x40); db(0x41); db(0xe8); - db(0x00); db(0x5c); db(0xe5); db(0x8a); db(0x22); db(0x42); db(0x22); db(0x51); - db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x22); db(0x02); db(0x43); db(0xfa); - db(0x00); db(0x0e); db(0x30); db(0x3c); db(0xff); db(0x68); db(0x61); db(0x00); - db(0x0b); db(0x60); db(0x4e); db(0x90); db(0x4e); db(0xd0); db(0x70); db(0x30); - db(0x60); db(0x0a); db(0x70); db(0x28); db(0x60); db(0x06); db(0x20); db(0x06); - db(0x60); db(0x02); db(0x20); db(0x06); db(0x12); db(0xd8); db(0x53); db(0x80); - db(0x6e); db(0xfa); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x00); db(0x00); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x04); - db(0x00); db(0x00); db(0x00); db(0x02); db(0x48); db(0xe7); db(0x20); db(0x22); - db(0x24); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x08); db(0x02); - db(0x00); db(0x01); db(0x67); db(0x4e); db(0x43); db(0xfa); db(0x0c); db(0x95); - db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); - db(0x67); db(0x40); db(0x24); db(0x4e); db(0x2c); db(0x40); db(0x4e); db(0xae); - db(0xff); db(0xd0); db(0x4a); db(0x80); db(0x67); db(0x2c); db(0x20); db(0x40); - db(0x43); db(0xfa); db(0xe2); db(0xb6); db(0x20); db(0x09); db(0x42); db(0x40); - db(0x21); db(0x40); db(0x00); db(0x20); db(0x21); db(0x7c); db(0x00); db(0x01); - db(0x00); db(0x00); db(0x00); db(0x24); db(0x31); db(0x7c); db(0x01); db(0x04); - db(0x00); db(0x10); db(0x31); db(0x7c); db(0x07); db(0xdb); db(0x00); db(0x14); - db(0x70); db(0x01); db(0x21); db(0x40); db(0x00); db(0x16); db(0x4e); db(0xae); - db(0xff); db(0xe2); db(0x22); db(0x4e); db(0x2c); db(0x4a); db(0x4e); db(0xae); - db(0xfe); db(0x62); db(0x08); db(0x02); db(0x00); db(0x00); db(0x67); db(0x44); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0xff); db(0xfc); db(0x61); db(0x00); - db(0x0a); db(0xd8); db(0x24); db(0x48); db(0x20); db(0x08); db(0x42); db(0x40); - db(0x20); db(0x40); db(0x21); db(0x4e); db(0x3f); db(0xfc); db(0x70); db(0x1a); - db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xfa); db(0x0c); db(0x71); - db(0x23); db(0x48); db(0x00); db(0x0a); db(0x23); db(0x4a); db(0x00); db(0x0e); - db(0x41); db(0xfa); db(0x01); db(0x30); db(0x23); db(0x48); db(0x00); db(0x12); - db(0x33); db(0x7c); db(0x02); db(0x7a); db(0x00); db(0x08); db(0x70); db(0x0d); - db(0x4e); db(0xae); db(0xff); db(0x58); db(0x4c); db(0xdf); db(0x44); db(0x04); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xc0); db(0x20); db(0x3c); - db(0x00); db(0x00); db(0xf0); db(0x00); db(0x61); db(0x00); db(0x0a); db(0x8a); - db(0x22); db(0x48); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x40); db(0x00); - db(0x61); db(0x00); db(0x0a); db(0x7e); db(0x70); db(0x03); db(0x4a); db(0x69); - db(0x00); db(0x02); db(0x67); db(0x0e); db(0xd0); db(0xfc); db(0x20); db(0x00); - db(0xd2); db(0xfc); db(0x00); db(0x08); db(0x51); db(0xc8); db(0xff); db(0xf0); - db(0x60); db(0xd4); db(0x48); db(0xe8); db(0x00); db(0xfc); db(0x00); db(0x0c); - db(0x48); db(0xe8); db(0x7c); db(0x00); db(0x00); db(0x2c); db(0x21); db(0x6f); - db(0x00); db(0x00); db(0x00); db(0x04); db(0x21); db(0x6f); db(0x00); db(0x04); - db(0x00); db(0x08); db(0x21); db(0x6f); db(0x00); db(0x08); db(0x00); db(0x24); - db(0x21); db(0x6f); db(0x00); db(0x0c); db(0x00); db(0x28); db(0x24); db(0x48); - db(0x26); db(0x49); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x42); db(0xaa); - db(0x00); db(0x4c); db(0x4a); db(0x13); db(0x67); db(0x0a); db(0x93); db(0xc9); - db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x25); db(0x40); db(0x00); db(0x4c); - db(0x36); db(0xaf); db(0x00); db(0x10); db(0x2a); db(0x3c); db(0x80); db(0x00); - db(0x00); db(0x00); db(0x38); db(0x3c); db(0x27); db(0x10); db(0x4a); db(0x2b); - db(0x00); db(0x02); db(0x66); db(0x50); db(0x0c); db(0x2b); db(0x00); db(0xfe); - db(0x00); db(0x07); db(0x66); db(0x18); db(0x17); db(0x7c); db(0x00); db(0x04); - db(0x00); db(0x07); db(0x20); db(0x4a); db(0x22); db(0x4b); db(0x70); db(0x01); - db(0x61); db(0x00); db(0x01); db(0x32); db(0x17); db(0x7c); db(0x00); db(0x03); - db(0x00); db(0x07); db(0x60); db(0xda); db(0x4a); db(0xaa); db(0x00); db(0x4c); - db(0x66); db(0x1e); db(0x0c); db(0x85); db(0x80); db(0x00); db(0x00); db(0x00); - db(0x66); db(0xcc); db(0x53); db(0x44); db(0x6a); db(0xc8); db(0x93); db(0xc9); - db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x22); db(0x40); db(0x70); db(0x88); - db(0x4e); db(0xae); db(0xfe); db(0xd4); db(0x2a); db(0x00); db(0x60); db(0xb6); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); - db(0xfe); db(0xc2); db(0x60); db(0xaa); db(0x0c); db(0x85); db(0x80); db(0x00); - db(0x00); db(0x00); db(0x67); db(0x0e); db(0x93); db(0xc9); db(0x4e); db(0xae); - db(0xfe); db(0xda); db(0x22); db(0x40); db(0x20); db(0x05); db(0x4e); db(0xae); - db(0xfe); db(0xd4); db(0x17); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x02); - db(0x20); db(0x4a); db(0x22); db(0x4b); db(0x4c); db(0xe8); db(0x00); db(0xff); - db(0x00); db(0x04); db(0x4c); db(0xe8); db(0x7c); db(0x00); db(0x00); db(0x2c); - db(0x2f); db(0x28); db(0x00); db(0x24); db(0x2f); db(0x28); db(0x00); db(0x28); - db(0x42); db(0xa8); db(0x00); db(0x4c); db(0x42); db(0x69); db(0x00); db(0x02); - db(0x22); db(0x5f); db(0x20); db(0x5f); db(0x4f); db(0xef); db(0x00); db(0x12); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x30); db(0x30); db(0x76); db(0x00); - db(0x24); db(0x49); db(0x4a); db(0x2a); db(0x00); db(0x01); db(0x67); db(0x4c); - db(0x76); db(0x01); db(0x20); db(0x0a); db(0x42); db(0x40); db(0x20); db(0x40); - db(0x72); db(0x04); db(0x22); db(0x48); db(0x2c); db(0x68); db(0x3f); db(0xfc); - db(0xd1); db(0xfc); db(0x00); db(0x00); db(0x40); db(0x00); db(0xd3); db(0xfc); - db(0x00); db(0x00); db(0xf0); db(0x00); db(0x4a); db(0x29); db(0x00); db(0x03); - db(0x67); db(0x1e); db(0x0c); db(0x29); db(0x00); db(0xff); db(0x00); db(0x07); - db(0x66); db(0x16); db(0x70); db(0x00); db(0x61); db(0x76); db(0x67); db(0x08); - db(0x13); db(0x7c); db(0x00); db(0xfd); db(0x00); db(0x07); db(0x60); db(0xca); - db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x07); db(0x60); db(0xc2); + db(0x0c); db(0xad); db(0x46); db(0x4f); db(0x52); db(0x4d); db(0x00); db(0x30); + db(0x66); db(0x52); db(0x20); db(0x2d); db(0x00); db(0x34); db(0x67); db(0x4c); + db(0x6b); db(0x4a); db(0x2b); db(0x6c); db(0x00); db(0x30); db(0x00); db(0x10); + db(0x50); db(0x80); db(0x24); db(0x00); db(0x72); db(0x01); db(0x4e); db(0xae); + db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x36); db(0x24); db(0x40); + db(0x20); db(0x4a); db(0x20); db(0xed); db(0x00); db(0x30); db(0x20); db(0xed); + db(0x00); db(0x34); db(0x29); db(0x48); db(0x00); db(0x28); db(0x20); db(0x02); + db(0x51); db(0x80); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c); + db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38); + db(0x72); db(0x0b); db(0x61); db(0x00); db(0x0e); db(0xdc); db(0x20); db(0x2c); + db(0x00); db(0x20); db(0x4e); db(0x90); db(0x22); db(0x4a); db(0x20); db(0x02); + db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x4a); db(0xac); db(0x00); db(0x20); + db(0x67); db(0x00); db(0xfe); db(0xda); db(0x41); db(0xed); db(0x00); db(0x30); + db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x01); db(0x29); db(0x40); + db(0x00); db(0x24); db(0x42); db(0xac); db(0x00); db(0x20); db(0x22); db(0x4c); + db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x60); db(0xde); db(0x41); db(0xe8); + db(0xff); db(0xe4); db(0x20); db(0x29); db(0x00); db(0x08); db(0xb0); db(0xa8); + db(0x00); db(0x10); db(0x67); db(0x1a); db(0x21); db(0x40); db(0x00); db(0x10); + db(0x2f); db(0x0e); db(0x2c); db(0x68); db(0x00); db(0x14); db(0x22); db(0x68); + db(0x00); db(0x08); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); + db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x2c); db(0x5f); db(0x70); db(0x00); + db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x74); db(0xff); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x11); db(0x61); db(0x00); + db(0x0e); db(0x70); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x01); + db(0x67); db(0x38); db(0x74); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x7c); + db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x0e); db(0x96); + db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x1e); + db(0x20); db(0x40); db(0x43); db(0xfa); db(0x00); db(0x22); db(0x24); db(0x68); + db(0xff); db(0xe4); db(0x21); db(0x49); db(0xff); db(0xe4); db(0x22); db(0x48); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x65); db(0x61); db(0x00); + db(0x0e); db(0x38); db(0x4e); db(0x90); db(0x74); db(0x01); db(0x4e); db(0xae); + db(0xff); db(0x76); db(0x20); db(0x02); db(0x4e); db(0x75); db(0x59); db(0x8f); + db(0x48); db(0xe7); db(0xc0); db(0x80); db(0x30); db(0x3c); db(0xff); db(0x38); + db(0x72); db(0x66); db(0x61); db(0x00); db(0x0e); db(0x1c); db(0x4e); db(0x90); + db(0x4c); db(0xdf); db(0x01); db(0x03); db(0x4e); db(0x75); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x41); db(0xfa); db(0x0f); db(0x43); db(0x43); db(0xfa); + db(0x00); db(0x14); db(0x70); db(0x0f); db(0x22); db(0x3c); db(0x00); db(0x00); + db(0x1f); db(0x40); db(0x61); db(0x00); db(0xe6); db(0xb4); db(0x4e); db(0x75); + db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x00); db(0x43); db(0xfa); + db(0x0f); db(0x2c); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2c); db(0x40); + db(0x72); db(0x02); db(0x30); db(0x3c); db(0xff); db(0x78); db(0x61); db(0x00); + db(0x0d); db(0xd8); db(0x24); db(0x48); db(0x72); db(0x01); db(0x4e); db(0x90); + db(0x4a); db(0x81); db(0x67); db(0x0c); db(0x26); db(0x41); db(0x4e); db(0xae); + db(0xfe); db(0x08); db(0x72); db(0x02); db(0x20); db(0x4b); db(0x4e); db(0x92); + db(0x22); db(0x4e); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); + db(0xfe); db(0x62); db(0x4e); db(0x75); db(0x4e); db(0x75); db(0xbc); db(0xfc); + db(0x00); db(0x00); db(0x67); db(0x06); db(0x4e); db(0xae); db(0xff); db(0x70); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x24); db(0x48); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0x01); db(0x00); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x49); db(0xeb); + db(0x00); db(0x2c); db(0x4b); db(0xec); db(0x00); db(0x10); db(0x4d); db(0xed); + db(0x00); db(0x44); db(0x22); db(0x4d); db(0x41); db(0xea); db(0x00); db(0x10); + db(0x70); db(0x10); db(0x22); db(0xd8); db(0x51); db(0xc8); db(0xff); db(0xfc); + db(0x20); db(0x4e); db(0x22); db(0x52); db(0x52); db(0x88); db(0x10); db(0xd9); + db(0x66); db(0xfc); db(0x20); db(0x08); db(0x56); db(0x80); db(0x02); db(0x00); + db(0x00); db(0xfc); db(0x2c); db(0x00); db(0x20); db(0x08); db(0x55); db(0x80); + db(0x90); db(0x8e); db(0x1c); db(0x80); db(0x20); db(0x46); db(0x22); db(0x6a); + db(0x00); db(0x04); db(0x52); db(0x88); db(0x10); db(0xd9); db(0x66); db(0xfc); + db(0x20); db(0x08); db(0x55); db(0x80); db(0x90); db(0x86); db(0x20); db(0x46); + db(0x10); db(0x80); db(0x28); db(0xaa); db(0x00); db(0x08); db(0x20); db(0x06); + db(0xe4); db(0x88); db(0x29); db(0x40); db(0x00); db(0x04); db(0x41); db(0xea); + db(0x00); db(0x10); db(0x20); db(0x0d); db(0xe4); db(0x88); db(0x29); db(0x40); + db(0x00); db(0x08); db(0x29); db(0x6a); db(0x00); db(0x0c); db(0x00); db(0x0c); + db(0x20); db(0x0c); db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x1c); + db(0x20); db(0x0e); db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x28); + db(0x70); db(0x0a); db(0x27); db(0x40); db(0x00); db(0x18); db(0x27); db(0x7c); + db(0x00); db(0x00); db(0x0f); db(0xa0); db(0x00); db(0x14); db(0x20); db(0x0b); + db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x4e); db(0x75); db(0xbc); db(0xfc); + db(0x00); db(0x00); db(0x67); db(0x06); db(0x4e); db(0xae); db(0xff); db(0x6a); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e); db(0x24); db(0x48); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x0e); db(0x26); + db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x2a); db(0x40); db(0x20); db(0x6d); + db(0x00); db(0x22); db(0x20); db(0x28); db(0x00); db(0x18); db(0xe5); db(0x88); + db(0x26); db(0x40); db(0x24); db(0xab); db(0x00); db(0x04); db(0x20); db(0x0a); + db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x04); db(0x22); db(0x4d); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62); + db(0x4c); db(0xdf); db(0x7c); db(0x1c); db(0x4e); db(0x75); db(0x00); db(0x00); + db(0x00); db(0x00); db(0x00); db(0x16); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x00); db(0x00); db(0x00); db(0x16); db(0x24); db(0x01); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); + db(0x20); db(0x40); db(0x41); db(0xe8); db(0x00); db(0x5c); db(0xe5); db(0x8a); + db(0x22); db(0x42); db(0x22); db(0x51); db(0x4e); db(0xae); db(0xfe); db(0x92); + db(0x22); db(0x02); db(0x43); db(0xfa); db(0x00); db(0x0e); db(0x30); db(0x3c); + db(0xff); db(0x68); db(0x61); db(0x00); db(0x0c); db(0x7c); db(0x4e); db(0x90); + db(0x4e); db(0xd0); db(0x70); db(0x30); db(0x60); db(0x0a); db(0x70); db(0x28); + db(0x60); db(0x06); db(0x20); db(0x06); db(0x60); db(0x02); db(0x20); db(0x06); + db(0x12); db(0xd8); db(0x53); db(0x80); db(0x6e); db(0xfa); db(0x4e); db(0x75); + db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x01); + db(0x00); db(0x00); db(0x00); db(0x04); db(0x00); db(0x00); db(0x00); db(0x02); + db(0x48); db(0xe7); db(0x20); db(0x22); db(0x24); db(0x00); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x08); db(0x02); db(0x00); db(0x01); db(0x67); db(0x4e); + db(0x43); db(0xfa); db(0x0d); db(0xb1); db(0x70); db(0x00); db(0x4e); db(0xae); + db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x67); db(0x40); db(0x24); db(0x4e); + db(0x2c); db(0x40); db(0x4e); db(0xae); db(0xff); db(0xd0); db(0x4a); db(0x80); + db(0x67); db(0x2c); db(0x20); db(0x40); db(0x43); db(0xfa); db(0xe2); db(0xb2); + db(0x20); db(0x09); db(0x42); db(0x40); db(0x21); db(0x40); db(0x00); db(0x20); + db(0x21); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x24); + db(0x31); db(0x7c); db(0x01); db(0x04); db(0x00); db(0x10); db(0x31); db(0x7c); + db(0x07); db(0xdb); db(0x00); db(0x14); db(0x70); db(0x01); db(0x21); db(0x40); + db(0x00); db(0x16); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x22); db(0x4e); + db(0x2c); db(0x4a); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x08); db(0x02); + db(0x00); db(0x00); db(0x67); db(0x44); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0xff); db(0xfc); db(0x61); db(0x00); db(0x0b); db(0xf4); db(0x24); db(0x48); + db(0x20); db(0x08); db(0x42); db(0x40); db(0x20); db(0x40); db(0x21); db(0x4e); + db(0x3f); db(0xfc); db(0x70); db(0x1a); db(0x22); db(0x3c); db(0x00); db(0x01); + db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); + db(0x41); db(0xfa); db(0x0d); db(0x8d); db(0x23); db(0x48); db(0x00); db(0x0a); + db(0x23); db(0x4a); db(0x00); db(0x0e); db(0x41); db(0xfa); db(0x01); db(0x30); + db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c); db(0x02); db(0x7a); + db(0x00); db(0x08); db(0x70); db(0x0d); db(0x4e); db(0xae); db(0xff); db(0x58); + db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0xc0); db(0xc0); db(0x20); db(0x3c); db(0x00); db(0x00); db(0xf0); db(0x00); + db(0x61); db(0x00); db(0x0b); db(0xa6); db(0x22); db(0x48); db(0x20); db(0x3c); + db(0x00); db(0x00); db(0x40); db(0x00); db(0x61); db(0x00); db(0x0b); db(0x9a); + db(0x70); db(0x03); db(0x4a); db(0x69); db(0x00); db(0x02); db(0x67); db(0x0e); db(0xd0); db(0xfc); db(0x20); db(0x00); db(0xd2); db(0xfc); db(0x00); db(0x08); - db(0x51); db(0xc9); db(0xff); db(0xd2); db(0x4a); db(0x2a); db(0x00); db(0x02); - db(0x67); db(0x4a); db(0x76); db(0x01); db(0x20); db(0x0a); db(0x42); db(0x40); - db(0x24); db(0x40); db(0x26); db(0x40); db(0x2c); db(0x6a); db(0x3f); db(0xfc); - db(0xd5); db(0xfc); db(0x00); db(0x00); db(0x40); db(0x00); db(0xd7); db(0xfc); - db(0x00); db(0x00); db(0xf0); db(0x00); db(0x74); db(0x03); db(0x20); db(0x2a); - db(0x00); db(0x4c); db(0x67); db(0x1c); db(0x4a); db(0x2b); db(0x00); db(0x03); - db(0x67); db(0x16); db(0x4a); db(0x2b); db(0x00); db(0x02); db(0x6a); db(0x10); - db(0x42); db(0xaa); db(0x00); db(0x4c); db(0x22); db(0x40); db(0x20); db(0x3c); - db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xbc); - db(0xd4); db(0xfc); db(0x20); db(0x00); db(0xd6); db(0xfc); db(0x00); db(0x08); - db(0x51); db(0xca); db(0xff); db(0xd4); db(0x20); db(0x03); db(0x4c); db(0xdf); - db(0x0c); db(0x0c); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x7c); db(0x7c); - db(0x3a); db(0x00); db(0x49); db(0xe8); db(0x00); db(0x54); db(0x4b); db(0xe9); - db(0x00); db(0x04); db(0x38); db(0x15); db(0xd8); db(0x44); db(0x47); db(0xfa); - db(0x00); db(0x54); db(0x32); db(0x33); db(0x40); db(0x00); db(0x66); db(0x36); - db(0x4a); db(0x45); db(0x67); db(0x14); db(0x32); db(0x3c); db(0x00); db(0x9c); - db(0x0c); db(0x44); db(0x00); db(0x24); db(0x67); db(0x28); db(0x32); db(0x3c); - db(0x00); db(0xb6); db(0x0c); db(0x44); db(0x00); db(0x26); db(0x67); db(0x1e); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0xff); db(0xf4); db(0x61); db(0x00); - db(0x08); db(0x90); db(0x20); db(0x10); db(0x67); db(0x10); db(0x22); db(0x40); - db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); - db(0xfe); db(0xbc); db(0x70); db(0x01); db(0x60); db(0x10); db(0xd6); db(0xc1); - db(0x4c); db(0xd4); db(0x07); db(0x00); db(0x4c); db(0xd4); db(0x00); db(0x07); - db(0x4e); db(0x93); db(0x28); db(0x80); db(0x70); db(0x00); db(0x4c); db(0xdf); - db(0x3e); db(0x3e); db(0x4e); db(0x75); db(0x00); db(0xca); db(0x00); db(0x2c); - db(0x00); db(0x30); db(0x00); db(0x34); db(0x00); db(0x38); db(0x00); db(0x3c); - db(0x00); db(0x42); db(0x00); db(0x48); db(0x00); db(0x4e); db(0x00); db(0x56); - db(0x00); db(0x48); db(0x00); db(0x4e); db(0x00); db(0x56); db(0x00); db(0x5e); - db(0x00); db(0x5e); db(0x00); db(0x70); db(0x00); db(0x78); db(0x00); db(0x80); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0xc6); db(0x00); db(0x88); - db(0x20); db(0x81); db(0x4e); db(0x75); db(0x30); db(0x81); db(0x4e); db(0x75); - db(0x10); db(0x81); db(0x4e); db(0x75); db(0x20); db(0x10); db(0x4e); db(0x75); - db(0x70); db(0x00); db(0x30); db(0x10); db(0x4e); db(0x75); db(0x70); db(0x00); - db(0x10); db(0x10); db(0x4e); db(0x75); db(0x20); db(0x02); db(0x4e); db(0xee); - db(0xfd); db(0x90); db(0x20); db(0x02); db(0xd0); db(0x80); db(0x4e); db(0xee); - db(0xfd); db(0x90); db(0x20); db(0x02); db(0xe5); db(0x88); db(0x4e); db(0xee); - db(0xfd); db(0x90); db(0x70); db(0x00); db(0x53); db(0x42); db(0x67); db(0x06); - db(0x52); db(0x40); db(0x12); db(0xd8); db(0x66); db(0xf4); db(0x42); db(0x29); - db(0xff); db(0xff); db(0x4e); db(0x75); db(0x20); db(0xc1); db(0x53); db(0x82); - db(0x66); db(0xfa); db(0x4e); db(0x75); db(0x30); db(0xc1); db(0x53); db(0x82); - db(0x66); db(0xfa); db(0x4e); db(0x75); db(0x10); db(0xc1); db(0x53); db(0x82); - db(0x66); db(0xfa); db(0x4e); db(0x75); db(0x70); db(0x00); db(0x10); db(0x18); - db(0x53); db(0x40); db(0x6b); db(0x08); db(0x53); db(0x42); db(0x6b); db(0x04); - db(0x12); db(0xd8); db(0x60); db(0xf4); db(0x42); db(0x11); db(0x4e); db(0x75); - db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x48); db(0xd0); db(0xc1); - db(0x48); db(0x7a); db(0x00); db(0x0a); db(0x2f); db(0x08); db(0x4c); db(0xd2); - db(0x3f); db(0xff); db(0x4e); db(0x75); db(0x4c); db(0xdf); db(0x7c); db(0xfc); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x48); db(0x7a); - db(0xff); db(0xf4); db(0x2f); db(0x08); db(0x4c); db(0xd1); db(0x7f); db(0xff); - db(0x4e); db(0x75); db(0x20); db(0x05); db(0x4e); db(0x75); db(0x48); db(0xe7); - db(0xff); db(0xfe); db(0x28); db(0x48); db(0x2a); db(0x4c); db(0x2e); db(0x01); - db(0x7a); db(0x00); db(0x38); db(0x1c); db(0x7c); db(0x00); db(0x3c); db(0x1c); - db(0xd8); db(0x44); db(0x47); db(0xfa); db(0xff); db(0x20); db(0xd6); db(0xf3); - db(0x40); db(0x00); db(0x4c); db(0xd4); db(0x07); db(0x00); db(0x4c); db(0xd4); - db(0x00); db(0x07); db(0x4e); db(0x93); db(0x28); db(0x80); db(0x2a); db(0x00); - db(0x4a); db(0x46); db(0x67); db(0x14); db(0x36); db(0x06); db(0x02); db(0x46); - db(0x00); db(0x0f); db(0xe0); db(0x4b); db(0xc6); db(0xfc); db(0x00); db(0x14); - db(0xe5); db(0x4e); db(0xd6); db(0x46); db(0x2b); db(0x80); db(0x30); db(0x04); - db(0xd8); db(0xfc); db(0x00); db(0x10); db(0x53); db(0x87); db(0x66); db(0xc2); - db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x2a); db(0x48); - db(0x7e); db(0x14); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); - db(0xff); db(0x7c); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x61); db(0x00); - db(0x07); db(0x38); db(0x24); db(0x0d); db(0x72); db(0x13); db(0x4e); db(0x90); - db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x98); db(0x26); db(0x40); - db(0x28); db(0x5b); db(0x20); db(0x4c); db(0x22); db(0x4d); db(0x30); db(0x3c); - db(0x3f); db(0xff); db(0x22); db(0xd8); db(0x51); db(0xc8); db(0xff); db(0xfc); - db(0x22); db(0x0d); db(0x92); db(0x8c); db(0x20); db(0x4b); db(0x70); db(0x00); - db(0x30); db(0x18); db(0x67); db(0x0e); db(0x43); db(0xf4); db(0x08); db(0x00); - db(0xd3); db(0x91); db(0x43); db(0xf5); db(0x08); db(0x00); db(0xd3); db(0x91); - db(0x60); db(0xec); db(0x70); db(0x00); db(0x20); db(0x18); db(0x67); db(0x06); - db(0x22); db(0x40); db(0xd3); db(0x91); db(0x60); db(0xf4); db(0x70); db(0x00); - db(0x61); db(0x00); db(0x06); db(0xee); db(0x43); db(0xfa); db(0x06); db(0xea); - db(0x93); db(0xc8); db(0xd3); db(0xcd); db(0x32); db(0xfc); db(0x41); db(0xf9); - db(0x22); db(0xcc); db(0x32); db(0xfc); db(0x02); db(0x80); db(0x22); db(0xfc); - db(0x00); db(0x00); db(0xff); db(0xff); db(0x22); db(0xbc); db(0xd1); db(0xc0); - db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x00); db(0x40); db(0x70); db(0x00); - db(0x30); db(0x18); db(0x67); db(0x14); db(0x06); db(0x40); db(0x00); db(0x0c); - db(0x43); db(0xf4); db(0x08); db(0x00); db(0x32); db(0xfc); db(0x4e); db(0xf9); - db(0x45); db(0xf5); db(0x08); db(0x00); db(0x22); db(0x8a); db(0x60); db(0xe6); - db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x04); - db(0x4e); db(0xae); db(0xfd); db(0x84); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x61); db(0x00); db(0x06); db(0x9e); db(0x24); db(0x0d); db(0x72); db(0x14); - db(0x4e); db(0x90); db(0x7e); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); - db(0x20); db(0x07); db(0x4e); db(0x75); db(0x0e); db(0xc2); db(0x13); db(0xb4); - db(0x05); db(0x68); db(0x02); db(0xac); db(0x03); db(0x32); db(0x00); db(0x00); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x30); db(0x72); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x6c); - db(0x26); db(0x40); db(0x41); db(0xfa); db(0x00); db(0x6a); db(0x22); db(0x4b); - db(0x70); db(0x2f); db(0x12); db(0xd8); db(0x51); db(0xc8); db(0xff); db(0xfc); - db(0x41); db(0xfa); db(0x00); db(0x94); db(0x27); db(0x48); db(0x00); db(0x12); - db(0x41); db(0xfa); db(0x00); db(0x84); db(0x27); db(0x48); db(0x00); db(0x1e); - db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); - db(0x43); db(0xfa); db(0x06); db(0x72); db(0x4e); db(0xae); db(0xfe); db(0xec); - db(0x4a); db(0x80); db(0x67); db(0x10); db(0x22); db(0x40); db(0x20); db(0x0b); + db(0x51); db(0xc8); db(0xff); db(0xf0); db(0x60); db(0xd4); db(0x48); db(0xe8); + db(0x00); db(0xfc); db(0x00); db(0x0c); db(0x48); db(0xe8); db(0x7c); db(0x00); + db(0x00); db(0x2c); db(0x21); db(0x6f); db(0x00); db(0x00); db(0x00); db(0x04); + db(0x21); db(0x6f); db(0x00); db(0x04); db(0x00); db(0x08); db(0x21); db(0x6f); + db(0x00); db(0x08); db(0x00); db(0x24); db(0x21); db(0x6f); db(0x00); db(0x0c); + db(0x00); db(0x28); db(0x24); db(0x48); db(0x26); db(0x49); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x42); db(0xaa); db(0x00); db(0x4c); db(0x4a); db(0x13); + db(0x67); db(0x0a); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); + db(0x25); db(0x40); db(0x00); db(0x4c); db(0x36); db(0xaf); db(0x00); db(0x10); + db(0x2a); db(0x3c); db(0x80); db(0x00); db(0x00); db(0x00); db(0x38); db(0x3c); + db(0x27); db(0x10); db(0x4a); db(0x2b); db(0x00); db(0x02); db(0x66); db(0x50); + db(0x0c); db(0x2b); db(0x00); db(0xfe); db(0x00); db(0x07); db(0x66); db(0x18); + db(0x17); db(0x7c); db(0x00); db(0x04); db(0x00); db(0x07); db(0x20); db(0x4a); + db(0x22); db(0x4b); db(0x70); db(0x01); db(0x61); db(0x00); db(0x01); db(0x32); + db(0x17); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x07); db(0x60); db(0xda); + db(0x4a); db(0xaa); db(0x00); db(0x4c); db(0x66); db(0x1e); db(0x0c); db(0x85); + db(0x80); db(0x00); db(0x00); db(0x00); db(0x66); db(0xcc); db(0x53); db(0x44); + db(0x6a); db(0xc8); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); + db(0x22); db(0x40); db(0x70); db(0x88); db(0x4e); db(0xae); db(0xfe); db(0xd4); + db(0x2a); db(0x00); db(0x60); db(0xb6); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x60); db(0xaa); + db(0x0c); db(0x85); db(0x80); db(0x00); db(0x00); db(0x00); db(0x67); db(0x0e); + db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x22); db(0x40); + db(0x20); db(0x05); db(0x4e); db(0xae); db(0xfe); db(0xd4); db(0x17); db(0x7c); + db(0x00); db(0x01); db(0x00); db(0x02); db(0x20); db(0x4a); db(0x22); db(0x4b); + db(0x4c); db(0xe8); db(0x00); db(0xff); db(0x00); db(0x04); db(0x4c); db(0xe8); + db(0x7c); db(0x00); db(0x00); db(0x2c); db(0x2f); db(0x28); db(0x00); db(0x24); + db(0x2f); db(0x28); db(0x00); db(0x28); db(0x42); db(0xa8); db(0x00); db(0x4c); + db(0x42); db(0x69); db(0x00); db(0x02); db(0x22); db(0x5f); db(0x20); db(0x5f); + db(0x4f); db(0xef); db(0x00); db(0x12); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0x30); db(0x30); db(0x76); db(0x00); db(0x24); db(0x49); db(0x4a); db(0x2a); + db(0x00); db(0x01); db(0x67); db(0x4c); db(0x76); db(0x01); db(0x20); db(0x0a); + db(0x42); db(0x40); db(0x20); db(0x40); db(0x72); db(0x04); db(0x22); db(0x48); + db(0x2c); db(0x68); db(0x3f); db(0xfc); db(0xd1); db(0xfc); db(0x00); db(0x00); + db(0x40); db(0x00); db(0xd3); db(0xfc); db(0x00); db(0x00); db(0xf0); db(0x00); + db(0x4a); db(0x29); db(0x00); db(0x03); db(0x67); db(0x1e); db(0x0c); db(0x29); + db(0x00); db(0xff); db(0x00); db(0x07); db(0x66); db(0x16); db(0x70); db(0x00); + db(0x61); db(0x76); db(0x67); db(0x08); db(0x13); db(0x7c); db(0x00); db(0xfd); + db(0x00); db(0x07); db(0x60); db(0xca); db(0x13); db(0x7c); db(0x00); db(0x01); + db(0x00); db(0x07); db(0x60); db(0xc2); db(0xd0); db(0xfc); db(0x20); db(0x00); + db(0xd2); db(0xfc); db(0x00); db(0x08); db(0x51); db(0xc9); db(0xff); db(0xd2); + db(0x4a); db(0x2a); db(0x00); db(0x02); db(0x67); db(0x4a); db(0x76); db(0x01); + db(0x20); db(0x0a); db(0x42); db(0x40); db(0x24); db(0x40); db(0x26); db(0x40); + db(0x2c); db(0x6a); db(0x3f); db(0xfc); db(0xd5); db(0xfc); db(0x00); db(0x00); + db(0x40); db(0x00); db(0xd7); db(0xfc); db(0x00); db(0x00); db(0xf0); db(0x00); + db(0x74); db(0x03); db(0x20); db(0x2a); db(0x00); db(0x4c); db(0x67); db(0x1c); + db(0x4a); db(0x2b); db(0x00); db(0x03); db(0x67); db(0x16); db(0x4a); db(0x2b); + db(0x00); db(0x02); db(0x6a); db(0x10); db(0x42); db(0xaa); db(0x00); db(0x4c); + db(0x22); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); + db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0xd4); db(0xfc); db(0x20); db(0x00); + db(0xd6); db(0xfc); db(0x00); db(0x08); db(0x51); db(0xca); db(0xff); db(0xd4); + db(0x20); db(0x03); db(0x4c); db(0xdf); db(0x0c); db(0x0c); db(0x4e); db(0x75); + db(0x48); db(0xe7); db(0x7c); db(0x7c); db(0x3a); db(0x00); db(0x49); db(0xe8); + db(0x00); db(0x54); db(0x4b); db(0xe9); db(0x00); db(0x04); db(0x38); db(0x15); + db(0xd8); db(0x44); db(0x47); db(0xfa); db(0x00); db(0x54); db(0x32); db(0x33); + db(0x40); db(0x00); db(0x66); db(0x36); db(0x4a); db(0x45); db(0x67); db(0x14); + db(0x32); db(0x3c); db(0x00); db(0x9c); db(0x0c); db(0x44); db(0x00); db(0x24); + db(0x67); db(0x28); db(0x32); db(0x3c); db(0x00); db(0xb6); db(0x0c); db(0x44); + db(0x00); db(0x26); db(0x67); db(0x1e); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0xff); db(0xf4); db(0x61); db(0x00); db(0x09); db(0xac); db(0x20); db(0x10); + db(0x67); db(0x10); db(0x22); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); + db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x70); db(0x01); + db(0x60); db(0x10); db(0xd6); db(0xc1); db(0x4c); db(0xd4); db(0x07); db(0x00); + db(0x4c); db(0xd4); db(0x00); db(0x07); db(0x4e); db(0x93); db(0x28); db(0x80); + db(0x70); db(0x00); db(0x4c); db(0xdf); db(0x3e); db(0x3e); db(0x4e); db(0x75); + db(0x00); db(0xca); db(0x00); db(0x2c); db(0x00); db(0x30); db(0x00); db(0x34); + db(0x00); db(0x38); db(0x00); db(0x3c); db(0x00); db(0x42); db(0x00); db(0x48); + db(0x00); db(0x4e); db(0x00); db(0x56); db(0x00); db(0x48); db(0x00); db(0x4e); + db(0x00); db(0x56); db(0x00); db(0x5e); db(0x00); db(0x5e); db(0x00); db(0x70); + db(0x00); db(0x78); db(0x00); db(0x80); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x00); db(0xc6); db(0x00); db(0x88); db(0x20); db(0x81); db(0x4e); db(0x75); + db(0x30); db(0x81); db(0x4e); db(0x75); db(0x10); db(0x81); db(0x4e); db(0x75); + db(0x20); db(0x10); db(0x4e); db(0x75); db(0x70); db(0x00); db(0x30); db(0x10); + db(0x4e); db(0x75); db(0x70); db(0x00); db(0x10); db(0x10); db(0x4e); db(0x75); + db(0x20); db(0x02); db(0x4e); db(0xee); db(0xfd); db(0x90); db(0x20); db(0x02); + db(0xd0); db(0x80); db(0x4e); db(0xee); db(0xfd); db(0x90); db(0x20); db(0x02); + db(0xe5); db(0x88); db(0x4e); db(0xee); db(0xfd); db(0x90); db(0x70); db(0x00); + db(0x53); db(0x42); db(0x67); db(0x06); db(0x52); db(0x40); db(0x12); db(0xd8); + db(0x66); db(0xf4); db(0x42); db(0x29); db(0xff); db(0xff); db(0x4e); db(0x75); + db(0x20); db(0xc1); db(0x53); db(0x82); db(0x66); db(0xfa); db(0x4e); db(0x75); + db(0x30); db(0xc1); db(0x53); db(0x82); db(0x66); db(0xfa); db(0x4e); db(0x75); + db(0x10); db(0xc1); db(0x53); db(0x82); db(0x66); db(0xfa); db(0x4e); db(0x75); + db(0x70); db(0x00); db(0x10); db(0x18); db(0x53); db(0x40); db(0x6b); db(0x08); + db(0x53); db(0x42); db(0x6b); db(0x04); db(0x12); db(0xd8); db(0x60); db(0xf4); + db(0x42); db(0x11); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); + db(0x2c); db(0x48); db(0xd0); db(0xc1); db(0x48); db(0x7a); db(0x00); db(0x0a); + db(0x2f); db(0x08); db(0x4c); db(0xd2); db(0x3f); db(0xff); db(0x4e); db(0x75); + db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x4e); db(0x75); db(0x48); db(0xe7); + db(0x3f); db(0x3e); db(0x48); db(0x7a); db(0xff); db(0xf4); db(0x2f); db(0x08); + db(0x4c); db(0xd1); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x20); db(0x05); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x28); db(0x48); + db(0x2a); db(0x4c); db(0x2e); db(0x01); db(0x7a); db(0x00); db(0x38); db(0x1c); + db(0x7c); db(0x00); db(0x3c); db(0x1c); db(0xd8); db(0x44); db(0x47); db(0xfa); + db(0xff); db(0x20); db(0xd6); db(0xf3); db(0x40); db(0x00); db(0x4c); db(0xd4); + db(0x07); db(0x00); db(0x4c); db(0xd4); db(0x00); db(0x07); db(0x4e); db(0x93); + db(0x28); db(0x80); db(0x2a); db(0x00); db(0x4a); db(0x46); db(0x67); db(0x14); + db(0x36); db(0x06); db(0x02); db(0x46); db(0x00); db(0x0f); db(0xe0); db(0x4b); + db(0xc6); db(0xfc); db(0x00); db(0x14); db(0xe5); db(0x4e); db(0xd6); db(0x46); + db(0x2b); db(0x80); db(0x30); db(0x04); db(0xd8); db(0xfc); db(0x00); db(0x10); + db(0x53); db(0x87); db(0x66); db(0xc2); db(0x4c); db(0xdf); db(0x7f); db(0xff); + db(0x4e); db(0x75); db(0x2a); db(0x48); db(0x7e); db(0x14); db(0x2c); db(0x78); + db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x30); db(0x3c); + db(0xff); db(0x38); db(0x61); db(0x00); db(0x08); db(0x54); db(0x24); db(0x0d); + db(0x72); db(0x13); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00); + db(0x00); db(0x98); db(0x26); db(0x40); db(0x28); db(0x5b); db(0x20); db(0x4c); + db(0x22); db(0x4d); db(0x30); db(0x3c); db(0x3f); db(0xff); db(0x22); db(0xd8); + db(0x51); db(0xc8); db(0xff); db(0xfc); db(0x22); db(0x0d); db(0x92); db(0x8c); + db(0x20); db(0x4b); db(0x70); db(0x00); db(0x30); db(0x18); db(0x67); db(0x0e); + db(0x43); db(0xf4); db(0x08); db(0x00); db(0xd3); db(0x91); db(0x43); db(0xf5); + db(0x08); db(0x00); db(0xd3); db(0x91); db(0x60); db(0xec); db(0x70); db(0x00); + db(0x20); db(0x18); db(0x67); db(0x06); db(0x22); db(0x40); db(0xd3); db(0x91); + db(0x60); db(0xf4); db(0x70); db(0x00); db(0x61); db(0x00); db(0x08); db(0x0a); + db(0x43); db(0xfa); db(0x08); db(0x06); db(0x93); db(0xc8); db(0xd3); db(0xcd); + db(0x32); db(0xfc); db(0x41); db(0xf9); db(0x22); db(0xcc); db(0x32); db(0xfc); + db(0x02); db(0x80); db(0x22); db(0xfc); db(0x00); db(0x00); db(0xff); db(0xff); + db(0x22); db(0xbc); db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x41); db(0xfa); + db(0x00); db(0x40); db(0x70); db(0x00); db(0x30); db(0x18); db(0x67); db(0x14); + db(0x06); db(0x40); db(0x00); db(0x0c); db(0x43); db(0xf4); db(0x08); db(0x00); + db(0x32); db(0xfc); db(0x4e); db(0xf9); db(0x45); db(0xf5); db(0x08); db(0x00); + db(0x22); db(0x8a); db(0x60); db(0xe6); db(0x0c); db(0x6e); db(0x00); db(0x24); + db(0x00); db(0x14); db(0x65); db(0x04); db(0x4e); db(0xae); db(0xfd); db(0x84); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x61); db(0x00); db(0x07); db(0xba); + db(0x24); db(0x0d); db(0x72); db(0x14); db(0x4e); db(0x90); db(0x7e); db(0x00); + db(0x4e); db(0xae); db(0xff); db(0x76); db(0x20); db(0x07); db(0x4e); db(0x75); + db(0x0e); db(0xc6); db(0x13); db(0xb8); db(0x05); db(0x6c); db(0x02); db(0xb0); + db(0x03); db(0x36); db(0x00); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); + db(0x70); db(0x30); db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x4a); db(0x80); db(0x67); db(0x6c); db(0x26); db(0x40); db(0x41); db(0xfa); + db(0x00); db(0x6a); db(0x22); db(0x4b); db(0x70); db(0x2f); db(0x12); db(0xd8); + db(0x51); db(0xc8); db(0xff); db(0xfc); db(0x41); db(0xfa); db(0x00); db(0x94); + db(0x27); db(0x48); db(0x00); db(0x12); db(0x41); db(0xfa); db(0x00); db(0x84); + db(0x27); db(0x48); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xff); db(0x7c); + db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x07); db(0x8e); + db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x10); + db(0x22); db(0x40); db(0x20); db(0x0b); db(0x30); db(0x7c); db(0xff); db(0xe2); + db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x27); db(0x40); db(0x00); db(0x28); + db(0x41); db(0xee); db(0x01); db(0x7a); db(0x43); db(0xfa); db(0x07); db(0x7d); + db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x14); + db(0x22); db(0x40); db(0x41); db(0xeb); db(0x00); db(0x1c); db(0x20); db(0x08); db(0x30); db(0x7c); db(0xff); db(0xe2); db(0x4e); db(0xae); db(0xfe); db(0x5c); - db(0x27); db(0x40); db(0x00); db(0x28); db(0x41); db(0xee); db(0x01); db(0x7a); - db(0x43); db(0xfa); db(0x06); db(0x61); db(0x4e); db(0xae); db(0xfe); db(0xec); - db(0x4a); db(0x80); db(0x67); db(0x14); db(0x22); db(0x40); db(0x41); db(0xeb); - db(0x00); db(0x1c); db(0x20); db(0x08); db(0x30); db(0x7c); db(0xff); db(0xe2); - db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x27); db(0x40); db(0x00); db(0x2c); - db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4e); db(0x75); db(0x0c); db(0x69); - db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x67); db(0x08); db(0x0c); db(0x69); - db(0x00); db(0x0c); db(0x00); db(0x1c); db(0x66); db(0x06); db(0x4e); db(0xb9); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x2f); db(0x3a); db(0x00); db(0x10); - db(0x4e); db(0x75); db(0x4e); db(0xb9); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x2f); db(0x3a); db(0x00); db(0x08); db(0x4e); db(0x75); db(0x00); db(0x00); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x48); db(0xe7); - db(0xff); db(0xfe); db(0x24); db(0x48); db(0x60); db(0x08); db(0x48); db(0xe7); - db(0xff); db(0xfe); db(0x24); db(0x69); db(0x00); db(0x28); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x51); db(0x8f); db(0x28); db(0x4f); db(0x2f); db(0x0c); - db(0x2f); db(0x0a); db(0x61); db(0x00); db(0x03); db(0xdc); db(0x50); db(0x8f); - db(0x4a); db(0x80); db(0x67); db(0x1a); db(0x24); db(0x00); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x61); db(0x00); db(0x05); db(0xa4); db(0x72); db(0x15); - db(0x22); db(0x42); db(0x20); db(0x14); db(0x4e); db(0x90); db(0x22); db(0x42); - db(0x20); db(0x14); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x50); db(0x8f); - db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x22); db(0x2f); - db(0x00); db(0x08); db(0x20); db(0x2f); db(0x00); db(0x04); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x03); db(0x00); - db(0x1e); db(0x2f); db(0x00); db(0x0f); db(0x7c); db(0x00); db(0x08); db(0x07); - db(0x00); db(0x00); db(0x67); db(0x02); db(0x52); db(0x86); db(0x08); db(0x07); - db(0x00); db(0x01); db(0x67); db(0x02); db(0x52); db(0x86); db(0x08); db(0x07); - db(0x00); db(0x02); db(0x67); db(0x02); db(0x52); db(0x86); db(0x20); db(0x06); - db(0x4c); db(0xdf); db(0x00); db(0xc0); db(0x4e); db(0x75); db(0x2f); db(0x07); - db(0x2e); db(0x2f); db(0x00); db(0x08); db(0x70); db(0x40); db(0xbe); db(0x80); - db(0x6f); db(0x28); db(0x70); db(0x4a); db(0xbe); db(0x80); db(0x67); db(0x22); - db(0x70); db(0x5a); db(0xbe); db(0x80); db(0x67); db(0x1c); db(0x70); db(0x5b); - db(0xbe); db(0x80); db(0x67); db(0x16); db(0x70); db(0x5c); db(0xbe); db(0x80); - db(0x67); db(0x10); db(0x70); db(0x5d); db(0xbe); db(0x80); db(0x67); db(0x0a); - db(0x70); db(0x5e); db(0xbe); db(0x80); db(0x67); db(0x04); db(0x70); db(0x01); - db(0x60); db(0x02); db(0x70); db(0x00); db(0x2e); db(0x1f); db(0x4e); db(0x75); - db(0x9e); db(0xfc); db(0x00); db(0x14); db(0x48); db(0xe7); db(0x37); db(0x34); - db(0x2e); db(0x2f); db(0x00); db(0x44); db(0x24); db(0x6f); db(0x00); db(0x40); - db(0x26); db(0x6f); db(0x00); db(0x3c); db(0x2a); db(0x6f); db(0x00); db(0x38); - db(0x2c); db(0x07); db(0x70); db(0x3f); db(0xdc); db(0x80); db(0x2f); db(0x47); - db(0x00); db(0x28); db(0x20); db(0x2f); db(0x00); db(0x28); db(0xb0); db(0x86); - db(0x6e); db(0x00); db(0x00); db(0xfe); db(0x2f); db(0x00); db(0x61); db(0x96); - db(0x58); db(0x4f); db(0x4a); db(0x80); db(0x66); db(0x00); db(0x00); db(0xe6); - db(0x70); db(0x00); db(0x10); db(0x13); db(0x02); db(0x40); db(0xff); db(0xf8); - db(0x72); db(0x20); db(0x90); db(0x81); db(0x67); db(0x4a); db(0x72); db(0x20); - db(0x90); db(0x81); db(0x66); db(0x00); db(0x00); db(0xd0); db(0x70); db(0x00); - db(0x10); db(0x13); db(0x2f); db(0x00); db(0x61); db(0x00); db(0xff); db(0x46); + db(0x27); db(0x40); db(0x00); db(0x2c); db(0x4e); db(0xae); db(0xff); db(0x76); + db(0x4e); db(0x75); db(0x0c); db(0x69); db(0x00); db(0x0a); db(0x00); db(0x1c); + db(0x67); db(0x08); db(0x0c); db(0x69); db(0x00); db(0x0c); db(0x00); db(0x1c); + db(0x66); db(0x06); db(0x4e); db(0xb9); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x2f); db(0x3a); db(0x00); db(0x10); db(0x4e); db(0x75); db(0x4e); db(0xb9); + db(0x00); db(0x00); db(0x00); db(0x00); db(0x2f); db(0x3a); db(0x00); db(0x08); + db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x00); db(0x00); db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x24); db(0x48); + db(0x60); db(0x08); db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x24); db(0x69); + db(0x00); db(0x28); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x51); db(0x8f); + db(0x28); db(0x4f); db(0x2f); db(0x0c); db(0x2f); db(0x0a); db(0x61); db(0x00); + db(0x04); db(0xf6); db(0x50); db(0x8f); db(0x4a); db(0x80); db(0x67); db(0x1a); + db(0x24); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x61); db(0x00); + db(0x06); db(0xc0); db(0x72); db(0x15); db(0x22); db(0x42); db(0x20); db(0x14); + db(0x4e); db(0x90); db(0x22); db(0x42); db(0x20); db(0x14); db(0x4e); db(0xae); + db(0xff); db(0x2e); db(0x50); db(0x8f); db(0x4c); db(0xdf); db(0x7f); db(0xff); + db(0x4e); db(0x75); db(0x20); db(0x78); db(0x00); db(0x04); db(0x0c); db(0x68); + db(0x00); db(0x25); db(0x00); db(0x14); db(0x65); db(0x00); db(0x00); db(0xa6); + db(0x30); db(0x3c); db(0xff); db(0x38); db(0x22); db(0x3c); db(0x00); db(0x00); + db(0x00); db(0xd0); db(0x61); db(0x00); db(0x06); db(0x7c); db(0x28); db(0x08); + db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x00); db(0x67); db(0x00); + db(0x00); db(0x8c); db(0x43); db(0xfa); db(0x07); db(0xb0); db(0x70); db(0x00); + db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x67); db(0x7c); + db(0x28); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x64); + db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); + db(0x67); db(0x6a); db(0x24); db(0x40); db(0x22); db(0x4a); db(0x70); db(0x18); + db(0x41); db(0xfa); db(0x00); db(0x66); db(0x22); db(0xd8); db(0x51); db(0xc8); + db(0xff); db(0xfc); db(0x41); db(0xea); db(0x00); db(0x30); db(0x20); db(0x84); + db(0x41); db(0xea); db(0x00); db(0x52); db(0x20); db(0x84); db(0x41); db(0xea); + db(0x00); db(0x0a); db(0x20); db(0x08); db(0x22); db(0x4c); db(0x30); db(0x7c); + db(0xff); db(0x6a); db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x41); db(0xea); + db(0x00); db(0x0e); db(0x20); db(0x80); db(0x41); db(0xea); db(0x00); db(0x00); + db(0x20); db(0x08); db(0x22); db(0x4c); db(0x30); db(0x7c); db(0xfd); db(0x00); + db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x41); db(0xea); db(0x00); db(0x04); + db(0x20); db(0x80); db(0x41); db(0xea); db(0x00); db(0x44); db(0x20); db(0x08); + db(0x22); db(0x4c); db(0x30); db(0x7c); db(0xff); db(0x64); db(0x4e); db(0xae); + db(0xfe); db(0x5c); db(0x41); db(0xea); db(0x00); db(0x5c); db(0x20); db(0x80); + db(0x20); db(0x44); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xd1); + db(0x22); db(0x4a); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x00); db(0x00); + db(0x2f); db(0x01); db(0x4e); db(0xb9); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x60); db(0x08); db(0x2f); db(0x01); db(0x4e); db(0xb9); db(0x00); db(0x00); + db(0x00); db(0x00); db(0x48); db(0xe7); db(0xf0); db(0xc0); db(0x26); db(0x00); + db(0x22); db(0x2f); db(0x00); db(0x18); db(0x4e); db(0xae); db(0xff); db(0xac); + db(0x24); db(0x00); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xca); + db(0x20); db(0x43); db(0x22); db(0x6f); db(0x00); db(0x18); db(0x4e); db(0xb9); + db(0x00); db(0x00); db(0x00); db(0x00); db(0x22); db(0x02); db(0x67); db(0x04); + db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x4c); db(0xdf); db(0x03); db(0x0f); + db(0x58); db(0x8f); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xc0); + db(0x20); db(0x41); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xcb); + db(0x4e); db(0xb9); db(0x00); db(0x00); db(0x00); db(0x00); db(0x4c); db(0xdf); + db(0x03); db(0x03); db(0x4e); db(0xb9); db(0x00); db(0x00); db(0x00); db(0x00); + db(0x4e); db(0x75); db(0x00); db(0x00); db(0x22); db(0x2f); db(0x00); db(0x08); + db(0x20); db(0x2f); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x3a); + db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x03); db(0x00); db(0x1e); db(0x2f); + db(0x00); db(0x0f); db(0x7c); db(0x00); db(0x08); db(0x07); db(0x00); db(0x00); + db(0x67); db(0x02); db(0x52); db(0x86); db(0x08); db(0x07); db(0x00); db(0x01); + db(0x67); db(0x02); db(0x52); db(0x86); db(0x08); db(0x07); db(0x00); db(0x02); + db(0x67); db(0x02); db(0x52); db(0x86); db(0x20); db(0x06); db(0x4c); db(0xdf); + db(0x00); db(0xc0); db(0x4e); db(0x75); db(0x2f); db(0x07); db(0x2e); db(0x2f); + db(0x00); db(0x08); db(0x70); db(0x40); db(0xbe); db(0x80); db(0x6f); db(0x28); + db(0x70); db(0x4a); db(0xbe); db(0x80); db(0x67); db(0x22); db(0x70); db(0x5a); + db(0xbe); db(0x80); db(0x67); db(0x1c); db(0x70); db(0x5b); db(0xbe); db(0x80); + db(0x67); db(0x16); db(0x70); db(0x5c); db(0xbe); db(0x80); db(0x67); db(0x10); + db(0x70); db(0x5d); db(0xbe); db(0x80); db(0x67); db(0x0a); db(0x70); db(0x5e); + db(0xbe); db(0x80); db(0x67); db(0x04); db(0x70); db(0x01); db(0x60); db(0x02); + db(0x70); db(0x00); db(0x2e); db(0x1f); db(0x4e); db(0x75); db(0x9e); db(0xfc); + db(0x00); db(0x14); db(0x48); db(0xe7); db(0x37); db(0x34); db(0x2e); db(0x2f); + db(0x00); db(0x44); db(0x24); db(0x6f); db(0x00); db(0x40); db(0x26); db(0x6f); + db(0x00); db(0x3c); db(0x2a); db(0x6f); db(0x00); db(0x38); db(0x2c); db(0x07); + db(0x70); db(0x3f); db(0xdc); db(0x80); db(0x2f); db(0x47); db(0x00); db(0x28); + db(0x20); db(0x2f); db(0x00); db(0x28); db(0xb0); db(0x86); db(0x6e); db(0x00); + db(0x00); db(0xfe); db(0x2f); db(0x00); db(0x61); db(0x96); db(0x58); db(0x4f); + db(0x4a); db(0x80); db(0x66); db(0x00); db(0x00); db(0xe6); db(0x70); db(0x00); + db(0x10); db(0x13); db(0x02); db(0x40); db(0xff); db(0xf8); db(0x72); db(0x20); + db(0x90); db(0x81); db(0x67); db(0x4a); db(0x72); db(0x20); db(0x90); db(0x81); + db(0x66); db(0x00); db(0x00); db(0xd0); db(0x70); db(0x00); db(0x10); db(0x13); + db(0x2f); db(0x00); db(0x61); db(0x00); db(0xff); db(0x46); db(0x58); db(0x4f); + db(0x72); db(0x00); db(0x01); db(0xc1); db(0x2a); db(0x01); db(0x20); db(0x05); + db(0xd0); db(0x80); db(0xd1); db(0xad); db(0x00); db(0x0c); db(0x2f); db(0x52); + db(0x00); db(0x30); db(0x42); db(0xaf); db(0x00); db(0x24); db(0x20); db(0x2f); + db(0x00); db(0x24); db(0xb0); db(0x85); db(0x6c); db(0x00); db(0x00); db(0xa4); + db(0x70); db(0x00); db(0x20); db(0x6f); db(0x00); db(0x30); db(0x10); db(0x10); + db(0xd1); db(0xad); db(0x00); db(0x0c); db(0x52); db(0xaf); db(0x00); db(0x24); + db(0x54); db(0xaf); db(0x00); db(0x30); db(0x60); db(0xe0); db(0x70); db(0x00); + db(0x10); db(0x13); db(0x2f); db(0x00); db(0x61); db(0x00); db(0xff); db(0x04); db(0x58); db(0x4f); db(0x72); db(0x00); db(0x01); db(0xc1); db(0x2a); db(0x01); db(0x20); db(0x05); db(0xd0); db(0x80); db(0xd1); db(0xad); db(0x00); db(0x0c); - db(0x2f); db(0x52); db(0x00); db(0x30); db(0x42); db(0xaf); db(0x00); db(0x24); - db(0x20); db(0x2f); db(0x00); db(0x24); db(0xb0); db(0x85); db(0x6c); db(0x00); - db(0x00); db(0xa4); db(0x70); db(0x00); db(0x20); db(0x6f); db(0x00); db(0x30); - db(0x10); db(0x10); db(0xd1); db(0xad); db(0x00); db(0x0c); db(0x52); db(0xaf); - db(0x00); db(0x24); db(0x54); db(0xaf); db(0x00); db(0x30); db(0x60); db(0xe0); + db(0x2f); db(0x52); db(0x00); db(0x2c); db(0x42); db(0xaf); db(0x00); db(0x24); + db(0x20); db(0x2f); db(0x00); db(0x24); db(0xb0); db(0x85); db(0x6c); db(0x62); + db(0x20); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x10); db(0x72); db(0x08); + db(0xb0); db(0x01); db(0x66); db(0x44); db(0x72); db(0x00); db(0x12); db(0x28); + db(0x00); db(0x01); db(0x24); db(0x01); db(0xe8); db(0x82); db(0x76); db(0x0f); + db(0xc4); db(0x83); db(0x3f); db(0x42); db(0x00); db(0x22); db(0x67); db(0x1e); + db(0x3b); db(0x42); db(0x00); db(0x04); db(0x70); db(0x00); db(0x10); db(0x28); + db(0x00); db(0x01); db(0x22); db(0x00); db(0xc2); db(0x83); db(0x3f); db(0x41); + db(0x00); db(0x22); db(0xb2); db(0x6d); db(0x00); db(0x02); db(0x6f); db(0x20); + db(0x3b); db(0x41); db(0x00); db(0x02); db(0x60); db(0x1a); db(0x74); db(0x00); + db(0x14); db(0x01); db(0xc4); db(0x83); db(0x3f); db(0x42); db(0x00); db(0x22); + db(0xb4); db(0x55); db(0x6f); db(0x0c); db(0x3a); db(0x82); db(0x60); db(0x08); + db(0x53); db(0x00); db(0x66); db(0x04); db(0x52); db(0x6d); db(0x00); db(0x06); + db(0x52); db(0xaf); db(0x00); db(0x24); db(0x54); db(0xaf); db(0x00); db(0x2c); + db(0x60); db(0x96); db(0x52); db(0xaf); db(0x00); db(0x28); db(0x52); db(0x8b); + db(0x58); db(0x8a); db(0x60); db(0x00); db(0xfe); db(0xfc); db(0x4c); db(0xdf); + db(0x2c); db(0xec); db(0xde); db(0xfc); db(0x00); db(0x14); db(0x4e); db(0x75); + db(0x48); db(0xe7); db(0x01); db(0x34); db(0x2e); db(0x2f); db(0x00); db(0x1c); + db(0x26); db(0x6f); db(0x00); db(0x18); db(0x2a); db(0x6f); db(0x00); db(0x14); + db(0x24); db(0x6d); db(0x00); db(0x10); db(0x20); db(0x4b); db(0x22); db(0x6d); + db(0x00); db(0x10); db(0x20); db(0x07); db(0x60); db(0x02); db(0x12); db(0xd8); + db(0x53); db(0x80); db(0x64); db(0xfa); db(0x20); db(0x6d); db(0x00); db(0x10); + db(0xd1); db(0xc7); db(0x2b); db(0x48); db(0x00); db(0x10); db(0xdf); db(0xad); + db(0x00); db(0x14); db(0x20); db(0x0a); db(0x4c); db(0xdf); db(0x2c); db(0x80); + db(0x4e); db(0x75); db(0x9e); db(0xfc); db(0x00); db(0x1c); db(0x48); db(0xe7); + db(0x07); db(0x34); db(0x2e); db(0x2f); db(0x00); db(0x4c); db(0x24); db(0x6f); + db(0x00); db(0x40); db(0x26); db(0x6f); db(0x00); db(0x3c); db(0x2a); db(0x6f); + db(0x00); db(0x38); db(0x2c); db(0x07); db(0x70); db(0x3f); db(0xdc); db(0x80); + db(0x2f); db(0x47); db(0x00); db(0x20); db(0x20); db(0x2f); db(0x00); db(0x20); + db(0xb0); db(0x86); db(0x6e); db(0x00); db(0x01); db(0xa0); db(0x2f); db(0x00); + db(0x61); db(0x00); db(0xfe); db(0x2a); db(0x58); db(0x4f); db(0x4a); db(0x80); + db(0x67); db(0x06); db(0x70); db(0x40); db(0xd0); db(0x80); db(0x60); db(0x04); + db(0x70); db(0x00); db(0x10); db(0x13); db(0x72); db(0x00); db(0x12); db(0x00); + db(0x02); db(0x41); db(0xff); db(0xf8); db(0x1f); db(0x40); db(0x00); db(0x1a); + db(0x4a); db(0x81); db(0x67); db(0x00); db(0x01); db(0x64); db(0x70); db(0x20); + db(0x92); db(0x80); db(0x67); db(0x00); db(0x00); db(0xa8); db(0x70); db(0x20); + db(0x92); db(0x80); db(0x67); db(0x04); db(0x60); db(0x00); db(0x01); db(0x4e); db(0x70); db(0x00); db(0x10); db(0x13); db(0x2f); db(0x00); db(0x61); db(0x00); - db(0xff); db(0x04); db(0x58); db(0x4f); db(0x72); db(0x00); db(0x01); db(0xc1); - db(0x2a); db(0x01); db(0x20); db(0x05); db(0xd0); db(0x80); db(0xd1); db(0xad); - db(0x00); db(0x0c); db(0x2f); db(0x52); db(0x00); db(0x2c); db(0x42); db(0xaf); - db(0x00); db(0x24); db(0x20); db(0x2f); db(0x00); db(0x24); db(0xb0); db(0x85); - db(0x6c); db(0x62); db(0x20); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x10); - db(0x72); db(0x08); db(0xb0); db(0x01); db(0x66); db(0x44); db(0x72); db(0x00); - db(0x12); db(0x28); db(0x00); db(0x01); db(0x24); db(0x01); db(0xe8); db(0x82); - db(0x76); db(0x0f); db(0xc4); db(0x83); db(0x3f); db(0x42); db(0x00); db(0x22); - db(0x67); db(0x1e); db(0x3b); db(0x42); db(0x00); db(0x04); db(0x70); db(0x00); - db(0x10); db(0x28); db(0x00); db(0x01); db(0x22); db(0x00); db(0xc2); db(0x83); - db(0x3f); db(0x41); db(0x00); db(0x22); db(0xb2); db(0x6d); db(0x00); db(0x02); - db(0x6f); db(0x20); db(0x3b); db(0x41); db(0x00); db(0x02); db(0x60); db(0x1a); - db(0x74); db(0x00); db(0x14); db(0x01); db(0xc4); db(0x83); db(0x3f); db(0x42); - db(0x00); db(0x22); db(0xb4); db(0x55); db(0x6f); db(0x0c); db(0x3a); db(0x82); - db(0x60); db(0x08); db(0x53); db(0x00); db(0x66); db(0x04); db(0x52); db(0x6d); - db(0x00); db(0x06); db(0x52); db(0xaf); db(0x00); db(0x24); db(0x54); db(0xaf); - db(0x00); db(0x2c); db(0x60); db(0x96); db(0x52); db(0xaf); db(0x00); db(0x28); - db(0x52); db(0x8b); db(0x58); db(0x8a); db(0x60); db(0x00); db(0xfe); db(0xfc); - db(0x4c); db(0xdf); db(0x2c); db(0xec); db(0xde); db(0xfc); db(0x00); db(0x14); - db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x01); db(0x34); db(0x2e); db(0x2f); - db(0x00); db(0x1c); db(0x26); db(0x6f); db(0x00); db(0x18); db(0x2a); db(0x6f); - db(0x00); db(0x14); db(0x24); db(0x6d); db(0x00); db(0x10); db(0x20); db(0x4b); - db(0x22); db(0x6d); db(0x00); db(0x10); db(0x20); db(0x07); db(0x60); db(0x02); - db(0x12); db(0xd8); db(0x53); db(0x80); db(0x64); db(0xfa); db(0x20); db(0x6d); - db(0x00); db(0x10); db(0xd1); db(0xc7); db(0x2b); db(0x48); db(0x00); db(0x10); - db(0xdf); db(0xad); db(0x00); db(0x14); db(0x20); db(0x0a); db(0x4c); db(0xdf); - db(0x2c); db(0x80); db(0x4e); db(0x75); db(0x9e); db(0xfc); db(0x00); db(0x1c); - db(0x48); db(0xe7); db(0x07); db(0x34); db(0x2e); db(0x2f); db(0x00); db(0x4c); - db(0x24); db(0x6f); db(0x00); db(0x40); db(0x26); db(0x6f); db(0x00); db(0x3c); - db(0x2a); db(0x6f); db(0x00); db(0x38); db(0x2c); db(0x07); db(0x70); db(0x3f); - db(0xdc); db(0x80); db(0x2f); db(0x47); db(0x00); db(0x20); db(0x20); db(0x2f); - db(0x00); db(0x20); db(0xb0); db(0x86); db(0x6e); db(0x00); db(0x01); db(0xa0); - db(0x2f); db(0x00); db(0x61); db(0x00); db(0xfe); db(0x2a); db(0x58); db(0x4f); - db(0x4a); db(0x80); db(0x67); db(0x06); db(0x70); db(0x40); db(0xd0); db(0x80); - db(0x60); db(0x04); db(0x70); db(0x00); db(0x10); db(0x13); db(0x72); db(0x00); - db(0x12); db(0x00); db(0x02); db(0x41); db(0xff); db(0xf8); db(0x1f); db(0x40); - db(0x00); db(0x1a); db(0x4a); db(0x81); db(0x67); db(0x00); db(0x01); db(0x64); - db(0x70); db(0x20); db(0x92); db(0x80); db(0x67); db(0x00); db(0x00); db(0xa8); - db(0x70); db(0x20); db(0x92); db(0x80); db(0x67); db(0x04); db(0x60); db(0x00); - db(0x01); db(0x4e); db(0x70); db(0x00); db(0x10); db(0x13); db(0x2f); db(0x00); - db(0x61); db(0x00); db(0xfd); db(0xc2); db(0x72); db(0x00); db(0x01); db(0xc1); - db(0x2a); db(0x01); db(0x22); db(0x6f); db(0x00); db(0x48); db(0x20); db(0x51); - db(0x22); db(0x6f); db(0x00); db(0x4c); db(0x22); db(0xad); db(0x00); db(0x14); - db(0x20); db(0x05); db(0xd0); db(0x80); db(0x2e); db(0x80); db(0x2f); db(0x08); - db(0x2f); db(0x0d); db(0x2f); db(0x48); db(0x00); db(0x3c); db(0x61); db(0x00); - db(0xff); db(0x32); db(0x4f); db(0xef); db(0x00); db(0x0c); db(0x22); db(0x05); - db(0xd2); db(0x81); db(0x42); db(0xaf); db(0x00); db(0x1c); db(0x2f); db(0x40); - db(0x00); db(0x28); db(0x1f); db(0x41); db(0x00); db(0x1b); db(0x20); db(0x2f); - db(0x00); db(0x1c); db(0xb0); db(0x85); db(0x6c); db(0x00); db(0x01); db(0x04); - db(0x20); db(0x6f); db(0x00); db(0x30); db(0x10); db(0x10); db(0x20); db(0x6f); - db(0x00); db(0x28); db(0x10); db(0x80); db(0x11); db(0x6f); db(0x00); db(0x1b); - db(0x00); db(0x01); db(0x22); db(0x6f); db(0x00); db(0x44); db(0x20); db(0x51); - db(0x70); db(0x00); db(0x22); db(0x6f); db(0x00); db(0x30); db(0x10); db(0x29); - db(0x00); db(0x01); db(0xd0); db(0xc0); db(0x70); db(0x00); db(0x10); db(0x11); - db(0x2f); db(0x00); db(0x2f); db(0x08); db(0x2f); db(0x0d); db(0x61); db(0x00); - db(0xfe); db(0xe2); db(0x4f); db(0xef); db(0x00); db(0x0c); db(0x20); db(0x6f); - db(0x00); db(0x30); db(0x10); db(0x10); db(0xd1); db(0x2f); db(0x00); db(0x1b); - db(0x52); db(0xaf); db(0x00); db(0x1c); db(0x54); db(0xaf); db(0x00); db(0x30); - db(0x54); db(0xaf); db(0x00); db(0x28); db(0x60); db(0xa8); db(0x70); db(0x00); - db(0x10); db(0x13); db(0x2f); db(0x00); db(0x61); db(0x00); db(0xfd); db(0x26); - db(0x72); db(0x00); db(0x01); db(0xc1); db(0x2a); db(0x01); db(0x22); db(0x6f); - db(0x00); db(0x48); db(0x20); db(0x51); db(0x22); db(0x6f); db(0x00); db(0x4c); - db(0x22); db(0xad); db(0x00); db(0x14); db(0x20); db(0x05); db(0xd0); db(0x80); - db(0x2e); db(0x80); db(0x2f); db(0x08); db(0x2f); db(0x0d); db(0x2f); db(0x48); - db(0x00); db(0x38); db(0x61); db(0x00); db(0xfe); db(0x96); db(0x4f); db(0xef); - db(0x00); db(0x0c); db(0x22); db(0x05); db(0xd2); db(0x81); db(0x42); db(0xaf); - db(0x00); db(0x1c); db(0x2f); db(0x40); db(0x00); db(0x24); db(0x1f); db(0x41); - db(0x00); db(0x1b); db(0x20); db(0x2f); db(0x00); db(0x1c); db(0xb0); db(0x85); - db(0x6c); db(0x68); db(0x20); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x10); - db(0x20); db(0x6f); db(0x00); db(0x24); db(0x10); db(0x80); db(0x70); db(0x01); - db(0x20); db(0x6f); db(0x00); db(0x2c); db(0xb0); db(0x10); db(0x66); db(0x36); - db(0x20); db(0x6f); db(0x00); db(0x24); db(0x11); db(0x6f); db(0x00); db(0x1b); - db(0x00); db(0x01); db(0x22); db(0x6f); db(0x00); db(0x44); db(0x20); db(0x51); - db(0x70); db(0x00); db(0x22); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x29); - db(0x00); db(0x01); db(0xd0); db(0xc0); db(0x2f); db(0x2d); db(0x00); db(0x08); - db(0x2f); db(0x08); db(0x2f); db(0x0d); db(0x61); db(0x00); db(0xfe); db(0x3c); - db(0x4f); db(0xef); db(0x00); db(0x0c); db(0x20); db(0x2d); db(0x00); db(0x08); - db(0xd1); db(0x2f); db(0x00); db(0x1b); db(0x60); db(0x0a); db(0x22); db(0x6f); - db(0x00); db(0x24); db(0x13); db(0x68); db(0x00); db(0x01); db(0x00); db(0x01); - db(0x52); db(0xaf); db(0x00); db(0x1c); db(0x54); db(0xaf); db(0x00); db(0x2c); - db(0x54); db(0xaf); db(0x00); db(0x24); db(0x60); db(0x94); db(0x14); db(0xbc); - db(0x00); db(0x80); db(0x52); db(0xaf); db(0x00); db(0x20); db(0x52); db(0x8b); - db(0x52); db(0x8a); db(0x58); db(0xaf); db(0x00); db(0x44); db(0x58); db(0xaf); - db(0x00); db(0x48); db(0x60); db(0x00); db(0xfe); db(0x5a); db(0x4c); db(0xdf); - db(0x2c); db(0xe0); db(0xde); db(0xfc); db(0x00); db(0x1c); db(0x4e); db(0x75); - db(0x9e); db(0xfc); db(0x00); db(0x2c); db(0x48); db(0xe7); db(0x20); db(0x34); - db(0x26); db(0x6f); db(0x00); db(0x44); db(0x2a); db(0x6f); db(0x00); db(0x40); - db(0x20); db(0x0d); db(0x67); db(0x04); db(0x20); db(0x0b); db(0x66); db(0x06); - db(0x70); db(0x00); db(0x60); db(0x00); db(0x01); db(0xa2); db(0x4a); db(0x95); - db(0x67); db(0x2a); db(0x4a); db(0xad); db(0x00); db(0x10); db(0x67); db(0x24); - db(0x4a); db(0xad); db(0x00); db(0x04); db(0x67); db(0x1e); db(0x4a); db(0xad); - db(0x00); db(0x14); db(0x67); db(0x18); db(0x4a); db(0xad); db(0x00); db(0x08); - db(0x67); db(0x12); db(0x4a); db(0xad); db(0x00); db(0x18); db(0x67); db(0x0c); - db(0x4a); db(0xad); db(0x00); db(0x0c); db(0x67); db(0x06); db(0x4a); db(0xad); - db(0x00); db(0x1c); db(0x66); db(0x06); db(0x70); db(0x00); db(0x60); db(0x00); - db(0x01); db(0x6e); db(0x70); db(0x00); db(0x41); db(0xef); db(0x00); db(0x24); - db(0x72); db(0x17); db(0x10); db(0xc0); db(0x51); db(0xc9); db(0xff); db(0xfc); - db(0x2f); db(0x7c); db(0x00); db(0x00); db(0x02); db(0xa2); db(0x00); db(0x30); - db(0x2f); db(0x00); db(0x2f); db(0x2d); db(0x00); db(0x04); db(0x2f); db(0x15); - db(0x48); db(0x6f); db(0x00); db(0x30); db(0x61); db(0x00); db(0xfc); db(0x4a); - db(0x48); db(0x78); db(0x00); db(0x40); db(0x2f); db(0x2d); db(0x00); db(0x14); - db(0x2f); db(0x2d); db(0x00); db(0x10); db(0x48); db(0x6f); db(0x00); db(0x40); - db(0x61); db(0x00); db(0xfc); db(0x36); db(0x4f); db(0xef); db(0x00); db(0x20); - db(0x30); db(0x2f); db(0x00); db(0x2a); db(0x67); db(0x24); db(0x32); db(0x2f); - db(0x00); db(0x28); db(0x67); db(0x0a); db(0x34); db(0x2f); db(0x00); db(0x26); - db(0x52); db(0x42); db(0xc5); db(0xc1); db(0x60); db(0x0a); db(0x32); db(0x2f); - db(0x00); db(0x24); db(0x48); db(0xc1); db(0x52); db(0x81); db(0x24); db(0x01); - db(0x2f); db(0x42); db(0x00); db(0x2c); db(0xc1); db(0xc2); db(0xd1); db(0xaf); - db(0x00); db(0x30); db(0x42); db(0xa7); db(0x2f); db(0x2f); db(0x00); db(0x34); - db(0x61); db(0x00); db(0xfb); db(0x8c); db(0x50); db(0x4f); db(0x2f); db(0x40); - db(0x00); db(0x14); db(0x67); db(0x00); db(0x00); db(0xee); db(0x2f); db(0x40); - db(0x00); db(0x34); db(0x1f); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x12); - db(0x20); db(0x2f); db(0x00); db(0x2c); db(0x1f); db(0x40); db(0x00); db(0x13); - db(0x48); db(0x78); db(0x00); db(0x02); db(0x48); db(0x6f); db(0x00); db(0x16); - db(0x48); db(0x6f); db(0x00); db(0x2c); db(0x61); db(0x00); db(0xfd); db(0x04); - db(0x48); db(0x78); db(0x00); db(0x40); db(0x2f); db(0x15); db(0x48); db(0x6f); - db(0x00); db(0x38); db(0x61); db(0x00); db(0xfc); db(0xf6); db(0x48); db(0x78); - db(0x00); db(0x40); db(0x2f); db(0x2d); db(0x00); db(0x10); db(0x48); db(0x6f); - db(0x00); db(0x44); db(0x2f); db(0x40); db(0x00); db(0x40); db(0x61); db(0x00); - db(0xfc); db(0xe2); db(0x48); db(0x78); db(0x01); db(0x00); db(0x2f); db(0x2d); - db(0x00); db(0x04); db(0x48); db(0x6f); db(0x00); db(0x50); db(0x2f); db(0x40); - db(0x00); db(0x48); db(0x61); db(0x00); db(0xfc); db(0xce); db(0x24); db(0x40); - db(0x48); db(0x78); db(0x01); db(0x00); db(0x2f); db(0x2d); db(0x00); db(0x14); - db(0x48); db(0x6f); db(0x00); db(0x5c); db(0x61); db(0x00); db(0xfc); db(0xbc); - db(0x48); db(0x78); db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x08); - db(0x48); db(0x6f); db(0x00); db(0x68); db(0x2f); db(0x40); db(0x00); db(0x68); - db(0x61); db(0x00); db(0xfc); db(0xa8); db(0x4f); db(0xef); db(0x00); db(0x48); - db(0x48); db(0x78); db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x18); - db(0x48); db(0x6f); db(0x00); db(0x2c); db(0x61); db(0x00); db(0xfc); db(0x94); - db(0x48); db(0x78); db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x0c); - db(0x48); db(0x6f); db(0x00); db(0x38); db(0x61); db(0x00); db(0xfc); db(0x84); - db(0x48); db(0x78); db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x1c); - db(0x48); db(0x6f); db(0x00); db(0x44); db(0x61); db(0x00); db(0xfc); db(0x74); - db(0x42); db(0x97); db(0x2f); db(0x0a); db(0x2f); db(0x2d); db(0x00); db(0x04); - db(0x2f); db(0x2f); db(0x00); db(0x48); db(0x2f); db(0x15); db(0x48); db(0x6f); - db(0x00); db(0x58); db(0x61); db(0x00); db(0xfc); db(0x98); db(0x48); db(0x78); - db(0x00); db(0x40); db(0x2f); db(0x2f); db(0x00); db(0x5c); db(0x2f); db(0x2d); - db(0x00); db(0x14); db(0x2f); db(0x2f); db(0x00); db(0x5c); db(0x2f); db(0x2d); - db(0x00); db(0x10); db(0x48); db(0x6f); db(0x00); db(0x70); db(0x61); db(0x00); - db(0xfc); db(0x7c); db(0x4f); db(0xef); db(0x00); db(0x50); db(0x26); db(0xaf); - db(0x00); db(0x30); db(0x20); db(0x2f); db(0x00); db(0x14); db(0x4c); db(0xdf); - db(0x2c); db(0x04); db(0xde); db(0xfc); db(0x00); db(0x2c); db(0x4e); db(0x75); - db(0x41); db(0xfa); db(0xd7); db(0xa2); db(0x02); db(0x80); db(0x00); db(0x00); + db(0xfd); db(0xc2); db(0x72); db(0x00); db(0x01); db(0xc1); db(0x2a); db(0x01); + db(0x22); db(0x6f); db(0x00); db(0x48); db(0x20); db(0x51); db(0x22); db(0x6f); + db(0x00); db(0x4c); db(0x22); db(0xad); db(0x00); db(0x14); db(0x20); db(0x05); + db(0xd0); db(0x80); db(0x2e); db(0x80); db(0x2f); db(0x08); db(0x2f); db(0x0d); + db(0x2f); db(0x48); db(0x00); db(0x3c); db(0x61); db(0x00); db(0xff); db(0x32); + db(0x4f); db(0xef); db(0x00); db(0x0c); db(0x22); db(0x05); db(0xd2); db(0x81); + db(0x42); db(0xaf); db(0x00); db(0x1c); db(0x2f); db(0x40); db(0x00); db(0x28); + db(0x1f); db(0x41); db(0x00); db(0x1b); db(0x20); db(0x2f); db(0x00); db(0x1c); + db(0xb0); db(0x85); db(0x6c); db(0x00); db(0x01); db(0x04); db(0x20); db(0x6f); + db(0x00); db(0x30); db(0x10); db(0x10); db(0x20); db(0x6f); db(0x00); db(0x28); + db(0x10); db(0x80); db(0x11); db(0x6f); db(0x00); db(0x1b); db(0x00); db(0x01); + db(0x22); db(0x6f); db(0x00); db(0x44); db(0x20); db(0x51); db(0x70); db(0x00); + db(0x22); db(0x6f); db(0x00); db(0x30); db(0x10); db(0x29); db(0x00); db(0x01); + db(0xd0); db(0xc0); db(0x70); db(0x00); db(0x10); db(0x11); db(0x2f); db(0x00); + db(0x2f); db(0x08); db(0x2f); db(0x0d); db(0x61); db(0x00); db(0xfe); db(0xe2); + db(0x4f); db(0xef); db(0x00); db(0x0c); db(0x20); db(0x6f); db(0x00); db(0x30); + db(0x10); db(0x10); db(0xd1); db(0x2f); db(0x00); db(0x1b); db(0x52); db(0xaf); + db(0x00); db(0x1c); db(0x54); db(0xaf); db(0x00); db(0x30); db(0x54); db(0xaf); + db(0x00); db(0x28); db(0x60); db(0xa8); db(0x70); db(0x00); db(0x10); db(0x13); + db(0x2f); db(0x00); db(0x61); db(0x00); db(0xfd); db(0x26); db(0x72); db(0x00); + db(0x01); db(0xc1); db(0x2a); db(0x01); db(0x22); db(0x6f); db(0x00); db(0x48); + db(0x20); db(0x51); db(0x22); db(0x6f); db(0x00); db(0x4c); db(0x22); db(0xad); + db(0x00); db(0x14); db(0x20); db(0x05); db(0xd0); db(0x80); db(0x2e); db(0x80); + db(0x2f); db(0x08); db(0x2f); db(0x0d); db(0x2f); db(0x48); db(0x00); db(0x38); + db(0x61); db(0x00); db(0xfe); db(0x96); db(0x4f); db(0xef); db(0x00); db(0x0c); + db(0x22); db(0x05); db(0xd2); db(0x81); db(0x42); db(0xaf); db(0x00); db(0x1c); + db(0x2f); db(0x40); db(0x00); db(0x24); db(0x1f); db(0x41); db(0x00); db(0x1b); + db(0x20); db(0x2f); db(0x00); db(0x1c); db(0xb0); db(0x85); db(0x6c); db(0x68); + db(0x20); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x10); db(0x20); db(0x6f); + db(0x00); db(0x24); db(0x10); db(0x80); db(0x70); db(0x01); db(0x20); db(0x6f); + db(0x00); db(0x2c); db(0xb0); db(0x10); db(0x66); db(0x36); db(0x20); db(0x6f); + db(0x00); db(0x24); db(0x11); db(0x6f); db(0x00); db(0x1b); db(0x00); db(0x01); + db(0x22); db(0x6f); db(0x00); db(0x44); db(0x20); db(0x51); db(0x70); db(0x00); + db(0x22); db(0x6f); db(0x00); db(0x2c); db(0x10); db(0x29); db(0x00); db(0x01); + db(0xd0); db(0xc0); db(0x2f); db(0x2d); db(0x00); db(0x08); db(0x2f); db(0x08); + db(0x2f); db(0x0d); db(0x61); db(0x00); db(0xfe); db(0x3c); db(0x4f); db(0xef); + db(0x00); db(0x0c); db(0x20); db(0x2d); db(0x00); db(0x08); db(0xd1); db(0x2f); + db(0x00); db(0x1b); db(0x60); db(0x0a); db(0x22); db(0x6f); db(0x00); db(0x24); + db(0x13); db(0x68); db(0x00); db(0x01); db(0x00); db(0x01); db(0x52); db(0xaf); + db(0x00); db(0x1c); db(0x54); db(0xaf); db(0x00); db(0x2c); db(0x54); db(0xaf); + db(0x00); db(0x24); db(0x60); db(0x94); db(0x14); db(0xbc); db(0x00); db(0x80); + db(0x52); db(0xaf); db(0x00); db(0x20); db(0x52); db(0x8b); db(0x52); db(0x8a); + db(0x58); db(0xaf); db(0x00); db(0x44); db(0x58); db(0xaf); db(0x00); db(0x48); + db(0x60); db(0x00); db(0xfe); db(0x5a); db(0x4c); db(0xdf); db(0x2c); db(0xe0); + db(0xde); db(0xfc); db(0x00); db(0x1c); db(0x4e); db(0x75); db(0x9e); db(0xfc); + db(0x00); db(0x2c); db(0x48); db(0xe7); db(0x20); db(0x34); db(0x26); db(0x6f); + db(0x00); db(0x44); db(0x2a); db(0x6f); db(0x00); db(0x40); db(0x20); db(0x0d); + db(0x67); db(0x04); db(0x20); db(0x0b); db(0x66); db(0x06); db(0x70); db(0x00); + db(0x60); db(0x00); db(0x01); db(0xa2); db(0x4a); db(0x95); db(0x67); db(0x2a); + db(0x4a); db(0xad); db(0x00); db(0x10); db(0x67); db(0x24); db(0x4a); db(0xad); + db(0x00); db(0x04); db(0x67); db(0x1e); db(0x4a); db(0xad); db(0x00); db(0x14); + db(0x67); db(0x18); db(0x4a); db(0xad); db(0x00); db(0x08); db(0x67); db(0x12); + db(0x4a); db(0xad); db(0x00); db(0x18); db(0x67); db(0x0c); db(0x4a); db(0xad); + db(0x00); db(0x0c); db(0x67); db(0x06); db(0x4a); db(0xad); db(0x00); db(0x1c); + db(0x66); db(0x06); db(0x70); db(0x00); db(0x60); db(0x00); db(0x01); db(0x6e); + db(0x70); db(0x00); db(0x41); db(0xef); db(0x00); db(0x24); db(0x72); db(0x17); + db(0x10); db(0xc0); db(0x51); db(0xc9); db(0xff); db(0xfc); db(0x2f); db(0x7c); + db(0x00); db(0x00); db(0x02); db(0xa2); db(0x00); db(0x30); db(0x2f); db(0x00); + db(0x2f); db(0x2d); db(0x00); db(0x04); db(0x2f); db(0x15); db(0x48); db(0x6f); + db(0x00); db(0x30); db(0x61); db(0x00); db(0xfc); db(0x4a); db(0x48); db(0x78); + db(0x00); db(0x40); db(0x2f); db(0x2d); db(0x00); db(0x14); db(0x2f); db(0x2d); + db(0x00); db(0x10); db(0x48); db(0x6f); db(0x00); db(0x40); db(0x61); db(0x00); + db(0xfc); db(0x36); db(0x4f); db(0xef); db(0x00); db(0x20); db(0x30); db(0x2f); + db(0x00); db(0x2a); db(0x67); db(0x24); db(0x32); db(0x2f); db(0x00); db(0x28); + db(0x67); db(0x0a); db(0x34); db(0x2f); db(0x00); db(0x26); db(0x52); db(0x42); + db(0xc5); db(0xc1); db(0x60); db(0x0a); db(0x32); db(0x2f); db(0x00); db(0x24); + db(0x48); db(0xc1); db(0x52); db(0x81); db(0x24); db(0x01); db(0x2f); db(0x42); + db(0x00); db(0x2c); db(0xc1); db(0xc2); db(0xd1); db(0xaf); db(0x00); db(0x30); + db(0x42); db(0xa7); db(0x2f); db(0x2f); db(0x00); db(0x34); db(0x61); db(0x00); + db(0xfb); db(0x8c); db(0x50); db(0x4f); db(0x2f); db(0x40); db(0x00); db(0x14); + db(0x67); db(0x00); db(0x00); db(0xee); db(0x2f); db(0x40); db(0x00); db(0x34); + db(0x1f); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x12); db(0x20); db(0x2f); + db(0x00); db(0x2c); db(0x1f); db(0x40); db(0x00); db(0x13); db(0x48); db(0x78); + db(0x00); db(0x02); db(0x48); db(0x6f); db(0x00); db(0x16); db(0x48); db(0x6f); + db(0x00); db(0x2c); db(0x61); db(0x00); db(0xfd); db(0x04); db(0x48); db(0x78); + db(0x00); db(0x40); db(0x2f); db(0x15); db(0x48); db(0x6f); db(0x00); db(0x38); + db(0x61); db(0x00); db(0xfc); db(0xf6); db(0x48); db(0x78); db(0x00); db(0x40); + db(0x2f); db(0x2d); db(0x00); db(0x10); db(0x48); db(0x6f); db(0x00); db(0x44); + db(0x2f); db(0x40); db(0x00); db(0x40); db(0x61); db(0x00); db(0xfc); db(0xe2); + db(0x48); db(0x78); db(0x01); db(0x00); db(0x2f); db(0x2d); db(0x00); db(0x04); + db(0x48); db(0x6f); db(0x00); db(0x50); db(0x2f); db(0x40); db(0x00); db(0x48); + db(0x61); db(0x00); db(0xfc); db(0xce); db(0x24); db(0x40); db(0x48); db(0x78); + db(0x01); db(0x00); db(0x2f); db(0x2d); db(0x00); db(0x14); db(0x48); db(0x6f); + db(0x00); db(0x5c); db(0x61); db(0x00); db(0xfc); db(0xbc); db(0x48); db(0x78); + db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x08); db(0x48); db(0x6f); + db(0x00); db(0x68); db(0x2f); db(0x40); db(0x00); db(0x68); db(0x61); db(0x00); + db(0xfc); db(0xa8); db(0x4f); db(0xef); db(0x00); db(0x48); db(0x48); db(0x78); + db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x18); db(0x48); db(0x6f); + db(0x00); db(0x2c); db(0x61); db(0x00); db(0xfc); db(0x94); db(0x48); db(0x78); + db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x0c); db(0x48); db(0x6f); + db(0x00); db(0x38); db(0x61); db(0x00); db(0xfc); db(0x84); db(0x48); db(0x78); + db(0x00); db(0x08); db(0x2f); db(0x2d); db(0x00); db(0x1c); db(0x48); db(0x6f); + db(0x00); db(0x44); db(0x61); db(0x00); db(0xfc); db(0x74); db(0x42); db(0x97); + db(0x2f); db(0x0a); db(0x2f); db(0x2d); db(0x00); db(0x04); db(0x2f); db(0x2f); + db(0x00); db(0x48); db(0x2f); db(0x15); db(0x48); db(0x6f); db(0x00); db(0x58); + db(0x61); db(0x00); db(0xfc); db(0x98); db(0x48); db(0x78); db(0x00); db(0x40); + db(0x2f); db(0x2f); db(0x00); db(0x5c); db(0x2f); db(0x2d); db(0x00); db(0x14); + db(0x2f); db(0x2f); db(0x00); db(0x5c); db(0x2f); db(0x2d); db(0x00); db(0x10); + db(0x48); db(0x6f); db(0x00); db(0x70); db(0x61); db(0x00); db(0xfc); db(0x7c); + db(0x4f); db(0xef); db(0x00); db(0x50); db(0x26); db(0xaf); db(0x00); db(0x30); + db(0x20); db(0x2f); db(0x00); db(0x14); db(0x4c); db(0xdf); db(0x2c); db(0x04); + db(0xde); db(0xfc); db(0x00); db(0x2c); db(0x4e); db(0x75); db(0x00); db(0x00); + db(0x41); db(0xfa); db(0xd6); db(0x82); db(0x02); db(0x80); db(0x00); db(0x00); db(0xff); db(0xff); db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x00); db(0x00); - db(0x41); db(0xfa); db(0xd7); db(0x92); db(0x02); db(0x80); db(0x00); db(0x00); + db(0x41); db(0xfa); db(0xd6); db(0x72); db(0x02); db(0x80); db(0x00); db(0x00); db(0xff); db(0xff); db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x4e); db(0x71); db(0x4e); db(0x71); db(0x69); db(0x6e); db(0x70); db(0x75); db(0x74); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x74); @@ -1347,5 +1383,8 @@ db(0x20); db(0x73); db(0x68); db(0x65); db(0x6c); db(0x6c); db(0x20); db(0x65); db(0x78); db(0x65); db(0x63); db(0x75); db(0x74); db(0x65); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); + db(0x00); db(0x75); db(0x61); db(0x65); db(0x2e); db(0x72); db(0x65); db(0x73); + db(0x6f); db(0x75); db(0x72); db(0x63); db(0x65); db(0x00); db(0x6d); db(0x69); + db(0x73); db(0x63); db(0x5f); db(0x66); db(0x75); db(0x6e); db(0x63); db(0x73); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x03); db(0xf2); diff --git a/gencpu.cpp b/gencpu.cpp index 10eff2f6..07b0c000 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -808,9 +808,9 @@ static void setpc (const char *format, ...) va_end (parms); if (using_mmu || using_prefetch || using_prefetch_020) - printf ("\tm68k_setpci (%s);\n", buffer); + printf ("\tm68k_setpci_j(%s);\n", buffer); else - printf ("\tm68k_setpc (%s);\n", buffer); + printf ("\tm68k_setpc_j(%s);\n", buffer); } static void incpc (const char *format, ...) @@ -3894,15 +3894,18 @@ static void gen_opcode (unsigned int opcode) if (cpu_level == 0) { genamode (NULL, Aipi, "7", sz_word, "sr", 1, 0, GF_NOREFILL); genamode (NULL, Aipi, "7", sz_long, "pc", 1, 0, GF_NOREFILL); + printf("\tuaecptr oldpc = %s;\n", getpc); printf ("\tregs.sr = sr;\n"); printf ("\tif (pc & 1) {\n"); printf ("\t\texception3i (0x%04X, pc);\n", opcode); printf ("\t\tgoto %s;\n", endlabelstr); printf ("\t}\n"); setpc ("pc"); + printf("\tbranch_stack_pop_rte(oldpc);\n"); makefromsr(); } else if (cpu_level == 1 && using_prefetch) { int old_brace_level = n_braces; + printf("\tuaecptr oldpc = %s;\n", getpc); printf ("\tuae_u16 newsr; uae_u32 newpc;\n"); printf ("\tfor (;;) {\n"); printf ("\t\tuaecptr a = m68k_areg (regs, 7);\n"); @@ -3927,11 +3930,13 @@ static void gen_opcode (unsigned int opcode) printf ("\t\tgoto %s;\n", endlabelstr); printf ("\t}\n"); setpc ("newpc"); + printf("\tbranch_stack_pop_rte(oldpc);\n"); check_ipl (); need_endlabel = 1; } else { int old_brace_level = n_braces; - printf ("\tuae_u16 newsr; uae_u32 newpc;\n"); + printf("\tuaecptr oldpc = %s;\n", getpc); + printf ("\tuae_u16 newsr; uae_u32 newpc;\n"); printf ("\tfor (;;) {\n"); printf ("\t\tuaecptr a = m68k_areg (regs, 7);\n"); printf ("\t\tuae_u16 sr = %s (a);\n", srcw); @@ -3990,6 +3995,7 @@ static void gen_opcode (unsigned int opcode) printf ("\t\tgoto %s;\n", endlabelstr); printf ("\t}\n"); setpc ("newpc"); + printf("\tbranch_stack_pop_rte(oldpc);\n"); check_ipl (); need_endlabel = 1; } @@ -4079,6 +4085,8 @@ static void gen_opcode (unsigned int opcode) } else { printf ("\tm68k_do_rts ();\n"); } + printf("\tif (debugmem_trace)\n"); + printf("\t\tbranch_stack_pop_rts(pc);\n"); printf ("\tif (%s & 1) {\n", getpc); printf ("\t\tuaecptr faultpc = %s;\n", getpc); setpc ("pc"); @@ -4126,7 +4134,8 @@ static void gen_opcode (unsigned int opcode) no_prefetch_ce020 = true; genamode (curi, curi->smode, "srcreg", curi->size, "src", 0, 0, GF_AA|GF_NOREFILL); start_brace (); - printf ("\tuaecptr oldpc = %s + %d;\n", getpc, m68k_pc_offset); + printf("\tuaecptr oldpc = %s;\n", getpc); + printf("\tuaecptr nextpc = oldpc + %d;\n", m68k_pc_offset); if (using_exception_3) { printf ("\tif (srca & 1) {\n"); printf ("\t\texception3i (opcode, srca);\n"); @@ -4135,7 +4144,7 @@ static void gen_opcode (unsigned int opcode) need_endlabel = 1; } if (using_mmu) { - printf ("\t%s (m68k_areg (regs, 7) - 4, oldpc);\n", dstl); + printf ("\t%s (m68k_areg (regs, 7) - 4, nextpc);\n", dstl); printf ("\tm68k_areg (regs, 7) -= 4;\n"); setpc ("srca"); clear_m68k_offset(); @@ -4145,18 +4154,20 @@ static void gen_opcode (unsigned int opcode) if (curi->smode == Ad8r || curi->smode == PC8r) { addcycles000 (6); if (cpu_level <= 1 && using_prefetch) - printf ("\toldpc += 2;\n"); + printf ("\tnextpc += 2;\n"); } setpc ("srca"); clear_m68k_offset(); fill_prefetch_1 (0); printf ("\tm68k_areg (regs, 7) -= 4;\n"); if (using_ce || using_prefetch) { - printf ("\t%s (m68k_areg (regs, 7), oldpc >> 16);\n", dstw); - printf ("\t%s (m68k_areg (regs, 7) + 2, oldpc);\n", dstw); + printf ("\t%s (m68k_areg (regs, 7), nextpc >> 16);\n", dstw); + printf ("\t%s (m68k_areg (regs, 7) + 2, nextpc);\n", dstw); } else { - printf ("\t%s (m68k_areg (regs, 7), oldpc);\n", dstl); + printf ("\t%s (m68k_areg (regs, 7), nextpc);\n", dstl); } + printf("\tif (debugmem_trace)\n"); + printf("\t\tbranch_stack_push(oldpc, nextpc);\n"); } count_write += 2; fill_prefetch_full_020 (); @@ -4205,21 +4216,25 @@ static void gen_opcode (unsigned int opcode) need_endlabel = 1; } addcycles000 (2); + printf("\tuaecptr oldpc = %s;\n", getpc); + printf("\tuaecptr nextpc = oldpc + %d;\n", m68k_pc_offset); if (using_indirect > 0 && !using_ce020 && !using_prefetch_020 && !using_ce) { - printf("\tm68k_do_bsri_jit (%s + %d, s);\n", getpc, m68k_pc_offset); + printf("\tm68k_do_bsri_jit (nextpc, s);\n"); } else if (using_mmu) { - printf ("\tm68k_do_bsr_mmu%s (%s + %d, s);\n", mmu_postfix, getpc, m68k_pc_offset); + printf ("\tm68k_do_bsr_mmu%s (nextpc, s);\n", mmu_postfix); } else if (using_ce020 == 1) { - printf ("\tm68k_do_bsr_ce020 (%s + %d, s);\n", getpc, m68k_pc_offset); + printf ("\tm68k_do_bsr_ce020 (nextpc, s);\n"); } else if (using_ce020 == 2) { - printf ("\tm68k_do_bsr_ce030 (%s + %d, s);\n", getpc, m68k_pc_offset); + printf ("\tm68k_do_bsr_ce030 (nextpc, s);\n"); } else if (using_ce) { - printf ("\tm68k_do_bsr_ce (%s + %d, s);\n", getpc, m68k_pc_offset); + printf ("\tm68k_do_bsr_ce (nextpc, s);\n"); } else if (using_prefetch || using_prefetch_020) { - printf ("\tm68k_do_bsri (%s + %d, s);\n", getpc, m68k_pc_offset); + printf ("\tm68k_do_bsri (nextpc, s);\n"); } else { - printf ("\tm68k_do_bsr (%s + %d, s);\n", getpc, m68k_pc_offset); + printf ("\tm68k_do_bsr (nextpc, s);\n"); } + printf("\tif (debugmem_trace)\n"); + printf("\t\tbranch_stack_push(oldpc, nextpc);\n"); count_write += 2; clear_m68k_offset(); fill_prefetch_full (); diff --git a/include/debug.h b/include/debug.h index 4d526362..404a7d6f 100644 --- a/include/debug.h +++ b/include/debug.h @@ -15,7 +15,7 @@ #ifdef DEBUGGER #define MAX_HIST 500 -#define MAX_LINEWIDTH 150 +#define MAX_LINEWIDTH 10000 extern int debugging; extern int memwatch_enabled; @@ -30,7 +30,8 @@ extern uae_u64 debug_illegal_mask; extern void debug (void); extern void debugger_change (int mode); -extern void activate_debugger (void); +extern void activate_debugger(void); +extern void activate_debugger_new(void); extern void deactivate_debugger (void); extern int notinrom (void); extern const TCHAR *debuginfo (int); diff --git a/include/debugmem.h b/include/debugmem.h new file mode 100644 index 00000000..f3c12ca7 --- /dev/null +++ b/include/debugmem.h @@ -0,0 +1,30 @@ + +uaecptr debugmem_reloc(uaecptr exeaddress, uae_u32 len, uaecptr task, uae_u32 *stack); +void debugmem_init(void); +uaecptr debugmem_allocmem(int mode, uae_u32 size, uae_u32 flags, uae_u32 caller); +uae_u32 debugmem_freemem(int mode, uaecptr addr, uae_u32 size, uae_u32 caller); +void debugmem_addsegs(TrapContext *ctx, uaecptr seg, uaecptr name, uae_u32 lock); +void debugmem_remsegs(uaecptr seg); +uae_u32 debugmem_exit(void); +bool debugmem_break(int); +bool debugmem_inhibit_break(int mode); +void debugmem_disable(void); +void debugmem_enable(void); +int debugmem_get_segment(uaecptr addr, bool *exact, bool *ext, TCHAR *out, TCHAR *name); +int debugmem_get_symbol(uaecptr addr, TCHAR *out, int maxsize); +bool debugmem_get_symbol_value(const TCHAR *name, uae_u32 *valp); +bool debugmem_list_segment(int mode, uaecptr addr); +int debugmem_get_sourceline(uaecptr addr, TCHAR *out, int maxsize); +bool debugmem_get_range(uaecptr*, uaecptr*); +bool debugmem_isactive(void); +bool debugger_load_libraries(void); +void debugger_scan_libraries(void); +bool debugger_get_library_symbol(uaecptr base, uaecptr addr, TCHAR *out); +bool debugmem_list_stackframe(bool super); +bool debugmem_break_stack_pop(void); +bool debugmem_break_stack_push(void); +bool debugmem_enable_stackframe(bool enable); + +extern uae_u32 debugmem_chiplimit; +extern uae_u32 debugmem_chiphit(uaecptr addr, uae_u32 v, int size); +extern bool debugmem_extinvalidmem(uaecptr addr, uae_u32 v, int size); diff --git a/include/memory.h b/include/memory.h index 05e339a0..da72299c 100644 --- a/include/memory.h +++ b/include/memory.h @@ -189,6 +189,26 @@ struct autoconfig_info #define CE_MEMBANK_FAST16 4 //#define CE_MEMBANK_FAST16_EXTRA_ACCURACY 5 +#define MEMORY_LGETI(name) \ +static uae_u32 REGPARAM3 name ## _lgeti (uaecptr) REGPARAM; \ +static uae_u32 REGPARAM2 name ## _lgeti (uaecptr addr) \ +{ \ + uae_u8 *m; \ + addr -= name ## _bank.start & name ## _bank.mask; \ + addr &= name ## _bank.mask; \ + m = name ## _bank.baseaddr + addr; \ + return do_get_mem_long ((uae_u32 *)m); \ +} +#define MEMORY_WGETI(name) \ +static uae_u32 REGPARAM3 name ## _wgeti (uaecptr) REGPARAM; \ +static uae_u32 REGPARAM2 name ## _wgeti (uaecptr addr) \ +{ \ + uae_u8 *m; \ + addr -= name ## _bank.start & name ## _bank.mask; \ + addr &= name ## _bank.mask; \ + m = name ## _bank.baseaddr + addr; \ + return do_get_mem_word ((uae_u16 *)m); \ +} #define MEMORY_LGET(name) \ static uae_u32 REGPARAM3 name ## _lget (uaecptr) REGPARAM; \ static uae_u32 REGPARAM2 name ## _lget (uaecptr addr) \ @@ -404,6 +424,7 @@ extern addrbank bogomem_bank; extern addrbank z3fastmem_bank[MAX_RAM_BOARDS]; extern addrbank z3chipmem_bank; extern addrbank mem25bit_bank; +extern addrbank debugmem_bank; extern addrbank a3000lmem_bank; extern addrbank a3000hmem_bank; extern addrbank extendedkickmem_bank; @@ -496,6 +517,7 @@ extern void free_fastmemory (int); extern void set_roms_modified (void); extern void reload_roms(void); extern bool read_kickstart_version(struct uae_prefs *p); +extern void chipmem_setindirect(void); #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr)) #define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr)) diff --git a/include/newcpu.h b/include/newcpu.h index 3d709bd6..208b7183 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -346,6 +346,11 @@ uae_u32 mem_access_delay_longi_read_c040 (uaecptr addr); extern uae_u32(REGPARAM3 *x_cp_get_disp_ea_020)(uae_u32 base, int idx) REGPARAM; +extern bool debugmem_trace; +extern void branch_stack_push(uaecptr, uaecptr); +extern void branch_stack_pop_rte(uaecptr); +extern void branch_stack_pop_rts(uaecptr); + /* direct (regs.pc_p) access */ STATIC_INLINE void m68k_setpc(uaecptr newpc) @@ -353,6 +358,11 @@ STATIC_INLINE void m68k_setpc(uaecptr newpc) regs.pc_p = regs.pc_oldp = get_real_address(newpc); regs.instruction_pc = regs.pc = newpc; } +STATIC_INLINE void m68k_setpc_j(uaecptr newpc) +{ + regs.pc_p = regs.pc_oldp = get_real_address(newpc); + regs.pc = newpc; +} STATIC_INLINE uaecptr m68k_getpc(void) { return (uaecptr)(regs.pc + ((uae_u8*)regs.pc_p - (uae_u8*)regs.pc_oldp)); @@ -411,6 +421,10 @@ STATIC_INLINE void m68k_setpci(uaecptr newpc) { regs.instruction_pc = regs.pc = newpc; } +STATIC_INLINE void m68k_setpci_j(uaecptr newpc) +{ + regs.pc = newpc; +} STATIC_INLINE uaecptr m68k_getpci(void) { return regs.pc; @@ -605,10 +619,10 @@ extern uae_u32 REGPARAM3 get_disp_ea_020 (uae_u32 base, int idx) REGPARAM; extern uae_u32 REGPARAM3 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM; extern void REGPARAM3 put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM; -extern void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr); -extern void m68k_disasm (uaecptr addr, uaecptr *nextpc, int cnt); -extern void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, int safemode); -extern void sm68k_disasm (TCHAR*, TCHAR*, uaecptr addr, uaecptr *nextpc); +extern void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc); +extern void m68k_disasm (uaecptr addr, uaecptr *nextpc, uaecptr lastpc, int cnt); +extern void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode); +extern void sm68k_disasm (TCHAR*, TCHAR*, uaecptr addr, uaecptr *nextpc, uaecptr lastpc); extern int m68k_asm(TCHAR *buf, uae_u16 *out, uaecptr pc); extern int get_cpu_model (void); @@ -632,8 +646,7 @@ extern bool m68k_divl (uae_u32, uae_u32, uae_u16); extern bool m68k_mull (uae_u32, uae_u32, uae_u16); extern void init_m68k (void); extern void m68k_go (int); -extern void m68k_dumpstate (uaecptr *); -extern void m68k_dumpstate (uaecptr, uaecptr *); +extern void m68k_dumpstate(uaecptr *, uaecptr); extern void m68k_dumpcache (bool); extern int getDivu68kCycles (uae_u32 dividend, uae_u16 divisor); extern int getDivs68kCycles (uae_s32 dividend, uae_s16 divisor); diff --git a/include/options.h b/include/options.h index 3f23c71d..2cec5639 100644 --- a/include/options.h +++ b/include/options.h @@ -442,6 +442,7 @@ struct uae_prefs { bool socket_emu; bool start_debugger; + bool debugging_features; bool start_gui; KbdLang keyboard_lang; @@ -685,6 +686,8 @@ struct uae_prefs { uae_u32 mbresmem_low_size; uae_u32 mbresmem_high_size; uae_u32 mem25bit_size; + uae_u32 debugmem_start; + uae_u32 debugmem_size; int cpuboard_type; int cpuboard_subtype; int cpuboard_settings; diff --git a/memory.cpp b/memory.cpp index 21c2fd5d..c544eeb4 100644 --- a/memory.cpp +++ b/memory.cpp @@ -35,6 +35,7 @@ #include "threaddep/thread.h" #include "gayle.h" #include "debug.h" +#include "debugmem.h" #include "gfxboard.h" #include "cpuboard.h" #include "uae/ppc.h" @@ -216,8 +217,6 @@ static bool maybe_map_boot_rom(uaecptr addr) static void dummylog (int rw, uaecptr addr, int size, uae_u32 val, int ins) { - if (illegal_count >= MAX_ILG && MAX_ILG > 0) - return; /* ignore Zorro3 expansion space */ if (addr >= AUTOCONFIG_Z3 && addr <= AUTOCONFIG_Z3 + 0x200) return; @@ -231,6 +230,10 @@ static void dummylog (int rw, uaecptr addr, int size, uae_u32 val, int ins) return; if (addr >= 0x07f7fff0 && addr <= 0x07ffffff) return; + if (debugmem_extinvalidmem(addr, val, rw ? size : -size)) + return; + if (illegal_count >= MAX_ILG && MAX_ILG > 0) + return; if (MAX_ILG >= 0) illegal_count++; if (ins) { @@ -788,6 +791,51 @@ STATIC_INLINE uae_u8* REGPARAM2 chipmem_xlate_bigmem (uaecptr addr) return get_real_address (addr); } +STATIC_INLINE void REGPARAM2 chipmem_lput_debugmem(uaecptr addr, uae_u32 v) +{ + if (addr < debugmem_chiplimit) + debugmem_chiphit(addr, v, 4); + put_long(addr, v); +} +STATIC_INLINE void REGPARAM2 chipmem_wput_debugmem(uaecptr addr, uae_u32 v) +{ + if (addr < debugmem_chiplimit) + debugmem_chiphit(addr, v, 2); + put_word(addr, v); +} +STATIC_INLINE void REGPARAM2 chipmem_bput_debugmem(uaecptr addr, uae_u32 v) +{ + if (addr < debugmem_chiplimit) + debugmem_chiphit(addr, v, 1); + put_byte(addr, v); +} +STATIC_INLINE uae_u32 REGPARAM2 chipmem_lget_debugmem(uaecptr addr) +{ + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -4); + return get_long(addr); +} +STATIC_INLINE uae_u32 REGPARAM2 chipmem_wget_debugmem(uaecptr addr) +{ + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -2); + return get_word(addr); +} +STATIC_INLINE uae_u32 REGPARAM2 chipmem_bget_debugmem(uaecptr addr) +{ + if (addr < debugmem_chiplimit) + return debugmem_chiphit(addr, 0, -1); + return get_byte(addr); +} +STATIC_INLINE int REGPARAM2 chipmem_check_debugmem(uaecptr addr, uae_u32 size) +{ + return valid_address(addr, size); +} +STATIC_INLINE uae_u8* REGPARAM2 chipmem_xlate_debugmem(uaecptr addr) +{ + return get_real_address(addr); +} + uae_u32 (REGPARAM2 *chipmem_lget_indirect)(uaecptr); uae_u32 (REGPARAM2 *chipmem_wget_indirect)(uaecptr); uae_u32 (REGPARAM2 *chipmem_bget_indirect)(uaecptr); @@ -797,9 +845,18 @@ void (REGPARAM2 *chipmem_bput_indirect)(uaecptr, uae_u32); int (REGPARAM2 *chipmem_check_indirect)(uaecptr, uae_u32); uae_u8 *(REGPARAM2 *chipmem_xlate_indirect)(uaecptr); -static void chipmem_setindirect (void) +void chipmem_setindirect(void) { - if (currprefs.z3chipmem_size) { + if (debugmem_bank.baseaddr && debugmem_chiplimit) { + chipmem_lget_indirect = chipmem_lget_debugmem; + chipmem_wget_indirect = chipmem_wget_debugmem; + chipmem_bget_indirect = chipmem_bget_debugmem; + chipmem_lput_indirect = chipmem_lput_debugmem; + chipmem_wput_indirect = chipmem_wput_debugmem; + chipmem_bput_indirect = chipmem_bput_debugmem; + chipmem_check_indirect = chipmem_check_bigmem; + chipmem_xlate_indirect = chipmem_xlate_bigmem; + } else if (currprefs.z3chipmem_size) { chipmem_lget_indirect = chipmem_lget_bigmem; chipmem_wget_indirect = chipmem_wget_bigmem; chipmem_bget_indirect = chipmem_bget_bigmem; @@ -837,6 +894,12 @@ MEMORY_FUNCTIONS(a3000hmem); MEMORY_FUNCTIONS(mem25bit); +/* debugger memory */ + +MEMORY_FUNCTIONS(debugmem); +MEMORY_WGETI(debugmem); +MEMORY_LGETI(debugmem); + /* Kick memory */ uae_u16 kickstart_version; @@ -1065,7 +1128,7 @@ uae_u8 *REGPARAM2 default_xlate (uaecptr addr) write_log (_T("Your Amiga program just did something terribly stupid %08X PC=%08X\n"), addr, M68K_GETPC); if (debugging || DEBUG_STUPID) { activate_debugger (); - m68k_dumpstate (0); + m68k_dumpstate(NULL, 0xffffffff); } for (i = 0; i < 10; i++) { write_log (_T("%08X "), i >= 5 ? a3 : a2); @@ -1157,6 +1220,14 @@ addrbank mem25bit_bank = { ABFLAG_RAM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL, 0, 0 }; +addrbank debugmem_bank = { + debugmem_lget, debugmem_wget, debugmem_bget, + debugmem_lput, debugmem_wput, debugmem_bput, + debugmem_xlate, debugmem_check, NULL, _T("debugmem"), _T("debugger memory"), + debugmem_lgeti, debugmem_wgeti, + ABFLAG_RAM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL, 0, 0 +}; + addrbank a3000lmem_bank = { a3000lmem_lget, a3000lmem_wget, a3000lmem_bget, a3000lmem_lput, a3000lmem_wput, a3000lmem_bput, @@ -2114,6 +2185,19 @@ static void allocate_memory (void) need_hardreset = true; } } + if (debugmem_bank.reserved_size != currprefs.debugmem_size) { + mapped_free(&debugmem_bank); + + debugmem_bank.reserved_size = currprefs.debugmem_size; + debugmem_bank.mask = debugmem_bank.reserved_size - 1; + debugmem_bank.start = currprefs.debugmem_start; + if (debugmem_bank.reserved_size) { + if (!mapped_malloc(&debugmem_bank)) { + write_log(_T("Out of memory for debugger memory.\n")); + debugmem_bank.reserved_size = 0; + } + } + } if (mem25bit_bank.reserved_size != currprefs.mem25bit_size) { mapped_free(&mem25bit_bank); @@ -2597,6 +2681,8 @@ void memory_reset (void) map_banks(&a3000lmem_bank, a3000lmem_bank.start >> 16, a3000lmem_bank.allocated_size >> 16, 0); if (a3000hmem_bank.baseaddr) map_banks(&a3000hmem_bank, a3000hmem_bank.start >> 16, a3000hmem_bank.allocated_size >> 16, 0); + if (debugmem_bank.baseaddr) + map_banks(&debugmem_bank, debugmem_bank.start >> 16, debugmem_bank.allocated_size >> 16, 0); #ifdef CDTV if (cardmem_bank.baseaddr) map_banks (&cardmem_bank, cardmem_bank.start >> 16, cardmem_bank.allocated_size >> 16, 0); diff --git a/newcpu.cpp b/newcpu.cpp index 0d11f724..b1467d6d 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -32,6 +32,7 @@ #include "autoconf.h" #include "traps.h" #include "debug.h" +#include "debugmem.h" #include "gui.h" #include "savestate.h" #include "blitter.h" @@ -2159,14 +2160,14 @@ static void showea_val(TCHAR *buffer, uae_u16 opcode, uaecptr addr, int size) instr *table = &table68k[opcode]; if (addr >= 0xe90000 && addr < 0xf00000) - return; + goto skip; if (addr >= 0xdff000 && addr < 0xe00000) - return; + goto skip; for (lookup = lookuptab; lookup->mnemo != table->mnemo; lookup++) ; if (!(lookup->flags & 1)) - return; + goto skip; buffer += _tcslen(buffer); if (debug_safe_addr(addr, datasizes[size])) { bool cached = false; @@ -2237,6 +2238,13 @@ static void showea_val(TCHAR *buffer, uae_u16 opcode, uaecptr addr, int size) break; } } +skip: + for (int i = 0; i < size; i++) { + TCHAR name[256]; + if (debugmem_get_symbol(addr + i, name, sizeof(name) / sizeof(TCHAR))) { + _stprintf(buffer + _tcslen(buffer), _T(" %s"), name); + } + } } static uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode, wordsizes size, TCHAR *buf, uae_u32 *eaddr, int safemode) @@ -2431,6 +2439,9 @@ static uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode offset = (uae_s32)(uae_s8)get_iword_debug (pc); _stprintf (buffer, _T("#$%02x"), (uae_u32)(offset & 0xff)); addr = pc + 2 + offset; + if ((opcode & 0xf000) == 0x6000) { + showea_val(buffer, opcode, addr, 1); + } pc += 2; break; case imm1: @@ -2438,12 +2449,18 @@ static uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode buffer[0] = 0; _stprintf (buffer, _T("#$%04x"), (uae_u32)(offset & 0xffff)); addr = pc + offset; + if ((opcode & 0xf000) == 0x6000) { + showea_val(buffer, opcode, addr, 2); + } pc += 2; break; case imm2: offset = (uae_s32)get_ilong_debug (pc); _stprintf (buffer, _T("#$%08x"), (uae_u32)offset); addr = pc + offset; + if ((opcode & 0xf000) == 0x6000) { + showea_val(buffer, opcode, addr, 4); + } pc += 4; break; case immi: @@ -2454,7 +2471,7 @@ static uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode default: break; } - if (buf == 0) + if (buf == NULL) f_out (f, _T("%s"), buffer); else _tcscat (buf, buffer); @@ -3006,6 +3023,9 @@ kludge_me_do: return; } m68k_setpc (newpc); + if (interrupt) + regs.intmask = nr - 24; + branch_stack_push(currpc, currpc); regs.ir = x_get_word (m68k_getpc ()); // prefetch 1 x_do_cycles (2 * cpucycleunit); regs.ipl_pin = intlev(); @@ -3276,6 +3296,8 @@ static void Exception_mmu030 (int nr, uaecptr oldpc) exception3_read(regs.ir, newpc); return; } + if (interrupt) + regs.intmask = nr - 24; m68k_setpci (newpc); fill_prefetch (); exception_check_trace (nr); @@ -3344,6 +3366,8 @@ static void Exception_mmu (int nr, uaecptr oldpc) cache_default_data &= ~CACHE_DISABLE_ALLOCATE; m68k_setpci (newpc); + if (interrupt) + regs.intmask = nr - 24; fill_prefetch (); exception_check_trace (nr); } @@ -3606,11 +3630,14 @@ kludge_me_do: exception3_notinstruction(regs.ir, newpc); return; } + if (interrupt) + regs.intmask = nr - 24; m68k_setpc (newpc); cache_default_data &= ~CACHE_DISABLE_ALLOCATE; #ifdef JIT set_special (SPCFLAG_END_COMPILE); #endif + branch_stack_push(currpc, nextpc); fill_prefetch (); exception_check_trace (nr); } @@ -3697,7 +3724,6 @@ static void do_interrupt (int nr) for (;;) { Exception (nr + 24); - regs.intmask = nr; if (!currprefs.cpu_compatible || currprefs.cpu_model == 68060) break; if (m68k_interrupt_delay) @@ -3989,7 +4015,7 @@ uae_u32 REGPARAM2 op_illg (uae_u32 opcode) warned++; } Exception (0xB); - //activate_debugger (); + //activate_debugger_new(); return 4; } if ((opcode & 0xF000) == 0xA000) { @@ -3998,13 +4024,13 @@ uae_u32 REGPARAM2 op_illg (uae_u32 opcode) warned++; } Exception (0xA); - //activate_debugger(); + //activate_debugger_new(); return 4; } if (warned < 20) { write_log (_T("Illegal instruction: %04x at %08X -> %08X\n"), opcode, pc, get_long_debug(regs.vbr + 0x10)); warned++; - //activate_debugger(); + //activate_debugger_new(); } Exception (4); @@ -5512,10 +5538,10 @@ static void opcodedebug (uae_u32 pc, uae_u16 opcode, bool full) TCHAR buf[100]; if (full) write_log (_T("mmufixup=%d %04x %04x\n"), mmufixup[0].reg, regs.wb3_status, regs.mmu_ssw); - m68k_disasm_2 (buf, sizeof buf / sizeof (TCHAR), addr, NULL, 1, NULL, NULL, 0); + m68k_disasm_2 (buf, sizeof buf / sizeof (TCHAR), addr, NULL, 1, NULL, NULL, 0xffffffff, 0); write_log (_T("%s\n"), buf); if (full) - m68k_dumpstate (NULL); + m68k_dumpstate(NULL, 0xffffffff); } } @@ -7349,17 +7375,36 @@ int m68k_asm(TCHAR *sline, uae_u16 *out, uaecptr pc) return 0; } -void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, int safemode) +static void resolve_if_jmp(TCHAR *s, uae_u32 addr) +{ + uae_u16 opcode = get_word_debug(addr); + if (opcode == 0x4ef9) { // JMP x.l + TCHAR *p = s + _tcslen(s); + uae_u32 addr2 = get_long_debug(addr + 2); + _stprintf(p, _T(" == $%08x "), addr2); + showea_val(p + _tcslen(p), opcode, addr2, 4); + TCHAR txt[256]; + bool ext; + if (debugmem_get_segment(addr2, NULL, &ext, NULL, txt)) { + if (ext) { + _tcscat(p, _T(" ")); + _tcscat(p, txt); + } + } + } +} + + +void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode) { uae_u32 seaddr2; uae_u32 deaddr2; - if (buf) - memset (buf, 0, bufsize * sizeof (TCHAR)); if (!table68k) return; while (cnt-- > 0) { TCHAR instrname[100], *ccpt; + TCHAR segout[256], segname[256]; int i; uae_u32 opcode; uae_u16 extra; @@ -7368,6 +7413,8 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn uaecptr oldpc; uaecptr m68kpc_illg = 0; bool illegal = false; + int segid, lastsegid; + TCHAR *symbolpos; seaddr2 = deaddr2 = 0; oldpc = pc; @@ -7387,8 +7434,23 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn for (lookup = lookuptab;lookup->mnemo != dp->mnemo; lookup++) ; + lastsegid = -1; + bool exact = false; + if (lastpc != 0xffffffff) { + lastsegid = debugmem_get_segment(lastpc, NULL, NULL, NULL, NULL); + } + segid = debugmem_get_segment(pc, &exact, NULL, segout, segname); + if (segid && (lastsegid != -1 || exact) && (segid != lastsegid || pc == lastpc || exact)) { + buf = buf_out(buf, &bufsize, _T("%s\n"), segname); + } + symbolpos = buf; + buf = buf_out (buf, &bufsize, _T("%08X "), pc); + if (segid) { + buf = buf_out(buf, &bufsize, _T("%s "), segout); + } + pc += 2; if (lookup->friendlyname) @@ -7598,6 +7660,20 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn } else { if (dp->suse) { pc = ShowEA (0, pc, opcode, dp->sreg, dp->smode, dp->size, instrname, &seaddr2, safemode); + + // JSR x(a6) / JMP x(a6) + if (opcode == 0x4ea8 + 6 || opcode == 0x4ee8 + 6) { + TCHAR sname[256]; + if (debugger_get_library_symbol(m68k_areg(regs, 6), 0xffff0000 | extra, sname)) { + TCHAR *p = instrname + _tcslen(instrname); + _stprintf(p, _T(" %s"), sname); + resolve_if_jmp(instrname, m68k_areg(regs, 6) + (uae_s16)extra); + } + } + // show target address if JSR x(pc) + JMP xxxx combination + if (opcode == 0x4eba && seaddr2 && instrname) { // JSR x(pc) + resolve_if_jmp(instrname, seaddr2); + } } if (dp->suse && dp->duse) _tcscat (instrname, _T(",")); @@ -7642,6 +7718,37 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn } buf = buf_out (buf, &bufsize, _T("\n")); + for (uaecptr segpc = oldpc; segpc < pc; segpc++) { + TCHAR segout[256]; + if (debugmem_get_symbol(segpc, segout, sizeof(segout) / sizeof(TCHAR))) { + _tcscat(segout, _T(":\n")); + if (bufsize > _tcslen(segout)) { + memmove(symbolpos + _tcslen(segout), symbolpos, (_tcslen(symbolpos) + 1) * sizeof(TCHAR)); + memcpy(symbolpos, segout, _tcslen(segout) * sizeof(TCHAR)); + bufsize -= _tcslen(segout); + buf += _tcslen(segout); + symbolpos += _tclen(segout); + } + } + } + + int srcline = -1; + for (uaecptr segpc = oldpc; segpc < pc; segpc++) { + TCHAR sourceout[256]; + int line = debugmem_get_sourceline(segpc, sourceout, sizeof(sourceout) / sizeof(TCHAR)); + if (line < 0) + break; + if (srcline != line) { + if (srcline < 0) + buf = buf_out(buf, &bufsize, _T("\n")); + buf = buf_out(buf, &bufsize, sourceout); + srcline = line; + } + } + if (srcline >= 0) { + buf = buf_out(buf, &bufsize, _T("\n")); + } + if (illegal) pc = m68kpc_illg; } @@ -7653,24 +7760,24 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn *deaddr = deaddr2; } -void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr) +void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc) { TCHAR *buf; - buf = xmalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); + buf = xcalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); if (!buf) return; - m68k_disasm_2 (buf, (MAX_LINEWIDTH + 1) * cnt, addr, nextpc, cnt, seaddr, deaddr, 1); + m68k_disasm_2 (buf, MAX_LINEWIDTH * cnt, addr, nextpc, cnt, seaddr, deaddr, lastpc, 1); xfree (buf); } -void m68k_disasm (uaecptr addr, uaecptr *nextpc, int cnt) +void m68k_disasm (uaecptr addr, uaecptr *nextpc, uaecptr lastpc, int cnt) { TCHAR *buf; - buf = xmalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); + buf = xcalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); if (!buf) return; - m68k_disasm_2 (buf, (MAX_LINEWIDTH + 1) * cnt, addr, nextpc, cnt, NULL, NULL, 0); + m68k_disasm_2 (buf, MAX_LINEWIDTH * cnt, addr, nextpc, cnt, NULL, NULL, lastpc, 0); console_out_f (_T("%s"), buf); xfree (buf); } @@ -7679,7 +7786,7 @@ void m68k_disasm (uaecptr addr, uaecptr *nextpc, int cnt) Disasm the m68kcode at the given address into instrname and instrcode *************************************************************/ -void sm68k_disasm (TCHAR *instrname, TCHAR *instrcode, uaecptr addr, uaecptr *nextpc) +void sm68k_disasm (TCHAR *instrname, TCHAR *instrcode, uaecptr addr, uaecptr *nextpc, uaecptr lastpc) { TCHAR *ccpt; uae_u32 opcode; @@ -7752,9 +7859,10 @@ struct cpum2c m2cregs[] = { { -1, NULL } }; -void m68k_dumpstate (uaecptr pc, uaecptr *nextpc) +void m68k_dumpstate(uaecptr *nextpc, uaecptr prevpc) { int i, j; + uaecptr pc = M68K_GETPC; for (i = 0; i < 8; i++){ console_out_f (_T(" D%d %08X "), i, m68k_dreg (regs, i)); @@ -7832,17 +7940,16 @@ void m68k_dumpstate (uaecptr pc, uaecptr *nextpc) regs.prefetch020[2], regs.prefetch020_valid[2]); } } - - if (pc != 0xffffffff) { - m68k_disasm (pc, nextpc, 1); - if (nextpc) - console_out_f (_T("Next PC: %08x\n"), *nextpc); + if (prevpc != 0xffffffff && pc - prevpc < 100) { + while (prevpc < pc) { + m68k_disasm(prevpc, &prevpc, 0xffffffff, 1); + } } + m68k_disasm (pc, nextpc, pc, 1); + if (nextpc) + console_out_f (_T("Next PC: %08x\n"), *nextpc); } -void m68k_dumpstate (uaecptr *nextpc) -{ - m68k_dumpstate (m68k_getpc (), nextpc); -} + void m68k_dumpcache (bool dc) { if (!currprefs.cpu_compatible) diff --git a/od-win32/debug_win32.cpp b/od-win32/debug_win32.cpp index fa62332e..0af3d5bb 100644 --- a/od-win32/debug_win32.cpp +++ b/od-win32/debug_win32.cpp @@ -519,7 +519,7 @@ static void ShowBreakpoints(void) for (i = 0; i < BREAKPOINT_TOTAL; i++) { if (!bpnodes[i].enabled) continue; - m68k_disasm_2(outbp, sizeof outbp / sizeof (TCHAR), bpnodes[i].value1, NULL, 1, NULL, NULL, 0); + m68k_disasm_2(outbp, sizeof outbp / sizeof (TCHAR), bpnodes[i].value1, NULL, 1, NULL, NULL, 0xffffffff, 0); ULBS(outbp); got = 1; } @@ -575,7 +575,7 @@ static int GetPrevAddr(uae_u32 addr, uae_u32 *prevaddr) dasmaddr = addr - 20; while (dasmaddr < addr) { next = dasmaddr + 2; - m68k_disasm_2(NULL, 0, dasmaddr, &next, 1, NULL, NULL, 0); + m68k_disasm_2(NULL, 0, dasmaddr, &next, 1, NULL, NULL, 0xffffffff, 0); if (next == addr) { *prevaddr = dasmaddr; return 1; @@ -607,7 +607,7 @@ static void ShowDasm(int direction) else addr = dbgpage[currpage].dasmaddr; if (direction > 0) { - m68k_disasm_2(NULL, 0, addr, &addr, 1, NULL, NULL, 0); + m68k_disasm_2(NULL, 0, addr, &addr, 1, NULL, NULL, 0xffffffff, 0); if (!addr || addr < dbgpage[currpage].dasmaddr) addr = dbgpage[currpage].dasmaddr; } @@ -621,7 +621,7 @@ static void ShowDasm(int direction) lines_old = SendMessage(hDasm, LB_GETCOUNT, 0, 0); lines_new = GetLBOutputLines(hDasm); for (i = 0; i < lines_new; i++) { - m68k_disasm_2(out, sizeof out / sizeof (TCHAR), addr, &addr, 1, NULL, NULL, 0); + m68k_disasm_2(out, sizeof out / sizeof (TCHAR), addr, &addr, 1, NULL, NULL, 0xffffffff, 0); if (addr > dbgpage[currpage].dasmaddr) UpdateListboxString(hDasm, i, out, FALSE); else diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index bdd72601..c1c6a0ce 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -6807,7 +6807,7 @@ LONG WINAPI WIN32_ExceptionFilter (struct _EXCEPTION_POINTERS *pExceptionPointer int got = 0; uaecptr opc = m68k_getpc (); void *ps = get_real_address (0); - m68k_dumpstate (0); + m68k_dumpstate(NULL, 0xffffffff); efix (&ctx->Eax, p, ps, &got); efix (&ctx->Ebx, p, ps, &got); efix (&ctx->Ecx, p, ps, &got);