1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

arm64-linux compiles

modified:   conf.h
	modified:   linker.cpp
	modified:   linker.h
	modified:   p_elf_enum.h
	modified:   p_lx_elf.cpp
	modified:   p_lx_elf.h
	modified:   packmast.cpp
	modified:   stub/Makefile
	new file:   stub/arm64-linux.shlib-init.h
	new file:   stub/src/arm64-linux.shlib-init.S
	new file:   stub/tmp/arm64-linux.elf-entry.bin.dump
	new file:   stub/tmp/arm64-linux.elf-fold.map
	new file:   stub/tmp/arm64-linux.shlib-init.bin.dump
This commit is contained in:
John Reiser 2017-03-05 18:07:29 -08:00
parent 4e8848eeca
commit 4089cc6e6f
13 changed files with 1450 additions and 2 deletions

View File

@ -403,6 +403,8 @@ private:
#define UPX_F_VMLINUX_PPC64LE 40
#define UPX_F_DYLIB_PPC64LE 41
#define UPX_F_LINUX_ELF64_ARM 42
#define UPX_F_ATARI_TOS 129
#define UPX_F_SOLARIS_SPARC 130 // NOT IMPLEMENTED
#define UPX_F_MACH_PPC32 131

View File

@ -591,6 +591,27 @@ void ElfLinkerAMD64::relocate1(const Relocation *rel, upx_byte *location, upx_ui
super::relocate1(rel, location, value, type);
}
void ElfLinkerARM64::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value,
const char *type) {
if (strncmp(type, "R_AARCH64_", 10))
return super::relocate1(rel, location, value, type);
type += 10;
if (!strncmp(type, "PREL", 4)) {
value -= rel->section->offset + rel->offset;
type += 4;
}
if (!strcmp(type, "16"))
set_le16(location, get_le16(location) + value);
else if (!strncmp(type, "32", 2)) // for "32" and "32S"
set_le32(location, get_le32(location) + value);
else if (!strcmp(type, "64"))
set_le64(location, get_le64(location) + value);
else
super::relocate1(rel, location, value, type);
}
void ElfLinkerArmBE::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value,
const char *type) {
if (strcmp(type, "R_ARM_PC24") == 0) {

View File

@ -160,6 +160,15 @@ protected:
const char *type);
};
class ElfLinkerARM64 : public ElfLinker {
typedef ElfLinker super;
protected:
virtual void alignCode(unsigned len) { alignWithByte(len, 0x90); }
virtual void relocate1(const Relocation *, upx_byte *location, upx_uint64_t value,
const char *type);
};
class ElfLinkerArmBE : public ElfLinker {
typedef ElfLinker super;

View File

@ -73,7 +73,8 @@
EM_PPC = 20,
EM_PPC64 = 21,
EM_ARM = 40,
EM_X86_64 = 62
EM_X86_64 = 62,
EM_AARCH64 = 183
};
enum { // e_version

View File

@ -650,6 +650,11 @@ Linker* PackLinuxElf64amd::newLinker() const
return new ElfLinkerAMD64;
}
Linker* PackLinuxElf64arm::newLinker() const
{
return new ElfLinkerARM64;
}
int const *
PackLinuxElf::getCompressionMethods(int method, int level) const
{
@ -696,6 +701,15 @@ PackLinuxElf64amd::getFilters() const
return filters;
}
int const *
PackLinuxElf64arm::getFilters() const
{
static const int filters[] = {
0x4A,
FT_END };
return filters;
}
void PackLinuxElf32::patchLoader()
{
}
@ -788,10 +802,23 @@ PackLinuxElf64amd::PackLinuxElf64amd(InputFile *f)
ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
}
PackLinuxElf64arm::PackLinuxElf64arm(InputFile *f)
: super(f)
{
e_machine = Elf64_Ehdr::EM_AARCH64;
ei_class = Elf64_Ehdr::ELFCLASS64;
ei_data = Elf64_Ehdr::ELFDATA2LSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
}
PackLinuxElf64amd::~PackLinuxElf64amd()
{
}
PackLinuxElf64arm::~PackLinuxElf64arm()
{
}
static unsigned
umax(unsigned a, unsigned b)
{
@ -1091,6 +1118,85 @@ PackLinuxElf64amd::defineSymbols(Filter const *)
//linker->dumpSymbols(); // debug
}
void
PackLinuxElf64arm::defineSymbols(Filter const *)
{
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
// We want to know if compressed data, plus stub, plus a couple pages,
// will fit below the uncompressed program in memory. But we don't
// know the final total compressed size yet, so use the uncompressed
// size (total over all PT_LOAD64) as an upper bound.
unsigned len = 0;
upx_uint64_t lo_va_user = ~0ull; // infinity
for (int j= e_phnum; --j>=0; ) {
if (PT_LOAD64 == get_te32(&phdri[j].p_type)) {
len += (unsigned)get_te64(&phdri[j].p_filesz);
upx_uint64_t const va = get_te64(&phdri[j].p_vaddr);
if (va < lo_va_user) {
lo_va_user = va;
}
}
}
lsize = /*getLoaderSize()*/ 64 * 1024; // XXX: upper bound; avoid circularity
upx_uint64_t lo_va_stub = get_te64(&elfout.phdr[0].p_vaddr);
upx_uint64_t adrc;
upx_uint64_t adrm;
upx_uint64_t adru;
upx_uint64_t adrx;
unsigned cntc;
unsigned lenm;
unsigned lenu;
len += (7&-lsize) + lsize;
is_big = (lo_va_user < (lo_va_stub + len + 2*page_size));
if (is_big && ehdri.ET_EXEC==get_te16(&ehdri.e_type)) {
set_te64( &elfout.ehdr.e_entry,
get_te64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
set_te64(&elfout.phdr[0].p_vaddr, lo_va_user);
set_te64(&elfout.phdr[0].p_paddr, lo_va_user);
lo_va_stub = lo_va_user;
adrc = lo_va_stub;
adrm = getbrk(phdri, e_phnum);
adru = page_mask & (~page_mask + adrm); // round up to page boundary
adrx = adru + hlen;
lenm = page_size + len;
lenu = page_size + len;
cntc = len >> 3; // over-estimate; corrected at runtime
}
else {
adrm = lo_va_stub + len;
adrc = adrm;
adru = lo_va_stub;
adrx = lo_va_stub + hlen;
lenm = page_size;
lenu = page_size + len;
cntc = 0;
}
adrm = page_mask & (~page_mask + adrm); // round up to page boundary
adrc = page_mask & (~page_mask + adrc); // round up to page boundary
//linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion
ACC_UNUSED(adrx);
// For actual moving, we need the true count, which depends on sz_pack2
// and is not yet known. So the runtime stub detects "no move"
// if adrm==adrc, and otherwise uses actual sz_pack2 to compute cntc.
//linker->defineSymbol("CNTC", cntc); // count for copy
ACC_UNUSED(cntc);
linker->defineSymbol("LENU", lenu); // len for unmap
linker->defineSymbol("ADRC", adrc); // addr for copy
//linker->defineSymbol("ADRU", adru); // addr for unmap
ACC_UNUSED(adru);
#define EI_NIDENT 16 /* <elf.h> */
linker->defineSymbol("JMPU", EI_NIDENT -4 + lo_va_user); // unmap trampoline
#undef EI_NIDENT
linker->defineSymbol("LENM", lenm); // len for map
linker->defineSymbol("ADRM", adrm); // addr for map
//linker->dumpSymbols(); // debug
}
static const
#include "stub/i386-linux.elf-entry.h"
static const
@ -1339,6 +1445,28 @@ PackLinuxElf64amd::buildLoader(const Filter *ft)
stub_amd64_linux_elf_fold, sizeof(stub_amd64_linux_elf_fold), ft);
}
static const
#include "stub/arm64-linux.elf-entry.h"
static const
#include "stub/arm64-linux.elf-fold.h"
//static const
//#include "stub/arm64-linux.shlib-init.h"
void
PackLinuxElf64arm::buildLoader(const Filter *ft)
{
if (0!=xct_off) { // shared library
abort(); // FIXME
//buildLinuxLoader(
// stub_arm64_linux_shlib_init, sizeof(stub_arm64_linux_shlib_init),
// NULL, 0, ft );
//return;
}
buildLinuxLoader(
stub_arm64_linux_elf_entry, sizeof(stub_arm64_linux_elf_entry),
stub_arm64_linux_elf_fold, sizeof(stub_arm64_linux_elf_fold), ft);
}
Elf32_Shdr const *PackLinuxElf32::elf_find_section_name(
char const *const name
) const
@ -1993,6 +2121,198 @@ proceed: ;
return true;
}
bool
PackLinuxElf64arm::canPack()
{
union {
unsigned char buf[sizeof(Elf64_Ehdr) + 14*sizeof(Elf64_Phdr)];
//struct { Elf64_Ehdr ehdr; Elf64_Phdr phdr; } e;
} u;
COMPILE_TIME_ASSERT(sizeof(u) <= 1024)
fi->readx(u.buf, sizeof(u.buf));
fi->seek(0, SEEK_SET);
Elf64_Ehdr const *const ehdr = (Elf64_Ehdr *) u.buf;
// now check the ELF header
if (checkEhdr(ehdr) != 0)
return false;
// additional requirements for linux/elf386
if (get_te16(&ehdr->e_ehsize) != sizeof(*ehdr)) {
throwCantPack("invalid Ehdr e_ehsize; try '--force-execve'");
return false;
}
if (e_phoff != sizeof(*ehdr)) {// Phdrs not contiguous with Ehdr
throwCantPack("non-contiguous Ehdr/Phdr; try '--force-execve'");
return false;
}
// The first PT_LOAD64 must cover the beginning of the file (0==p_offset).
Elf64_Phdr const *phdr = phdri;
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
if (j >= 14)
return false;
if (phdr->PT_LOAD64 == get_te32(&phdr->p_type)) {
load_va = get_te64(&phdr->p_vaddr);
upx_uint64_t file_offset = get_te64(&phdr->p_offset);
if (~page_mask & file_offset) {
if ((~page_mask & load_va) == file_offset) {
throwCantPack("Go-language PT_LOAD: try hemfix.c, or try '--force-execve'");
// Fixing it inside upx fails because packExtent() reads original file.
}
else {
throwCantPack("invalid Phdr p_offset; try '--force-execve'");
}
return false;
}
exetype = 1;
break;
}
}
// We want to compress position-independent executable (gcc -pie)
// main programs, but compressing a shared library must be avoided
// because the result is no longer usable. In theory, there is no way
// to tell them apart: both are just ET_DYN. Also in theory,
// neither the presence nor the absence of any particular symbol name
// can be used to tell them apart; there are counterexamples.
// However, we will use the following heuristic suggested by
// Peter S. Mazinger <ps.m@gmx.net> September 2005:
// If a ET_DYN has __libc_start_main as a global undefined symbol,
// then the file is a position-independent executable main program
// (that depends on libc.so.6) and is eligible to be compressed.
// Otherwise (no __libc_start_main as global undefined): skip it.
// Also allow __uClibc_main and __uClibc_start_main .
if (Elf32_Ehdr::ET_DYN==get_te16(&ehdr->e_type)) {
// The DT_STRTAB has no designated length. Read the whole file.
alloc_file_image(file_image, file_size);
fi->seek(0, SEEK_SET);
fi->readx(file_image, file_size);
memcpy(&ehdri, ehdr, sizeof(Elf64_Ehdr));
phdri= (Elf64_Phdr *)((size_t)e_phoff + file_image); // do not free() !!
shdri= (Elf64_Shdr const *)((size_t)e_shoff + file_image); // do not free() !!
//sec_strndx = &shdri[ehdr->e_shstrndx];
//shstrtab = (char const *)(sec_strndx->sh_offset + file_image);
sec_dynsym = elf_find_section_type(Elf64_Shdr::SHT_DYNSYM);
if (sec_dynsym)
sec_dynstr = get_te64(&sec_dynsym->sh_link) + shdri;
int j= e_phnum;
phdr= phdri;
for (; --j>=0; ++phdr)
if (Elf64_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
dynseg= (Elf64_Dyn const *)(get_te64(&phdr->p_offset) + file_image);
break;
}
// elf_find_dynamic() returns 0 if 0==dynseg.
dynstr= (char const *)elf_find_dynamic(Elf64_Dyn::DT_STRTAB);
dynsym= (Elf64_Sym const *)elf_find_dynamic(Elf64_Dyn::DT_SYMTAB);
// Modified 2009-10-10 to detect a ProgramLinkageTable relocation
// which references the symbol, because DT_GNU_HASH contains only
// defined symbols, and there might be no DT_HASH.
Elf64_Rela const *
rela= (Elf64_Rela const *)elf_find_dynamic(Elf64_Dyn::DT_RELA);
Elf64_Rela const *
jmprela= (Elf64_Rela const *)elf_find_dynamic(Elf64_Dyn::DT_JMPREL);
for ( int sz = elf_unsigned_dynamic(Elf64_Dyn::DT_PLTRELSZ);
0 < sz;
(sz -= sizeof(Elf64_Rela)), ++jmprela
) {
unsigned const symnum = get_te64(&jmprela->r_info) >> 32;
char const *const symnam = get_te32(&dynsym[symnum].st_name) + dynstr;
if (0==strcmp(symnam, "__libc_start_main")
|| 0==strcmp(symnam, "__uClibc_main")
|| 0==strcmp(symnam, "__uClibc_start_main"))
goto proceed;
}
// 2016-10-09 DT_JMPREL is no more (binutils-2.26.1)?
// Check the general case, too.
for ( int sz = elf_unsigned_dynamic(Elf64_Dyn::DT_RELASZ);
0 < sz;
(sz -= sizeof(Elf64_Rela)), ++rela
) {
unsigned const symnum = get_te64(&rela->r_info) >> 32;
char const *const symnam = get_te32(&dynsym[symnum].st_name) + dynstr;
if (0==strcmp(symnam, "__libc_start_main")
|| 0==strcmp(symnam, "__uClibc_main")
|| 0==strcmp(symnam, "__uClibc_start_main"))
goto proceed;
}
// Heuristic HACK for shared libraries (compare Darwin (MacOS) Dylib.)
// If there is an existing DT_INIT, and if everything that the dynamic
// linker ld-linux needs to perform relocations before calling DT_INIT
// resides below the first SHT_EXECINSTR Section in one PT_LOAD, then
// compress from the first executable Section to the end of that PT_LOAD.
// We must not alter anything that ld-linux might touch before it calls
// the DT_INIT function.
//
// Obviously this hack requires that the linker script put pieces
// into good positions when building the original shared library,
// and also requires ld-linux to behave.
if (elf_find_dynamic(Elf64_Dyn::DT_INIT)) {
if (elf_has_dynamic(Elf64_Dyn::DT_TEXTREL)) {
throwCantPack("DT_TEXTREL found; re-compile with -fPIC");
goto abandon;
}
Elf64_Shdr const *shdr = shdri;
xct_va = ~0ull;
for (j= e_shnum; --j>=0; ++shdr) {
if (Elf64_Shdr::SHF_EXECINSTR & get_te32(&shdr->sh_flags)) {
xct_va = umin64(xct_va, get_te64(&shdr->sh_addr));
}
}
// Rely on 0==elf_unsigned_dynamic(tag) if no such tag.
upx_uint64_t const va_gash = elf_unsigned_dynamic(Elf64_Dyn::DT_GNU_HASH);
upx_uint64_t const va_hash = elf_unsigned_dynamic(Elf64_Dyn::DT_HASH);
if (xct_va < va_gash || (0==va_gash && xct_va < va_hash)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_STRTAB)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_SYMTAB)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_REL)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_RELA)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_JMPREL)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERDEF)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERSYM)
|| xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERNEEDED) ) {
throwCantPack("DT_ tag above stub");
goto abandon;
}
for ((shdr= shdri), (j= e_shnum); --j>=0; ++shdr) {
upx_uint64_t const sh_addr = get_te64(&shdr->sh_addr);
if ( sh_addr==va_gash
|| (sh_addr==va_hash && 0==va_gash) ) {
shdr= &shdri[get_te32(&shdr->sh_link)]; // the associated SHT_SYMTAB
hatch_off = (char *)&ehdri.e_ident[11] - (char *)&ehdri;
break;
}
}
ACC_UNUSED(shdr);
xct_off = elf_get_offset_from_address(xct_va);
goto proceed; // But proper packing depends on checking xct_va.
}
abandon:
return false;
proceed: ;
}
// XXX Theoretically the following test should be first,
// but PackUnix::canPack() wants 0!=exetype ?
if (!super::canPack())
return false;
assert(exetype == 1);
exetype = 0;
// set options
opt->o_unix.blocksize = blocksize = file_size;
return true;
}
off_t
PackLinuxElf32::getbrk(const Elf32_Phdr *phdr, int nph) const
{
@ -2663,6 +2983,14 @@ void PackLinuxElf64amd::pack1(OutputFile *fo, Filter &ft)
generateElfHdr(fo, stub_amd64_linux_elf_fold, getbrk(phdri, e_phnum) );
}
void PackLinuxElf64arm::pack1(OutputFile *fo, Filter &ft)
{
super::pack1(fo, ft);
if (0!=xct_off) // shared library
return;
generateElfHdr(fo, stub_arm64_linux_elf_fold, getbrk(phdri, e_phnum) );
}
// Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD
// which follows in the file (or end-of-file). Optimize for common case
// where the PT_LOAD are adjacent ascending by .p_offset. Assume no overlap.

