ELF2 for powerpc (32-bit) main programs

modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   p_lx_elf.cpp
	modified:   stub/Makefile
	modified:   stub/src/arch/powerpc/32/macros.S
	modified:   stub/src/i386-linux.elf-main2.c
	new file:   stub/src/powerpc-expand.S
	modified:   stub/src/powerpc-linux.elf-entry.S
	modified:   stub/src/powerpc-linux.elf-fold.S
	modified:   stub/src/powerpc-linux.elf-fold.lds
	new file:   stub/src/powerpc-linux.elf-main2.c
	modified:   stub/src/powerpc64-linux.elf-fold.S
           plus generated *.h *.map *.dump

 interactive rebase in progress; onto ac82d473
 Last commands done (17 commands done):
    pick 1b9ddea5 ELF2 arm32-linux unmap_all_pages
    pick 1f372e54 ELF2 for powerpc (32-bit) main programs
 Next commands to do (10 remaining commands):
    pick 5f5849a9 ELF2 stragglers from stub make
    pick 2ba8b5da ELF2 for mips 32-bit main programs
 You are currently rebasing branch 'jreiser-ELF2' on 'ac82d473'.

 Changes to be committed:
	modified:   misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   src/p_lx_elf.cpp
	modified:   src/stub/Makefile
	modified:   src/stub/powerpc-linux.elf-entry.h
	modified:   src/stub/powerpc-linux.elf-fold.h
	modified:   src/stub/powerpc64-linux.elf-fold.h
	modified:   src/stub/powerpc64le-linux.elf-fold.h
	modified:   src/stub/src/arch/powerpc/32/macros.S
	modified:   src/stub/src/i386-linux.elf-main2.c
	new file:   src/stub/src/powerpc-expand.S
	modified:   src/stub/src/powerpc-linux.elf-entry.S
	modified:   src/stub/src/powerpc-linux.elf-fold.S
	modified:   src/stub/src/powerpc-linux.elf-fold.lds
	new file:   src/stub/src/powerpc-linux.elf-main2.c
	modified:   src/stub/src/powerpc64-linux.elf-fold.S
	modified:   src/stub/tmp/powerpc-linux.elf-entry.bin.dump
	modified:   src/stub/tmp/powerpc-linux.elf-fold.map
	modified:   src/stub/tmp/powerpc64-linux.elf-fold.map
	modified:   src/stub/tmp/powerpc64le-linux.elf-fold.map
This commit is contained in:
John Reiser 2024-07-09 11:06:49 -07:00
parent 6cda0b6016
commit 88c94d1cc0
19 changed files with 3894 additions and 3010 deletions

View File

@ -64,9 +64,9 @@ e5ccaa48ec0223990abc7681bb97a9f49b0192db4d04a21b0525dd610bfcbcae *i386-linux.elf
e7bfe2365ce83121ef757f8be47aa158da537e8992c3b2082e08a0fc4512708b *mips-linux.elf/upx-3.95
502515712de82f6dabaad1cc5887a04edbb28d4da7017dd50b677f5708e625aa *mipsel-linux.elf/upx-3.91
fcbd8b4709ee324eb772e5de45a85bac5b8e560460fb1d50d0958f2ce568be97 *mipsel-linux.elf/upx-3.95
16b0df199ae2055fb98ddf8cf77a0ee2ea3fa9a386e9cc6dd940647532130c2f *powerpc-linux.elf/upx-3.91
1561a7e36653475eeabe33f65890e9a25e9e00b69ffcfa7928f68d4c0f6b2179 *powerpc-linux.elf/upx-3.95
037374e757fdac5832e00fc5901545543279bc5dc492a583dcf47275939c1ce0 *powerpc64le-linux.elf/upx-3.95
24d55fdb89305d4c767fdd38c0a0c53abffed8a5d540c470054f761fa9cfebee *powerpc-linux.elf/upx-3.91
6e414a871d14d8feec0e8abfc26678dc89dfaa120b17d71b340a3406ba0c161d *powerpc-linux.elf/upx-3.95
6b71e490524ccaab029b87a984bfd0c3a5f191b7e9497f795f916f2da98b9764 *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
7ae7eea1444d1b6e56dda4a0512ff94e5ebaf8c02288a4132def5fdf46fb4b2e *amd64-linux.elf/upx-3.91
@ -87,9 +87,9 @@ b8d481769be7aa7768bb1bd8775e766512c5720813e5d8bab6decb200a916f11 *m68k-atari.tos
0e79d59ea6651e43d757fd584ac909df8e2719179664f61daaf842fdaf4abd36 *mips-linux.elf/upx-3.95
ee769694227b4f2e6195852ce6cbd899fc0c3308f978dcb85c9fc768d21ce37f *mipsel-linux.elf/upx-3.91
73c3d6cee83136438b884e8dd3af19c9cb8298401e295bf0428616c75589090b *mipsel-linux.elf/upx-3.95
d05786b4b729f13a9b325322c2ea41ca7db6f60fee9f82c58874a25ee7eca086 *powerpc-linux.elf/upx-3.91
5068e792280ded5f51eb7003807514bdb7fce8739170952fa3ec631d9743bb69 *powerpc-linux.elf/upx-3.95
2f50e82cfca013d37d0081982f8731590bbb79cf95257736ef2dfa3ad4a42d93 *powerpc64le-linux.elf/upx-3.95
3411eafdbac912015e1e8eb53e4210e775b46ce699efe917be95cb495c6e4902 *powerpc-linux.elf/upx-3.91
9b0195a869a97db2e24d381f93fc7e937c8d9c0d6321c8432601dd919894ed03 *powerpc-linux.elf/upx-3.95
c42eee3abe1b44d2e0fe491910314cce2800d321abb8dc468a81e049ed6bdf3e *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
34959e4a8682e4270e7a1a471fca0d8cd20391201ec50c2815b7dbfb6df5b9a8 *amd64-linux.elf/upx-3.91
@ -110,9 +110,9 @@ a47825b63e33e2ff5f07ec2b8e51991172a1e26e17fa1b2a19dc7857ab76db35 *i386-win32.pe/
023eac920d1eccb97d491880fc754a7ebca0d0b1fd2d69a799247e0fd86b0a1c *mips-linux.elf/upx-3.95
d18aa30ba7a8bc500517b8dcdd16976806c88c5a49e721f8a54d216fb7f7b230 *mipsel-linux.elf/upx-3.91
fa3be8f93006a88c7ad3d9fd13f600c4f69745859eb76f7eab317a5b87d256ea *mipsel-linux.elf/upx-3.95
1eaa5a0165d9d7cd6c0dd1f6c223f60cb5c213ff8f74af78764b075a7202f334 *powerpc-linux.elf/upx-3.91
39133844ee0264df192e96e2447f5383e7cef42dbf08e9dd5b8928328894f62b *powerpc-linux.elf/upx-3.95
9f0562baf5988ec9bc11b07593a64bd7428cd77405dbefb52ff9a380c91d3d21 *powerpc64le-linux.elf/upx-3.95
006e6471ccc74f1367b82ee84ce2c1d5f0a24fee18f8d44a9fbdb51bfba2cfd0 *powerpc-linux.elf/upx-3.91
9b130ab4725daa1f7e262a6e40c6999516a8bddb3089e57b42fcf97d70fd29d1 *powerpc-linux.elf/upx-3.95
13ce7ab52c606c265e77a12967ec67d0548a8e3b39d0019a8c332c2cc980c0e3 *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t140_compress_lzma_2_no_filter="\
b028e56efb322a8d3a462cde72ff1ed193ba1e53bb055a40e20f436fa374403d *amd64-linux.elf/upx-3.91
@ -133,9 +133,9 @@ d81bbba6a8ede3aa9bebcd28280914c1084dc0a9ff1d000389e3f52ff05a1ac7 *m68k-atari.tos
5e05bfd0d6ad9b3d5378705e35165accaf7008742b26b0cbe72c7d7137ef20f6 *mips-linux.elf/upx-3.95
bfbcb18537081e3393c6d144101675bfe935192390405c3072449fbfa3b38069 *mipsel-linux.elf/upx-3.91
c8b1cbc45bc1c34f481bdf535bb21ea62d2a6a7ce8bcfb1460cb8c5de85e3c43 *mipsel-linux.elf/upx-3.95
d2ee5c94812125bcc8970f42dd363ebe0f0fd9b3bdfe8973214e956978bc1dad *powerpc-linux.elf/upx-3.91
a214c035d403c1dc7b5d80d6cfd8e00e2278f8600332875f2e53e1c61648fdc2 *powerpc-linux.elf/upx-3.95
4018c5dcc8d1479ab64977c8b714421235a72b900d406c891c6913195bfc3a6c *powerpc64le-linux.elf/upx-3.95
44b9dba881ff6203d77c4af7f7183a1ef9178a43e12bcdb383223093873047c2 *powerpc-linux.elf/upx-3.91
a2eb3334b926429225f81ae7f73e10b1ba88585a4d427b724efcd5f1be2096c7 *powerpc-linux.elf/upx-3.95
83ee22373cdeae5cb78582f4852b979673e908729bfaf429e09c379d4bf6ee16 *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t150_compress_ucl_2_all_filters="\
fc70cf55446c99b6e6845511f86c7f9496c97bcd44f0844206c9b70722fc33eb *amd64-linux.elf/upx-3.91
@ -156,9 +156,9 @@ b233f8508a150a20dffaeb6da057ccfd1cf78fbb89d9bdf3fbdd1c21716665e3 *i386-win32.pe/
da433fd7ab5139a574f4ab21f0c2401eda8aa977ca5988a70c93b6f295ed6248 *mips-linux.elf/upx-3.95
c30fa4adac1d1b0838e452e7f6591d433352ed719d32b161e6383828927e9b13 *mipsel-linux.elf/upx-3.91
b5ece56b5e674b8ba1a6bdd488ad41495d52a8a9e594bd84651e1d7f393d5e23 *mipsel-linux.elf/upx-3.95
e3825daa7fb8d509590c1db347a8403dbd899da453fb43850ebf1d31abbe0cba *powerpc-linux.elf/upx-3.91
20e2b5270c00b18770cc7fd9b2c4d523b2a33b215d354fb00d129d35219094f0 *powerpc-linux.elf/upx-3.95
7bb92d8d8a53d9ff563d1512c47874ad9bc6bf0ecb06f1c2da92ec22b4206de5 *powerpc64le-linux.elf/upx-3.95
4bb696766de1658a4e42d79d2f2f73f1108d7e754e882fb064c88637285726b6 *powerpc-linux.elf/upx-3.91
41bdafc3d9f4218fb448d0584e17770bbe9124da2d66f45e2d55b58135ff7ffc *powerpc-linux.elf/upx-3.95
a44f6615d689956d2f2d0325721abbeb758b9f3e0035ddeb098488d861096633 *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
09724f7b02c462d992ec9f4464f72bd7c25eb6e2918c9ad14fa88d4edc1207dc *amd64-linux.elf/upx-3.91
@ -179,9 +179,9 @@ f6a7a90073cf16f53c17a2ae7aea1c91beff0c2926d41c628a8d1a724bc37e6b *i386-win32.pe/
4b28f7ad82b9172ff8e65c03f48b23184494f0b82704e39d2c9b3fc854db1d9a *mips-linux.elf/upx-3.95
c4cf58843905b62b0fe50266b926f46041a7329ca1f8237a5743fc54a6daed68 *mipsel-linux.elf/upx-3.91
558047321b8771a5445bd56741334a954f1d722d9e70764ca13a1075ad139378 *mipsel-linux.elf/upx-3.95
4a57ba95ab87a2710d2e3f93a344b3f56cae08043c5b3f2ce55965a59d13762e *powerpc-linux.elf/upx-3.91
c37806b0d68697276cdd208ab37c92e01055bfbab73c6bbdf054c95fe9cef3b9 *powerpc-linux.elf/upx-3.95
8747ba2fc2b332588fe3aa50fcc303fcd516798552e0092699b8a9b718096ad5 *powerpc64le-linux.elf/upx-3.95
fbae47b348a8bf6e9cba7f4a92f9fb701d9f655b8468c2547e6826c99e8cc23a *powerpc-linux.elf/upx-3.91
3618c0b70a7a8b505db67a173413dc8c49b8b2bc1ab0b967cc23d27beb440912 *powerpc-linux.elf/upx-3.95
e3e83f1f43c2af7873ee0ada32e1b322b31fcfee1baf2c51e58a5fe6f5163eb5 *powerpc64le-linux.elf/upx-3.95
"
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
cdc4ed9c5f1f724c436a3fc97a45b6b89605b34d8210ab6fdbbefb5954b5361b *amd64-linux.elf/upx-3.91
@ -202,8 +202,8 @@ eb01b6f27798690115cabb88314551579da509455232bbaa3276eddc25106d0d *i386-win32.pe/
4ab3160a6486ab2fe9f65e008fa084f1d1df5ebe3bd2b3960d0257ed6a11e5ad *mips-linux.elf/upx-3.95
846565c58b637ec7c59a962dd68848d375468f02a03490d972255150412e7f19 *mipsel-linux.elf/upx-3.91
b34e08324b5f078b1f7408afcf72f7b6fb7f2a25e76332459aa30c020124f04c *mipsel-linux.elf/upx-3.95
1c0fde4880d16710cba3d2d285d8af01aff2b50bd8f0203afcd3a338a8a0b0b1 *powerpc-linux.elf/upx-3.91
60f7c8153f3e0ae5d793645b88b6323630fd1b8caf40511a26836835aa99228d *powerpc-linux.elf/upx-3.95
d6ff4a6d2f0d4edd68dd8ab7c1c219a5d7820d53ccd512cc1eb6837b58b237d4 *powerpc64le-linux.elf/upx-3.95
5cdd68abc67e8009acbfefeb49b887206a504bf7492e8f8da9ef281f50394f53 *powerpc-linux.elf/upx-3.91
bf42c5453264a033ba786c9b661b12d7a725ecad99092b797e146d214f7149db *powerpc-linux.elf/upx-3.95
1a610a97f83fce54f88ad410072ab0d40fc5138f47412d24526caf175ef3c18d *powerpc64le-linux.elf/upx-3.95
"
########## end .sha256sums.recreate

