diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 716a86e4..79103f4d 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -708,8 +708,8 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader { // offset of p_info in compressed file overlay_offset = sizeof(mhdro) + sizeof(segZERO) - + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); if (my_filetype==Mach_header::MH_EXECUTE) { overlay_offset += sizeof(uuid_cmd) + sizeof(linkitem); @@ -732,13 +732,23 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader foff1 += PAGE_SIZE; // codesign disallows overhang segLINK.fileoff = foff1; segLINK.vmaddr = segTEXT.vmaddr + foff1; - fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); + segTEXT.vmsize = 0x1000; + secTEXT.size = 0x1000; + + segXHDR.vmaddr = PAGE_MASK64 & (~PAGE_MASK64 + segTEXT.vmsize + segTEXT.vmaddr); + segXHDR.vmsize = 0x1000; + secXHDR.size = 0x1000; + + segLINK.vmaddr = PAGE_MASK64 & (~PAGE_MASK64 + segXHDR.vmsize + segXHDR.vmaddr); + segLINK.vmsize = 0x1000; + fo->seek(-1+ 0x4000, SEEK_SET); fo->write("", 1); + fo->seek(sizeof(mhdro), SEEK_SET); fo->rewrite(&segZERO, sizeof(segZERO)); - fo->rewrite(&segXHDR, sizeof(segXHDR)); - fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segTEXT, sizeof(segTEXT)); fo->rewrite(&secTEXT, sizeof(secTEXT)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segLINK, sizeof(segLINK)); fo->rewrite(&threado, sizeof(threado)); if (my_filetype==Mach_header::MH_EXECUTE) { @@ -1453,10 +1463,13 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e segTEXT.vmsize = 0; // adjust later segTEXT.fileoff = 0; segTEXT.filesize = 0; // adjust later - segTEXT.initprot = segTEXT.maxprot = + segTEXT.maxprot = Mach_segment_command::VM_PROT_READ | Mach_segment_command::VM_PROT_WRITE | Mach_segment_command::VM_PROT_EXECUTE; + segTEXT.initprot = + Mach_segment_command::VM_PROT_READ | + Mach_segment_command::VM_PROT_EXECUTE; segTEXT.nsects = 1; // secTEXT segTEXT.flags = 0; diff --git a/src/stub/Makefile b/src/stub/Makefile index dc5a528c..8a993414 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -154,7 +154,7 @@ endif all.targets ?= .upx-stubtools-stamp tmp/.tmp-stamp .all-stamp all: $$(all.targets) .upx-stubtools-stamp: $(MAKEFILE_LIST) - upx-stubtools-check-version 20130920 + upx-stubtools-check-version 20160902 @echo "timestamp" > $@ %/.tmp-stamp: @mkdir -p $(dir $@) diff --git a/src/stub/arm64-darwin.macho-entry.h b/src/stub/arm64-darwin.macho-entry.h index ac727163..f54c26b6 100644 --- a/src/stub/arm64-darwin.macho-entry.h +++ b/src/stub/arm64-darwin.macho-entry.h @@ -1,5 +1,5 @@ /* arm64-darwin.macho-entry.h - created from arm64-darwin.macho-entry.bin, 6745 (0x1a59) bytes + created from arm64-darwin.macho-entry.bin, 4261 (0x10a5) bytes This file is part of the UPX executable compressor. @@ -31,15 +31,15 @@ */ -#define STUB_ARM64_DARWIN_MACHO_ENTRY_SIZE 6745 -#define STUB_ARM64_DARWIN_MACHO_ENTRY_ADLER32 0xaa9276e7 -#define STUB_ARM64_DARWIN_MACHO_ENTRY_CRC32 0xcff4e65f +#define STUB_ARM64_DARWIN_MACHO_ENTRY_SIZE 4261 +#define STUB_ARM64_DARWIN_MACHO_ENTRY_ADLER32 0xe928ad34 +#define STUB_ARM64_DARWIN_MACHO_ENTRY_CRC32 0x2eccc221 -unsigned char stub_arm64_darwin_macho_entry[6745] = { +unsigned char stub_arm64_darwin_macho_entry[4261] = { /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,160, 18, 0, 0, 0, 0, 0, 0, -/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 18, 0, 15, 0, +/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 88, 11, 0, 0, 0, 0, 0, 0, +/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 13, 0, 10, 0, /* 0x0040 */ 255, 19, 0,209,224, 7,177,169,226, 15, 1,169,228, 23, 2,169, /* 0x0050 */ 230, 31, 3,169,232, 39, 4,169,234, 47, 5,169,236, 55, 6,169, /* 0x0060 */ 238, 63, 7,169,240, 71, 8,169,242, 79, 9,169,244, 87, 10,169, @@ -99,363 +99,208 @@ unsigned char stub_arm64_darwin_macho_entry[6745] = { /* 0x03c0 */ 229,255,255,151, 33, 0, 1, 58,227,255,255,151, 33, 0, 1, 58, /* 0x03d0 */ 97, 0, 0, 84,232,255,255,151, 33, 8, 0, 17,191, 0, 52, 49, /* 0x03e0 */ 33, 36,129, 26, 67,200,101, 56, 33, 4, 0,113, 67, 20, 0, 56, -/* 0x03f0 */ 162,255,255, 84,233,255,255, 23,159, 56, 0,113, 1, 0, 0, 84, -/* 0x0400 */ 226, 15,190,169,253,123, 1,169, 7, 0, 64, 57, 8,192,128, 82, -/* 0x0410 */ 231,124, 3, 83, 8, 33,199, 26,231, 3, 0,145, 8, 1, 58, 17, -/* 0x0420 */ 255, 67, 40,203,104, 0, 64,185,230, 3, 3,170,229, 3, 8, 42, -/* 0x0430 */ 228, 3, 2,170,227, 51, 0,145, 8, 0,128,210,104,132, 0,248, -/* 0x0440 */ 127, 0, 7,235,195,255,255, 84,227, 51, 0,145, 34, 8, 0, 81, -/* 0x0450 */ 225, 3, 0,170, 40, 20, 64, 56, 8, 9, 0, 18,232, 75, 0, 57, -/* 0x0460 */ 40, 20, 64, 56, 0,125, 4, 83,224, 71, 0, 57, 8, 13, 0, 18, -/* 0x0470 */ 232, 67, 0, 57,224, 67, 0,145, 16, 0, 0,148,255, 0, 0,145, -/* 0x0480 */ 228, 3, 0, 42,224, 7,193,168, 33, 0, 64,249,224, 7,191,169, -/* 0x0490 */ 35, 0,128, 82, 8, 0,176, 82, 0, 16, 32,212,224, 7,193,168, -/* 0x04a0 */ 3, 0,128, 82, 8, 0,176, 82, 0, 16, 32,212,224, 3, 4,170, -/* 0x04b0 */ 253,123,193,168,192, 3, 95,214,253,123,185,169, 8,128,128, 82, -/* 0x04c0 */ 253, 3, 0,145,243, 83, 1,169,245, 91, 2,169,247, 99, 3,169, -/* 0x04d0 */ 249,107, 4,169, 19, 60, 64, 41, 14, 8, 64,185, 11, 8, 64,249, -/* 0x04e0 */ 127, 0, 0,185,223, 0, 0,185, 7, 4, 64,185, 0, 96,128, 82, -/* 0x04f0 */ 103, 2, 7, 11, 7, 32,199, 26, 32, 0,128, 82,231,216, 28, 49, -/* 0x0500 */ 14, 32,206, 26, 0, 32,207, 26,206, 5, 0, 81, 15, 4, 0, 81, -/* 0x0510 */ 0, 0,128,210,160, 0, 0, 84,104,121, 32,120, 0, 4, 0,145, -/* 0x0520 */ 255, 0, 0,107,168,255,255, 84, 34, 64, 34,139, 27, 0,128, 82, -/* 0x0530 */ 162, 51, 0,249, 28, 0,128, 18, 32, 4, 0,145, 42, 24, 0,145, -/* 0x0540 */ 66, 4, 0,145, 31, 0, 2,235,232, 3, 0,170, 32, 32, 0, 84, -/* 0x0550 */ 160, 55, 0,249, 0, 4, 0,145, 31, 0, 10,235, 7,224, 95, 56, -/* 0x0560 */ 251, 32, 27, 42, 1,255,255, 84,161, 27, 5,169,233, 3, 4,170, -/* 0x0570 */ 249, 3, 3,170,165, 37, 0, 52, 55, 0,128, 82, 26, 1,128, 82, -/* 0x0580 */ 246, 3, 23, 42,245, 3, 23, 42,231, 3, 23, 42, 10, 0,128, 82, -/* 0x0590 */ 13, 0,128, 82, 6, 0,128, 82, 84, 3, 19, 75,204, 1, 6, 10, -/* 0x05a0 */ 72,109, 28, 83,178,131, 1,145, 0, 0,128, 82,129,125, 64,147, -/* 0x05b0 */ 40,192, 40,139, 8,249,127,211, 97, 1, 8,139, 29, 1, 0,148, -/* 0x05c0 */ 0, 10, 0, 53,224, 1, 6, 10,168, 41,212, 26, 0, 32,211, 26, -/* 0x05d0 */ 95, 25, 0,113, 8, 0, 8, 11, 0,117, 30, 83, 8, 0, 8, 75, -/* 0x05e0 */ 8, 93,120,211, 8,217, 28,145,104, 5, 8,139,141, 7, 0, 84, -/* 0x05f0 */ 192, 0, 7, 75, 34, 0,128, 82, 44,105, 96, 56, 4, 0, 0, 20, -/* 0x0600 */ 237, 1, 0, 53, 95,252, 3,113,236, 6, 0, 84,140,121, 31, 83, -/* 0x0610 */ 224, 3, 2, 42,141, 1, 24, 18,178,131, 1,145,161,125, 64,147, -/* 0x0620 */ 33, 0, 4,145, 33,192, 34,139, 1, 5, 1,139, 1, 1, 0,148, -/* 0x0630 */ 226, 3, 0, 42, 98,254, 7, 54,109,254,255, 53, 95,252, 3,113, -/* 0x0640 */ 44, 5, 0, 84, 1,197, 34,139,224, 3, 2, 42,178,131, 1,145, -/* 0x0650 */ 248, 0, 0,148, 31,252, 3,113,226, 3, 0, 42, 77,255,255, 84, -/* 0x0660 */ 13, 28, 0, 83, 95, 13, 0,113, 45, 73, 38, 56,198, 4, 0, 17, -/* 0x0670 */ 12, 4, 0, 84, 10, 0,128, 82,191, 0, 6,107, 8,249,255, 84, -/* 0x0680 */ 1,224,191, 18,159, 3, 1,107,200, 28, 0, 84,162, 7, 70,169, -/* 0x0690 */ 63, 0, 2,235,224, 21, 0, 84, 40, 4, 0,145,168, 55, 0,249, -/* 0x06a0 */ 156, 95, 24, 83, 32, 0, 64, 57, 27, 32, 27, 42,160, 43, 64,249, -/* 0x06b0 */ 243, 83, 65,169, 8, 1, 0,203,160, 47, 64,249, 40, 3, 0,185, -/* 0x06c0 */ 245, 91, 66,169, 6, 0, 0,185, 0, 0,128, 82,247, 99, 67,169, -/* 0x06d0 */ 249,107, 68,169,253,123,199,168,192, 3, 95,214, 34, 0,128, 82, -/* 0x06e0 */ 217,255,255, 23, 77, 28, 0, 83, 45, 73, 38, 56,198, 4, 0, 17, -/* 0x06f0 */ 95, 37, 0,113, 76, 12, 0, 84, 74, 13, 0, 81,223,255,255, 23, -/* 0x0700 */ 77,125, 64,147,178,131, 1,145,173, 1, 3,145, 0, 0,128, 82, -/* 0x0710 */ 173,249,127,211, 97, 1, 13,139,198, 0, 0,148, 64, 11, 0, 53, -/* 0x0720 */ 96, 0,128, 82, 95, 25, 0,113,247, 3, 22, 42, 10,192,159, 26, -/* 0x0730 */ 246, 3, 21, 42,120,145, 25,145,245, 3, 7, 42,178,131, 1,145, -/* 0x0740 */ 225, 3, 24,170, 0, 0,128, 82,186, 0, 0,148, 96, 12, 0, 53, -/* 0x0750 */ 140,113, 29, 83,232, 0,128, 18,109, 0,128, 82,140,125, 64,147, -/* 0x0760 */ 140, 9, 0,145, 12, 7, 12,139, 32, 0,128, 82,178,131, 1,145, -/* 0x0770 */ 129, 69, 32,139,175, 0, 0,148,173, 5, 0,113,129,255,255, 84, -/* 0x0780 */ 95, 13, 0,113, 8, 0, 8, 11,236, 5, 0, 84,103, 0,128, 82, -/* 0x0790 */ 204, 0,128, 82, 31, 1, 7,107, 32, 0,128, 82, 7,209,135, 26, -/* 0x07a0 */ 231,100, 26, 83,231,124, 64,147,231,192, 6,145,231,248,127,211, -/* 0x07b0 */ 225, 68, 32,139,178,131, 1,145, 97, 1, 1,139,157, 0, 0,148, -/* 0x07c0 */ 140, 5, 0,113, 97,255,255, 84, 7, 0, 1, 81, 74, 29, 0, 17, -/* 0x07d0 */ 255, 12, 0,113,236, 3, 7, 42, 45, 3, 0, 84,255, 52, 0,113, -/* 0x07e0 */ 224, 0, 0, 18,225,124, 1, 19, 7, 0, 31, 50, 12, 12, 0, 84, -/* 0x07f0 */ 45, 4, 0, 81, 0, 86,128,210,231, 32,205, 26, 12,192, 44,203, -/* 0x0800 */ 140, 65, 39,139,108, 5, 12,139,140, 9, 0,209, 32, 0,128, 82, -/* 0x0810 */ 248, 3, 0, 42,129,197, 32,139,178,131, 1,145,133, 0, 0,148, -/* 0x0820 */ 3, 0, 0, 18,225, 0, 24, 42,127, 0, 31,107, 39, 16,135, 26, -/* 0x0830 */ 173, 5, 0,113, 24,123, 31, 83,225,254,255, 84,231, 4, 0, 49, -/* 0x0840 */ 0,242,255, 84,255, 0, 6,107, 0, 9, 0, 17, 40, 8, 0, 84, -/* 0x0850 */ 225, 3, 6, 42,194, 0, 7, 75, 0, 4, 0, 81,198, 4, 0, 17, -/* 0x0860 */ 31, 0, 31,107,160, 16, 70,122, 45,105, 98, 56, 45, 73, 33, 56, -/* 0x0870 */ 225, 3, 6, 42, 8,255,255, 84,128,255,255, 23, 74, 25, 0, 81, -/* 0x0880 */ 126,255,255, 23,161, 97, 0,145,178,131, 1,145, 97, 1, 1,139, -/* 0x0890 */ 0, 0,128, 82,103, 0, 0,148,128, 3, 0, 53, 1,129, 7,145, -/* 0x08a0 */ 178,131, 1,145, 97, 1, 1,139, 98, 0, 0,148, 64, 9, 0, 53, -/* 0x08b0 */ 6, 5, 0, 52,192, 0, 7, 75, 95, 25, 0,113,106, 1,128, 82, -/* 0x08c0 */ 45,105, 96, 56, 32, 1,128, 82, 45, 73, 38, 56, 74,193,128, 26, -/* 0x08d0 */ 198, 4, 0, 17,105,255,255, 23,178,131, 1,145, 1, 11, 0,145, -/* 0x08e0 */ 0, 0,128, 82, 83, 0, 0,148,232, 3, 0, 42,160, 2, 0, 53, -/* 0x08f0 */ 128,113, 29, 83,109, 0,128, 82, 0,124, 64,147, 0, 8, 2,145, -/* 0x0900 */ 12, 7, 0,139,153,255,255, 23,161,193, 0,145,178,131, 1,145, -/* 0x0910 */ 97, 1, 1,139, 0, 0,128, 82, 70, 0, 0,148, 64, 6, 0, 53, -/* 0x0920 */ 95, 25, 0,113,224, 3, 7, 42,106, 1,128, 82,231, 3, 21, 42, -/* 0x0930 */ 74,193,154, 26,245, 3, 0, 42,120,161, 41,145,128,255,255, 23, -/* 0x0940 */ 12, 19, 8,145,232, 29,128, 18, 13, 1,128, 82,135,255,255, 23, -/* 0x0950 */ 243, 83, 65,169,245, 91, 66,169,247, 99, 67,169,249,107, 68,169, -/* 0x0960 */ 32, 0,128, 82,253,123,199,168,192, 3, 95,214,172, 51, 64,249, -/* 0x0970 */ 33, 20, 0, 81, 3,224,191, 18,159, 3, 3,107,231,120, 31, 83, -/* 0x0980 */ 40, 1, 0, 84,162, 55, 64,249, 95, 0, 12,235, 68, 4, 0,145, -/* 0x0990 */ 0,254,255, 84,164, 55, 0,249,156, 95, 24, 83, 64, 0, 64, 57, -/* 0x09a0 */ 27, 32, 27, 42,128,127, 1, 83, 31, 0, 27,107,252, 3, 0, 42, -/* 0x09b0 */ 104, 0, 0, 84,123, 3, 0, 75,231, 0, 0, 50, 33, 4, 0,113, -/* 0x09c0 */ 193,253,255, 84,231,108, 28, 83,108, 17, 25,145,141, 0,128, 82, -/* 0x09d0 */ 143,255,255, 23,224, 3, 21, 42,245, 3, 7, 42,231, 3, 0, 42, -/* 0x09e0 */ 208,255,255, 23,161, 33, 1,145,178,131, 1,145, 97, 1, 1,139, -/* 0x09f0 */ 0, 0,128, 82, 15, 0, 0,148,160, 0, 0, 53,224, 3, 21, 42, -/* 0x0a00 */ 245, 3, 22, 42,246, 3, 0, 42,198,255,255, 23,224, 3, 21, 42, -/* 0x0a10 */ 245, 3, 23, 42,247, 3, 22, 42,246, 3, 0, 42,193,255,255, 23, -/* 0x0a20 */ 168, 55, 64,249, 34,255,255, 23, 6, 0,128, 82, 32,255,255, 23, -/* 0x0a30 */ 3,224,191, 18,159, 3, 3,107, 40, 1, 0, 84, 68, 14, 64,169, -/* 0x0a40 */ 127, 0, 4,235, 32, 3, 0, 84,100, 4, 0,145, 68, 6, 0,249, -/* 0x0a50 */ 156, 95, 24, 83, 98, 0, 64, 57, 91, 32, 27, 42, 35, 0, 64,121, -/* 0x0a60 */ 130,127, 11, 83, 66,124, 3, 27, 95, 0, 27,107, 8, 1, 0, 84, -/* 0x0a70 */ 0,120, 31, 83, 99, 20, 67, 75,123, 3, 2, 75,156, 3, 2, 75, -/* 0x0a80 */ 35, 0, 0,121, 0, 4, 0, 17,192, 3, 95,214, 4, 0,129, 82, -/* 0x0a90 */ 252, 3, 2, 42,130, 0, 3, 75, 0,120, 31, 83, 99, 20,130, 11, -/* 0x0aa0 */ 35, 0, 0,121,192, 3, 95,214, 32, 0,128, 82,192, 3, 95,214, -/* 0x0ab0 */ 230,123,191,169,227,147,190,169,229, 11, 0,249,232, 3, 1,170, -/* 0x0ac0 */ 45, 64, 34,139,233, 3, 4,170,142, 64, 37,139, 11, 16, 0,145, -/* 0x0ad0 */ 6, 0, 64, 57, 5, 4, 64, 57, 4, 8, 64, 57,174, 0, 6, 11, -/* 0x0ae0 */ 7, 0,128, 18,229, 32,197, 26,229, 3, 37, 42,228, 32,196, 26, -/* 0x0af0 */ 228, 3, 36, 42, 35, 0,128, 82, 34, 0,128, 82, 33, 0,128, 82, -/* 0x0b00 */ 32, 0,128, 82, 6, 0,128, 82,230, 31, 0,185, 2, 96,128, 82, -/* 0x0b10 */ 192,230,128, 82, 66, 32,206, 26, 66, 0, 0, 11, 0,128,128,210, -/* 0x0b20 */ 225, 3, 11,170, 0, 64, 0,170, 0,128, 0,170, 32,132, 0,248, -/* 0x0b30 */ 66, 16, 0,113,204,255,255, 84, 0, 21, 0,145,231, 0, 0,148, -/* 0x0b40 */ 31, 0, 8,235,193,255,255, 84,227, 67, 66,248,226, 19, 64,185, -/* 0x0b50 */ 36, 1, 3,203,128, 0, 2, 10,224, 47, 0,185, 0, 16, 6, 11, -/* 0x0b60 */ 97, 1, 0,145,225, 0, 0,148,129, 5, 0, 84,227, 23, 64,185, -/* 0x0b70 */ 226, 27, 64,185, 99, 0, 4, 10,224,115, 64, 57, 99, 32,194, 26, -/* 0x0b80 */ 226, 3, 2, 75, 66, 32, 0, 17, 2, 36,194, 26, 99, 0, 2, 11, -/* 0x0b90 */ 106,177, 57,145, 99, 4, 3, 11,227, 3, 3, 42, 32, 0,128, 82, -/* 0x0ba0 */ 74, 37, 3,139,223, 28, 0,113, 3, 2, 0, 84,227,125, 64,147, -/* 0x0bb0 */ 227, 3, 3,203, 37,105, 99, 56,165,120, 31, 83, 65, 1, 8,145, -/* 0x0bc0 */ 164, 0, 24, 18,227, 3, 4, 42, 33, 4, 3,139,201, 0, 0,148, -/* 0x0bd0 */ 3, 0, 0, 18,127, 32, 68,107,193, 0, 0, 84, 31, 0, 4,113, -/* 0x0be0 */ 195,254,255, 84, 5, 0, 0, 20,225, 3, 10,170,193, 0, 0,148, -/* 0x0bf0 */ 31, 0, 4,113,163,255,255, 84, 98, 0,128, 82,195, 0,128, 82, -/* 0x0c00 */ 223, 40, 0,113, 67, 48,131, 26,223, 16, 0,113,195, 48,131, 26, -/* 0x0c10 */ 198, 0, 3, 75, 34, 0, 0, 20, 97, 1, 6,145,178, 0, 0,148, -/* 0x0c20 */ 129, 1, 0, 84,227, 11, 64,185,226, 7, 64,185,227, 15, 0,185, -/* 0x0c30 */ 226, 11, 0,185,239, 7, 0,185, 3, 0,128, 82,223, 28, 0,113, -/* 0x0c40 */ 102, 0,128, 82,102, 48,134, 26,106,145, 25,145, 42, 0, 0, 20, -/* 0x0c50 */ 97, 97, 6,145,164, 0, 0,148, 97, 2, 0, 84,227, 47, 64,185, -/* 0x0c60 */ 97,129, 7,145, 96, 16, 6, 11,160, 0, 0,148,161, 3, 0, 84, -/* 0x0c70 */ 35, 1,128, 82,223, 28, 0,113,102, 1,128, 82,102, 48,134, 26, -/* 0x0c80 */ 227, 67, 66,248, 36, 1, 3,203,159, 0, 15,107,131, 17, 0, 84, -/* 0x0c90 */ 227,125, 64,147,227, 3, 3,203, 32,105, 99, 56, 32, 21, 0, 56, -/* 0x0ca0 */ 121, 0, 0, 20, 97,193, 6,145,143, 0, 0,148,228, 7, 64,185, -/* 0x0cb0 */ 64, 1, 0, 84, 97, 33, 7,145,139, 0, 0,148,228, 11, 64,185, -/* 0x0cc0 */ 128, 0, 0, 84,227, 11, 64,185,228, 15, 64,185,227, 15, 0,185, -/* 0x0cd0 */ 227, 7, 64,185,227, 11, 0,185,239, 7, 0,185,239, 3, 4, 42, -/* 0x0ce0 */ 3, 1,128, 82,223, 28, 0,113,102, 1,128, 82,102, 48,134, 26, -/* 0x0cf0 */ 106,161, 41,145, 65, 1, 0,145,125, 0, 0,148, 1, 1, 0, 84, -/* 0x0d00 */ 227, 47, 64,185, 69, 17, 0,145,227, 3, 3, 42, 2, 0,128, 82, -/* 0x0d10 */ 165, 16, 3,139, 4, 1,128, 82, 14, 0, 0, 20, 65, 9, 0,145, -/* 0x0d20 */ 115, 0, 0,148, 1, 1, 0, 84,227, 47, 64,185, 69, 17, 4,145, -/* 0x0d30 */ 227, 3, 3, 42, 2, 1,128, 82,165, 16, 3,139, 4, 1,128, 82, -/* 0x0d40 */ 4, 0, 0, 20, 69, 17, 8,145, 2, 2,128, 82, 4, 32,128, 82, -/* 0x0d50 */ 226, 55, 0,185, 32, 0,128, 82,225, 3, 5,170,101, 0, 0,148, -/* 0x0d60 */ 3, 0, 4,107,163,255,255, 84,229, 55, 64,185,165, 0, 3, 11, -/* 0x0d70 */ 229, 55, 0,185,223, 16, 0,113,194, 6, 0, 84,198, 28, 0, 17, -/* 0x0d80 */ 99, 0,128, 82,191, 16, 0,113,101, 32,133, 26,227, 3, 5, 42, -/* 0x0d90 */ 101, 29, 3,139,165,128, 13,145, 32, 0,128, 82, 4, 8,128, 82, -/* 0x0da0 */ 225, 3, 5,170, 83, 0, 0,148, 3, 0, 4,107,163,255,255, 84, -/* 0x0db0 */ 227, 47, 0,185,127, 16, 0,113, 99, 4, 0, 84,100,124, 1, 83, -/* 0x0dc0 */ 132, 4, 0, 81,111, 0, 0, 18,239, 1, 31, 50,127, 56, 0,113, -/* 0x0dd0 */ 226, 0, 0, 84,239, 33,196, 26,106,121, 21,145,227, 1, 3, 75, -/* 0x0de0 */ 227, 3, 3, 42, 74, 5, 3,139, 12, 0, 0, 20,132, 16, 0, 81, -/* 0x0df0 */ 53, 0, 0,148,231,124, 1, 83,131, 1, 7,107,108, 32,140, 26, -/* 0x0e00 */ 239, 1, 15, 26,132, 4, 0,113, 65,255,255, 84,106, 17, 25,145, -/* 0x0e10 */ 239,109, 28, 83,132, 0,128, 82, 37, 0,128, 82, 32, 0,128, 82, -/* 0x0e20 */ 225, 3, 10,170, 51, 0, 0,148, 31, 0, 0,114, 64, 0, 0, 84, -/* 0x0e30 */ 239, 1, 5, 42,165,120, 31, 83,132, 4, 0,113, 33,255,255, 84, -/* 0x0e40 */ 2, 0, 0, 20,239, 47, 64,185,239, 5, 0, 49,229, 55, 64,185, -/* 0x0e50 */ 227, 67, 66,248,165, 8, 0, 17, 35, 1, 3,203,255, 1, 3,107, -/* 0x0e60 */ 232, 2, 0, 84,227,125, 64,147,227, 3, 3,203, 32,105, 99, 56, -/* 0x0e70 */ 32, 21, 0, 56, 63, 1, 14,235,194, 0, 0, 84,165, 4, 0,113, -/* 0x0e80 */ 97,255,255, 84,224,115, 0, 57, 63, 1, 14,235,227,229,255, 84, -/* 0x0e90 */ 13, 0, 0,148, 0, 0,128, 82,226, 19, 64,249, 3, 1, 2,203, -/* 0x0ea0 */ 226, 31, 64,249, 67, 0, 0,185,226, 67, 66,248, 35, 1, 2,203, -/* 0x0eb0 */ 226, 55, 64,249, 67, 0, 0,185,255,243, 0,145, 32, 0,128, 82, -/* 0x0ec0 */ 246,255,255, 23,227,124, 24, 83,195, 0, 0, 53, 31, 1, 13,235, -/* 0x0ed0 */ 231, 92, 24, 83, 66,255,255, 84, 3, 21, 64, 56,108, 32, 12, 42, -/* 0x0ee0 */ 192, 3, 95,214,224, 3, 6, 42, 33, 68, 32,139, 0, 0,128, 82, -/* 0x0ef0 */ 33, 68, 32,139,227,124, 24, 83,241, 3, 30,170, 94, 0, 0, 16, -/* 0x0f00 */ 99,254,255, 52, 35, 0, 64,121,226,124, 11, 83, 98,124, 2, 27, -/* 0x0f10 */ 159, 1, 2,107, 2, 1, 0, 84, 2, 0,129, 82,231, 3, 2, 42, -/* 0x0f20 */ 66, 0, 3, 75, 0, 0, 0, 58, 99, 20, 66, 11, 35, 0, 0,121, -/* 0x0f30 */ 32, 2, 95,214,140, 1, 2, 75,231, 0, 2, 75, 99, 20, 67, 75, -/* 0x0f40 */ 0, 0, 0, 58, 35, 0, 0,121, 32, 2, 95,214,195, 3, 64,185, -/* 0x0f50 */ 193, 7, 64,185,194, 67, 33,139, 66, 48, 0,145,192, 67, 35,139, -/* 0x0f60 */ 0, 0, 3,145,228, 3, 1, 42, 73,204, 95,184,132, 16, 0, 81, -/* 0x0f70 */ 9,204, 31,184,164,255,255, 53,196, 11, 64,185,222, 3, 2,145, -/* 0x0f80 */ 227,143, 31,184,227, 3, 0,145,226, 3, 30,170,171, 32, 1,209, -/* 0x0f90 */ 234, 3, 30,170,160, 0, 63,214, 64, 1, 31,214,229, 3, 30,170, -/* 0x0fa0 */ 235,255,255,151,102,105,108,101, 32,102,111,114,109, 97,116, 32, -/* 0x0fb0 */ 101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97,114, 99, -/* 0x0fc0 */ 104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73, -/* 0x0fd0 */ 100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x0fe0 */ 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, -/* 0x0ff0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, -/* 0x1000 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70, -/* 0x1010 */ 105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70, -/* 0x1020 */ 108, 97,103,115, 10, 32, 32, 48, 32, 77, 65, 67, 72, 77, 65, 73, -/* 0x1030 */ 78, 88, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 52, 52, 32, -/* 0x1040 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1050 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1060 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, -/* 0x1070 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, -/* 0x1080 */ 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, -/* 0x1090 */ 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, -/* 0x10a0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, -/* 0x10b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x10c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, -/* 0x10d0 */ 48, 48, 48, 48, 48, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, -/* 0x10e0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, -/* 0x10f0 */ 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, -/* 0x1100 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 51, 99, 32, 32, 48, 48, -/* 0x1110 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, -/* 0x1120 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1130 */ 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, 50, 42, 42, 50, -/* 0x1140 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, -/* 0x1150 */ 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 68, 32, 32, -/* 0x1160 */ 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 51, 48, 32, -/* 0x1170 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1180 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1190 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 99, 48, 32, 32, 50, -/* 0x11a0 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, -/* 0x11b0 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, -/* 0x11c0 */ 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, -/* 0x11d0 */ 48, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x11e0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x11f0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50,102, 48, -/* 0x1200 */ 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, -/* 0x1210 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, 78, -/* 0x1220 */ 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32, 48, 48, 48, -/* 0x1230 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1240 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, -/* 0x1250 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, -/* 0x1260 */ 51,102, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, -/* 0x1270 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, -/* 0x1280 */ 54, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32, 32, 32, -/* 0x1290 */ 48, 48, 48, 48, 48, 48, 99, 48, 32, 32, 48, 48, 48, 48, 48, 48, -/* 0x12a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, -/* 0x12b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, -/* 0x12c0 */ 48, 48, 48, 51,102, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, -/* 0x12d0 */ 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, -/* 0x12e0 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, -/* 0x12f0 */ 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 53, -/* 0x1300 */ 102, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1310 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1320 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, 98, 56, -/* 0x1330 */ 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, -/* 0x1340 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 76, -/* 0x1350 */ 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, 48, -/* 0x1360 */ 48, 48, 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1370 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, -/* 0x1380 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, -/* 0x1390 */ 97, 98, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, -/* 0x13a0 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, -/* 0x13b0 */ 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, -/* 0x13c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, -/* 0x13d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, -/* 0x13e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, -/* 0x13f0 */ 48, 48, 48,102, 52, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, -/* 0x1400 */ 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, -/* 0x1410 */ 10, 32, 49, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 32, 32, -/* 0x1420 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x1430 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, -/* 0x1440 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1450 */ 32, 48, 48, 48, 48, 48,102, 52, 99, 32, 32, 50, 42, 42, 48, 32, -/* 0x1460 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, -/* 0x1470 */ 78, 76, 89, 10, 32, 49, 49, 32, 77, 65, 67, 72, 77, 65, 73, 78, -/* 0x1480 */ 90, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 53, 56, 32, 32, -/* 0x1490 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x14a0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x14b0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48,102, 52, 99, 32, 32, 50, 42, -/* 0x14c0 */ 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, -/* 0x14d0 */ 65, 68, 79, 78, 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, -/* 0x14e0 */ 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x14f0 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, -/* 0x1500 */ 77, 65, 95, 68, 69, 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, -/* 0x1510 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, -/* 0x1520 */ 69, 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1530 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, -/* 0x1540 */ 67, 72, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1550 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, -/* 0x1560 */ 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1570 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, -/* 0x1580 */ 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1590 */ 48, 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, -/* 0x15a0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x15b0 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69, -/* 0x15c0 */ 65, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x15d0 */ 48, 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48, -/* 0x15e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, -/* 0x15f0 */ 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, -/* 0x1600 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, -/* 0x1610 */ 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1620 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, -/* 0x1630 */ 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1640 */ 48, 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, -/* 0x1650 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, -/* 0x1660 */ 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, -/* 0x1680 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1690 */ 108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, -/* 0x16a0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x16b0 */ 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, -/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, -/* 0x16d0 */ 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, 48, -/* 0x16e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x16f0 */ 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, -/* 0x1700 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, -/* 0x1710 */ 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, 48, -/* 0x1720 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1730 */ 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, -/* 0x1740 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, -/* 0x1750 */ 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, -/* 0x1760 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1770 */ 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, -/* 0x1780 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, -/* 0x1790 */ 32,100, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, -/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 77, -/* 0x17b0 */ 65, 67, 72, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, -/* 0x17c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, -/* 0x17d0 */ 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, -/* 0x17e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, -/* 0x17f0 */ 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1800 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, -/* 0x1810 */ 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1820 */ 49, 51, 99, 32,117, 99,108, 95,110,114,118, 50,101, 95,100,101, -/* 0x1830 */ 99,111,109,112,114,101,115,115, 95, 56, 10, 48, 48, 48, 48, 48, -/* 0x1840 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, -/* 0x1850 */ 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, -/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 49, 51, 48, 32,117, 99,108, 95,110, -/* 0x1870 */ 114,118, 50,100, 95,100,101, 99,111,109,112,114,101,115,115, 95, -/* 0x1880 */ 56, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1890 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, -/* 0x18a0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 48, -/* 0x18b0 */ 56, 32,117, 99,108, 95,110,114,118, 50, 98, 95,100,101, 99,111, -/* 0x18c0 */ 109,112,114,101,115,115, 95, 56, 10, 48, 48, 48, 48, 48, 48, 48, -/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, -/* 0x18e0 */ 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, -/* 0x18f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122, -/* 0x1900 */ 109, 97, 68,101, 99,111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, -/* 0x1910 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, -/* 0x1920 */ 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, -/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,101,110,100, -/* 0x1940 */ 95,100,101, 99,111,109,112,114,101,115,115, 10, 10, 82, 69, 76, -/* 0x1950 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, -/* 0x1960 */ 70, 79, 82, 32, 91, 77, 65, 67, 72, 77, 65, 73, 78, 88, 93, 58, -/* 0x1970 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1980 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1990 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, -/* 0x19a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 52, 48, 32, 82, 95, 65, 65, 82, -/* 0x19b0 */ 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, 32, 32, 77, 65, 67, -/* 0x19c0 */ 72, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, -/* 0x19d0 */ 48, 48, 48, 48, 48, 48, 48, 53, 48, 10, 10, 82, 69, 76, 79, 67, -/* 0x19e0 */ 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, -/* 0x19f0 */ 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, -/* 0x1a00 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1a10 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1a20 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, -/* 0x1a30 */ 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, 95, 65, 65, 82, 67, -/* 0x1a40 */ 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49, 57, 32, 32, 76, 90, -/* 0x1a50 */ 77, 65, 95, 68, 69, 67, 51, 48, 10 +/* 0x03f0 */ 162,255,255, 84,233,255,255, 23,230,123,191,169,227,147,190,169, +/* 0x0400 */ 229, 11, 0,249,232, 3, 1,170, 45, 64, 34,139,233, 3, 4,170, +/* 0x0410 */ 142, 64, 37,139,235, 3, 0,170, 6, 21, 64, 56,160, 5,128, 82, +/* 0x0420 */ 196, 8,192, 26, 0,124, 4, 27,198, 0, 0, 75, 32, 1,128, 82, +/* 0x0430 */ 197, 8,192, 26, 0,124, 5, 27,198, 0, 0, 75,174, 0, 6, 11, +/* 0x0440 */ 7, 0,128, 18,229, 32,197, 26,229, 3, 37, 42,228, 32,196, 26, +/* 0x0450 */ 228, 3, 36, 42, 35, 0,128, 82, 34, 0,128, 82, 33, 0,128, 82, +/* 0x0460 */ 32, 0,128, 82, 6, 0,128, 82,230, 31, 0,185, 2, 96,128, 82, +/* 0x0470 */ 192,230,128, 82, 66, 32,206, 26, 66, 0, 0, 11, 0,128,128,210, +/* 0x0480 */ 225, 3, 11,170, 0, 64, 0,170, 0,128, 0,170, 32,132, 0,248, +/* 0x0490 */ 66, 16, 0,113,204,255,255, 84, 0, 21, 0,145,231, 0, 0,148, +/* 0x04a0 */ 31, 0, 8,235,193,255,255, 84,227, 67, 66,248,226, 19, 64,185, +/* 0x04b0 */ 36, 1, 3,203,128, 0, 2, 10,224, 47, 0,185, 0, 16, 6, 11, +/* 0x04c0 */ 97, 1, 0,145,225, 0, 0,148,129, 5, 0, 84,227, 23, 64,185, +/* 0x04d0 */ 226, 27, 64,185, 99, 0, 4, 10,224,115, 64, 57, 99, 32,194, 26, +/* 0x04e0 */ 226, 3, 2, 75, 66, 32, 0, 17, 2, 36,194, 26, 99, 0, 2, 11, +/* 0x04f0 */ 106,177, 57,145, 99, 4, 3, 11,227, 3, 3, 42, 32, 0,128, 82, +/* 0x0500 */ 74, 37, 3,139,223, 28, 0,113, 3, 2, 0, 84,227,125, 64,147, +/* 0x0510 */ 227, 3, 3,203, 37,105, 99, 56,165,120, 31, 83, 65, 1, 8,145, +/* 0x0520 */ 164, 0, 24, 18,227, 3, 4, 42, 33, 4, 3,139,201, 0, 0,148, +/* 0x0530 */ 3, 0, 0, 18,127, 32, 68,107,193, 0, 0, 84, 31, 0, 4,113, +/* 0x0540 */ 195,254,255, 84, 5, 0, 0, 20,225, 3, 10,170,193, 0, 0,148, +/* 0x0550 */ 31, 0, 4,113,163,255,255, 84, 98, 0,128, 82,195, 0,128, 82, +/* 0x0560 */ 223, 40, 0,113, 67, 48,131, 26,223, 16, 0,113,195, 48,131, 26, +/* 0x0570 */ 198, 0, 3, 75, 34, 0, 0, 20, 97, 1, 6,145,178, 0, 0,148, +/* 0x0580 */ 129, 1, 0, 84,227, 11, 64,185,226, 7, 64,185,227, 15, 0,185, +/* 0x0590 */ 226, 11, 0,185,239, 7, 0,185, 3, 0,128, 82,223, 28, 0,113, +/* 0x05a0 */ 102, 0,128, 82,102, 48,134, 26,106,145, 25,145, 42, 0, 0, 20, +/* 0x05b0 */ 97, 97, 6,145,164, 0, 0,148, 97, 2, 0, 84,227, 47, 64,185, +/* 0x05c0 */ 97,129, 7,145, 96, 16, 6, 11,160, 0, 0,148,161, 3, 0, 84, +/* 0x05d0 */ 35, 1,128, 82,223, 28, 0,113,102, 1,128, 82,102, 48,134, 26, +/* 0x05e0 */ 227, 67, 66,248, 36, 1, 3,203,159, 0, 15,107,131, 17, 0, 84, +/* 0x05f0 */ 227,125, 64,147,227, 3, 3,203, 32,105, 99, 56, 32, 21, 0, 56, +/* 0x0600 */ 121, 0, 0, 20, 97,193, 6,145,143, 0, 0,148,228, 7, 64,185, +/* 0x0610 */ 64, 1, 0, 84, 97, 33, 7,145,139, 0, 0,148,228, 11, 64,185, +/* 0x0620 */ 128, 0, 0, 84,227, 11, 64,185,228, 15, 64,185,227, 15, 0,185, +/* 0x0630 */ 227, 7, 64,185,227, 11, 0,185,239, 7, 0,185,239, 3, 4, 42, +/* 0x0640 */ 3, 1,128, 82,223, 28, 0,113,102, 1,128, 82,102, 48,134, 26, +/* 0x0650 */ 106,161, 41,145, 65, 1, 0,145,125, 0, 0,148, 1, 1, 0, 84, +/* 0x0660 */ 227, 47, 64,185, 69, 17, 0,145,227, 3, 3, 42, 2, 0,128, 82, +/* 0x0670 */ 165, 16, 3,139, 4, 1,128, 82, 14, 0, 0, 20, 65, 9, 0,145, +/* 0x0680 */ 115, 0, 0,148, 1, 1, 0, 84,227, 47, 64,185, 69, 17, 4,145, +/* 0x0690 */ 227, 3, 3, 42, 2, 1,128, 82,165, 16, 3,139, 4, 1,128, 82, +/* 0x06a0 */ 4, 0, 0, 20, 69, 17, 8,145, 2, 2,128, 82, 4, 32,128, 82, +/* 0x06b0 */ 226, 55, 0,185, 32, 0,128, 82,225, 3, 5,170,101, 0, 0,148, +/* 0x06c0 */ 3, 0, 4,107,163,255,255, 84,229, 55, 64,185,165, 0, 3, 11, +/* 0x06d0 */ 229, 55, 0,185,223, 16, 0,113,194, 6, 0, 84,198, 28, 0, 17, +/* 0x06e0 */ 99, 0,128, 82,191, 16, 0,113,101, 32,133, 26,227, 3, 5, 42, +/* 0x06f0 */ 101, 29, 3,139,165,128, 13,145, 32, 0,128, 82, 4, 8,128, 82, +/* 0x0700 */ 225, 3, 5,170, 83, 0, 0,148, 3, 0, 4,107,163,255,255, 84, +/* 0x0710 */ 227, 47, 0,185,127, 16, 0,113, 99, 4, 0, 84,100,124, 1, 83, +/* 0x0720 */ 132, 4, 0, 81,111, 0, 0, 18,239, 1, 31, 50,127, 56, 0,113, +/* 0x0730 */ 226, 0, 0, 84,239, 33,196, 26,106,121, 21,145,227, 1, 3, 75, +/* 0x0740 */ 227, 3, 3, 42, 74, 5, 3,139, 12, 0, 0, 20,132, 16, 0, 81, +/* 0x0750 */ 53, 0, 0,148,231,124, 1, 83,131, 1, 7,107,108, 32,140, 26, +/* 0x0760 */ 239, 1, 15, 26,132, 4, 0,113, 65,255,255, 84,106, 17, 25,145, +/* 0x0770 */ 239,109, 28, 83,132, 0,128, 82, 37, 0,128, 82, 32, 0,128, 82, +/* 0x0780 */ 225, 3, 10,170, 51, 0, 0,148, 31, 0, 0,114, 64, 0, 0, 84, +/* 0x0790 */ 239, 1, 5, 42,165,120, 31, 83,132, 4, 0,113, 33,255,255, 84, +/* 0x07a0 */ 2, 0, 0, 20,239, 47, 64,185,239, 5, 0, 49,229, 55, 64,185, +/* 0x07b0 */ 227, 67, 66,248,165, 8, 0, 17, 35, 1, 3,203,255, 1, 3,107, +/* 0x07c0 */ 232, 2, 0, 84,227,125, 64,147,227, 3, 3,203, 32,105, 99, 56, +/* 0x07d0 */ 32, 21, 0, 56, 63, 1, 14,235,194, 0, 0, 84,165, 4, 0,113, +/* 0x07e0 */ 97,255,255, 84,224,115, 0, 57, 63, 1, 14,235,227,229,255, 84, +/* 0x07f0 */ 13, 0, 0,148, 0, 0,128, 82,226, 19, 64,249, 3, 1, 2,203, +/* 0x0800 */ 226, 31, 64,249, 67, 0, 0,185,226, 67, 66,248, 35, 1, 2,203, +/* 0x0810 */ 226, 55, 64,249, 67, 0, 0,185,255,243, 0,145, 32, 0,128, 82, +/* 0x0820 */ 246,255,255, 23,227,124, 24, 83,195, 0, 0, 53, 31, 1, 13,235, +/* 0x0830 */ 231, 92, 24, 83, 66,255,255, 84, 3, 21, 64, 56,108, 32, 12, 42, +/* 0x0840 */ 192, 3, 95,214,224, 3, 6, 42, 33, 68, 32,139, 0, 0,128, 82, +/* 0x0850 */ 33, 68, 32,139,227,124, 24, 83,241, 3, 30,170, 94, 0, 0, 16, +/* 0x0860 */ 99,254,255, 52, 35, 0, 64,121,226,124, 11, 83, 98,124, 2, 27, +/* 0x0870 */ 159, 1, 2,107, 2, 1, 0, 84, 2, 0,129, 82,231, 3, 2, 42, +/* 0x0880 */ 66, 0, 3, 75, 0, 0, 0, 58, 99, 20, 66, 11, 35, 0, 0,121, +/* 0x0890 */ 32, 2, 95,214,140, 1, 2, 75,231, 0, 2, 75, 99, 20, 67, 75, +/* 0x08a0 */ 0, 0, 0, 58, 35, 0, 0,121, 32, 2, 95,214,195, 3, 64,185, +/* 0x08b0 */ 193, 7, 64,185,194, 67, 33,139, 66, 48, 0,145,192, 67, 35,139, +/* 0x08c0 */ 0, 0, 3,145,228, 3, 1, 42, 73,204, 95,184,132, 16, 0, 81, +/* 0x08d0 */ 9,204, 31,184,164,255,255, 53,196, 11, 64,185,222, 3, 2,145, +/* 0x08e0 */ 227,143, 31,184,227, 3, 0,145,226, 3, 30,170,171, 32, 1,209, +/* 0x08f0 */ 234, 3, 30,170,160, 0, 63,214, 64, 1, 31,214,229, 3, 30,170, +/* 0x0900 */ 235,255,255,151,102,105,108,101, 32,102,111,114,109, 97,116, 32, +/* 0x0910 */ 101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97,114, 99, +/* 0x0920 */ 104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73, +/* 0x0930 */ 100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x0940 */ 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, +/* 0x0950 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, +/* 0x0960 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70, +/* 0x0970 */ 105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70, +/* 0x0980 */ 108, 97,103,115, 10, 32, 32, 48, 32, 77, 65, 67, 72, 77, 65, 73, +/* 0x0990 */ 78, 88, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 52, 52, 32, +/* 0x09a0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x09b0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x09c0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, +/* 0x09d0 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, +/* 0x09e0 */ 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, +/* 0x09f0 */ 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, +/* 0x0a00 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, +/* 0x0a10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, +/* 0x0a20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, +/* 0x0a30 */ 48, 48, 48, 48, 48, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, +/* 0x0a40 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, +/* 0x0a50 */ 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, +/* 0x0a60 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 51, 99, 32, 32, 48, 48, +/* 0x0a70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, +/* 0x0a80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0a90 */ 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, 50, 42, 42, 50, +/* 0x0aa0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, +/* 0x0ab0 */ 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 68, 32, 32, +/* 0x0ac0 */ 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 51, 48, 32, +/* 0x0ad0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0ae0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0af0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 99, 48, 32, 32, 50, +/* 0x0b00 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, +/* 0x0b10 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, +/* 0x0b20 */ 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, +/* 0x0b30 */ 48, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0b40 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0b50 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50,102, 48, +/* 0x0b60 */ 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, +/* 0x0b70 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, 78, +/* 0x0b80 */ 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32, 48, 48, 48, +/* 0x0b90 */ 48, 48, 52, 98, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0ba0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x0bb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, +/* 0x0bc0 */ 51,102, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, +/* 0x0bd0 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, +/* 0x0be0 */ 54, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, +/* 0x0bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x0c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, +/* 0x0c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, +/* 0x0c20 */ 48, 48, 48, 56, 97, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, +/* 0x0c30 */ 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, +/* 0x0c40 */ 10, 32, 32, 55, 32, 77, 65, 67, 72, 77, 65, 73, 78, 90, 32, 32, +/* 0x0c50 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 53, 56, 32, 32, 48, 48, 48, +/* 0x0c60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, +/* 0x0c70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x0c80 */ 32, 48, 48, 48, 48, 48, 56, 97, 99, 32, 32, 50, 42, 42, 50, 32, +/* 0x0c90 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, +/* 0x0ca0 */ 78, 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, +/* 0x0cb0 */ 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0cc0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, 77, +/* 0x0cd0 */ 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0ce0 */ 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 90, 10, +/* 0x0cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0d00 */ 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, 77, 65, 73, +/* 0x0d10 */ 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0d20 */ 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 10, 48, 48, +/* 0x0d30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, +/* 0x0d40 */ 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69, 65, 68, 9, +/* 0x0d50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0d60 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, +/* 0x0d70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, +/* 0x0d80 */ 100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, +/* 0x0d90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, +/* 0x0da0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0db0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, 9, 48, +/* 0x0dc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x0dd0 */ 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0de0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, +/* 0x0df0 */ 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0e00 */ 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, +/* 0x0e10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, +/* 0x0e20 */ 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 9, 48, 48, +/* 0x0e30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, +/* 0x0e40 */ 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0e50 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x0e60 */ 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, +/* 0x0e70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, +/* 0x0e80 */ 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0e90 */ 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 77, +/* 0x0ea0 */ 65, 67, 72, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, +/* 0x0eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, 97,114,116, +/* 0x0ec0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0ed0 */ 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 69, 9, +/* 0x0ee0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 99, +/* 0x0ef0 */ 32,117, 99,108, 95,110,114,118, 50,101, 95,100,101, 99,111,109, +/* 0x0f00 */ 112,114,101,115,115, 95, 56, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0f10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, +/* 0x0f20 */ 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0f30 */ 48, 48, 48, 48, 49, 51, 48, 32,117, 99,108, 95,110,114,118, 50, +/* 0x0f40 */ 100, 95,100,101, 99,111,109,112,114,101,115,115, 95, 56, 10, 48, +/* 0x0f50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x0f60 */ 103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, 9, 48, 48, +/* 0x0f70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 48, 56, 32,117, +/* 0x0f80 */ 99,108, 95,110,114,118, 50, 98, 95,100,101, 99,111,109,112,114, +/* 0x0f90 */ 101,115,115, 95, 56, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0fa0 */ 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 78, +/* 0x0fb0 */ 82, 86, 95, 84, 65, 73, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0fc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99, +/* 0x0fd0 */ 111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0fe0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 77, 65, 67, +/* 0x0ff0 */ 72, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1000 */ 48, 48, 48, 48, 48, 48, 48, 32,101,110,100, 95,100,101, 99,111, +/* 0x1010 */ 109,112,114,101,115,115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, +/* 0x1020 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, +/* 0x1030 */ 77, 65, 67, 72, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, +/* 0x1040 */ 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, +/* 0x1050 */ 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, +/* 0x1060 */ 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1070 */ 48, 48, 48, 52, 48, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, +/* 0x1080 */ 67, 65, 76, 76, 50, 54, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, +/* 0x1090 */ 90, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x10a0 */ 48, 48, 53, 48, 10 }; diff --git a/src/stub/src/arch/arm/v8a/lzma_d.S b/src/stub/src/arch/arm/v8a/lzma_d.S index 95df84f1..39f37862 100644 --- a/src/stub/src/arch/arm/v8a/lzma_d.S +++ b/src/stub/src/arch/arm/v8a/lzma_d.S @@ -1,157 +1,525 @@ -/* lzma_d.S -- ARM decompressor for LZMA +// In LZMA SDK 4.63 file lzma.txt (2008-12-30): +// LZMA SDK is written and placed in the public domain by Igor Pavlov. +// The creative expression of this hand compilation into assembly language, +// including (but not limited to) code organization and register assignment, +// remains copyright by John F. Reiser and licensed under GNU Lesser General +// Public License (GNU LGPL). - This file is part of the UPX executable compressor. +// Hand compiled Copyright (c) 2006-2015 John F. Reiser (2007-06-18) +// from modified LzmaDecode.c. +// LZMA SDK 4.40 Copyright (c) 1999-2015 Igor Pavlov (2006-05-01) +// +// This file is licensed under either of these two licenses: +// 1) GNU Lesser General Public License (GNU LGPL) +// 2) Common Public License (CPL) +// See files LGPL.txt and CPL.html for the text of the licenses. - Copyright (C) 1996-2015 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1996-2015 Laszlo Molnar - Copyright (C) 2000-2015 John F. Reiser - All Rights Reserved. +#include "macros.S" - UPX and the UCL library are free software; you can redistribute them - and/or modify them under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. +kLzmaStreamWasFinishedId= (-1) - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +kNumTopBits= 24 +kTopValue= 1< +kNumPosBitsMax= 4 +kNumPosStatesMax= (1 << kNumPosBitsMax) - John F. Reiser - +kLenNumLowBits= 3 +kLenNumLowSymbols= (1 << kLenNumLowBits) +kLenNumMidBits= 3 +kLenNumMidSymbols= (1 << kLenNumMidBits) +kLenNumHighBits= 8 +kLenNumHighSymbols= (1 << kLenNumHighBits) + +LenChoice= 0 +LenChoice2= (LenChoice + 1) +LenLow= (LenChoice2 + 1) +LenMid= (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +LenHigh= (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +kNumLenProbs= (LenHigh + kLenNumHighSymbols) + +kNumStates= 12 +kNumLitStates= 7 + +kStartPosModelIndex= 4 +kEndPosModelIndex= 14 +kNumFullDistances= (1 << (kEndPosModelIndex >> 1)) + +kNumPosSlotBits= 6 +kNumLenToPosStates= 4 + +kNumAlignBits= 4 +kAlignTableSize= (1 << kNumAlignBits) + +kMatchMinLen= 2 + +IsMatch= 0 +IsRep= (IsMatch + (kNumStates << kNumPosBitsMax)) +IsRepG0= (IsRep + kNumStates) +IsRepG1= (IsRepG0 + kNumStates) +IsRepG2= (IsRepG1 + kNumStates) +IsRep0Long= (IsRepG2 + kNumStates) +PosSlot= (IsRep0Long + (kNumStates << kNumPosBitsMax)) +SpecPos= (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +Align= (SpecPos + kNumFullDistances - kEndPosModelIndex) + + LenCoder= (Align + kAlignTableSize) +RepLenCoder= (LenCoder + kNumLenProbs) +Literal= (RepLenCoder + kNumLenProbs) + +LZMA_BASE_SIZE= Literal /* 1846 */ +LZMA_LIT_SIZE= 768 + +#define call bl /* subroutine call */ + +#define symbol mi +#define mo mi + +#define mi w0 +#define p_in x1 +#define t1 w2 +#define t1x x2 +#define t0 w3 +#define t0x x3 + +#define bit w4 +#define bitx x4 +#define i w5 +#define ix x5 +#define state w6 +#define Range w7 + +#define inPtr x8 +#define outPtr x9 +#define prob x10 +#define p x11 + +#define Code w12 +#define inLim x13 +#define outLim x14 + +#define rep0 w15 + +#define t2x x17 + +#define nowPos bit /* temporary only */ +#define nowPosx bitx /* temporary only */ +#define distance bit +#define numDirectBits bit +#define hibit bit +#define matchB i +#define probLen ix +#define probLit ix +#define posSlot posState +#define r_posSlot t0 + +#define r_len i + +#define vs x0 +vs_ps= 2 +vs_lp= 1 +vs_lc= 0 + +#if !defined(PARAMETER_STYLE) /*{*/ + #define PARAMETER_STYLE 1 +// Possible choices: +// 1 /* 0 bytes; 1-byte encoding of pb,lp,lc [default] */ +// 2 /* -24 bytes; 2-byte encoding requires no division */ +// 3 /* -32 bytes; separate bytes lc,lp,pb,xx at -4+ probs */ +#endif /*}*/ + +/* LzmaDecode(x0=vs, x1=inStream, w2=inSize, x3= &inSizeProcessed, + x4= outStream, w5= outSize, x6= &outSizeProcessed) */ +LzmaDecode: .globl LzmaDecode + // save &inSizeProcesesed and caller registers + PUSH5(x3,x4,x5,x6, x30) + mov inPtr,x1 + add inLim,x1,w2, uxtw + mov outPtr,x4 + add outLim,x4,w5, uxtw -#define section .section -#define fp x29 +#if 1==PARAMETER_STYLE /*{ [0]: pb*45 + lp*9 + lc */ + mov p,vs + ldrb w6,[inPtr],#1 - section LZMA_ELF00 -//decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method) -/* Arguments according to calling convention */ -#define src x0 -#define lsrc w1 -#define dst x2 -#define ldst x3 /* Out: actually a reference: &len_dst */ -#define meth w4 + mov w0,#45; udiv w4,w6,w0 // w4 = quo(w6, 45) = pb + mul w0,w0,w4; sub w6,w6,w0 // w6 = rem(w6, 45) - // bkpt // debugging - -#define M_LZMA 14 - cmp meth,#M_LZMA; bne not_lzma - -#if defined(LINUX_ARM_CACHEFLUSH)||defined(DARWIN_ARM_CACHEFLUSH) /*{*/ - PUSH4(dst,ldst, fp,lr) // dst,ldst for cache flush -#else /*}{*/ - PUSH2( fp,lr) + mov w0,#9; udiv w5,w6,w0 // w5 = quo(w6, 9) = lp + mul w0,w0,w5; sub w6,w6,w0 // w6 = rem(w6, 9) = lc #endif /*}*/ -#define a0 x0 -#define a1 x1 -#define a2 w2 -#define a3 x3 -#define a4 x4 /* outp */ -#define a5 w5 /* outSize */ -#define a6 x6 /* &outSizeProcessed */ -#define inSzP 3*4 /* inSizeprocessed */ -#define State 4*4 /* CLzmaDecoderState */ -#define t0 w7 -#define t0x x7 -#define t1 w8 -#define t1x x8 +#if 2==PARAMETER_STYLE /*{ [0]: ((lc + lp)<<3) | pb; [1]: (lp<<4) | lc */ + mov p,vs + ldrb w4,[inPtr],#1; and w4,w4,#7 // pb + ldrb w6,[inPtr],#1; mov w5,w6,lsr #4 // lp + and w6,w6,#0xf // lc -//LzmaDecode( // from lzmaSDK/C/7zip/Compress/LZMA_C/LzmaDecode.h -// a0= &CLzmaDecoderState, -// a1= inp, a2= inSize, a3= &inSizeProcessed, -// a4= outp, a5= outSize, a6= &outSizeProcessed -//) -LZMA_BASE_SIZE= 1846 -LZMA_LIT_SIZE= 768 - - ldrb t0,[src,#0] // first byte, replaces LzmaDecodeProperties() - mov t1,#2*LZMA_LIT_SIZE - lsr t0,t0,#3 // lit_context_bits + lit_pos_bits - lsl t1,t1,t0 // 2*LZMA_LIT_SIZE << (lit_context_bits + lit_pos_bits) - mov t0x,sp -#define W 4 /* even #bits to round up so that 8 bits span all the 1's */ - add t1,t1,#((~(~0<>W)<>1) // 0.5 starting probability + mov x1,p + orr x0,x0,x0,lsl #16 + orr x0,x0,x0,lsl #32 +L10: + str x0,[x1],#4*2 // 4 at a time + subs w2,w2,#4; bgt L10 + + add x0,inPtr,#5 // sentinel +L14: + call rcInit2; cmp x0,inPtr; bne L14 + +L200: // main loop + ldr t0x,outBuf + ldr t1,posStateMask + sub nowPosx,outPtr,t0x + and mi,nowPos,t1 + str mi,posState + add mi,mi,state, lsl #kNumPosBitsMax + add p_in,p,#IsMatch<<1 + call rcGetBit_mi0; bne L270 + + ldr t0,litPosMask + ldr t1,lc + and t0,t0,nowPos + ldrb mi,prevB + lsl t0,t0,t1 // (nowPos & litPosMask)<> (8- lc) + add t0,t0,t1 + add prob, p,#Literal<<1 + add t0,t0,t0,lsl #1 // *3 + uxtw t0x,t0 + mov symbol,#1 + add prob,prob,t0x,lsl #1+ 8 // *768 *2 + + cmp state,#kNumLitStates; blo L240 +L205: + sxtw t0x,rep0 + neg t0x,t0x + ldrb matchB,[outPtr,t0x] +L210: // symbol === mi === mo + lsl matchB,matchB,#1 + add p_in,prob,#0x100<<1 + and bit,matchB,#0x100 + uxtw t0x,bit + add p_in,p_in,t0x,lsl #1 + call rcGetBit_mi + and t0,symbol,#1 + cmp t0,bit,lsr #8; bne L243 // break + cmp symbol,#0x100; blo L210 + b L245 +L240: // symbol === mi === mo + mov p_in,prob + call rcGetBit_mi +L243: + cmp symbol,#0x100; blo L240 +L245: + mov t1,#3; mov t0,#6 + cmp state,#10; csel t0,t1, t0,lo + cmp state,# 4; csel t0,state,t0,lo + sub state,state,t0 + b L298 // assumes symbol===w0 +L270: + add p_in,p,#IsRep<<1 + call rcGetBit_state0; bne L290 + ldr t0,rep2 + ldr t1,rep1 + str t0,rep3 + str t1,rep2 + str rep0,rep1 + mov t0,#0 + cmp state,#kNumLitStates + mov state,#3 + csel state,t0,state,lo + add prob, p,#LenCoder<<1 + b L350 +L290: + add p_in,p,#IsRepG0<<1 + call rcGetBit_state0; bne L300 +L293: + ldr t0,posState + add p_in,p,#IsRep0Long<<1 + add mi,t0,state,lsl #kNumPosBitsMax + call rcGetBit_mi0; bne L340 +L295: + mov t0,#9 + cmp state,#kNumLitStates + mov state,#11 + csel state,t0,state,lo +L297: + ldr t0x,outBuf + sub nowPosx,outPtr,t0x + cmp nowPos,rep0; blo lzmaDataError + sxtw t0x,rep0 + neg t0x,t0x + ldrb w0,[outPtr,t0x] +L298: + strb w0,[outPtr],#1 + b L519 +L300: + add p_in,p,#IsRepG1<<1 + call rcGetBit_state0; ldr distance,rep1; beq L330 +L310: + add p_in,p,#IsRepG2<<1 + call rcGetBit_state0; ldr distance,rep2; beq L325 +L320: + ldr t0,rep2 + ldr distance,rep3 + str t0,rep3 +L325: + ldr t0,rep1 + str t0,rep2 +L330: + str rep0,rep1 + mov rep0,distance +L340: + mov t0,#8 + cmp state,#kNumLitStates + mov state,#11 + csel state,t0,state,lo + add prob, p,#RepLenCoder<<1 +L350: + add p_in,prob,#LenChoice<<1 + call rcGetBit_0; bne L360 + ldr t0,posState + add probLen,prob,#LenLow<<1 + uxtw t0x,t0 + mov t1,#0 + add probLen,probLen,t0x,lsl #1+ kLenNumLowBits + mov hibit,#1<=Range) Code-=Range; + adc rep0,rep0,rep0 // rep0 = (rep0<<1) + (Code>=Range) +L430: + subs numDirectBits,numDirectBits,#1; bne L420 + add prob,p, #Align<<1 + lsl rep0,rep0,#kNumAlignBits + mov numDirectBits,#kNumAlignBits +L438: + mov i,#1 + mov mi,#1 +L440: + mov p_in,prob; call rcGetBit_mi + tst mo,#1; beq L445 + orr rep0,rep0,i +L445: + lsl i,i,#1 + subs numDirectBits,numDirectBits,#1; bne L440 + b L465 +L450: +L460: + ldr rep0,posSlot +L465: + adds rep0,rep0,#1 +#if 0 /*{ only for the stream version */ + bne L470 + mov t0,#kLzmaStreamWasFinishedId + str t0,m_len + b L530 +L470: +#endif /*}*/ + ldr r_len,m_len +L500: + ldr t0x,outBuf + add r_len,r_len,#kMatchMinLen + sub t0x,outPtr,t0x // nowPos + cmp rep0,t0; bhi lzmaDataError + sxtw t0x,rep0 + neg t0x,t0x +L510: // const t0x= -rep0; + ldrb w0,[outPtr,t0x] + strb w0,[outPtr],#1 + cmp outPtr,outLim; bhs L530 + subs r_len,r_len,#1; bne L510 + // FIXME: prfm PLDL1KEEP,outPtr,#32 // fetch next cache line +L519: + strb w0,prevB // implicit &0xFF +L520: // bottom of while loop + cmp outPtr,outLim; blo L200 +L530: + call rcNormalize + mov w0,#0 // success +lzmaExit: + ldr t1x,inBuf + sub t0x,inPtr,t1x + ldr t1x,inSizeProcessed + str t0,[t1x] + + ldr t1x,outBuf + sub t0x,outPtr,t1x + ldr t1x,outSizeProcessed + str t0,[t1x] + + add sp,sp,#(14+1)*4 +// FIXME ldmia sp!,{r4,r5,r6,r7, r8,r9,r10,r11, pc} + +lzmaDataError: + mov w0,#1 // failure + b lzmaExit + + +rcNormalize: + lsr t0,Range,#kNumTopBits + cbnz t0,retNorm +rcLoad: + cmp inPtr,inLim + lsl Range,Range,#8 + bhs lzmaDataError +rcInit2: + ldrb t0,[inPtr],#1 + orr Code,t0,Code, lsl #8 +retNorm: + ret + +rcGetBit_state0: // rcGetBit(0, state + p_in) + mov mi,state +rcGetBit_mi0: // rcGetBit(0, mi + p_in) + add p_in,p_in,mi, uxtw #1 +rcGetBit_0: // rcGetBit(0, p_in) + mov mi,#0 +rcGetBit_mi: // rcGetBit(mi, mi + p_in) + add p_in,p_in,mi, uxtw #1 +rcGetBit: // Out: CC set on mo + lsr t0,Range,#kNumTopBits + mov t2x,x30 // save lr if need rcLoad + adr x30,rcGetBitCont; cbz t0,rcLoad // conditional subroutine call +rcGetBitCont: +#define starp t0 +#define bound t1 +#define y0tmp t1 + ldrh starp,[p_in] + lsr y0tmp,Range,#kNumBitModelTotalBits + mul bound,starp,y0tmp + cmp Code,bound; bhs rcGB1 +rcGB0: // Code < bound + mov y0tmp,#kBitModelTotal + mov Range,bound + sub y0tmp,y0tmp,starp + adcs mo,mi,mi // mo = (mi<<1) | (Code >= bound); set CC + add starp,starp,y0tmp, lsr #kNumMoveBits + strh starp,[p_in] + ret t2x +rcGB1: // Code >= bound + sub Code,Code,bound + sub Range,Range,bound + sub starp,starp,starp, lsr #kNumMoveBits + adcs mo,mi,mi // mo = (mi<<1) | (Code >= bound); set CC + strh starp,[p_in] + ret t2x +#undef y0tmp +#undef bound +#undef starp #undef t1x #undef t1 #undef t0x #undef t0 - section LZMA_DEC20 -#include "lzma_d_cf.S" - - section LZMA_DEC10 -#if 0 /*{*/ -#include "lzma_d_cs.S" -#else /*}{*/ -#define PARAMETER_STYLE 3 -#include "lzma_d-arm.S" -#endif /*}*/ - - section LZMA_DEC30 - -not_lzma: - // vi:ts=8:et - diff --git a/src/stub/tmp/arm64-darwin.macho-entry.bin.dump b/src/stub/tmp/arm64-darwin.macho-entry.bin.dump index d3c12f3b..a7a7db46 100644 --- a/src/stub/tmp/arm64-darwin.macho-entry.bin.dump +++ b/src/stub/tmp/arm64-darwin.macho-entry.bin.dump @@ -7,15 +7,10 @@ Idx Name Size VMA LMA File off Algn 2 NRV2E 0000013c 0000000000000000 0000000000000000 00000084 2**2 CONTENTS, READONLY 3 NRV2D 00000130 0000000000000000 0000000000000000 000001c0 2**2 CONTENTS, READONLY 4 NRV2B 00000108 0000000000000000 0000000000000000 000002f0 2**2 CONTENTS, READONLY - 5 NRV_TAIL 00000000 0000000000000000 0000000000000000 000003f8 2**0 CONTENTS, READONLY - 6 LZMA_ELF00 000000c0 0000000000000000 0000000000000000 000003f8 2**2 CONTENTS, RELOC, READONLY - 7 LZMA_DEC20 000005f8 0000000000000000 0000000000000000 000004b8 2**2 CONTENTS, READONLY - 8 LZMA_DEC10 0000049c 0000000000000000 0000000000000000 00000ab0 2**2 CONTENTS, READONLY - 9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 00000f4c 2**0 CONTENTS, READONLY - 10 MACHMAINY 00000000 0000000000000000 0000000000000000 00000f4c 2**0 CONTENTS, READONLY - 11 MACHMAINZ 00000058 0000000000000000 0000000000000000 00000f4c 2**2 CONTENTS, READONLY + 5 NRV_TAIL 000004b4 0000000000000000 0000000000000000 000003f8 2**2 CONTENTS, READONLY + 6 MACHMAINY 00000000 0000000000000000 0000000000000000 000008ac 2**0 CONTENTS, READONLY + 7 MACHMAINZ 00000058 0000000000000000 0000000000000000 000008ac 2**2 CONTENTS, READONLY SYMBOL TABLE: -0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30 0000000000000000 l d MACHMAINZ 0000000000000000 MACHMAINZ 0000000000000000 l d MACHMAINX 0000000000000000 MACHMAINX 0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD @@ -23,21 +18,14 @@ SYMBOL TABLE: 0000000000000000 l d NRV2D 0000000000000000 NRV2D 0000000000000000 l d NRV2B 0000000000000000 NRV2B 0000000000000000 l d NRV_TAIL 0000000000000000 NRV_TAIL -0000000000000000 l d LZMA_ELF00 0000000000000000 LZMA_ELF00 -0000000000000000 l d LZMA_DEC20 0000000000000000 LZMA_DEC20 -0000000000000000 l d LZMA_DEC10 0000000000000000 LZMA_DEC10 0000000000000000 l d MACHMAINY 0000000000000000 MACHMAINY 0000000000000000 g MACHMAINX 0000000000000000 _start 0000000000000000 g F NRV2E 000000000000013c ucl_nrv2e_decompress_8 0000000000000000 g F NRV2D 0000000000000130 ucl_nrv2d_decompress_8 0000000000000000 g F NRV2B 0000000000000108 ucl_nrv2b_decompress_8 -0000000000000000 g LZMA_DEC10 0000000000000000 LzmaDecode +0000000000000000 g NRV_TAIL 0000000000000000 LzmaDecode 0000000000000000 g MACHMAINY 0000000000000000 end_decompress RELOCATION RECORDS FOR [MACHMAINX]: OFFSET TYPE VALUE 0000000000000040 R_AARCH64_CALL26 MACHMAINZ+0x0000000000000050 - -RELOCATION RECORDS FOR [LZMA_ELF00]: -OFFSET TYPE VALUE -0000000000000004 R_AARCH64_CONDBR19 LZMA_DEC30 diff --git a/src/stub/tmp/thumb-eabi-linux.shlib-init.bin.dump b/src/stub/tmp/thumb-eabi-linux.shlib-init.bin.dump deleted file mode 100644 index b2165624..00000000 --- a/src/stub/tmp/thumb-eabi-linux.shlib-init.bin.dump +++ /dev/null @@ -1,266 +0,0 @@ -file format elf32-littlearm - -Sections: -Idx Name Size VMA LMA File off Algn Flags - 0 ELFMAINX 00000098 00000000 00000000 00000034 2**2 CONTENTS, RELOC, READONLY - 1 NRV_HEAD 00000000 00000000 00000000 000000cc 2**0 CONTENTS, READONLY - 2 NRV_TAIL 00000000 00000000 00000000 000000cc 2**0 CONTENTS, READONLY - 3 NRV2E 0000013c 00000000 00000000 000000cc 2**0 CONTENTS, RELOC, READONLY - 4 NRV2D 00000128 00000000 00000000 00000208 2**0 CONTENTS, RELOC, READONLY - 5 NRV2B 000000ec 00000000 00000000 00000330 2**0 CONTENTS, RELOC, READONLY - 6 LZMA_ELF00 000000b8 00000000 00000000 0000041c 2**0 CONTENTS, RELOC, READONLY - 7 LZMA_DEC20 00000938 00000000 00000000 000004d4 2**0 CONTENTS, RELOC, READONLY - 8 LZMA_DEC10 00000478 00000000 00000000 00000e0c 2**0 CONTENTS, RELOC, READONLY - 9 LZMA_DEC30 00000000 00000000 00000000 00001284 2**0 CONTENTS, READONLY - 10 ELFMAINY 0000003e 00000000 00000000 00001284 2**0 CONTENTS, READONLY - 11 ELFMAINZ 0000017c 00000000 00000000 000012c4 2**2 CONTENTS, RELOC, READONLY -SYMBOL TABLE: -00000000 l ELFMAINX 00000000 .real_start_ofELFMAINX -00000000 l d NRV2E 00000000 NRV2E -00000000 l d NRV2D 00000000 NRV2D -00000000 l d NRV2B 00000000 NRV2B -00000000 l d LZMA_ELF00 00000000 LZMA_ELF00 -00000000 l d LZMA_DEC20 00000000 LZMA_DEC20 -00000000 l d LZMA_DEC10 00000000 LZMA_DEC10 -00000000 l d LZMA_DEC30 00000000 LZMA_DEC30 -00000000 l d ELFMAINZ 00000000 ELFMAINZ -00000000 l ELFMAINZ 00000000 .real_start_ofELFMAINZ -00000000 l d ELFMAINX 00000000 ELFMAINX -00000000 l d NRV_HEAD 00000000 NRV_HEAD -00000000 l d NRV_TAIL 00000000 NRV_TAIL -00000000 l d ELFMAINY 00000000 ELFMAINY -00000000 g ELFMAINX 00000000 _start -00000000 g F NRV2E 0000013c ucl_nrv2e_decompress_8 -00000000 g F NRV2D 00000128 ucl_nrv2d_decompress_8 -00000000 g F NRV2B 000000ec ucl_nrv2b_decompress_8 -00000000 g LZMA_DEC10 00000000 LzmaDecode -00000000 g ELFMAINY 00000000 end_decompress - -RELOCATION RECORDS FOR [ELFMAINX]: -OFFSET TYPE VALUE -0000002c R_ARM_THM_CALL .real_start_ofELFMAINZ -00000044 R_ARM_THM_CALL .real_start_ofELFMAINX -00000088 R_ARM_THM_CALL .real_start_ofELFMAINZ -0000008e R_ARM_THM_CALL .real_start_ofELFMAINZ -00000094 R_ARM_THM_CALL .real_start_ofELFMAINZ - -RELOCATION RECORDS FOR [NRV2E]: -OFFSET TYPE VALUE -00000010 R_ARM_PC24 NRV2E -0000006c R_ARM_PC24 NRV2E -00000070 R_ARM_PC24 NRV2E -00000078 R_ARM_PC24 NRV2E -00000084 R_ARM_PC24 NRV2E -00000090 R_ARM_PC24 NRV2E -0000009c R_ARM_PC24 NRV2E -000000a0 R_ARM_PC24 NRV2E -000000ac R_ARM_PC24 NRV2E -000000bc R_ARM_PC24 NRV2E -000000c4 R_ARM_PC24 NRV2E -000000c8 R_ARM_PC24 NRV2E -000000d0 R_ARM_PC24 NRV2E -000000d4 R_ARM_PC24 NRV2E -000000e0 R_ARM_PC24 NRV2E -000000e4 R_ARM_PC24 NRV2E -000000ec R_ARM_PC24 NRV2E -000000f8 R_ARM_PC24 NRV2E -000000fc R_ARM_PC24 NRV2E -00000104 R_ARM_PC24 NRV2E -0000010c R_ARM_PC24 NRV2E -00000134 R_ARM_PC24 NRV2E -00000138 R_ARM_PC24 NRV2E - -RELOCATION RECORDS FOR [NRV2D]: -OFFSET TYPE VALUE -00000010 R_ARM_PC24 NRV2D -0000006c R_ARM_PC24 NRV2D -00000070 R_ARM_PC24 NRV2D -00000078 R_ARM_PC24 NRV2D -00000084 R_ARM_PC24 NRV2D -00000090 R_ARM_PC24 NRV2D -0000009c R_ARM_PC24 NRV2D -000000a0 R_ARM_PC24 NRV2D -000000ac R_ARM_PC24 NRV2D -000000bc R_ARM_PC24 NRV2D -000000c4 R_ARM_PC24 NRV2D -000000cc R_ARM_PC24 NRV2D -000000d8 R_ARM_PC24 NRV2D -000000e0 R_ARM_PC24 NRV2D -000000ec R_ARM_PC24 NRV2D -000000f8 R_ARM_PC24 NRV2D -000000fc R_ARM_PC24 NRV2D -00000120 R_ARM_PC24 NRV2D -00000124 R_ARM_PC24 NRV2D - -RELOCATION RECORDS FOR [NRV2B]: -OFFSET TYPE VALUE -00000010 R_ARM_PC24 NRV2B -00000070 R_ARM_PC24 NRV2B -00000078 R_ARM_PC24 NRV2B -0000007c R_ARM_PC24 NRV2B -0000008c R_ARM_PC24 NRV2B -00000090 R_ARM_PC24 NRV2B -00000094 R_ARM_PC24 NRV2B -000000a0 R_ARM_PC24 NRV2B -000000b0 R_ARM_PC24 NRV2B -000000b4 R_ARM_PC24 NRV2B -000000bc R_ARM_PC24 NRV2B -000000c4 R_ARM_PC24 NRV2B -000000c8 R_ARM_PC24 NRV2B -000000e4 R_ARM_PC24 NRV2B -000000e8 R_ARM_PC24 NRV2B - -RELOCATION RECORDS FOR [LZMA_ELF00]: -OFFSET TYPE VALUE -00000008 R_ARM_PC24 LZMA_DEC30 -0000004c R_ARM_PC24 LZMA_ELF00 -00000080 R_ARM_PC24 LZMA_ELF00 - -RELOCATION RECORDS FOR [LZMA_DEC20]: -OFFSET TYPE VALUE -00000074 R_ARM_PC24 LZMA_DEC20 -00000090 R_ARM_PC24 LZMA_DEC20 -000000b8 R_ARM_PC24 LZMA_DEC20 -000000cc R_ARM_PC24 LZMA_DEC20 -000000f4 R_ARM_PC24 LZMA_DEC20 -00000100 R_ARM_PC24 LZMA_DEC20 -00000108 R_ARM_PC24 LZMA_DEC20 -00000144 R_ARM_PC24 LZMA_DEC20 -00000190 R_ARM_PC24 LZMA_DEC20 -000001cc R_ARM_PC24 LZMA_DEC20 -000001d8 R_ARM_PC24 LZMA_DEC20 -00000204 R_ARM_PC24 LZMA_DEC20 -00000218 R_ARM_PC24 LZMA_DEC20 -00000220 R_ARM_PC24 LZMA_DEC20 -00000234 R_ARM_PC24 LZMA_DEC20 -0000023c R_ARM_PC24 LZMA_DEC20 -00000240 R_ARM_PC24 LZMA_DEC20 -0000024c R_ARM_PC24 LZMA_DEC20 -00000258 R_ARM_PC24 LZMA_DEC20 -000002a4 R_ARM_PC24 LZMA_DEC20 -000002c8 R_ARM_PC24 LZMA_DEC20 -000002e8 R_ARM_PC24 LZMA_DEC20 -00000304 R_ARM_PC24 LZMA_DEC20 -0000030c R_ARM_PC24 LZMA_DEC20 -0000033c R_ARM_PC24 LZMA_DEC20 -00000388 R_ARM_PC24 LZMA_DEC20 -000003a0 R_ARM_PC24 LZMA_DEC20 -000003a8 R_ARM_PC24 LZMA_DEC20 -000003cc R_ARM_PC24 LZMA_DEC20 -000003e0 R_ARM_PC24 LZMA_DEC20 -000003e8 R_ARM_PC24 LZMA_DEC20 -00000424 R_ARM_PC24 LZMA_DEC20 -00000438 R_ARM_PC24 LZMA_DEC20 -0000046c R_ARM_PC24 LZMA_DEC20 -00000484 R_ARM_PC24 LZMA_DEC20 -0000048c R_ARM_PC24 LZMA_DEC20 -000004b0 R_ARM_PC24 LZMA_DEC20 -000004d4 R_ARM_PC24 LZMA_DEC20 -000004ec R_ARM_PC24 LZMA_DEC20 -000004f4 R_ARM_PC24 LZMA_DEC20 -00000518 R_ARM_PC24 LZMA_DEC20 -0000053c R_ARM_PC24 LZMA_DEC20 -00000598 R_ARM_PC24 LZMA_DEC20 -000005a0 R_ARM_PC24 LZMA_DEC20 -000005c0 R_ARM_PC24 LZMA_DEC20 -000005e4 R_ARM_PC24 LZMA_DEC20 -000005fc R_ARM_PC24 LZMA_DEC20 -00000604 R_ARM_PC24 LZMA_DEC20 -00000624 R_ARM_PC24 LZMA_DEC20 -00000648 R_ARM_PC24 LZMA_DEC20 -00000680 R_ARM_PC24 LZMA_DEC20 -0000068c R_ARM_PC24 LZMA_DEC20 -000006d0 R_ARM_PC24 LZMA_DEC20 -000006ec R_ARM_PC24 LZMA_DEC20 -0000071c R_ARM_PC24 LZMA_DEC20 -00000728 R_ARM_PC24 LZMA_DEC20 -0000076c R_ARM_PC24 LZMA_DEC20 -0000077c R_ARM_PC24 LZMA_DEC20 -0000079c R_ARM_PC24 LZMA_DEC20 -000007b8 R_ARM_PC24 LZMA_DEC20 -000007c4 R_ARM_PC24 LZMA_DEC20 -000007d0 R_ARM_PC24 LZMA_DEC20 -000007f4 R_ARM_PC24 LZMA_DEC20 -00000820 R_ARM_PC24 LZMA_DEC20 -0000082c R_ARM_PC24 LZMA_DEC20 -0000087c R_ARM_PC24 LZMA_DEC20 -00000888 R_ARM_PC24 LZMA_DEC20 -000008a0 R_ARM_PC24 LZMA_DEC20 -000008e8 R_ARM_PC24 LZMA_DEC20 -000008f4 R_ARM_PC24 LZMA_DEC20 -000008fc R_ARM_PC24 LZMA_DEC20 -00000904 R_ARM_PC24 LZMA_DEC20 -00000928 R_ARM_PC24 LZMA_DEC20 - -RELOCATION RECORDS FOR [LZMA_DEC10]: -OFFSET TYPE VALUE -00000078 R_ARM_PC24 LZMA_DEC10 -00000080 R_ARM_PC24 LZMA_DEC10 -00000088 R_ARM_PC24 LZMA_DEC10 -000000a8 R_ARM_PC24 LZMA_DEC10 -000000ac R_ARM_PC24 LZMA_DEC10 -000000e4 R_ARM_PC24 LZMA_DEC10 -00000100 R_ARM_PC24 LZMA_DEC10 -0000010c R_ARM_PC24 LZMA_DEC10 -00000114 R_ARM_PC24 LZMA_DEC10 -00000118 R_ARM_PC24 LZMA_DEC10 -00000120 R_ARM_PC24 LZMA_DEC10 -00000128 R_ARM_PC24 LZMA_DEC10 -00000144 R_ARM_PC24 LZMA_DEC10 -0000014c R_ARM_PC24 LZMA_DEC10 -00000150 R_ARM_PC24 LZMA_DEC10 -00000180 R_ARM_PC24 LZMA_DEC10 -00000188 R_ARM_PC24 LZMA_DEC10 -0000018c R_ARM_PC24 LZMA_DEC10 -0000019c R_ARM_PC24 LZMA_DEC10 -000001a0 R_ARM_PC24 LZMA_DEC10 -000001c0 R_ARM_PC24 LZMA_DEC10 -000001cc R_ARM_PC24 LZMA_DEC10 -000001d4 R_ARM_PC24 LZMA_DEC10 -000001dc R_ARM_PC24 LZMA_DEC10 -000001e4 R_ARM_PC24 LZMA_DEC10 -000001ec R_ARM_PC24 LZMA_DEC10 -00000228 R_ARM_PC24 LZMA_DEC10 -0000022c R_ARM_PC24 LZMA_DEC10 -00000244 R_ARM_PC24 LZMA_DEC10 -0000024c R_ARM_PC24 LZMA_DEC10 -00000250 R_ARM_PC24 LZMA_DEC10 -00000268 R_ARM_PC24 LZMA_DEC10 -00000284 R_ARM_PC24 LZMA_DEC10 -0000028c R_ARM_PC24 LZMA_DEC10 -000002a4 R_ARM_PC24 LZMA_DEC10 -000002c8 R_ARM_PC24 LZMA_DEC10 -000002d0 R_ARM_PC24 LZMA_DEC10 -000002dc R_ARM_PC24 LZMA_DEC10 -000002f4 R_ARM_PC24 LZMA_DEC10 -0000030c R_ARM_PC24 LZMA_DEC10 -00000314 R_ARM_PC24 LZMA_DEC10 -0000032c R_ARM_PC24 LZMA_DEC10 -00000350 R_ARM_PC24 LZMA_DEC10 -00000358 R_ARM_PC24 LZMA_DEC10 -00000370 R_ARM_PC24 LZMA_DEC10 -00000378 R_ARM_PC24 LZMA_DEC10 -0000039c R_ARM_PC24 LZMA_DEC10 -000003b0 R_ARM_PC24 LZMA_DEC10 -000003b8 R_ARM_PC24 LZMA_DEC10 -000003c8 R_ARM_PC24 LZMA_DEC10 -000003cc R_ARM_PC24 LZMA_DEC10 -00000400 R_ARM_PC24 LZMA_DEC10 -00000418 R_ARM_PC24 LZMA_DEC10 -00000440 R_ARM_PC24 LZMA_DEC10 - -RELOCATION RECORDS FOR [ELFMAINZ]: -OFFSET TYPE VALUE -00000020 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000028 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000030 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000050 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000076 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000094 R_ARM_THM_CALL .real_start_ofELFMAINZ -000000c4 R_ARM_PC24 ELFMAINZ -000000e2 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000108 R_ARM_THM_CALL .real_start_ofELFMAINZ -00000120 R_ARM_THM_CALL .real_start_ofELFMAINZ -0000012a R_ARM_THM_CALL .real_start_ofELFMAINZ -00000134 R_ARM_THM_CALL .real_start_ofELFMAINZ -0000013c R_ARM_THM_CALL .real_start_ofELFMAINZ