View File

@ -387,6 +387,25 @@ protected:
virtual void defineSymbols(Filter const *);
};
class PackLinuxElf64arm : public PackLinuxElf64Le
{
typedef PackLinuxElf64Le super;
public:
PackLinuxElf64arm(InputFile *f);
virtual ~PackLinuxElf64arm();
virtual int getFormat() const { return UPX_F_LINUX_ELF64_ARM; }
virtual const char *getName() const { return "linux/arm64"; }
virtual const char *getFullName(const options_t *) const { return "arm64-linux.elf"; }
virtual const int *getFilters() const;
virtual bool canPack();
protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
//virtual void pack3(OutputFile *, Filter &); // append loader
virtual void buildLoader(const Filter *);
virtual Linker* newLinker() const;
virtual void defineSymbols(Filter const *);
};
/*************************************************************************
// linux/elf32ppc

View File

@ -250,6 +250,9 @@ Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio
if ((p = func(new PackLinuxElf32armBe(f), user)) != NULL)
return p;
delete p; p = NULL;
if ((p = func(new PackLinuxElf64arm(f), user)) != NULL)
return p;
delete p; p = NULL;
if ((p = func(new PackLinuxElf32ppc(f), user)) != NULL)
return p;
delete p; p = NULL;

View File

@ -71,7 +71,6 @@ STUBS += arm.v5a-linux.kernel.vmlinux.h
STUBS += arm.v5a-linux.kernel.vmlinuz-head.h
STUBS += arm.v5a-linux.kernel.vmlinuz.h
STUBS += arm.v5a-linux.shlib-init.h
STUBS += arm.v5a-linux.shlib-init.h
STUBS += arm.v5t-linux.shlib-init.h
STUBS += armeb.v4a-linux.elf-entry.h
STUBS += armeb.v4a-linux.elf-fold.h
@ -79,6 +78,7 @@ STUBS += armeb.v5a-linux.kernel.vmlinux-head.h
STUBS += armeb.v5a-linux.kernel.vmlinux.h
STUBS += arm64-linux.elf-entry.h
STUBS += arm64-linux.elf-fold.h
STUBS += arm64-linux.shlib-init.h
STUBS += arm64-darwin.macho-entry.h
STUBS += arm64-darwin.macho-fold.h
STUBS += i086-dos16.com.h
@ -574,6 +574,20 @@ tmp/arm64-linux.elf-main.o : $(srcdir)/src/$$T.c $(srcdir)/src/arm64-linux.elf-m
$(call tc,gcc) -c -Os $< -o $@
$(call tc,f-objstrip,$@)
# /***********************************************************************
# // arm64-linux.shlib arm64
# ************************************************************************/
arm64-linux.shlib%.h : tc_list = arm64-linux.elf default
arm64-linux.shlib%.h : tc_bfdname = elf64-littleaarch64
tc.arm64-linux.shlib-init.objcopy = /usr/bin/aarch64-linux-gnu-objcopy -F elf64-littleaarch64
tc.arm64-linux.shlib-init.objdump = /usr/bin/aarch64-linux-gnu-objdump
arm64-linux.shlib%.h : $(srcdir)/src/$$T.S
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,f-embed_objinfo,tmp/$T.bin)
$(call tc,bin2h-c) tmp/$T.bin $@
# /***********************************************************************
# // arm.v5a-linux.shlib (arm.v5a)