View File

@ -1498,8 +1498,8 @@ PackLinuxElf32::buildLinuxLoader(
else if (0
|| this->e_machine==Elf32_Ehdr::EM_386
|| this->e_machine==Elf32_Ehdr::EM_ARM
|| this->e_machine==Elf32_Ehdr::EM_PPC
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC
) { // main program with ELF2 de-compressor
initLoader(fold, szfold);
char sec[120];
@ -1569,8 +1569,8 @@ PackLinuxElf32::buildLinuxLoader(
&& (0
|| this->e_machine==Elf32_Ehdr::EM_386
|| this->e_machine==Elf32_Ehdr::EM_ARM
|| this->e_machine==Elf32_Ehdr::EM_PPC
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC
)
) { // shlib with ELF2 de-compressor
addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR");
@ -1578,8 +1578,8 @@ PackLinuxElf32::buildLinuxLoader(
else if (0
|| this->e_machine==Elf32_Ehdr::EM_386
|| this->e_machine==Elf32_Ehdr::EM_ARM
|| this->e_machine==Elf32_Ehdr::EM_PPC
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS
//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC
) { // main program with ELF2 de-compressor
addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR");
defineSymbols(ft);

View File

@ -1682,7 +1682,7 @@ powerpc-darwin.dylib-entry.h : $(srcdir)/src/$$T.S
powerpc-linux.elf%.h : tc_list = powerpc-linux.elf default
powerpc-linux.elf%.h : tc_bfdname = elf32-powerpc
tc.powerpc-linux.elf.gcc = powerpc.405-linux-gcc-3.4.5 -m32 -mbig-endian -mtune=powerpc -nostdinc -MMD -MT $@
tc.powerpc-linux.elf.gcc = powerpc.405-linux-gcc-3.4.5 -m32 -mbig-endian -DBIG_ENDIAN=1 -mtune=powerpc -nostdinc -MMD -MT $@
tc.powerpc-linux.elf.gcc += -fno-exceptions -fno-asynchronous-unwind-tables # -fno-stack-protector
tc.powerpc-linux.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototypes -Wwrite-strings -Werror
@ -1691,20 +1691,30 @@ powerpc-linux.elf-entry.h : $(srcdir)/src/$$T.S
$(call tc,f-embed_objinfo,tmp/$T.bin)
$(call tc,bin2h) tmp/$T.bin $@
powerpc-linux.elf-fold.h : tmp/$$T.o tmp/powerpc-linux.elf-main.o $(srcdir)/src/$$T.lds
$(call tc,ld) --strip-all -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin
$(call tc,f-objstrip,tmp/$T.bin)
$(call tc,sstrip) tmp/$T.bin
powerpc-linux.elf-fold.h : $(srcdir)/src/$$T.lds \
tmp/$$T.o \
tmp/powerpc-linux.elf-upxfd_android.o \
tmp/powerpc-expand.o \
tmp/powerpc-linux.elf-main2.o
$(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin
$(call tc,f-embed_objinfo_without_xstrip_keep_dot_text,tmp/$T.bin)
$(call tc,bin2h) tmp/$T.bin $@
tmp/powerpc-linux.elf-fold.o : $(srcdir)/src/$$T.S
$(call tc,gcc) -c $< -o $@
$(call tc,f-objstrip,$@)
tmp/powerpc-linux.elf-main.o : $(srcdir)/src/$$T.c
tmp/powerpc-linux.elf-main2.o : $(srcdir)/src/$$T.c
$(call tc,gcc) -c $< -o $@
$(call tc,f-objstrip,$@)
tmp/powerpc-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c
$(call tc,gcc) -c -O $< -o $@
$(call tc,objcopy) -R .comment $@
$(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm
tmp/powerpc-expand.o: $(srcdir)/src/$$T.S
$(call tc,gcc) -c $< -o $@
# /***********************************************************************
# // powerpc-linux.kernel.vmlinux

View File

@ -1,5 +1,5 @@
/* powerpc-linux.elf-entry.h
created from powerpc-linux.elf-entry.bin, 8471 (0x2117) bytes
created from powerpc-linux.elf-entry.bin, 1420 (0x58c) bytes
This file is part of the UPX executable compressor.
@ -32,539 +32,98 @@
/* clang-format off */
#define STUB_POWERPC_LINUX_ELF_ENTRY_SIZE 8471
#define STUB_POWERPC_LINUX_ELF_ENTRY_ADLER32 0x1993c3e0
#define STUB_POWERPC_LINUX_ELF_ENTRY_CRC32 0xb3750514
#define STUB_POWERPC_LINUX_ELF_ENTRY_SIZE 1420
#define STUB_POWERPC_LINUX_ELF_ENTRY_ADLER32 0x0c907cef
#define STUB_POWERPC_LINUX_ELF_ENTRY_CRC32 0x4d50d660
unsigned char stub_powerpc_linux_elf_entry[8471] = {
unsigned char stub_powerpc_linux_elf_entry[1420] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 0, 1, 0, 20, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 25,180, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40,
/* 0x0030 */ 0, 0, 0, 0, 72, 0, 0,213,124, 0, 41,236,125,168, 2,166,
/* 0x0040 */ 40, 7, 0, 8, 64,130, 1, 64,144,166, 0, 0,124,132, 26, 20,
/* 0x0020 */ 0, 0, 3, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40,
/* 0x0030 */ 0, 0, 0, 0, 72, 0, 1, 13,124, 0, 41,236,125,168, 2,166,
/* 0x0040 */ 40, 7, 0, 2, 64,130, 0,232,144,166, 0, 0,124,132, 26, 20,
/* 0x0050 */ 60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255,
/* 0x0060 */ 57, 64,255,255, 72, 0, 1, 16, 57, 32, 0, 1,125, 41, 28, 44,
/* 0x0070 */ 56, 99, 0, 4, 97, 43, 0, 1,124, 11, 0, 64,125, 41, 72, 20,
/* 0x0080 */ 97, 41, 0, 1, 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1,
/* 0x0090 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255,209, 65,129,255,236,
/* 0x00a0 */ 56,224, 0, 1, 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21,
/* 0x00b0 */ 65,162,255,185,124,231, 57, 20,125, 41, 72, 21, 65,162,255,173,
/* 0x00c0 */ 124,231, 57, 20,124, 9, 0, 64,125, 41, 74, 20, 65,162,255,157,
/* 0x00d0 */ 65,160,255,216, 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46,
/* 0x00e0 */ 65,128, 0, 32,141, 99, 0, 1,124,234, 88,249,125, 74, 14,112,
/* 0x00f0 */ 65,130, 0, 0,113,107, 0, 1, 65,162, 0, 80, 72, 0, 0, 20,
/* 0x0100 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 97, 65,161, 0, 60,
/* 0x0110 */ 57, 0, 0, 1,124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 77,
/* 0x0120 */ 65,161, 0, 40,125, 41, 72, 21, 65,162,255, 65,125, 8, 65, 20,
/* 0x0130 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 49, 65,160,255,232,
/* 0x0140 */ 57, 8, 0, 2, 72, 0, 0, 16,125, 41, 72, 21, 65,162,255, 29,
/* 0x0150 */ 125, 8, 65, 20, 32,234,250,255, 57, 8, 0, 2,125, 8, 1,148,
/* 0x0160 */ 124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1,
/* 0x0170 */ 66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44,
/* 0x0180 */ 75,255,255, 16,124, 0, 41,236,125,168, 2,166, 40, 7, 0, 5,
/* 0x0190 */ 64,130, 1, 36,144,166, 0, 0,124,132, 26, 20, 60, 0,128, 0,
/* 0x01a0 */ 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, 57, 64,255,255,
/* 0x01b0 */ 72, 0, 0,244, 57, 32, 0, 1,125, 41, 28, 44, 56, 99, 0, 4,
/* 0x01c0 */ 97, 43, 0, 1,124, 11, 0, 64,125, 41, 72, 20, 97, 41, 0, 1,
/* 0x01d0 */ 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1,124, 9, 0, 64,
/* 0x01e0 */ 125, 41, 74, 20, 65,162,255,209, 65,129,255,236, 56,224, 0, 1,
/* 0x01f0 */ 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, 65,162,255,185,
/* 0x0200 */ 124,231, 57, 21,125, 41, 72, 21, 65,162,255,173,124,231, 57, 21,
/* 0x0210 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255,157, 65,160,255,216,
/* 0x0220 */ 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, 65,128, 0, 24,
/* 0x0230 */ 141, 99, 0, 1,124,234, 88,249,125, 74, 14,112, 65,130, 0, 0,
/* 0x0240 */ 72, 0, 0, 12,125, 41, 72, 21, 65,162,255,109,125, 8, 65, 21,
/* 0x0250 */ 125, 41, 72, 21, 65,162,255, 97,125, 8, 65, 21, 64,130, 0, 40,
/* 0x0260 */ 57, 0, 0, 1,125, 41, 72, 21, 65,162,255, 77,125, 8, 65, 21,
/* 0x0270 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 61, 65,160,255,232,
/* 0x0280 */ 57, 8, 0, 2, 32,234,250,255, 57, 8, 0, 1,125, 8, 1,148,
/* 0x0290 */ 124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1,
/* 0x02a0 */ 66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44,
/* 0x02b0 */ 75,255,255, 44,124, 0, 41,236,125,168, 2,166, 40, 7, 0, 2,
/* 0x02c0 */ 64,130, 0,232,144,166, 0, 0,124,132, 26, 20, 60, 0,128, 0,
/* 0x02d0 */ 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, 57, 64,255,255,
/* 0x02e0 */ 72, 0, 0,184,124, 9, 0, 64,125, 41, 72, 20, 76,162, 0, 32,
/* 0x02f0 */ 57, 32, 0, 1,125, 41, 28, 44, 56, 99, 0, 4, 97, 43, 0, 1,
/* 0x0300 */ 124, 11, 0, 64,125, 41, 73, 20, 78,128, 0, 32,141, 3, 0, 1,
/* 0x0310 */ 157, 5, 0, 1, 75,255,255,209, 65,129,255,244, 56,224, 0, 1,
/* 0x0320 */ 75,255,255,197,124,231, 57, 21, 75,255,255,189, 65,160,255,244,
/* 0x0330 */ 52,231,255,253, 57, 0, 0, 0, 65,128, 0, 20,141, 99, 0, 1,
/* 0x0340 */ 84,231, 64, 46,124,234, 88,249, 65,130, 0, 0, 75,255,255,153,
/* 0x0350 */ 125, 8, 65, 21, 75,255,255,145,125, 8, 65, 21, 56,224, 0, 1,
/* 0x0360 */ 64,130, 0, 28, 56,224, 0, 3, 57, 0, 0, 1, 75,255,255,121,
/* 0x0370 */ 125, 8, 65, 21, 75,255,255,113, 65,160,255,244, 33,106,242,255,
/* 0x0380 */ 125, 8, 57, 20,124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,
/* 0x0390 */ 157, 5, 0, 1, 66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,
/* 0x03a0 */ 124, 7, 26, 44, 75,255,255,112, 40, 7, 0, 14, 64,130, 0, 36,
/* 0x03b0 */ 148, 33,255,232,124, 8, 2,166,124,201, 51,120,129, 6, 0, 0,
/* 0x03c0 */ 124,167, 43,120, 56,164,255,254, 56,131, 0, 2,144, 1, 0, 8,
/* 0x03d0 */ 136, 3, 0, 0, 84, 11,232,254, 84, 12, 7,126, 56, 96,250, 0,
/* 0x03e0 */ 124, 99, 88, 48, 56, 99,241,124,124, 38, 11,120,124, 33, 26, 20,
/* 0x03f0 */ 84, 33, 0, 52, 56, 0, 0, 0,124,195, 51,120,144, 9, 0, 0,
/* 0x0400 */ 148, 3,255,252,124, 1, 24, 64, 65,128,255,248,144,193, 0, 0,
/* 0x0410 */ 136, 4,255,255,144,225, 0, 8, 56,193, 0, 16,145, 33, 0, 12,
/* 0x0420 */ 56, 97, 0, 20, 84, 11,225, 62, 84, 0, 7, 62,153,131, 0, 2,
/* 0x0430 */ 153, 99, 0, 1,152, 3, 0, 0,124, 8, 2,166,148, 33,255,160,
/* 0x0440 */ 189,193, 0, 24, 59, 32, 0, 0,125, 40, 3,166,124,206, 51,120,
/* 0x0450 */ 124,147, 35,120,144, 1, 0,100,124,245, 59,120,125, 20, 67,120,
/* 0x0460 */ 137, 67, 0, 2, 59, 3, 0, 4, 59,224, 0, 0,137, 99, 0, 1,
/* 0x0470 */ 58,224, 0, 0, 59, 64, 0, 1,138, 67, 0, 0, 58, 32, 0, 1,
/* 0x0480 */ 58, 0, 0, 1,147, 38, 0, 0, 57,224, 0, 1,147, 41, 0, 0,
/* 0x0490 */ 57, 32, 3, 0,136, 3, 0, 1,124, 18, 2, 20,125, 41, 0, 48,
/* 0x04a0 */ 56, 9, 7, 54, 57, 32, 0, 1,127,153, 0, 64,125, 43, 88, 48,
/* 0x04b0 */ 125, 41, 80, 48, 57,107,255,255, 57, 41,255,255,145, 97, 0, 12,
/* 0x04c0 */ 145, 33, 0, 8, 57, 32, 0, 0, 64,156, 0, 28,124, 9, 3,166,
/* 0x04d0 */ 57, 96, 4, 0, 85, 32, 8, 60, 57, 41, 0, 1,125,120, 3, 46,
/* 0x04e0 */ 66, 0,255,244,127,147, 42, 20,126,108,155,120, 56,160, 0, 0,
/* 0x04f0 */ 57, 0,255,255, 57, 96, 0, 0,127,140,224, 0, 57,107, 0, 1,
/* 0x0500 */ 47, 11, 0, 4, 84,169, 64, 46, 65,158, 8,156,136, 12, 0, 0,
/* 0x0510 */ 57,140, 0, 1,125, 37, 3,120, 64,153,255,224,127,153,160, 64,
/* 0x0520 */ 64,156, 8,100, 62,192, 0,255, 98,214,255,255,127,136,176, 64,
/* 0x0530 */ 128, 1, 0, 8,127, 35, 0, 56, 86,224, 32, 54,124, 0, 26, 20,
/* 0x0540 */ 84, 6, 8, 60, 65,157, 0, 32,127,140,224, 0, 65,158, 8, 88,
/* 0x0550 */ 137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x0560 */ 124, 5, 75,120,124,230,194, 46, 85, 0,170,254,125, 64, 57,214,
/* 0x0570 */ 127,133, 80, 64, 64,156, 1,172,128, 1, 0, 12, 47,151, 0, 6,
/* 0x0580 */ 125, 72, 83,120, 56, 96, 0, 1,127, 41, 0, 56, 32, 18, 0, 8,
/* 0x0590 */ 127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, 32, 7, 8, 0,
/* 0x05a0 */ 29, 41, 6, 0,124, 0, 46,112,124, 7, 2, 20,124, 6,195, 46,
/* 0x05b0 */ 125, 56, 74, 20, 56,201, 14,108, 64,157, 0,180,124, 26,200, 80,
/* 0x05c0 */ 63, 96, 0,255,127,245, 0,174, 99,123,255,255,127,136,216, 64,
/* 0x05d0 */ 87,255, 8, 60, 87,253, 5,238, 84,100, 8, 60, 87,160, 8, 60,
/* 0x05e0 */ 127, 12,224, 0,124, 6, 2, 20, 84,169, 64, 46,124,224, 34, 20,
/* 0x05f0 */ 65,157, 0, 24, 65,154, 7,176,136, 12, 0, 0, 85, 8, 64, 46,
/* 0x0600 */ 57,140, 0, 1,125, 37, 3,120,161,103, 2, 0, 85, 0,170,254,
/* 0x0610 */ 47, 29, 0, 0,124,131, 35,120,125, 64, 89,214, 32, 11, 8, 0,
/* 0x0620 */ 85,105,217,126,124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,
/* 0x0630 */ 127,133, 80, 64,125, 10, 64, 80, 64,156, 0, 20,176, 7, 2, 0,
/* 0x0640 */ 125, 72, 83,120, 65,186, 0, 24, 72, 0, 0, 28,177,103, 2, 0,
/* 0x0650 */ 124,170, 40, 80, 56,100, 0, 1, 65,154, 0, 12, 47,131, 0,255,
/* 0x0660 */ 64,157,255,108, 47,131, 0,255, 65,157, 0,132, 63,224, 0,255,
/* 0x0670 */ 99,255,255,255,127,136,248, 64, 84,103, 8, 60,127, 12,224, 0,
/* 0x0680 */ 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, 65,154, 7, 24,
/* 0x0690 */ 136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,
/* 0x06a0 */ 125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0,
/* 0x06b0 */ 85,105,217,126,124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,
/* 0x06c0 */ 127,133, 80, 64,125, 10, 64, 80, 64,156, 0, 16,125, 72, 83,120,
/* 0x06d0 */ 124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80,125,102, 59, 46,
/* 0x06e0 */ 56,103, 0, 1, 47,131, 0,255, 64,157,255,140, 47,151, 0, 3,
/* 0x06f0 */ 84,127, 6, 62,127,249,169,174, 59, 57, 0, 1, 65,157, 0, 12,
/* 0x0700 */ 58,224, 0, 0, 72, 0, 6,120, 47,151, 0, 9, 65,157, 0, 12,
/* 0x0710 */ 58,247,255,253, 72, 0, 6,104, 58,247,255,250, 72, 0, 6, 96,
/* 0x0720 */ 125, 10, 64, 80, 84,224,217,126,127,136,176, 64,124, 0, 56, 80,
/* 0x0730 */ 86,233, 8, 60,124, 6,195, 46,124,170, 40, 80,124,248, 74, 20,
/* 0x0740 */ 65,157, 0, 32,127,140,224, 0, 65,158, 6, 92,137, 44, 0, 0,
/* 0x0750 */ 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,
/* 0x0760 */ 161,103, 1,128, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64,
/* 0x0770 */ 64,156, 0, 64, 47,151, 0, 6, 32, 11, 8, 0,124, 0, 46,112,
/* 0x0780 */ 126, 15,131,120,124, 11, 2, 20,126, 48,139,120,176, 7, 1,128,
/* 0x0790 */ 125, 72, 83,120, 56, 0, 0, 0,127, 81,211,120, 64,157, 0, 8,
/* 0x07a0 */ 56, 0, 0, 3,124, 23, 3,120, 56,216, 6,100, 72, 0, 2, 24,
/* 0x07b0 */ 125, 10, 64, 80, 85, 96,217,126,127,136,176, 64,124, 0, 88, 80,
/* 0x07c0 */ 124,170, 40, 80,176, 7, 1,128, 65,157, 0, 32,127,140,224, 0,
/* 0x07d0 */ 65,158, 5,212,137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46,
/* 0x07e0 */ 57,140, 0, 1,124, 5, 75,120,161,103, 1,152, 85, 0,170,254,
/* 0x07f0 */ 125, 64, 89,214,127,133, 80, 64, 64,156, 0,188,127,138,176, 64,
/* 0x0800 */ 32, 11, 8, 0,124, 0, 46,112, 86,233, 40, 52,124, 11, 2, 20,
/* 0x0810 */ 125, 56, 74, 20, 84,107, 8, 60,176, 7, 1,152,125, 72, 83,120,
/* 0x0820 */ 124,233, 90, 20, 65,157, 0, 32,127,140,224, 0, 65,158, 5,120,
/* 0x0830 */ 137, 44, 0, 0, 84,160, 64, 46, 85, 72, 64, 46, 57,140, 0, 1,
/* 0x0840 */ 124, 5, 75,120,161,103, 1,224, 85, 0,170,254,125, 64, 89,214,
/* 0x0850 */ 127,133, 80, 64, 64,156, 0, 72, 47,153, 0, 0, 32, 11, 8, 0,
/* 0x0860 */ 124, 0, 46,112,125, 72, 83,120,124, 11, 2, 20,176, 7, 1,224,
/* 0x0870 */ 65,158, 5, 52, 47,151, 0, 6, 57, 32, 0, 9, 64,157, 0, 8,
/* 0x0880 */ 57, 32, 0, 11,124, 26,200, 80,125, 55, 75,120,127,245, 0,174,
/* 0x0890 */ 127,249,169,174, 59, 57, 0, 1, 72, 0, 4,228, 85, 96,217,126,
/* 0x08a0 */ 124,170, 40, 80,124, 0, 88, 80,125, 10, 64, 80,176, 7, 1,224,
/* 0x08b0 */ 72, 0, 0,252,125, 10, 64, 80, 85, 96,217,126,127,136,176, 64,
/* 0x08c0 */ 124, 0, 88, 80,124,170, 40, 80,176, 7, 1,152, 65,157, 0, 32,
/* 0x08d0 */ 127,140,224, 0, 65,158, 4,208,137, 44, 0, 0, 84,160, 64, 46,
/* 0x08e0 */ 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,161,103, 1,176,
/* 0x08f0 */ 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32,
/* 0x0900 */ 32, 11, 8, 0,125, 72, 83,120,124, 0, 46,112,126, 41,139,120,
/* 0x0910 */ 124, 11, 2, 20,176, 7, 1,176, 72, 0, 0,140,125, 10, 64, 80,
/* 0x0920 */ 85, 96,217,126,127,136,176, 64,124, 0, 88, 80,124,170, 40, 80,
/* 0x0930 */ 176, 7, 1,176, 65,157, 0, 32,127,140,224, 0, 65,158, 4,104,
/* 0x0940 */ 137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x0950 */ 124, 5, 75,120,161,103, 1,200, 85, 0,170,254,125, 64, 89,214,
/* 0x0960 */ 127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0,125, 72, 83,120,
/* 0x0970 */ 124, 0, 46,112,126, 9,131,120,124, 11, 2, 20,176, 7, 1,200,
/* 0x0980 */ 72, 0, 0, 32, 85, 96,217,126,125,233,123,120,124, 0, 88, 80,
/* 0x0990 */ 124,170, 40, 80,176, 7, 1,200,125, 10, 64, 80,126, 15,131,120,
/* 0x09a0 */ 126, 48,139,120,127, 81,211,120,125, 58, 75,120, 47,151, 0, 6,
/* 0x09b0 */ 56, 0, 0, 8, 64,157, 0, 8, 56, 0, 0, 11,124, 23, 3,120,
/* 0x09c0 */ 56,216, 10,104,127,136,176, 64, 65,157, 0, 32,127,140,224, 0,
/* 0x09d0 */ 65,158, 3,212,137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46,
/* 0x09e0 */ 57,140, 0, 1,124, 5, 75,120,161,102, 0, 0, 85, 0,170,254,
/* 0x09f0 */ 125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, 84,105, 32, 54,
/* 0x0a00 */ 32, 11, 8, 0,125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20,
/* 0x0a10 */ 125, 72, 83,120, 56,137, 0, 4, 59, 96, 0, 0,176, 6, 0, 0,
/* 0x0a20 */ 56, 96, 0, 3, 72, 0, 0,156,125, 10, 64, 80, 85, 96,217,126,
/* 0x0a30 */ 127,136,176, 64,124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 0,
/* 0x0a40 */ 65,157, 0, 32,127,140,224, 0, 65,158, 3, 92,137, 44, 0, 0,
/* 0x0a50 */ 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,
/* 0x0a60 */ 161,102, 0, 2, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64,
/* 0x0a70 */ 64,156, 0, 48, 84,105, 32, 54, 32, 11, 8, 0,125, 38, 74, 20,
/* 0x0a80 */ 124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, 56,137, 1, 4,
/* 0x0a90 */ 59, 96, 0, 8,176, 6, 0, 2, 56, 96, 0, 3, 72, 0, 0, 36,
/* 0x0aa0 */ 85, 96,217,126,124,170, 40, 80,124, 0, 88, 80,125, 10, 64, 80,
/* 0x0ab0 */ 176, 6, 0, 2, 56,134, 2, 4, 59, 96, 0, 16, 56, 96, 0, 8,
/* 0x0ac0 */ 63,224, 0,255,124,105, 3,166, 59,160, 0, 1, 99,255,255,255,
/* 0x0ad0 */ 127,136,248, 64, 87,167, 8, 60,127, 12,224, 0, 84,169, 64, 46,
/* 0x0ae0 */ 124,253, 59,120, 65,157, 0, 24, 65,154, 2,188,136, 12, 0, 0,
/* 0x0af0 */ 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,100, 58, 46,
/* 0x0b00 */ 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,
/* 0x0b10 */ 124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,
/* 0x0b20 */ 125, 10, 64, 80, 64,156, 0, 16,125, 72, 83,120,124, 4, 59, 46,
/* 0x0b30 */ 72, 0, 0, 16,124,170, 40, 80, 59,167, 0, 1,125,100, 59, 46,
/* 0x0b40 */ 66, 0,255,144, 47,151, 0, 3, 56, 0, 0, 1,124, 0, 24, 48,
/* 0x0b50 */ 127,160,232, 80,127,189,218, 20, 65,157, 1,232, 47,157, 0, 3,
/* 0x0b60 */ 58,247, 0, 7,127,169,235,120, 64,157, 0, 8, 57, 32, 0, 3,
/* 0x0b70 */ 85, 41, 56, 48, 63,224, 0,255,125, 56, 74, 20, 99,255,255,255,
/* 0x0b80 */ 56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, 56,128, 0, 1,
/* 0x0b90 */ 127,136,248, 64, 84,135, 8, 60,127, 12,224, 0, 84,169, 64, 46,
/* 0x0ba0 */ 124,228, 59,120, 65,157, 0, 24, 65,154, 1,252,136, 12, 0, 0,
/* 0x0bb0 */ 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46,
/* 0x0bc0 */ 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,
/* 0x0bd0 */ 124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,
/* 0x0be0 */ 125, 10, 64, 80, 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46,
/* 0x0bf0 */ 72, 0, 0, 16,124,170, 40, 80, 56,135, 0, 1,125,102, 59, 46,
/* 0x0c00 */ 66, 0,255,144, 56,132,255,192, 47,132, 0, 3,124,154, 35,120,
/* 0x0c10 */ 64,157, 1, 40, 47,132, 0, 13,124,137, 14,112, 84,128, 7,254,
/* 0x0c20 */ 57,105,255,255, 96, 26, 0, 2,125,105, 3,166, 65,157, 0, 32,
/* 0x0c30 */ 127, 90, 88, 48, 84,128, 8, 60, 87, 73, 8, 60,125, 56, 74, 20,
/* 0x0c40 */ 125, 32, 72, 80, 56,201, 5, 94, 72, 0, 0,100, 57, 41,255,251,
/* 0x0c50 */ 61, 96, 0,255,125, 41, 3,166, 97,107,255,255,127,136, 88, 64,
/* 0x0c60 */ 127, 12,224, 0, 84,169, 64, 46, 87, 90, 8, 60, 65,157, 0, 24,
/* 0x0c70 */ 65,154, 1, 52,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x0c80 */ 125, 37, 3,120, 85, 8,248,126,127,133, 64, 64, 65,156, 0, 12,
/* 0x0c90 */ 124,168, 40, 80, 99, 90, 0, 1, 66, 0,255,196, 56, 0, 0, 4,
/* 0x0ca0 */ 87, 90, 32, 54,124, 9, 3,166, 56,216, 6, 68, 60, 96, 0,255,
/* 0x0cb0 */ 56,128, 0, 1, 96, 99,255,255, 59,224, 0, 1,127,136, 24, 64,
/* 0x0cc0 */ 87,231, 8, 60,127, 12,224, 0, 84,169, 64, 46,124,255, 59,120,
/* 0x0cd0 */ 65,157, 0, 24, 65,154, 0,208,136, 12, 0, 0, 85, 8, 64, 46,
/* 0x0ce0 */ 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,
/* 0x0cf0 */ 125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,124, 0, 46,112,
/* 0x0d00 */ 124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,125, 10, 64, 80,
/* 0x0d10 */ 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 20,
/* 0x0d20 */ 124,170, 40, 80, 59,231, 0, 1,125,102, 59, 46,127, 90, 35,120,
/* 0x0d30 */ 84,132, 8, 60, 66, 0,255,136, 55, 90, 0, 1, 65,130, 0, 72,
/* 0x0d40 */ 127,154,200, 64, 59,189, 0, 2, 65,157, 0, 92,124, 26,200, 80,
/* 0x0d50 */ 59,189,255,255,127,245, 0,174, 49,125,255,255,125, 43,233, 16,
/* 0x0d60 */ 127,249,169,174, 59, 57, 0, 1,124, 20,200, 16,124, 0, 1, 16,
/* 0x0d70 */ 124, 0, 0,208,125, 43, 0, 57, 64,130,255,212,127,153,160, 64,
/* 0x0d80 */ 65,156,247,172, 60, 0, 0,255, 96, 0,255,255,127,136, 0, 64,
/* 0x0d90 */ 65,157, 0, 32,127,140,224, 0, 56, 96, 0, 1, 65,158, 0, 40,
/* 0x0da0 */ 72, 0, 0, 12, 56, 96, 0, 1, 72, 0, 0, 28, 57,140, 0, 1,
/* 0x0db0 */ 125, 40, 2,166,124, 19, 96, 80, 56, 96, 0, 0,144, 14, 0, 0,
/* 0x0dc0 */ 147, 41, 0, 0,128, 1, 0,100,185,193, 0, 24, 56, 33, 0, 96,
/* 0x0dd0 */ 124, 8, 3,166,124, 8, 2,166,148, 33,255,160,189,193, 0, 24,
/* 0x0de0 */ 59, 32, 0, 0,125, 40, 3,166,124,206, 51,120,124,147, 35,120,
/* 0x0df0 */ 144, 1, 0,100,124,245, 59,120,125, 20, 67,120,137, 67, 0, 2,
/* 0x0e00 */ 59, 3, 0, 4, 59,224, 0, 0,137, 99, 0, 1, 58,224, 0, 0,
/* 0x0e10 */ 59, 64, 0, 1,138, 67, 0, 0, 58, 32, 0, 1, 58, 0, 0, 1,
/* 0x0e20 */ 147, 38, 0, 0, 57,224, 0, 1,147, 41, 0, 0, 57, 32, 3, 0,
/* 0x0e30 */ 136, 3, 0, 1,124, 18, 2, 20,125, 41, 0, 48, 56, 9, 7, 54,
/* 0x0e40 */ 57, 32, 0, 1,127,153, 0, 64,125, 43, 88, 48,125, 41, 80, 48,
/* 0x0e50 */ 57,107,255,255, 57, 41,255,255,145, 97, 0, 12,145, 33, 0, 8,
/* 0x0e60 */ 57, 32, 0, 0, 64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0,
/* 0x0e70 */ 85, 32, 8, 60, 57, 41, 0, 1,125,120, 3, 46, 66, 0,255,244,
/* 0x0e80 */ 127,147, 42, 20,126,108,155,120, 56,160, 0, 0, 57, 0,255,255,
/* 0x0e90 */ 57, 96, 0, 0,127,140,224, 0, 57,107, 0, 1, 47, 11, 0, 4,
/* 0x0ea0 */ 84,169, 64, 46, 65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1,
/* 0x0eb0 */ 125, 37, 3,120, 64,153,255,224,127,153,160, 64, 64,156, 8,100,
/* 0x0ec0 */ 62,192, 0,255, 98,214,255,255,127,136,176, 64,128, 1, 0, 8,
/* 0x0ed0 */ 127, 35, 0, 56, 86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60,
/* 0x0ee0 */ 65,157, 0, 32,127,140,224, 0, 65,158, 8, 88,137, 44, 0, 0,
/* 0x0ef0 */ 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,
/* 0x0f00 */ 124,230,194, 46, 85, 0,170,254,125, 64, 57,214,127,133, 80, 64,
/* 0x0f10 */ 64,156, 1,172,128, 1, 0, 12, 47,151, 0, 6,125, 72, 83,120,
/* 0x0f20 */ 56, 96, 0, 1,127, 41, 0, 56, 32, 18, 0, 8,127,224, 6, 48,
/* 0x0f30 */ 125, 41,144, 48,125, 41, 2, 20, 32, 7, 8, 0, 29, 41, 6, 0,
/* 0x0f40 */ 124, 0, 46,112,124, 7, 2, 20,124, 6,195, 46,125, 56, 74, 20,
/* 0x0f50 */ 56,201, 14,108, 64,157, 0,180,124, 26,200, 80, 63, 96, 0,255,
/* 0x0f60 */ 127,245, 0,174, 99,123,255,255,127,136,216, 64, 87,255, 8, 60,
/* 0x0f70 */ 87,253, 5,238, 84,100, 8, 60, 87,160, 8, 60,127, 12,224, 0,
/* 0x0f80 */ 124, 6, 2, 20, 84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24,
/* 0x0f90 */ 65,154, 7,176,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x0fa0 */ 125, 37, 3,120,161,103, 2, 0, 85, 0,170,254, 47, 29, 0, 0,
/* 0x0fb0 */ 124,131, 35,120,125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,
/* 0x0fc0 */ 124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,
/* 0x0fd0 */ 125, 10, 64, 80, 64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120,
/* 0x0fe0 */ 65,186, 0, 24, 72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80,
/* 0x0ff0 */ 56,100, 0, 1, 65,154, 0, 12, 47,131, 0,255, 64,157,255,108,
/* 0x1000 */ 47,131, 0,255, 65,157, 0,132, 63,224, 0,255, 99,255,255,255,
/* 0x1010 */ 127,136,248, 64, 84,103, 8, 60,127, 12,224, 0, 84,169, 64, 46,
/* 0x1020 */ 124,227, 59,120, 65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0,
/* 0x1030 */ 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46,
/* 0x1040 */ 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,
/* 0x1050 */ 124, 0, 46,112,124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,
/* 0x1060 */ 125, 10, 64, 80, 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46,
/* 0x1070 */ 72, 0, 0, 16,124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1,
/* 0x1080 */ 47,131, 0,255, 64,157,255,140, 47,151, 0, 3, 84,127, 6, 62,
/* 0x1090 */ 127,249,169,174, 59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0,
/* 0x10a0 */ 72, 0, 6,120, 47,151, 0, 9, 65,157, 0, 12, 58,247,255,253,
/* 0x10b0 */ 72, 0, 6,104, 58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80,
/* 0x10c0 */ 84,224,217,126,127,136,176, 64,124, 0, 56, 80, 86,233, 8, 60,
/* 0x10d0 */ 124, 6,195, 46,124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32,
/* 0x10e0 */ 127,140,224, 0, 65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46,
/* 0x10f0 */ 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,161,103, 1,128,
/* 0x1100 */ 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64,
/* 0x1110 */ 47,151, 0, 6, 32, 11, 8, 0,124, 0, 46,112,126, 15,131,120,
/* 0x1120 */ 124, 11, 2, 20,126, 48,139,120,176, 7, 1,128,125, 72, 83,120,
/* 0x1130 */ 56, 0, 0, 0,127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3,
/* 0x1140 */ 124, 23, 3,120, 56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80,
/* 0x1150 */ 85, 96,217,126,127,136,176, 64,124, 0, 88, 80,124,170, 40, 80,
/* 0x1160 */ 176, 7, 1,128, 65,157, 0, 32,127,140,224, 0, 65,158, 5,212,
/* 0x1170 */ 137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x1180 */ 124, 5, 75,120,161,103, 1,152, 85, 0,170,254,125, 64, 89,214,
/* 0x1190 */ 127,133, 80, 64, 64,156, 0,188,127,138,176, 64, 32, 11, 8, 0,
/* 0x11a0 */ 124, 0, 46,112, 86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20,
/* 0x11b0 */ 84,107, 8, 60,176, 7, 1,152,125, 72, 83,120,124,233, 90, 20,
/* 0x11c0 */ 65,157, 0, 32,127,140,224, 0, 65,158, 5,120,137, 44, 0, 0,
/* 0x11d0 */ 84,160, 64, 46, 85, 72, 64, 46, 57,140, 0, 1,124, 5, 75,120,
/* 0x11e0 */ 161,103, 1,224, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64,
/* 0x11f0 */ 64,156, 0, 72, 47,153, 0, 0, 32, 11, 8, 0,124, 0, 46,112,
/* 0x1200 */ 125, 72, 83,120,124, 11, 2, 20,176, 7, 1,224, 65,158, 5, 52,
/* 0x1210 */ 47,151, 0, 6, 57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11,
/* 0x1220 */ 124, 26,200, 80,125, 55, 75,120,127,245, 0,174,127,249,169,174,
/* 0x1230 */ 59, 57, 0, 1, 72, 0, 4,228, 85, 96,217,126,124,170, 40, 80,
/* 0x1240 */ 124, 0, 88, 80,125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252,
/* 0x1250 */ 125, 10, 64, 80, 85, 96,217,126,127,136,176, 64,124, 0, 88, 80,
/* 0x1260 */ 124,170, 40, 80,176, 7, 1,152, 65,157, 0, 32,127,140,224, 0,
/* 0x1270 */ 65,158, 4,208,137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46,
/* 0x1280 */ 57,140, 0, 1,124, 5, 75,120,161,103, 1,176, 85, 0,170,254,
/* 0x1290 */ 125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0,
/* 0x12a0 */ 125, 72, 83,120,124, 0, 46,112,126, 41,139,120,124, 11, 2, 20,
/* 0x12b0 */ 176, 7, 1,176, 72, 0, 0,140,125, 10, 64, 80, 85, 96,217,126,
/* 0x12c0 */ 127,136,176, 64,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176,
/* 0x12d0 */ 65,157, 0, 32,127,140,224, 0, 65,158, 4,104,137, 44, 0, 0,
/* 0x12e0 */ 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,
/* 0x12f0 */ 161,103, 1,200, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64,
/* 0x1300 */ 64,156, 0, 32, 32, 11, 8, 0,125, 72, 83,120,124, 0, 46,112,
/* 0x1310 */ 126, 9,131,120,124, 11, 2, 20,176, 7, 1,200, 72, 0, 0, 32,
/* 0x1320 */ 85, 96,217,126,125,233,123,120,124, 0, 88, 80,124,170, 40, 80,
/* 0x1330 */ 176, 7, 1,200,125, 10, 64, 80,126, 15,131,120,126, 48,139,120,
/* 0x1340 */ 127, 81,211,120,125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8,
/* 0x1350 */ 64,157, 0, 8, 56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104,
/* 0x1360 */ 127,136,176, 64, 65,157, 0, 32,127,140,224, 0, 65,158, 3,212,
/* 0x1370 */ 137, 44, 0, 0, 84,160, 64, 46, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x1380 */ 124, 5, 75,120,161,102, 0, 0, 85, 0,170,254,125, 64, 89,214,
/* 0x1390 */ 127,133, 80, 64, 64,156, 0, 48, 84,105, 32, 54, 32, 11, 8, 0,
/* 0x13a0 */ 125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120,
/* 0x13b0 */ 56,137, 0, 4, 59, 96, 0, 0,176, 6, 0, 0, 56, 96, 0, 3,
/* 0x13c0 */ 72, 0, 0,156,125, 10, 64, 80, 85, 96,217,126,127,136,176, 64,
/* 0x13d0 */ 124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32,
/* 0x13e0 */ 127,140,224, 0, 65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46,
/* 0x13f0 */ 85, 8, 64, 46, 57,140, 0, 1,124, 5, 75,120,161,102, 0, 2,
/* 0x1400 */ 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48,
/* 0x1410 */ 84,105, 32, 54, 32, 11, 8, 0,125, 38, 74, 20,124, 0, 46,112,
/* 0x1420 */ 124, 11, 2, 20,125, 72, 83,120, 56,137, 1, 4, 59, 96, 0, 8,
/* 0x1430 */ 176, 6, 0, 2, 56, 96, 0, 3, 72, 0, 0, 36, 85, 96,217,126,
/* 0x1440 */ 124,170, 40, 80,124, 0, 88, 80,125, 10, 64, 80,176, 6, 0, 2,
/* 0x1450 */ 56,134, 2, 4, 59, 96, 0, 16, 56, 96, 0, 8, 63,224, 0,255,
/* 0x1460 */ 124,105, 3,166, 59,160, 0, 1, 99,255,255,255,127,136,248, 64,
/* 0x1470 */ 87,167, 8, 60,127, 12,224, 0, 84,169, 64, 46,124,253, 59,120,
/* 0x1480 */ 65,157, 0, 24, 65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46,
/* 0x1490 */ 57,140, 0, 1,125, 37, 3,120,125,100, 58, 46, 85, 0,170,254,
/* 0x14a0 */ 125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,124, 0, 46,112,
/* 0x14b0 */ 124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,125, 10, 64, 80,
/* 0x14c0 */ 64,156, 0, 16,125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16,
/* 0x14d0 */ 124,170, 40, 80, 59,167, 0, 1,125,100, 59, 46, 66, 0,255,144,
/* 0x14e0 */ 47,151, 0, 3, 56, 0, 0, 1,124, 0, 24, 48,127,160,232, 80,
/* 0x14f0 */ 127,189,218, 20, 65,157, 1,232, 47,157, 0, 3, 58,247, 0, 7,
/* 0x1500 */ 127,169,235,120, 64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48,
/* 0x1510 */ 63,224, 0,255,125, 56, 74, 20, 99,255,255,255, 56,201, 3, 96,
/* 0x1520 */ 57, 32, 0, 6,125, 41, 3,166, 56,128, 0, 1,127,136,248, 64,
/* 0x1530 */ 84,135, 8, 60,127, 12,224, 0, 84,169, 64, 46,124,228, 59,120,
/* 0x1540 */ 65,157, 0, 24, 65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46,
/* 0x1550 */ 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,
/* 0x1560 */ 125, 64, 89,214, 32, 11, 8, 0, 85,105,217,126,124, 0, 46,112,
/* 0x1570 */ 124, 11, 2, 20,125,105, 88, 80,127,133, 80, 64,125, 10, 64, 80,
/* 0x1580 */ 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16,
/* 0x1590 */ 124,170, 40, 80, 56,135, 0, 1,125,102, 59, 46, 66, 0,255,144,
/* 0x15a0 */ 56,132,255,192, 47,132, 0, 3,124,154, 35,120, 64,157, 1, 40,
/* 0x15b0 */ 47,132, 0, 13,124,137, 14,112, 84,128, 7,254, 57,105,255,255,
/* 0x15c0 */ 96, 26, 0, 2,125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48,
/* 0x15d0 */ 84,128, 8, 60, 87, 73, 8, 60,125, 56, 74, 20,125, 32, 72, 80,
/* 0x15e0 */ 56,201, 5, 94, 72, 0, 0,100, 57, 41,255,251, 61, 96, 0,255,
/* 0x15f0 */ 125, 41, 3,166, 97,107,255,255,127,136, 88, 64,127, 12,224, 0,
/* 0x1600 */ 84,169, 64, 46, 87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52,
/* 0x1610 */ 136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,
/* 0x1620 */ 85, 8,248,126,127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80,
/* 0x1630 */ 99, 90, 0, 1, 66, 0,255,196, 56, 0, 0, 4, 87, 90, 32, 54,
/* 0x1640 */ 124, 9, 3,166, 56,216, 6, 68, 60, 96, 0,255, 56,128, 0, 1,
/* 0x1650 */ 96, 99,255,255, 59,224, 0, 1,127,136, 24, 64, 87,231, 8, 60,
/* 0x1660 */ 127, 12,224, 0, 84,169, 64, 46,124,255, 59,120, 65,157, 0, 24,
/* 0x1670 */ 65,154, 0,208,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,
/* 0x1680 */ 125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214,
/* 0x1690 */ 32, 11, 8, 0, 85,105,217,126,124, 0, 46,112,124, 11, 2, 20,
/* 0x16a0 */ 125,105, 88, 80,127,133, 80, 64,125, 10, 64, 80, 64,156, 0, 16,
/* 0x16b0 */ 125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80,
/* 0x16c0 */ 59,231, 0, 1,125,102, 59, 46,127, 90, 35,120, 84,132, 8, 60,
/* 0x16d0 */ 66, 0,255,136, 55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64,
/* 0x16e0 */ 59,189, 0, 2, 65,157, 0, 92,124, 26,200, 80, 59,189,255,255,
/* 0x16f0 */ 127,245, 0,174, 49,125,255,255,125, 43,233, 16,127,249,169,174,
/* 0x1700 */ 59, 57, 0, 1,124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208,
/* 0x1710 */ 125, 43, 0, 57, 64,130,255,212,127,153,160, 64, 65,156,247,172,
/* 0x1720 */ 60, 0, 0,255, 96, 0,255,255,127,136, 0, 64, 65,157, 0, 32,
/* 0x1730 */ 127,140,224, 0, 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12,
/* 0x1740 */ 56, 96, 0, 1, 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,
/* 0x1750 */ 124, 19, 96, 80, 56, 96, 0, 0,144, 14, 0, 0,147, 41, 0, 0,
/* 0x1760 */ 128, 1, 0,100,185,193, 0, 24, 56, 33, 0, 96,124, 8, 3,166,
/* 0x1770 */ 128,161, 0, 12,128,225, 0, 8,128,165, 0, 0,128, 33, 0, 0,
/* 0x1780 */ 124,165, 58, 20,128, 1, 0, 8, 56,165,255,255,128, 33, 0, 0,
/* 0x1790 */ 124, 8, 3,166,128,230, 0, 0,125,168, 3,166,124,100, 24, 80,
/* 0x17a0 */ 124,135, 40, 80, 56, 99, 0, 1, 56,132, 0, 1,144,134, 0, 0,
/* 0x17b0 */ 96,231, 0, 31,124, 0, 56,108,124, 7, 40, 64,124, 0, 63,172,
/* 0x17c0 */ 56,231, 0, 32, 65,128,255,240,124, 0, 4,172, 76, 0, 1, 44,
/* 0x17d0 */ 78,128, 0, 32, 72, 0, 0, 1,109,109, 97,112, 32,102, 97,105,
/* 0x17e0 */ 108,101,100, 46, 10, 0, 56,160, 0, 14,124,136, 2,166, 56, 96,
/* 0x17f0 */ 0, 2, 56, 0, 0, 4, 68, 0, 0, 2, 56, 96, 0,127, 56, 0,
/* 0x1800 */ 0, 1, 68, 0, 0, 2,126,200, 2,166,128, 31,255,248, 59, 63,
/* 0x1810 */ 255,248,127, 32,200, 80, 56,224,255,255,130,182, 0, 4, 56,192,
/* 0x1820 */ 0, 34, 56, 96, 0, 0,126,164,171,120,124,156, 35,120, 72, 0,
/* 0x1830 */ 0, 93,124,125, 27,120,130,118, 0, 0, 86,115, 0, 58,127,233,
/* 0x1840 */ 3,166,136,246, 0, 12,146,161, 0,140, 56,193, 0,140,127,165,
/* 0x1850 */ 235,120,128,150, 0, 8, 56,118, 0, 16, 78,128, 4, 33,147,221,
/* 0x1860 */ 0, 8, 56,160, 0, 5,127,132,227,120,127,163,235,120, 56, 0,
/* 0x1870 */ 0,125, 68, 0, 0, 2,130,255,255,248,127,169, 3,166,127, 25,
/* 0x1880 */ 154, 20, 56, 0, 0, 36, 78,128, 4, 32, 57, 0, 0, 0, 56,160,
/* 0x1890 */ 0, 3, 56, 0, 0, 90, 68, 0, 0, 2, 64,131, 0, 8,124,128,
/* 0x18a0 */ 0, 8, 78,128, 0, 32,128, 3, 0, 0, 56, 99, 0, 4, 44, 0,
/* 0x18b0 */ 0, 0, 64,130,255,244, 78,128, 0, 32,148, 33,255,112,188, 65,
/* 0x18c0 */ 0, 20,127,232, 2,166, 56, 97, 0,148, 75,255,255,221, 75,255,
/* 0x18d0 */ 255,217,124,122, 27,120,128, 3, 0, 0,128,131, 0, 4, 56, 99,
/* 0x18e0 */ 0, 8, 44, 0, 0, 6, 65,130, 0, 16, 44, 0, 0, 0, 64,130,
/* 0x18f0 */ 255,232, 56,128, 16, 0,127,196, 0,208, 75,255,255, 13, 0, 0,
/* 0x1900 */ 0, 0,102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,
/* 0x1910 */ 102, 51, 50, 45,112,111,119,101,114,112, 99, 10, 10, 83,101, 99,
/* 0x1920 */ 116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32,
/* 0x1930 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32,
/* 0x1940 */ 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65,
/* 0x1950 */ 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32,
/* 0x1960 */ 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48,
/* 0x1970 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48,
/* 0x1980 */ 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42,
/* 0x1990 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49,
/* 0x19a0 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48,
/* 0x19b0 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 56, 32, 32, 50, 42, 42,
/* 0x19c0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32,
/* 0x19d0 */ 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 49,
/* 0x19e0 */ 52, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 56, 32, 32, 50,
/* 0x19f0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32,
/* 0x1a00 */ 51, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1a10 */ 48, 49, 51, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 56, 52,
/* 0x1a20 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x1a30 */ 10, 32, 32, 52, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32,
/* 0x1a40 */ 32, 32, 32, 48,102, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 50,
/* 0x1a50 */ 98, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x1a60 */ 84, 83, 10, 32, 32, 53, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48,
/* 0x1a70 */ 48, 32, 32, 32, 32, 48, 57, 48, 32, 32, 48, 32, 32, 48, 32, 32,
/* 0x1a80 */ 48, 51, 97, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1a90 */ 69, 78, 84, 83, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x1aa0 */ 67, 49, 48, 32, 32, 32, 32, 48, 57, 57, 99, 32, 32, 48, 32, 32,
/* 0x1ab0 */ 48, 32, 32, 48, 52, 51, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1ac0 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 55, 32, 76, 90, 77, 65,
/* 0x1ad0 */ 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 57, 57, 99, 32, 32,
/* 0x1ae0 */ 48, 32, 32, 48, 32, 32, 48,100,100, 52, 32, 32, 50, 42, 42, 48,
/* 0x1af0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 56, 32, 76,
/* 0x1b00 */ 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 50, 52,
/* 0x1b10 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 55, 48, 32, 32, 50,
/* 0x1b20 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32,
/* 0x1b30 */ 57, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32,
/* 0x1b40 */ 48, 49, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 57, 52,
/* 0x1b50 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x1b60 */ 10, 32, 49, 48, 32, 67, 70, 76, 85, 83, 72, 32, 32, 32, 32, 32,
/* 0x1b70 */ 32, 32, 32, 48, 50, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49,
/* 0x1b80 */ 55, 98, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69,
/* 0x1b90 */ 78, 84, 83, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73, 78, 89,
/* 0x1ba0 */ 32, 32, 32, 32, 32, 32, 48, 49, 50, 32, 32, 48, 32, 32, 48, 32,
/* 0x1bb0 */ 32, 48, 49, 55,100, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79,
/* 0x1bc0 */ 78, 84, 69, 78, 84, 83, 10, 32, 49, 50, 32, 69, 76, 70, 77, 65,
/* 0x1bd0 */ 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 49, 49, 99, 32, 32, 48,
/* 0x1be0 */ 32, 32, 48, 32, 32, 48, 49, 55,101, 54, 32, 32, 50, 42, 42, 48,
/* 0x1bf0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79,
/* 0x1c00 */ 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c10 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68,
/* 0x1c20 */ 69, 67, 51, 48, 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51,
/* 0x1c30 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1c40 */ 100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 48, 32, 78, 82,
/* 0x1c50 */ 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1c60 */ 108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90,
/* 0x1c70 */ 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48,
/* 0x1c80 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70,
/* 0x1c90 */ 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88,
/* 0x1ca0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100,
/* 0x1cb0 */ 32, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 48, 32, 78, 82, 86,
/* 0x1cc0 */ 95, 72, 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1cd0 */ 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 32, 48, 32, 78,
/* 0x1ce0 */ 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32,
/* 0x1cf0 */ 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, 32, 48, 32, 78, 82,
/* 0x1d00 */ 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1d10 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 32, 48, 32, 78, 82, 86,
/* 0x1d20 */ 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1d30 */ 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 48,
/* 0x1d40 */ 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48,
/* 0x1d50 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77,
/* 0x1d60 */ 65, 95, 68, 69, 67, 49, 48, 32, 48, 32, 76, 90, 77, 65, 95, 68,
/* 0x1d70 */ 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32,
/* 0x1d80 */ 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48,
/* 0x1d90 */ 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48,
/* 0x1da0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 67,
/* 0x1db0 */ 70, 76, 85, 83, 72, 32, 48, 32, 67, 70, 76, 85, 83, 72, 10, 48,
/* 0x1dc0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1dd0 */ 69, 76, 70, 77, 65, 73, 78, 89, 32, 48, 32, 69, 76, 70, 77, 65,
/* 0x1de0 */ 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x1df0 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,
/* 0x1e00 */ 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1e10 */ 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,
/* 0x1e20 */ 79, 95, 66, 73, 78, 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, 84,
/* 0x1e30 */ 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32,
/* 0x1e40 */ 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83,
/* 0x1e50 */ 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32,
/* 0x1e60 */ 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48,
/* 0x1e70 */ 48, 48, 48, 48, 48, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50,
/* 0x1e80 */ 52, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90,
/* 0x1e90 */ 43, 48,120, 48, 48, 48, 48, 48, 48,100, 52, 10, 10, 82, 69, 76,
/* 0x1ea0 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x1eb0 */ 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, 70,
/* 0x1ec0 */ 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x1ed0 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x1ee0 */ 48, 48, 48, 48, 98, 56, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76,
/* 0x1ef0 */ 49, 52, 32, 32, 32, 32, 32, 32, 32, 78, 82, 86, 95, 84, 65, 73,
/* 0x1f00 */ 76, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69,
/* 0x1f10 */ 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 68,
/* 0x1f20 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69,
/* 0x1f30 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65,
/* 0x1f40 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 98, 56, 32, 82, 95, 80,
/* 0x1f50 */ 80, 67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 78,
/* 0x1f60 */ 82, 86, 95, 84, 65, 73, 76, 10, 10, 82, 69, 76, 79, 67, 65, 84,
/* 0x1f70 */ 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32,
/* 0x1f80 */ 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x1f90 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1fa0 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x1fb0 */ 57, 52, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, 32,
/* 0x1fc0 */ 32, 32, 32, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 10, 82,
/* 0x1fd0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68,
/* 0x1fe0 */ 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, 48,
/* 0x1ff0 */ 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80,
/* 0x2000 */ 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86,
/* 0x2010 */ 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, 95,
/* 0x2020 */ 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32,
/* 0x2030 */ 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 43, 48,120, 48, 48, 48,
/* 0x2040 */ 48, 48, 48, 50, 52, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79,
/* 0x2050 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69,
/* 0x2060 */ 76, 70, 77, 65, 73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, 84,
/* 0x2070 */ 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2080 */ 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48,
/* 0x2090 */ 48, 48, 48, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32,
/* 0x20a0 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10,
/* 0x20b0 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x20c0 */ 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90,
/* 0x20d0 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69,
/* 0x20e0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65,
/* 0x20f0 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 49, 49, 56, 32, 82, 95, 80,
/* 0x2100 */ 80, 67, 95, 65, 68, 68, 82, 51, 50, 32, 32, 32, 32, 32, 32, 79,
/* 0x2110 */ 95, 66, 73, 78, 70, 79, 10
/* 0x0060 */ 57, 64,255,255, 72, 0, 0,184,124, 9, 0, 64,125, 41, 72, 20,
/* 0x0070 */ 76,162, 0, 32, 57, 32, 0, 1,125, 41, 28, 44, 56, 99, 0, 4,
/* 0x0080 */ 97, 43, 0, 1,124, 11, 0, 64,125, 41, 73, 20, 78,128, 0, 32,
/* 0x0090 */ 141, 3, 0, 1,157, 5, 0, 1, 75,255,255,209, 65,129,255,244,
/* 0x00a0 */ 56,224, 0, 1, 75,255,255,197,124,231, 57, 21, 75,255,255,189,
/* 0x00b0 */ 65,160,255,244, 52,231,255,253, 57, 0, 0, 0, 65,128, 0, 20,
/* 0x00c0 */ 141, 99, 0, 1, 84,231, 64, 46,124,234, 88,249, 65,130, 0, 96,
/* 0x00d0 */ 75,255,255,153,125, 8, 65, 21, 75,255,255,145,125, 8, 65, 21,
/* 0x00e0 */ 56,224, 0, 1, 64,130, 0, 28, 56,224, 0, 3, 57, 0, 0, 1,
/* 0x00f0 */ 75,255,255,121,125, 8, 65, 21, 75,255,255,113, 65,160,255,244,
/* 0x0100 */ 33,106,242,255,125, 8, 57, 20,124,234, 42, 20,125, 9, 3,166,
/* 0x0110 */ 141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, 56,224, 1, 0,
/* 0x0120 */ 124, 7, 41,236,124, 7, 26, 44, 75,255,255,112,128,230, 0, 0,
/* 0x0130 */ 125,168, 3,166,124,100, 24, 80,124,135, 40, 80, 56, 99, 0, 1,
/* 0x0140 */ 56,132, 0, 1,144,134, 0, 0, 96,231, 0, 31,124, 0, 56,108,
/* 0x0150 */ 124, 7, 40, 64,124, 0, 63,172, 56,231, 0, 32, 65,128,255,240,
/* 0x0160 */ 124, 0, 4,172, 76, 0, 1, 44, 78,128, 0, 32,126,200, 2,166,
/* 0x0170 */ 128, 31,255,248, 59, 63,255,248,127, 32,200, 80,131,150, 0, 4,
/* 0x0180 */ 72, 0, 0, 9,117,112,120, 0,124,104, 2,166, 56,128, 0, 16,
/* 0x0190 */ 56, 0, 1,104, 68, 0, 0, 2, 64,163, 0, 8,124,128, 0, 8,
/* 0x01a0 */ 124,123, 27,120,124, 62, 11,120, 56, 0,255,224,124, 60, 8, 80,
/* 0x01b0 */ 124, 33, 0, 56,130,118, 0, 0,136,246, 0, 12,147,158, 0,140,
/* 0x01c0 */ 56,222, 0,140,124, 37, 11,120,128,150, 0, 8, 56,118, 0, 16,
/* 0x01d0 */ 72, 0, 0, 5,146,129, 0, 0,127, 99,219,120,124, 36, 11,120,
/* 0x01e0 */ 127,133,227,120, 56, 0, 0, 4, 68, 0, 0, 2, 64,163, 0, 8,
/* 0x01f0 */ 124,128, 0, 8,127,193,243,120, 57, 0, 0, 0,127,103,219,120,
/* 0x0200 */ 56,192, 0, 2, 56,160, 0, 7,127,132,227,120, 56, 96, 0, 0,
/* 0x0210 */ 56, 0, 0, 90, 68, 0, 0, 2, 64,163, 0, 8,124,128, 0, 8,
/* 0x0220 */ 124,125, 27,120,127, 99,219,120, 56, 96, 0, 6, 68, 0, 0, 2,
/* 0x0230 */ 56, 29, 0, 8,127, 25,154, 20,124, 9, 3,166, 56, 0, 0, 36,
/* 0x0240 */ 130,255,255,248, 78,128, 4, 32, 57, 0, 0, 0, 56,160, 0, 3,
/* 0x0250 */ 56, 0, 0, 90, 68, 0, 0, 2, 64,163, 0, 8,124,128, 0, 8,
/* 0x0260 */ 78,128, 0, 32,128, 3, 0, 0, 56, 99, 0, 4, 47,128, 0, 0,
/* 0x0270 */ 64,158,255,244, 78,128, 0, 32,148, 33,255,112,188, 65, 0, 20,
/* 0x0280 */ 127,232, 2,166, 56, 97, 0,148, 75,255,255,221, 75,255,255,217,
/* 0x0290 */ 124,122, 27,120,128, 3, 0, 0,128,131, 0, 4, 56, 99, 0, 8,
/* 0x02a0 */ 47,128, 0, 6, 65,158, 0, 16, 44, 0, 0, 0, 64,130,255,232,
/* 0x02b0 */ 56,128, 16, 0,126,132, 0,208, 75,255,254,181, 0, 0, 0, 0,
/* 0x02c0 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51,
/* 0x02d0 */ 50, 45,112,111,119,101,114,112, 99, 10, 10, 83,101, 99,116,105,
/* 0x02e0 */ 111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32,
/* 0x02f0 */ 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32,
/* 0x0300 */ 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32,
/* 0x0310 */ 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,
/* 0x0320 */ 108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69,
/* 0x0330 */ 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, 51,
/* 0x0340 */ 56, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42,
/* 0x0350 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49,
/* 0x0360 */ 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48,
/* 0x0370 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 54, 99, 32, 32, 50, 42,
/* 0x0380 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50,
/* 0x0390 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 32, 48,
/* 0x03a0 */ 49, 53, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 54, 99, 32,
/* 0x03b0 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10,
/* 0x03c0 */ 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48,
/* 0x03d0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69,
/* 0x03e0 */ 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65, 73,
/* 0x03f0 */ 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x0400 */ 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, 69,
/* 0x0410 */ 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0420 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x0430 */ 89, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48,
/* 0x0440 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x0450 */ 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10,
/* 0x0460 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0470 */ 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79,
/* 0x0480 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x0490 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73,
/* 0x04a0 */ 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89,
/* 0x04b0 */ 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x04c0 */ 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82,
/* 0x04d0 */ 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, 32, 32,
/* 0x04e0 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48,
/* 0x04f0 */ 48, 49, 48, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x0500 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76,
/* 0x0510 */ 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x0520 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0530 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x0540 */ 54, 52, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32,
/* 0x0550 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 43, 48,120,
/* 0x0560 */ 48, 48, 48, 48, 48, 48, 48, 52, 10, 48, 48, 48, 48, 48, 49, 53,
/* 0x0570 */ 48, 32, 82, 95, 80, 80, 67, 95, 65, 68, 68, 82, 51, 50, 32, 32,
/* 0x0580 */ 32, 32, 32, 32, 79, 95, 66, 73, 78, 70, 79, 10
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -33,4 +33,38 @@
.section \name
.endm
.macro PUSH4 p1,p2,p3,p4
stwu \p1,-4*NBPW(sp)
stw \p2, 1*NBPW(sp)
stw \p3, 2*NBPW(sp)
stw \p4, 3*NBPW(sp)
.endm
.macro POP4 p1,p2,p3,p4
lwz \p1, 0*NBPW(sp)
lwz \p2, 1*NBPW(sp)
lwz \p3, 2*NBPW(sp)
lwz \p4, 3*NBPW(sp)
addi sp,sp,4*NBPW
.endm
.macro PUSH3 p1,p2,p3
stwu \p1,-3*NBPW(sp)
stw \p2, 1*NBPW(sp)
stw \p3, 2*NBPW(sp)
.endm
.macro POP3 p1,p2,p3
lwz \p1, 0*NBPW(sp)
lwz \p2, 1*NBPW(sp)
lwz \p3, 2*NBPW(sp)
addi sp,sp,3*NBPW
.endm
.macro POP2 p1,p2
lwz \p1, 0*NBPW(sp)
lwz \p2, 1*NBPW(sp)
addi sp,sp,2*NBPW
.endm
.macro POP1 p1
lwz \p1, 0*NBPW(sp)
addi sp,sp,1*NBPW
.endm
// vi:ts=8:et:nowrap

View File

@ -658,7 +658,7 @@ do_xmap(
#if defined(__i386__) //{
void *const hatch = make_hatch_i386(phdr, xo.buf, ~page_mask);
#elif defined(__powerpc__) //}{
void *const hatch = make_hatch_ppc(phdr, xo.buf, ~page_mask);
void *const hatch = make_hatch_ppc32(phdr, xo.buf, ~page_mask);
#elif defined(__arm__) //}{
void *const hatch = make_hatch_arm32(phdr, xo.buf, ~page_mask);
#endif //}
@ -726,7 +726,7 @@ upx_main( // returns entry address
// ehdr = Uncompress Ehdr and Phdrs
unpackExtent(&xi2, &xo); // never filtered?
#if defined(__i386__) || defined(__arm__) //{
#if defined(__i386__) || defined(__arm__) || defined(__powerpc__) //{
ElfW(Addr) *const p_reloc = &elfaddr;
#endif //}
ElfW(Addr) page_mask = get_page_mask(); (void)page_mask;

View File

@ -0,0 +1,183 @@
/*
; powerpc-expand.S -- decompressors for powerpc
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 1996-2021 Markus Franz Xaver Johannes Oberhumer
; Copyright (C) 1996-2021 Laszlo Molnar
; Copyright (C) 2000-2021 John F. Reiser
; All Rights Reserved.
;
; 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.
;
; 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.
;
; You should have received a copy of the GNU General Public License
; along with this program; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer Laszlo Molnar
; <markus@oberhumer.com> <ezerotven+github@gmail.com>
;
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
// FIXME This assembles, but has ERRORS in translation from amd64
NBPW= 4
SZ_DLINE= 128 # size of data cache line in Apple G5
#ifndef BIG_ENDIAN //{
#define BIG_ENDIAN 1
#endif //}
#include "arch/powerpc/32/ppc_regs.h"
#include "arch/powerpc/32/macros.S"
section EXP_HEAD
sz_unc= 0
sz_cpr= 4
b_method= 8
b_ftid= 9
b_cto8= 10
b_extra= 11
sz_binfo= 12
f_expand: .globl f_expand // f_expand(b_info *, dst, &dstlen)
.type f_expand,function
// Supervisor for de-compression, un-filter, and sync_cache
// Input to supervisor:
#define fx_src a0
#define fx_dst a1
#define fx_dstlen a2
mflr r0
PUSH4 fx_src,fx_dst,fx_dstlen,r0 // params to unfilter and sync_cache
// Input to de-compressor:
#define xsrc a0
#define xsrclen a1
#define xdst a2
#define xdstlen a3
#define methb a4
lbz methb,b_method(fx_src)
movr xdstlen,fx_dstlen // arg4
movr xdst,fx_dst // arg3
lwz xsrclen,sz_cpr(xsrc) // arg2
addi xsrc,fx_src,sz_binfo // arg1
call decompress
movr a3,a0 // save retval
POP3 a2,a0,a1 // fx_src,fx_dst,fx_dstlen; keep f_expand.retaddr
lwz a1,0(a1) // actual length used by decompressor
PUSH3 a0,a1,a3 // params for sync_cache
lbz a3,b_ftid(a2)
lbz a2,b_cto8(a2)
cmpi cr0,a3,0; beq no_unf
call unfilter
no_unf:
POP2 a0,a1 // dst, len
add a1,a1,a0 // lo, hi
CACHELINE=32
ori a0,a0,-1+ CACHELINE // highest addr on cache line
cfl_nrv:
dcbst 0,a0 // initiate store (modified) cacheline to memory
cmpl cr0,a0,a1 // did we cover the highest-addressed byte?
icbi 0,a0 // discard instructions from cacheline
addi a0,a0,CACHELINE // highest addr on next line
blt cr0,cfl_nrv // not done yet
sync // wait for all memory operations to finish
isync // discard prefetched instructions (if any)
cfl_ret:
POP2 a0,r0 // retval, retaddr from f_expand
mtlr r0
ret
// .unreq fx_src
// .unreq fx_dst
// .unreq fx_dstlen
// .unreq xsrc
// .unreq xsrclen
// .unreq xdst
// .unreq xdstlen
// .unreq methb
decompress: // (src *, cpr_len, dst *, &dstlen);
// sections NRV2B, etc, inserted here by addLoader() from ::buildLinuxLoader()
section EXP_TAIL
#define M_NRV2B_LE32 2
#define M_NRV2B_8 3
#define M_NRV2D_LE32 5
#define M_NRV2D_8 6
#define M_NRV2E_LE32 8
#define M_NRV2E_8 9
#define M_CL1B_LE32 11
#define M_LZMA 14
#define hibit r0 /* holds 0x80000000 during decompress */
#define src a0
#define lsrc a1
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
.globl eof_nrv
eof_nrv:
#define tmp a1
#define dst0 a4
lwz dst0,0(ldst) // original dst
mtlr t3 // return address
subf a0,lsrc,src
subf tmp,dst0,dst // -1+ dst length
addi a0,a0,1 // return 0: good; else: bad [+1: correct for lbzu]
addi tmp,tmp,1 // dst length
stw tmp,0(ldst)
blr
#undef tmp
#undef dst0
unfilter:
#include "arch/powerpc/64/bxx.S" // unfilter code; args in registers, fall-through return
// FIXME: will need extra parameter for multi-method decompression
#define NO_METHOD_CHECK 1
#define off a4
#define len a5
#define bits a6
#define disp a7
section NRV2E
#include "arch/powerpc/32/nrv2e_d.S"
section NRV2D
#include "arch/powerpc/32/nrv2d_d.S"
section NRV2B
#include "arch/powerpc/32/nrv2b_d.S"
#undef off
#undef len
#undef bits
#undef disp
#undef src
#undef lsrc
#undef dst
#undef ldst
#undef meth
/* lzma has its own 'section's */
#include "arch/powerpc/32/lzma_d.S"

View File

@ -61,6 +61,7 @@ PROT_EXEC= 4
MAP_PRIVATE= 2
MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20
MFD_EXEC= 0x10
PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT)
@ -70,6 +71,7 @@ PAGE_SIZE64 = -(~0<<PAGE_SHIFT64)
/* /usr/include/asm-ppc/unistd.h */
__NR_exit = 1
__NR_memfd_create= 360
__NR_mmap = 90
__NR_mprotect = 125
__NR_munmap = 91
@ -85,7 +87,6 @@ f_exp:
/* Returns 0 on success; non-zero on failure. */
decompress: // (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method)
section NRV_HEAD
SZ_DLINE=128 # size of data cache line in Apple G5
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */
@ -102,18 +103,8 @@ SZ_DLINE=128 # size of data cache line in Apple G5
#define bits a6
#define disp a7
section NRV2E
#include "arch/powerpc/32/nrv2e_d.S"
section NRV2D
#include "arch/powerpc/32/nrv2d_d.S"
section NRV2B
#include "arch/powerpc/32/nrv2b_d.S"
#include "arch/powerpc/32/lzma_d.S"
section NRV_TAIL
eof_nrv:
#define dst0 a4
#define tmp a1
@ -134,7 +125,6 @@ eof_nrv:
// that the second dcbst (or icbi) on a the same line will be fast.
// If not, then too bad.
section CFLUSH // In: a2=dst= &highest stored byte; a4=dst0= &lowest stored byte
CACHELINE=32
ori dst0,dst0,-1+ CACHELINE // highest addr on cache line
cfl_nrv:
@ -150,25 +140,11 @@ cfl_ret:
ret
section ELFMAINY
msg_SELinux:
call L72
L70:
.asciz "mmap failed.\n"
L71:
// IDENTSTR goes here
section ELFMAINZ
L72:
li a2,L71 - L70 // length
mflr a1 // message text
li a0,2 // fd stderr
li 0,__NR_write; sc
die:
li a0,127
li 0,__NR_exit; sc
r_exp= 31
r_PMASK= 30
r_fp= 30
r_ADRU= 29
r_LENU= 28
r_fd= 27
@ -177,53 +153,71 @@ r_elf= 25
r_ADRX= 24
r_LENX= 23
r_FLD= 22
r_szuf= 21
r_PMASK= 20
r_obinf= 19
/* Decompress the rest of this loader, and jump to it. */
unfold: // IN: r_exp, r_auxv, r_PMASK
unfold: // IN: r_auxv, r_PMASK
mflr r_FLD // LrFLD
//Reserve enough space to decompress the folded code of the stub
lwz r0, sz_pack2 - f_exp(r_exp)
lwz r0, sz_pack2 - f_exp(r_exp)
la r_elf,sz_pack2 - f_exp(r_exp)
sub r_elf,r_elf,r0 // r_elf=&Elf32_Ehdr of stub
li a4,-1
lwz r_szuf, sz_unc + LBINFO - LrFLD(r_FLD) // sz_unc of fold
li a3,MAP_PRIVATE|MAP_ANONYMOUS
li a0,0 // kernel chooses addr
mr a1,r_szuf // length needed
mr r_LENU,a1
call mmapRW0 // fills in a5, a2
mr r_ADRU,a0
lwz r_LENU, sz_unc + LBINFO - LrFLD(r_FLD) // sz_unc of fold
call 0f; .asciz "upx"; 0:
mflr a0
li a1,MFD_EXEC
SYS_memfd_create= __NR_memfd_create
li r0,SYS_memfd_create; sc; bns+ 0f; teq r0,r0; 0:
mr r_fd,a0
//Reserve enough space to decompress the folded code of the stub
mr r_fp,sp
li r0,-CACHELINE
// alloca
sub sp,sp,r_LENU
and sp,sp,r0
lwz r_obinf, LOBINFO - LrFLD(r_FLD) // O_BINFO
clrrwi r_obinf,r_obinf,2 // clear is_ptinterp | unmap_all_pages
// Decompress folded code
mtctr r_exp
lbz meth,b_method + LBINFO - LrFLD(r_FLD)
stw r_szuf,SZ_FRAME+31*NBPW(sp) // lzma uses for EOF
la ldst, SZ_FRAME+31*NBPW(sp) // &slot on stack
mr dst,r_ADRU // dst for unfolding
stw r_LENU,SZ_FRAME+31*NBPW(r_fp) // lzma uses for EOF
la ldst, SZ_FRAME+31*NBPW(r_fp) // &slot on stack
mr dst,sp // dst for unfolding
lwz lsrc,sz_cpr + LBINFO - LrFLD(r_FLD)
la src,sz_b_info + LBINFO - LrFLD(r_FLD) // folded code
bctrl // decompress it
bl decompress
stw r_PMASK,0(sp) // forward the actual PAGE_MASK
// Generate code to compute PAGE_MASK.
stw r_PMASK,2*4(r_ADRU) // page_mask in powerpc-linux.elf-fold.S
mr a0,r_fd
mr a1,sp
mr a2,r_LENU
SYS_write= __NR_write
li r0,SYS_write; sc; bns+ 0f; teq r0,r0; 0:
mr sp,r_fp
// PROT_EXEC
li a2,PROT_EXEC|PROT_READ
mr a1,r_LENU // length
mr a0,r_ADRU // base
li r0,__NR_mprotect; sc
li a5,0
mr a4,r_fd
li a3,MAP_PRIVATE
li a2,PROT_WRITE|PROT_EXEC|PROT_READ // PROT_WRITE: DEBUG only
mr a1,r_LENU
li a0,0
SYS_mmap= __NR_mmap
li r0,SYS_mmap; sc; bns+ 0f; teq r0,r0; 0:
mr r_ADRU,a0
mr a0,r_fd
SYS_close= 6
li a0,SYS_close; sc
// Use the unfolded code
lwz r_LENX, sz_pack2 - f_exp(r_exp)
mtctr r_ADRU
addi r0,r_ADRU,2*NBPW // skip page_mask, other word
add r_ADRX,r_elf,r_obinf // compressed data
mtctr r0
li r0,(SZ_FRAME+32*NBPW)/NBPW // words before &argc
lwz r_LENX, sz_pack2 - f_exp(r_exp)
bctr
// Example code at entrypoint of C-language subroutine:
@ -243,12 +237,12 @@ mmapRW0:
mmapRW:
li a2,PROT_READ|PROT_WRITE
mmap:
li r0,__NR_mmap; sc; bns 0f; teq r0,r0; 0:
li r0,__NR_mmap; sc; bns+ 0f; teq r0,r0; 0:
ret
zfind:
lwz r0,0(a0); addi a0,a0,NBPW
cmpi cr0,r0,0; bne+ cr0,zfind
cmpi cr7,r0,0; bne+ cr7,zfind
ret
main:
@ -256,7 +250,7 @@ main:
stmw r2, SZ_FRAME+ 2*NBPW - NBPW(sp) // save registers r2 thru r31
mflr r_exp // &f_exp (decompress)
la a0,SZ_FRAME+32*NBPW+NBPW(sp) // argv; argc could be zero
la a0,SZ_FRAME+32*NBPW+NBPW(sp) // &argv; argc could be zero!
call zfind // a0= envp
call zfind // a0= &Elf32_auxv
mr r_auxv,a0 // save for folded code
@ -264,7 +258,7 @@ main:
// set r_PMASK by finding actual page size in Elf32_auxv_t
1:
lwz r0,a_type(a0); lwz a1,a_val(a0); addi a0,a0,sz_auxv
cmpi cr0,r0,AT_PAGESZ; beq- cr0,2f
cmpi cr7,r0,AT_PAGESZ; beq- cr7,2f
cmpi cr0,r0,AT_NULL; bne+ cr0,1b
li a1,PAGE_SIZE // not found; use default
2:
@ -273,7 +267,7 @@ main:
call unfold
LrFLD:
LOBINFO:
.long O_BINFO // | unmap_all_pages
.long O_BINFO
LBINFO:
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */

View File

@ -71,17 +71,17 @@ r_ADRX= 24 // compressed input
r_LENX= 23 // total size
r_FLD= 22
// Local:
r_unf= 22 // f_unf == &unfilter()
r_90b= 22
av_hi= 21
av_len= 20
cblk= 19
r_buf= 18
b fold_begin
nop
page_mask:
.int -0x1000 // default page mask (4KiB)
.int 0 // something else?
b fold_begin
.balign 4
get_page_mask: .globl get_page_mask
mflr r0 // retaddr
@ -102,24 +102,23 @@ mprotect: .globl mprotect
b sysgo
fold_begin:
mtctr r0 // # words of stuff
teq r0,r0 // DEBUG
mtctr r0 // # words before argc FIXME: fragile
lwz r0,0(r_FLD) // O_BINFO | is_ptinterp | unmap_all_pages
slwi r0,r0,3*4
mtcrf 0x8,r0 // cr4.eq = unmap_all_pages
call L90
L90b:
#include "arch/powerpc/32/bxx.S"
L90a:
L_PFX= 4 // strlen(" =")
.asciz " =/proc/self/exe"
L_PFX= 4 // strlen(" =")
.balign 4
L90:
mflr r_unf // L90b = &ppcbxx: f_unfilter
mflr r_90b
// slide {<<stuff>>,argc,argv,0,env,0,auxv} down with maximum room before strings
la a1,-NBPW(sp) // src ready for lwzu
beq cr4,0f; la sp,-(-AL_STK & (-1+ AL_STK + (NBPW + L_PFX + PATH_MAX)))(sp); 0:
la a0,-NBPW(sp) // dst ready for stwu
0: // copy stuff
0: // copy stuff below argc (count in r0 at fold_begin)
lwzu r0,NBPW(a1)
stwu r0,NBPW(a0); bdnz 0b
@ -143,22 +142,22 @@ L90:
beq cr4,no_pse_env
subf av_len,r_auxv,av_hi // length of auxv
lwz r0,L90a - L90b(r_unf) // " ="
lwz r0,0(r_90b) // " ="
la cblk,NBPW(a1) // original &strings
stwu r0,NBPW(a0)
la r_buf,L_PFX(a0) // buffer
// r_fd = open("/proc/self/exe", O_RDONLY)
li a1,O_RDONLY
la a0,L_PFX+ L90a - L90b(r_unf) // "/proc/self/exe"
la a0,L_PFX(r_90b) // "/proc/self/exe"
call open; mr r_fd,a0
// readlink("/proc/self/exe", buffer, -1+ PATH_MAX)
li a2,-1+ PATH_MAX
movr a1,r_buf // buffer
la a0,L_PFX+ L90a - L90b(r_unf) // "/proc/self/exe"
la a0,L_PFX(r_90b) // "/proc/self/exe"
call readlink; la a2,-L_PFX(r_buf) // a0= len; a2= buffer
cmpwi a0,0; bgt 0f // success
la a2,L90a - L90b(r_unf) // " =/proc/self/exe"
li a0,L90 - (NBPW+ L90a) // round_up(NBPW, strlen("/proc/self/exe"))
la a2,0(r_90b) // " =/proc/self/exe"
li a0,L90 - (NBPW+ L90b) // round_up(NBPW, strlen("/proc/self/exe"))
0:
addi a0,a0,L_PFX
add a1,a2,a0 // beyond end of path and prefix
@ -198,14 +197,13 @@ no_pse_env:
stwu sp,-(SZ_FRAME+OVERHEAD)(sp) // allocate this frame
mr a0,r_ADRX // &b_info
mr a1,r_LENX // total_size
la a2,SZ_FRAME(sp) // &Elf32_Ehdr temporary space
mr a2,r_elfa // elfaddr
mr a3,r_auxv // &Elf32_auxv_t
mr a4,r_exp // &decompress: f_expand
mr a5,r_unf // &f_unf
mr a6,r_elfa // elfaddr
la a4,SZ_FRAME(sp) // &Elf32_Ehdr temporary space
teq r0,r0 //DEBUG
call upx_main // Out: a0= entry
// entry= upx_main(b_info *a0, total_size a1, Elf32_Ehdr *a2, ELf32_auxv_t *a3,
// f_exp a4, f_unf a5, elfaddr a6)
// tmp_ehdr[])
la sp,SZ_FRAME+OVERHEAD(sp) // deallocate this frame
mr r_exp,a0 // save &entry
@ -261,6 +259,7 @@ sz_auxv= 2*NBPW
bctr // goto escape hatch
section SYSCALLS
SYS_exit= 1
SYS_fork= 2
SYS_read= 3
@ -272,7 +271,9 @@ SYS_brk= 45
SYS_readlink= 85
SYS_mmap= 90
SYS_munmap= 91
SYS_ftruncate= 93
SYS_mprotect= 125
SYS_memfd_create= 360
mmap: .globl mmap
li r0,SYS_mmap
@ -283,6 +284,10 @@ sysgo:
no_fail:
ret
memfd_create: .globl memfd_create
li r0,SYS_memfd_create; b 5f
ftruncate: .globl ftruncate
li r0,SYS_ftruncate;5: b 5f
exit: .globl exit
li r0,SYS_exit; b 5f
brk: .globl brk
@ -300,6 +305,28 @@ close: .globl close
munmap: .globl munmap
li r0,SYS_munmap; 5: b sysgo
memcpy: .globl memcpy // (dst, src, n)
cmpwi a2,0; beq- 9f
mtctr a2
subi a3,a0,1
subi a1,a1,1
0:
lbzu r0,1(a1)
stbu r0,1(a3)
bdnz 0b
9:
blr // return original dst
memset: .globl memset // (dst, val, n)
cmpwi a2,0; beq- 9f
mtctr a2
subi a3,a0,1
0:
stbu a1,1(a3)
bdnz 0b
9:
blr // return original dst
my_bkpt: .globl my_bkpt
teq r0,r0 // my_bkpt
blr

View File

@ -38,7 +38,6 @@ PHDRS
}
SECTIONS
{
. = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */
.text : {
*(.text)
*(.data)

View File

@ -0,0 +1 @@
#include "i386-linux.elf-main2.c"

View File

@ -398,15 +398,17 @@ O_TMPFILE= 020000000 // 0x400000
ok_memfd:
ret
memcpy: .globl memcpy // FIXME: opcodes!
memcpy: .globl memcpy // (dst, src, n)
cmpwi a2,0; beq- 9f
mtctr a2
subi a0,a0,1
subi a3,a0,1
subi a1,a1,1
L999:
0:
lbzu r0,1(a1)
stbu r0,1(a0)
bdnz L999
blr
stbu r0,1(a3)
bdnz 0b
9:
blr // return original dst
my_bkpt: .globl my_bkpt
teq r0,r0 // my_bkpt

View File

@ -2,60 +2,21 @@ file format elf32-powerpc
Sections:
Idx Name Size VMA LMA File off Algn Flags
0 ELFMAINX 04 0 0 034 2**0 CONTENTS
1 NRV_HEAD 0 0 0 038 2**0 CONTENTS
2 NRV2E 014c 0 0 038 2**0 CONTENTS
3 NRV2D 0130 0 0 0184 2**0 CONTENTS
4 NRV2B 0f4 0 0 02b4 2**0 CONTENTS
5 LZMA_ELF00 090 0 0 03a8 2**0 CONTENTS
6 LZMA_DEC10 099c 0 0 0438 2**0 CONTENTS
7 LZMA_DEC20 099c 0 0 0dd4 2**0 CONTENTS
8 LZMA_DEC30 024 0 0 01770 2**0 CONTENTS
9 NRV_TAIL 01c 0 0 01794 2**0 CONTENTS
10 CFLUSH 024 0 0 017b0 2**0 CONTENTS
11 ELFMAINY 012 0 0 017d4 2**0 CONTENTS
12 ELFMAINZ 011c 0 0 017e6 2**0 CONTENTS
0 ELFMAINX 0138 0 0 034 2**0 CONTENTS
1 ELFMAINY 0 0 0 016c 2**0 CONTENTS
2 ELFMAINZ 0154 0 0 016c 2**0 CONTENTS
SYMBOL TABLE:
00000000 l d LZMA_DEC30 0 LZMA_DEC30
00000000 l d NRV_TAIL 0 NRV_TAIL
00000000 l d ELFMAINZ 0 ELFMAINZ
00000000 l d ELFMAINX 0 ELFMAINX
00000000 l d NRV_HEAD 0 NRV_HEAD
00000000 l d NRV2E 0 NRV2E
00000000 l d NRV2D 0 NRV2D
00000000 l d NRV2B 0 NRV2B
00000000 l d LZMA_ELF00 0 LZMA_ELF00
00000000 l d LZMA_DEC10 0 LZMA_DEC10
00000000 l d LZMA_DEC20 0 LZMA_DEC20
00000000 l d CFLUSH 0 CFLUSH
00000000 l d ELFMAINZ 0 ELFMAINZ
00000000 l d ELFMAINY 0 ELFMAINY
00000000 g ELFMAINX 0 _start
00000000 *UND* 0 O_BINFO
RELOCATION RECORDS FOR [ELFMAINX]:
OFFSET TYPE VALUE
00000000 R_PPC_REL24 ELFMAINZ+0x000000d4
RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE
000000b8 R_PPC_REL14 NRV_TAIL
RELOCATION RECORDS FOR [NRV2D]:
OFFSET TYPE VALUE
000000b8 R_PPC_REL14 NRV_TAIL
RELOCATION RECORDS FOR [NRV2B]:
OFFSET TYPE VALUE
00000094 R_PPC_REL14 NRV_TAIL
RELOCATION RECORDS FOR [LZMA_ELF00]:
OFFSET TYPE VALUE
00000004 R_PPC_REL14 LZMA_DEC30+0x00000024
RELOCATION RECORDS FOR [ELFMAINY]:
OFFSET TYPE VALUE
00000000 R_PPC_REL24 ELFMAINZ
00000000 R_PPC_REL24 ELFMAINZ+0x0000010c
RELOCATION RECORDS FOR [ELFMAINZ]:
OFFSET TYPE VALUE
00000118 R_PPC_ADDR32 O_BINFO
00000064 R_PPC_REL24 ELFMAINX+0x00000004
00000150 R_PPC_ADDR32 O_BINFO

View File

@ -7,38 +7,85 @@ Name Origin Length Attributes
Linker script and memory map
TARGET(elf32-powerpc)
0x0000000000100080 . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000100080 0x1164
.text 0x0000000000000000 0x2248
*(.text)
.text 0x0000000000100080 0x318 tmp/powerpc-linux.elf-fold.o
0x000000000010008c get_page_mask
0x0000000000100388 munmap
0x0000000000100360 readlink
0x000000000010033c mmap
0x0000000000100368 write
0x0000000000100370 read
0x0000000000100390 my_bkpt
0x00000000001000a4 Pprotect
0x0000000000100350 exit
0x0000000000100358 brk
0x0000000000100378 open
0x00000000001000a4 mprotect
0x0000000000100380 close
.text 0x0000000000100398 0xe4c tmp/powerpc-linux.elf-main.o
0x0000000000100fe4 upx_main
.text 0x0000000000000000 0x258 tmp/powerpc-linux.elf-fold.o
0x000000000000000c get_page_mask
0x0000000000000024 Pprotect
0x0000000000000024 mprotect
.text 0x0000000000000258 0xb8 tmp/powerpc-linux.elf-upxfd_android.o
0x0000000000000258 upx_mmap_and_fd
.text 0x0000000000000310 0x0 tmp/powerpc-expand.o
.text 0x0000000000000310 0x1f38 tmp/powerpc-linux.elf-main2.o
0x0000000000000af0 underlay
0x0000000000001804 upx_main
*(.data)
.data 0x00000000001011e4 0x0 tmp/powerpc-linux.elf-fold.o
.data 0x00000000001011e4 0x0 tmp/powerpc-linux.elf-main.o
.data 0x0000000000002248 0x0 tmp/powerpc-linux.elf-fold.o
.data 0x0000000000002248 0x0 tmp/powerpc-linux.elf-upxfd_android.o
.data 0x0000000000002248 0x0 tmp/powerpc-expand.o
.data 0x0000000000002248 0x0 tmp/powerpc-linux.elf-main2.o
.data
.bss 0x00000000001011e4 0x0
.bss 0x00000000001011e4 0x0 tmp/powerpc-linux.elf-fold.o
.bss 0x00000000001011e4 0x0 tmp/powerpc-linux.elf-main.o
.rela.dyn 0x00000000001011e4 0x0
.rela.text 0x0000000000000000 0x0 tmp/powerpc-linux.elf-fold.o
.bss 0x0000000000000000 0x0
.bss 0x0000000000000000 0x0 tmp/powerpc-linux.elf-fold.o
.bss 0x0000000000000000 0x0 tmp/powerpc-linux.elf-upxfd_android.o
.bss 0x0000000000000000 0x0 tmp/powerpc-expand.o
.bss 0x0000000000000000 0x0 tmp/powerpc-linux.elf-main2.o
LOAD tmp/powerpc-linux.elf-fold.o
LOAD tmp/powerpc-linux.elf-main.o
LOAD tmp/powerpc-linux.elf-upxfd_android.o
LOAD tmp/powerpc-expand.o
LOAD tmp/powerpc-linux.elf-main2.o
OUTPUT(tmp/powerpc-linux.elf-fold.bin elf32-powerpc)
SYSCALLS 0x0000000000000000 0xac
SYSCALLS 0x0000000000000000 0xac tmp/powerpc-linux.elf-fold.o
0x000000000000005c munmap
0x0000000000000064 memcpy
0x0000000000000034 readlink
0x000000000000001c ftruncate
0x0000000000000000 mmap
0x000000000000003c write
0x0000000000000014 memfd_create
0x0000000000000044 read
0x0000000000000088 memset
0x00000000000000a4 my_bkpt
0x0000000000000024 exit
0x000000000000002c brk
0x000000000000004c open
0x0000000000000054 close
.note.GNU-stack
0x0000000000000000 0x0
.note.GNU-stack
0x0000000000000000 0x0 tmp/powerpc-linux.elf-upxfd_android.o
EXP_HEAD 0x0000000000000000 0xa8
EXP_HEAD 0x0000000000000000 0xa8 tmp/powerpc-expand.o
0x0000000000000000 f_expand
EXP_TAIL 0x0000000000000000 0x84
EXP_TAIL 0x0000000000000000 0x84 tmp/powerpc-expand.o
0x0000000000000000 eof_nrv
NRV2E 0x0000000000000000 0x14c
NRV2E 0x0000000000000000 0x14c tmp/powerpc-expand.o
NRV2D 0x0000000000000000 0x130
NRV2D 0x0000000000000000 0x130 tmp/powerpc-expand.o
NRV2B 0x0000000000000000 0xf4
NRV2B 0x0000000000000000 0xf4 tmp/powerpc-expand.o
LZMA_ELF00 0x0000000000000000 0x90
LZMA_ELF00 0x0000000000000000 0x90 tmp/powerpc-expand.o
LZMA_DEC10 0x0000000000000000 0x99c
LZMA_DEC10 0x0000000000000000 0x99c tmp/powerpc-expand.o
LZMA_DEC20 0x0000000000000000 0x99c
LZMA_DEC20 0x0000000000000000 0x99c tmp/powerpc-expand.o
LZMA_DEC30 0x0000000000000000 0x24
LZMA_DEC30 0x0000000000000000 0x24 tmp/powerpc-expand.o

View File

@ -27,8 +27,8 @@ OUTPUT(tmp/powerpc64-linux.elf-fold.bin elf64-powerpc)
.bss 0x0000000000000000 0x0
.bss 0x0000000000000000 0x0 tmp/powerpc64-linux.elf-fold.o
SYSCALLS 0x0000000000000000 0xf4
SYSCALLS 0x0000000000000000 0xf4 tmp/powerpc64-linux.elf-fold.o
SYSCALLS 0x0000000000000000 0xfc
SYSCALLS 0x0000000000000000 0xfc tmp/powerpc64-linux.elf-fold.o
0x0000000000000008 mmap
0x0000000000000020 munmap
0x0000000000000028 mprotect
@ -43,7 +43,7 @@ SYSCALLS 0x0000000000000000 0xf4
0x0000000000000070 close
0x0000000000000078 upxfd_create
0x00000000000000d0 memcpy
0x00000000000000ec my_bkpt
0x00000000000000f4 my_bkpt
.comment 0x0000000000000000 0x33
.comment 0x0000000000000000 0x33 tmp/powerpc64-linux.elf-fold.o

View File

@ -27,8 +27,8 @@ OUTPUT(tmp/powerpc64le-linux.elf-fold.bin elf64-powerpcle)
.bss 0x0000000000000000 0x0
.bss 0x0000000000000000 0x0 tmp/powerpc64le-linux.elf-fold.o
SYSCALLS 0x0000000000000000 0xf4
SYSCALLS 0x0000000000000000 0xf4 tmp/powerpc64le-linux.elf-fold.o
SYSCALLS 0x0000000000000000 0xfc
SYSCALLS 0x0000000000000000 0xfc tmp/powerpc64le-linux.elf-fold.o
0x0000000000000008 mmap
0x0000000000000020 munmap
0x0000000000000028 mprotect
@ -43,7 +43,7 @@ SYSCALLS 0x0000000000000000 0xf4
0x0000000000000070 close
0x0000000000000078 upxfd_create
0x00000000000000d0 memcpy
0x00000000000000ec my_bkpt
0x00000000000000f4 my_bkpt
.comment 0x0000000000000000 0x33
.comment 0x0000000000000000 0x33 tmp/powerpc64le-linux.elf-fold.o