View File

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

View File

@ -0,0 +1,400 @@
/* arm-linux.shlib-init.S -- Linux Elf shared library init & decompressor
*
* This file is part of the UPX executable compressor.
*
* Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer
* Copyright (C) 1996-2017 Laszlo Molnar
* Copyright (C) 2000-2017 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>
*/
#include "arch/arm/v8a/macros.S"
sz_Elf64_Ehdr = 16 + 2*2 + 4 + 3*8 + 4 + 6*2
sz_Elf64_Phdr = 2*4 + 6*8
sz_b_info= 12
sz_unc= 0
sz_cpr= 4
b_method= 8
sz_l_info= 12
sz_p_info= 12
PROT_READ= 1
PROT_WRITE= 2
PROT_EXEC= 4
MAP_PRIVATE= 2
MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20
PAGE_SHIFT= 12
PAGE_MASK= (~0<<PAGE_SHIFT)
PAGE_SIZE= -PAGE_MASK
__NR_exit = 93
__NR_write = 64
__NR_mmap64 = 0xde // 222
__NR_munmap = 0xd7 // 215
__NR_mprotect = 0xe2 // 226
__ARM_NR_cacheflush = (1<<31) // FIXME
#define arg1 x0
#define arg2 x1
#define arg3 x2
#define arg4 x3
#define arg5 x4
#define edi w0
#define esi w1
#define edx w2
#define tmp w3
#define eax w4
#define ecx w5
#define rdi x0
#define rsi x1
#define rdx x2
#define rax x4
#define rcx x5
#define lr x30
#define fp x29
#define src x0
#define len w1
#define dst x2
#define dstw w2
#define tmp w3
#define tmpx x3
#define bits w4
#define off w5
section ELFMAINX
// .long offset(.) // detect relocation
// .long offset(user DT_INIT)
// .long offset(escape_hatch)
// .long offset({p_info; b_info; compressed data})
_start: .globl _start
brk #0 // for debugging
PUSH3(x29,x30,x0)
PUSH4(arg4,arg5,x6,x7)
PUSH3(arg1,arg2,arg3)
mov fp,sp
o_uinit= (3+4+2)*8 // pc
bl main // push &f_decompress
f_decompress:
#define LINUX_ARM_CACHEFLUSH 1
section NRV_HEAD
// empty
section NRV_TAIL
// empty
section NRV2E
#include "arch/arm/v8a/nrv2e_d8.S"
section NRV2D
#include "arch/arm/v8a/nrv2d_d8.S"
section NRV2B
#include "arch/arm/v8a/nrv2b_d8.S"
#include "arch/arm/v8a/lzma_d.S"
section ELFMAINY
end_decompress: .globl end_decompress
msg_SELinux:
mov w2,#L71 - L70 // length
adr x1,L70 // message text
mov w0,#2 // fd stderr
do_sys __NR_write
die:
mov w0,#127
do_sys __NR_exit
L70:
.asciz "PROT_EXEC|PROT_WRITE failed.\n"
L71:
/* IDENTSTR goes here */
section ELFMAINZ
.macro push reg
str \reg,[sp,#-4]!
.endm
.macro pop reg
ldr \reg,[sp],#4
.endm
#define lodsl ldr eax,[rsi],#4
#define lodslu lodsl
main:
// 1. allocate temporary pages
// 2. copy to temporary pages:
// fragment of page below dst; compressed src;
// decompress+unfilter; supervise
// 3. mmap destination pages for decompressed data
// 4. create escape hatch
// 5. jump to temporary pages
// 6. uncompress
// 7. unfilter
// 8. mprotect decompressed pages
// 9 setup args for unmap of temp pages
// 10. jump to escape hatch
// 11. unmap temporary pages
// 12. goto user DT_INIT
mov rdx,lr // &f_decompress
add rsi,rdx,# _start - f_decompress - 4*4
mov rcx,rsi
lodsl; sub rcx,rcx,rax; //str ecx,[fp,#o_reloc]
lodsl; add rax,rcx,rax; str eax,[fp,#o_uinit] // reloc DT_INIT for step 12
lodsl; add rax,rcx,rax; push rax // reloc &hatch for step 10
o_hatch= -1*4
lodsl; add edi,ecx,eax // &l_info; also destination for decompress
add esi,edi,#sz_l_info + sz_p_info // &b_info
sub sp,sp,#2*4 // param space: munmap temp pages step 9
p_unmap= -3*4
ldr eax,[rsi,#4]; add rsi,rsi,#3*4 // sz_cpr
add rsi,rsi,rax // skip unpack helper block
lodslu // eax=dstlen
lsl ecx,edi,# (32-PAGE_SHIFT)
lsr ecx,ecx,#2+(32-PAGE_SHIFT) // ecx= w_fragment
add eax,eax,ecx,lsl #2; push eax // params: mprotect restored pages step 8
sub edi,edi,ecx,lsl #2; push edi
p_mprot= -5*8
sub eax,eax,ecx,lsl #2 // dstlen
add edi,edi,ecx,lsl #2 // dst
push ecx // w_fragment
o_wfrag= -6*8
bl L610
f_unfilter: // (char *ptr, uint len, uint cto, uint fid)
ptr .req x0
fid .req w3
#ifndef FILTER_ID /*{*/
#define FILTER_ID 0x50 /* little-endian */
#endif /*}*/
and fid,fid,#0xff
cmp fid,#FILTER_ID // last use of fid
bne unfret
lsr x1,x1,#2 // word count
cbz x1,unfret
top_unf:
sub x1,x1,#1
ldr w2,[ptr,x1,lsl #2]
ubfx w3,w2,#26,#5
cmp w3,#5; bne tst_unf // not unconditional branch
sub w2,w2,w1 // word displ; hi 0b.00101 preserves bit 31
ubfm w2,w3,#26,#5
str w2,[ptr,x1,lsl #2]
tst_unf:
cbnz x1,top_unf
unfret:
ret
L610:
push lr
o_unflt= -7*8
ldrb tmp,[rsi,#b_method-4+1]; push tmpx // ftid
ldrb tmp,[rsi,#b_method-4+2]; push tmpx // cto8
push rax // dstlen also for unfilter step 7
push rdi // dst param for unfilter step 7
p_unflt= -11*8
lodslu; mov ecx,eax // ecx= srclen
lodslu; push rax // method,filter,cto,junk
push rdx // &decompress
o_uncpr= -13*8
add tmpx,fp,#p_unflt+1*4; push tmpx // &dstlen
push rdi // dst
push rcx // srclen
push rsi // src; arglist ready for decompress step 6
p_uncpr= -17*8
and tmpx,rsi,#3 // length of prefix alignment
add rcx,rcx,#3 // allow suffix alignment
add rcx,rcx,tmpx // prefix increases byte length
ldr tmp,[fp,#o_wfrag]; add rdx,tmpx,rcx,lsr #2 // w_srclen + w_frag
ldr tmp,[fp,#o_uncpr]; bl wlen_subr
ldr tmp,[fp,#o_unflt]; bl wlen_subr
bl L220
supervise:
// Allocate pages for result of decompressing.
// These replace the compressed source and the following hole.
mov arg5,#-1 // cater to *BSD for fd of MAP_ANON
mov arg4,#MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED
mov arg3,#PROT_READ|PROT_WRITE
ldr arg2,[fp,#p_mprot+4] // dstlen
ldr arg1,[fp,#p_mprot ] // dst
mov x6,arg1 // required result
do_sys __NR_mmap64; cmp x0,x6; beq 0f; brk #0; 0:
// Restore fragment of page below dst
ldr ecx,[fp,#o_wfrag]
//mov edi,r0 // NOP: edi==r0
ldr rsi,[fp,#p_unmap]
bl movsl
POP4(arg1,arg2,arg3,arg4)
POP1(rax)
blr rax // decompress
add sp,sp,#8 // toss arg5
bl L620
//hatch:
do_sys __NR_munmap
POP3(arg1,arg2,arg3)
POP4(rax,rcx,x6,x7)
POP3(fp,lr,x1)
br x1
L620: // Implant escape hatch at end of .text
ldr eax,[fp,#o_hatch]
ldp arg1,arg2,[lr]
stp arg1,arg2,[rax]
//p_unflt
POP4(arg1,arg2,arg3,arg4)
POP2(rax,x12) // x12= w_fragment [toss]
cbz arg4,0f // 0==ftid ==> no filter
blr rax // unfilter
0:
//p_mprot
ldr arg1,[sp,#0*4] // lo(dst)
ldr arg2,[sp,#1*4] // len
mov arg3,#0
add arg2,arg2,arg1 // hi(dst)
add arg2,arg2,#2*4 // len(hatch)
do_sys __ARM_NR_cacheflush
POP2(arg1,arg2)
mov arg3,#PROT_READ|PROT_EXEC
do_sys __NR_mprotect
//p_unmap
#if defined(ARMEL_EABI4) //{
// first part of do_sys7t __NR_munmap
.if __NR_munmap <= 0xff
mov r7,#__NR_munmap
.else
mov r7,#__NR_munmap>>16
lsl r7,r7,#16
add r7,r7,#__NR_munmap - ((__NR_munmap>>16)<<16)
.endif
#endif //}
POP3(arg1,arg2,lr)
br lr // togo hatch
movsl_subr:
ldr ecx,[rsi,#-4] // 'bl <over>' instruction word
bic ecx,ecx,#0xff<<24 // displacment field
add ecx,ecx,#1 // displ omits one word
// FALL THROUGH to the part of 'movsl' that trims to a multiple of 8 words.
// 7/8 of the time this is faster; 1/8 of the time it's slower.
9:
ldr tmp,[rsi],#4; sub ecx,ecx,#1
str tmp,[rdi],#4
movsl: // rdi= 4-byte aligned dst; esi= 4-byte aligned src; ecx= word count
tst ecx,#7; bne 9b // work ecx down to multiple of 8
lsr ecx,ecx,#3; cbz ecx,9f
7:
ldp x2,x3,[rsi],#2*8; subs ecx,ecx,#1
stp x2,x3,[rdi],#2*8; cbnz ecx,7b
9:
ret
L220:
push lr // &supervise
o_super= -18*8
mov tmpx,lr; bl wlen_subr // wlen_supervise
lsl arg2,rdx,#2 // convert to bytes
// Allocate pages to hold temporary copy.
mov arg5,#-1 // cater to *BSD for fd of MAP_ANON
mov arg4,#MAP_PRIVATE|MAP_ANONYMOUS
mov arg3,#PROT_READ|PROT_WRITE|PROT_EXEC
str arg2,[fp,#p_unmap+1*8] // length to unmap
mov arg1,#0 // any addr
do_sys __NR_mmap64; cmn x0,#4096; bcc 0f; brk #0; 0:
str x0,[fp,#p_unmap+0*8] // address to unmap
ldr esi,[fp,#p_mprot]
//mov edi,r0 // edi= dst NOP: edi==r0
ldr ecx,[fp,#o_wfrag] // w_fragment
bl movsl // copy the fragment
ldr esi,[fp,#p_uncpr+0*4] // src
ldr ecx,[fp,#p_uncpr+1*4] // len
and tmp,esi,#3 // length of prefix alignment
sub esi,esi,tmp // down to word aligned
add ecx,ecx,tmp // prefix increases byte length
add tmp,tmp,edi // skip prefix at destination
str tmp,[fp,#p_uncpr+0*4] // dst
add ecx,ecx,#7 // round up to full words
lsr ecx,ecx,#3
bl movsl // copy all aligned words that contain compressed data
mov rdx,rdi // lo(dst) of copied code
ldr rsi,[fp,#o_uncpr]
str rdi,[fp,#o_uncpr]
bl movsl_subr // copy decompressor
ldr rsi,[fp,#o_unflt]
str rdi,[fp,#o_unflt]
bl movsl_subr // copy unfilter
pop rsi // &supervise
push rdi // &copied
bl movsl_subr // copy supervisor
mov arg2,rdi // hi(dst) of copied code
mov arg1,rdx // lo(dst) of copied code
mov arg3,#0
do_sys __ARM_NR_cacheflush
pop lr; br lr // goto copied supervisor
wlen_subr: // edx+= nwords of inline subr at *tmp
ldr tmp,[tmpx,#-4] // 'bl <over>' instruction word
bic tmp,tmp,#0xff<<24 // displacment field
add tmp,tmp,#1 // displ omits one word
add rdx,rdx,tmpx
ret
/*__XTHEENDX__*/
/* vim:set ts=8 sw=8 et: */

View File

@ -0,0 +1,49 @@
file format elf64-littleaarch64
Sections:
Idx Name Size VMA LMA File off Algn Flags
0 ELFMAINX 00000040 0000000000000000 0000000000000000 00000040 2**2 CONTENTS, RELOC, READONLY
1 LUNMP000 00000004 0000000000000000 0000000000000000 00000080 2**2 CONTENTS, READONLY
2 LUNMP001 00000004 0000000000000000 0000000000000000 00000084 2**2 CONTENTS, READONLY
3 ELFMAINXu 000000ac 0000000000000000 0000000000000000 00000088 2**2 CONTENTS, RELOC, READONLY
4 NRV_HEAD 00000000 0000000000000000 0000000000000000 00000134 2**0 CONTENTS, READONLY
5 NRV_TAIL 00000000 0000000000000000 0000000000000000 00000134 2**0 CONTENTS, READONLY
6 NRV2E 00000128 0000000000000000 0000000000000000 00000134 2**2 CONTENTS, READONLY
7 NRV2D 0000011c 0000000000000000 0000000000000000 0000025c 2**2 CONTENTS, READONLY
8 NRV2B 000005a4 0000000000000000 0000000000000000 00000378 2**2 CONTENTS, READONLY
9 ELFMAINY 00000046 0000000000000000 0000000000000000 0000091c 2**2 CONTENTS, READONLY
10 ELFMAINZ 00000000 0000000000000000 0000000000000000 00000962 2**0 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d ELFMAINY 0000000000000000 ELFMAINY
0000000000000000 l d ELFMAINX 0000000000000000 ELFMAINX
0000000000000000 l d LUNMP000 0000000000000000 LUNMP000
0000000000000000 l d LUNMP001 0000000000000000 LUNMP001
0000000000000000 l d ELFMAINXu 0000000000000000 ELFMAINXu
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d NRV_TAIL 0000000000000000 NRV_TAIL
0000000000000000 l d NRV2E 0000000000000000 NRV2E
0000000000000000 l d NRV2D 0000000000000000 NRV2D
0000000000000000 l d NRV2B 0000000000000000 NRV2B
0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ
0000000000000000 *UND* 0000000000000000 LENF
0000000000000000 *UND* 0000000000000000 CPR0
0000000000000000 *UND* 0000000000000000 MFLG
0000000000000000 *UND* 0000000000000000 ADRM
0000000000000014 g ELFMAINX 0000000000000000 _start
0000000000000000 g F NRV2E 0000000000000128 ucl_nrv2e_decompress_8
0000000000000000 g F NRV2D 000000000000011c ucl_nrv2d_decompress_8
0000000000000000 g F NRV2B 00000000000000f0 ucl_nrv2b_decompress_8
00000000000000f0 g NRV2B 0000000000000000 LzmaDecode
0000000000000000 g ELFMAINY 0000000000000000 end_decompress
0000000000000000 g ELFMAINZ 0000000000000000 cpr0
RELOCATION RECORDS FOR [ELFMAINX]:
OFFSET TYPE VALUE
0000000000000000 R_AARCH64_ABS32 LENF
0000000000000004 R_AARCH64_ABS32 CPR0
0000000000000008 R_AARCH64_ABS32 MFLG
000000000000000c R_AARCH64_ABS64 ADRM
RELOCATION RECORDS FOR [ELFMAINXu]:
OFFSET TYPE VALUE
000000000000002c R_AARCH64_CONDBR19 ELFMAINY

View File

@ -0,0 +1,51 @@
Memory Configuration
Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff
Linker script and memory map
0x00000000001000bc . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x00000000001000bc 0x8a4
*(.text)
.text 0x00000000001000bc 0x2fc tmp/arm64-linux.elf-fold.o
0x00000000001002b4 my_bkpt
0x00000000001002bc exit
0x00000000001002c8 read
0x00000000001002d8 write
0x00000000001002e8 open
0x00000000001002f8 close
0x0000000000100308 unlink
0x0000000000100318 getpid
0x0000000000100328 brk
0x0000000000100338 readlink
0x0000000000100348 munmap
0x0000000000100358 mprotect
0x0000000000100368 __clear_cache
0x0000000000100380 mmap
0x00000000001003a0 mmap_privanon
.text 0x00000000001003b8 0x5a8 tmp/arm64-linux.elf-main.o
0x000000000010080c upx_main
*(.data)
.data 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o
.data 0x0000000000100960 0x0 tmp/arm64-linux.elf-main.o
.iplt 0x0000000000100960 0x0
.iplt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o
.rela.dyn 0x0000000000100960 0x0
.rela.iplt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o
.data
LOAD tmp/arm64-linux.elf-fold.o
LOAD tmp/arm64-linux.elf-main.o
OUTPUT(tmp/arm64-linux.elf-fold.bin elf64-littleaarch64)
.igot.plt 0x0000000000100960 0x0
.igot.plt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o
.bss 0x0000000000100960 0x0
.bss 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o
.bss 0x0000000000100960 0x0 tmp/arm64-linux.elf-main.o

View File

@ -0,0 +1,43 @@
file format elf64-littleaarch64
Sections:
Idx Name Size VMA LMA File off Algn Flags
0 ELFMAINX 00000024 0000000000000000 0000000000000000 00000040 2**2 CONTENTS, RELOC, READONLY
1 NRV_HEAD 00000000 0000000000000000 0000000000000000 00000064 2**0 CONTENTS, READONLY
2 NRV_TAIL 00000000 0000000000000000 0000000000000000 00000064 2**0 CONTENTS, READONLY
3 NRV2E 0000012c 0000000000000000 0000000000000000 00000064 2**2 CONTENTS, READONLY
4 NRV2D 00000120 0000000000000000 0000000000000000 00000190 2**2 CONTENTS, READONLY
5 NRV2B 000000f8 0000000000000000 0000000000000000 000002b0 2**2 CONTENTS, READONLY
6 LZMA_ELF00 000000b4 0000000000000000 0000000000000000 000003a8 2**2 CONTENTS, RELOC, READONLY
7 LZMA_DEC20 000005f8 0000000000000000 0000000000000000 0000045c 2**2 CONTENTS, READONLY
8 LZMA_DEC10 0000050c 0000000000000000 0000000000000000 00000a54 2**2 CONTENTS, READONLY
9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 00000f60 2**0 CONTENTS, READONLY
10 ELFMAINY 00000046 0000000000000000 0000000000000000 00000f60 2**2 CONTENTS, READONLY
11 ELFMAINZ 00000304 0000000000000000 0000000000000000 00000fa8 2**2 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30
0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ
0000000000000000 l d ELFMAINX 0000000000000000 ELFMAINX
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d NRV_TAIL 0000000000000000 NRV_TAIL
0000000000000000 l d NRV2E 0000000000000000 NRV2E
0000000000000000 l d NRV2D 0000000000000000 NRV2D
0000000000000000 l d NRV2B 0000000000000000 NRV2B
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 ELFMAINY 0000000000000000 ELFMAINY
0000000000000000 g ELFMAINX 0000000000000000 _start
0000000000000000 g F NRV2E 000000000000012c ucl_nrv2e_decompress_8
0000000000000000 g F NRV2D 0000000000000120 ucl_nrv2d_decompress_8
0000000000000000 g F NRV2B 00000000000000f8 ucl_nrv2b_decompress_8
0000000000000000 g LZMA_DEC10 0000000000000000 LzmaDecode
0000000000000000 g ELFMAINY 0000000000000000 end_decompress
RELOCATION RECORDS FOR [ELFMAINX]:
OFFSET TYPE VALUE
0000000000000020 R_AARCH64_CALL26 ELFMAINZ
RELOCATION RECORDS FOR [LZMA_ELF00]:
OFFSET TYPE VALUE
0000000000000004 R_AARCH64_CONDBR19 LZMA_DEC30