From a9dc8ddd7708ec1f53ea8588418007da0a345e2a Mon Sep 17 00:00:00 2001 From: Chad Retz Date: Wed, 19 Apr 2017 00:33:32 -0500 Subject: [PATCH] Fixes #1. Fix large mem data, copysign stack count, and reworked leftover mem instance support --- .../asmble/compile/jvm/ByteBufferMem.kt | 17 +- src/main/kotlin/asmble/compile/jvm/Func.kt | 3 +- .../kotlin/asmble/compile/jvm/FuncBuilder.kt | 34 ++-- .../kotlin/asmble/compile/jvm/InsnReworker.kt | 8 +- src/main/kotlin/asmble/compile/jvm/Mem.kt | 6 +- src/test/resources/local-spec/large-mem.wast | 147 ++++++++++++++++++ 6 files changed, 180 insertions(+), 35 deletions(-) create mode 100644 src/test/resources/local-spec/large-mem.wast diff --git a/src/main/kotlin/asmble/compile/jvm/ByteBufferMem.kt b/src/main/kotlin/asmble/compile/jvm/ByteBufferMem.kt index bccbf7e..ec04248 100644 --- a/src/main/kotlin/asmble/compile/jvm/ByteBufferMem.kt +++ b/src/main/kotlin/asmble/compile/jvm/ByteBufferMem.kt @@ -47,15 +47,12 @@ open class ByteBufferMem(val direct: Boolean = true) : Mem { addInsns( forceFnType Buffer>(ByteBuffer::position).invokeVirtual(), TypeInsnNode(Opcodes.CHECKCAST, memType.asmName), - // TODO: Is there a cheaper bulk approach instead of manually building - // a byte array? What's the harm of using a String in the constant pool instead? - bytes.size.const, - IntInsnNode(Opcodes.NEWARRAY, Opcodes.T_BYTE) - ). - addInsns(bytes.withIndex().flatMap { (index, byte) -> - listOf(InsnNode(Opcodes.DUP), index.const, byte.toInt().const, InsnNode(Opcodes.BASTORE)) - }). - addInsns( + // We're going to do this as an LDC string in ISO-8859 and read it back at runtime + LdcInsnNode(bytes.toString(Charsets.ISO_8859_1)), + LdcInsnNode("ISO-8859-1"), + // Ug, can't do func refs on native types here... + MethodInsnNode(Opcodes.INVOKEVIRTUAL, String::class.ref.asmName, + "getBytes", "(Ljava/lang/String;)[B", false), 0.const, bytes.size.const, forceFnType ByteBuffer>(ByteBuffer::put).invokeVirtual(), @@ -252,5 +249,7 @@ open class ByteBufferMem(val direct: Boolean = true) : Mem { } } + override val storeLeavesMemOnStack get() = true + companion object : ByteBufferMem() } \ No newline at end of file diff --git a/src/main/kotlin/asmble/compile/jvm/Func.kt b/src/main/kotlin/asmble/compile/jvm/Func.kt index fa5b7b9..b95aed9 100644 --- a/src/main/kotlin/asmble/compile/jvm/Func.kt +++ b/src/main/kotlin/asmble/compile/jvm/Func.kt @@ -13,7 +13,8 @@ data class Func( val stack: List = emptyList(), val blockStack: List = emptyList(), // Contains index of JumpInsnNode that has a null label initially - val ifStack: List = emptyList() + val ifStack: List = emptyList(), + val lastStackIsMemLeftover: Boolean = false ) { val desc: String get() = ret.asMethodRetDesc(*params.toTypedArray()) diff --git a/src/main/kotlin/asmble/compile/jvm/FuncBuilder.kt b/src/main/kotlin/asmble/compile/jvm/FuncBuilder.kt index 7420d15..77a1851 100644 --- a/src/main/kotlin/asmble/compile/jvm/FuncBuilder.kt +++ b/src/main/kotlin/asmble/compile/jvm/FuncBuilder.kt @@ -93,7 +93,7 @@ open class FuncBuilder { is Insn.ThisNeededOnStack -> fn.addInsns(VarInsnNode(Opcodes.ALOAD, 0)).push(ctx.cls.thisRef) is Insn.MemNeededOnStack -> - putMemoryOnStackIfNecessary(ctx, fn) + putMemoryOnStack(ctx, fn) } fun applyNodeInsn(ctx: FuncContext, fn: Func, i: Node.Instr, index: Int) = when (i) { @@ -1069,7 +1069,7 @@ open class FuncBuilder { // Curr mem is not specially injected, so we have to put the memory on the // stack since we need it ctx.cls.assertHasMemory().let { - putMemoryOnStackIfNecessary(ctx, fn).let { fn -> ctx.cls.mem.currentMemory(ctx, fn) } + putMemoryOnStack(ctx, fn).let { fn -> ctx.cls.mem.currentMemory(ctx, fn) } } fun applyStoreOp(ctx: FuncContext, fn: Func, insn: Node.Instr.Args.AlignOffset, insnIndex: Int) = @@ -1078,7 +1078,15 @@ open class FuncBuilder { // so we pop it if we need to ctx.cls.assertHasMemory().let { ctx.cls.mem.storeOp(ctx, fn, insn).let { fn -> - popMemoryIfNecessary(ctx, fn, ctx.insns.getOrNull(insnIndex + 1)) + // As a special case, if this leaves the mem on the stack + // and we need it in the future, we mark it as leftover and + // reuse + if (!ctx.cls.mem.storeLeavesMemOnStack) fn else ctx.insns.getOrNull(insnIndex + 1).let { nextInsn -> + if (nextInsn is Insn.MemNeededOnStack) { + fn.peekExpecting(ctx.cls.mem.memType) + fn.copy(lastStackIsMemLeftover = true) + } else fn.popExpecting(ctx.cls.mem.memType).addInsns(InsnNode(Opcodes.POP)) + } } } @@ -1089,10 +1097,11 @@ open class FuncBuilder { ctx.cls.mem.loadOp(ctx, fn, insn) } - fun putMemoryOnStackIfNecessary(ctx: FuncContext, fn: Func) = - if (fn.stack.lastOrNull() == ctx.cls.mem.memType) fn + fun putMemoryOnStack(ctx: FuncContext, fn: Func) = + // Only put it if it's not already leftover + if (fn.lastStackIsMemLeftover) fn.copy(lastStackIsMemLeftover = false) else if (ctx.memIsLocalVar) - // Assume it's just past the locals + // Assume it's just past the locals fn.addInsns(VarInsnNode(Opcodes.ALOAD, ctx.actualLocalIndex(ctx.node.localsSize))). push(ctx.cls.mem.memType) else fn.addInsns( @@ -1100,19 +1109,6 @@ open class FuncBuilder { FieldInsnNode(Opcodes.GETFIELD, ctx.cls.thisRef.asmName, "memory", ctx.cls.mem.memType.asmDesc) ).push(ctx.cls.mem.memType) - fun popMemoryIfNecessary(ctx: FuncContext, fn: Func, nextInsn: Insn?) = - // We pop the mem if it's there and not a mem op next - if (fn.stack.lastOrNull() != ctx.cls.mem.memType) fn else { - val nextInstrRequiresMemOnStack = when (nextInsn) { - is Insn.Node -> nextInsn.insn is Node.Instr.Args.AlignOffset || - nextInsn.insn is Node.Instr.CurrentMemory || nextInsn.insn is Node.Instr.GrowMemory - is Insn.MemNeededOnStack -> true - else -> false - } - if (nextInstrRequiresMemOnStack) fn - else fn.popExpecting(ctx.cls.mem.memType).addInsns(InsnNode(Opcodes.POP)) - } - fun applySetGlobal(ctx: FuncContext, fn: Func, index: Int) = ctx.cls.globalAtIndex(index).let { when (it) { is Either.Left -> applyImportSetGlobal(ctx, fn, index, it.v.kind as Node.Import.Kind.Global) diff --git a/src/main/kotlin/asmble/compile/jvm/InsnReworker.kt b/src/main/kotlin/asmble/compile/jvm/InsnReworker.kt index 80f7d2b..f80a6d2 100644 --- a/src/main/kotlin/asmble/compile/jvm/InsnReworker.kt +++ b/src/main/kotlin/asmble/compile/jvm/InsnReworker.kt @@ -230,14 +230,14 @@ open class InsnReworker { is Node.Instr.F32Add, is Node.Instr.F32Sub, is Node.Instr.F32Mul, is Node.Instr.F32Div, is Node.Instr.F32Eq, is Node.Instr.F32Ne, is Node.Instr.F32Lt, is Node.Instr.F32Le, is Node.Instr.F32Gt, is Node.Instr.F32Ge, is Node.Instr.F32Sqrt, is Node.Instr.F32Min, - is Node.Instr.F32Max -> POP_PARAM + POP_PARAM + PUSH_RESULT - is Node.Instr.F32Abs, is Node.Instr.F32Neg, is Node.Instr.F32CopySign, is Node.Instr.F32Ceil, + is Node.Instr.F32Max, is Node.Instr.F32CopySign -> POP_PARAM + POP_PARAM + PUSH_RESULT + is Node.Instr.F32Abs, is Node.Instr.F32Neg, is Node.Instr.F32Ceil, is Node.Instr.F32Floor, is Node.Instr.F32Trunc, is Node.Instr.F32Nearest -> POP_PARAM + PUSH_RESULT is Node.Instr.F64Add, is Node.Instr.F64Sub, is Node.Instr.F64Mul, is Node.Instr.F64Div, is Node.Instr.F64Eq, is Node.Instr.F64Ne, is Node.Instr.F64Lt, is Node.Instr.F64Le, is Node.Instr.F64Gt, is Node.Instr.F64Ge, is Node.Instr.F64Sqrt, is Node.Instr.F64Min, - is Node.Instr.F64Max -> POP_PARAM + POP_PARAM + PUSH_RESULT - is Node.Instr.F64Abs, is Node.Instr.F64Neg, is Node.Instr.F64CopySign, is Node.Instr.F64Ceil, + is Node.Instr.F64Max, is Node.Instr.F64CopySign -> POP_PARAM + POP_PARAM + PUSH_RESULT + is Node.Instr.F64Abs, is Node.Instr.F64Neg, is Node.Instr.F64Ceil, is Node.Instr.F64Floor, is Node.Instr.F64Trunc, is Node.Instr.F64Nearest -> POP_PARAM + PUSH_RESULT is Node.Instr.I32WrapI64, is Node.Instr.I32TruncSF32, is Node.Instr.I32TruncUF32, is Node.Instr.I32TruncSF64, is Node.Instr.I32TruncUF64, is Node.Instr.I64ExtendSI32, diff --git a/src/main/kotlin/asmble/compile/jvm/Mem.kt b/src/main/kotlin/asmble/compile/jvm/Mem.kt index 63ba946..f59499d 100644 --- a/src/main/kotlin/asmble/compile/jvm/Mem.kt +++ b/src/main/kotlin/asmble/compile/jvm/Mem.kt @@ -35,10 +35,12 @@ interface Mem { fun loadOp(ctx: FuncContext, func: Func, insn: Node.Instr.Args.AlignOffset): Func // Caller can trust the mem instance is on the stack followed - // by the value. If it's already there after call anyways, this can - // leave the mem inst on the stack and it will be reused or popped. + // by the value. If storeLeavesMemOnStack is true, this should leave the mem + // on the stack after every call. fun storeOp(ctx: FuncContext, func: Func, insn: Node.Instr.Args.AlignOffset): Func + val storeLeavesMemOnStack: Boolean + companion object { const val PAGE_SIZE = 65536 } diff --git a/src/test/resources/local-spec/large-mem.wast b/src/test/resources/local-spec/large-mem.wast new file mode 100644 index 0000000..8625d72 --- /dev/null +++ b/src/test/resources/local-spec/large-mem.wast @@ -0,0 +1,147 @@ +;; This is from musl.wast, was causing max-method-size issue +(module + (memory $0 1) + (data (i32.const 12) "\10\01\00\00") + (data (i32.const 16) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\03 \02 \02 \02 \02 \02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\01`\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\08\d8\08\d8\08\d8\08\d8\08\d8\08\d8\08\d8\08\d8\08\d8\08\d8\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\08\d5\08\d5\08\d5\08\d5\08\d5\08\d5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\08\c5\04\c0\04\c0\04\c0\04\c0\04\c0\04\c0\08\d6\08\d6\08\d6\08\d6\08\d6\08\d6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\08\c6\04\c0\04\c0\04\c0\04\c0\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 784) " \05\00\00") + (data (i32.const 800) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\t\00\00\00\n\00\00\00\0b\00\00\00\0c\00\00\00\0d\00\00\00\0e\00\00\00\0f\00\00\00\10\00\00\00\11\00\00\00\12\00\00\00\13\00\00\00\14\00\00\00\15\00\00\00\16\00\00\00\17\00\00\00\18\00\00\00\19\00\00\00\1a\00\00\00\1b\00\00\00\1c\00\00\00\1d\00\00\00\1e\00\00\00\1f\00\00\00 \00\00\00!\00\00\00\"\00\00\00#\00\00\00$\00\00\00%\00\00\00&\00\00\00\'\00\00\00(\00\00\00)\00\00\00*\00\00\00+\00\00\00,\00\00\00-\00\00\00.\00\00\00/\00\00\000\00\00\001\00\00\002\00\00\003\00\00\004\00\00\005\00\00\006\00\00\007\00\00\008\00\00\009\00\00\00:\00\00\00;\00\00\00<\00\00\00=\00\00\00>\00\00\00?\00\00\00@\00\00\00a\00\00\00b\00\00\00c\00\00\00d\00\00\00e\00\00\00f\00\00\00g\00\00\00h\00\00\00i\00\00\00j\00\00\00k\00\00\00l\00\00\00m\00\00\00n\00\00\00o\00\00\00p\00\00\00q\00\00\00r\00\00\00s\00\00\00t\00\00\00u\00\00\00v\00\00\00w\00\00\00x\00\00\00y\00\00\00z\00\00\00[\00\00\00\\\00\00\00]\00\00\00^\00\00\00_\00\00\00`\00\00\00a\00\00\00b\00\00\00c\00\00\00d\00\00\00e\00\00\00f\00\00\00g\00\00\00h\00\00\00i\00\00\00j\00\00\00k\00\00\00l\00\00\00m\00\00\00n\00\00\00o\00\00\00p\00\00\00q\00\00\00r\00\00\00s\00\00\00t\00\00\00u\00\00\00v\00\00\00w\00\00\00x\00\00\00y\00\00\00z\00\00\00{\00\00\00|\00\00\00}\00\00\00~\00\00\00\7f\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2336) "0\0b\00\00") + (data (i32.const 2352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\t\00\00\00\n\00\00\00\0b\00\00\00\0c\00\00\00\0d\00\00\00\0e\00\00\00\0f\00\00\00\10\00\00\00\11\00\00\00\12\00\00\00\13\00\00\00\14\00\00\00\15\00\00\00\16\00\00\00\17\00\00\00\18\00\00\00\19\00\00\00\1a\00\00\00\1b\00\00\00\1c\00\00\00\1d\00\00\00\1e\00\00\00\1f\00\00\00 \00\00\00!\00\00\00\"\00\00\00#\00\00\00$\00\00\00%\00\00\00&\00\00\00\'\00\00\00(\00\00\00)\00\00\00*\00\00\00+\00\00\00,\00\00\00-\00\00\00.\00\00\00/\00\00\000\00\00\001\00\00\002\00\00\003\00\00\004\00\00\005\00\00\006\00\00\007\00\00\008\00\00\009\00\00\00:\00\00\00;\00\00\00<\00\00\00=\00\00\00>\00\00\00?\00\00\00@\00\00\00A\00\00\00B\00\00\00C\00\00\00D\00\00\00E\00\00\00F\00\00\00G\00\00\00H\00\00\00I\00\00\00J\00\00\00K\00\00\00L\00\00\00M\00\00\00N\00\00\00O\00\00\00P\00\00\00Q\00\00\00R\00\00\00S\00\00\00T\00\00\00U\00\00\00V\00\00\00W\00\00\00X\00\00\00Y\00\00\00Z\00\00\00[\00\00\00\\\00\00\00]\00\00\00^\00\00\00_\00\00\00`\00\00\00A\00\00\00B\00\00\00C\00\00\00D\00\00\00E\00\00\00F\00\00\00G\00\00\00H\00\00\00I\00\00\00J\00\00\00K\00\00\00L\00\00\00M\00\00\00N\00\00\00O\00\00\00P\00\00\00Q\00\00\00R\00\00\00S\00\00\00T\00\00\00U\00\00\00V\00\00\00W\00\00\00X\00\00\00Y\00\00\00Z\00\00\00{\00\00\00|\00\00\00}\00\00\00~\00\00\00\7f\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3888) "Symbol not found: %s\00") + (data (i32.const 3912) "\00\00\00\00") + (data (i32.const 4232) "\00\00\00\00\00\00m\e6\ec\de\05\00\0b\00") + (data (i32.const 4248) "\00\00\00\00") + (data (i32.const 4256) "Assertion failed: %s (%s: %s: %d)\n\00") + (data (i32.const 4432) "O\bba\05g\ac\dd?\18-DT\fb!\e9?\9b\f6\81\d2\0bs\ef?\18-DT\fb!\f9?") + (data (i32.const 4464) "\e2e/\"\7f+z<\07\\\143&\a6\81<\bd\cb\f0z\88\07p<\07\\\143&\a6\91<") + (data (i32.const 4496) "\d2!3\7f|\d9\02@\d2!3\7f|\d9\02\c0\18-DT\fb!\e9?\18-DT\fb!\e9\bf") + (data (i32.const 4528) "\18-DT\fb!\t@\18-DT\fb!\t\c0\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\80") + (data (i32.const 4560) "\e4\cb\16@\e4\cb\16\c0\db\0fI?\db\0fI\bf") + (data (i32.const 4576) "\db\0fI@\db\0fI\c0\00\00\00\00\00\00\00\80") + (data (i32.const 4592) "8c\ed>\da\0fI?^\98{?\da\0f\c9?") + (data (i32.const 4608) "i7\ac1h!\"3\b4\0f\143h!\a23") + (data (i32.const 4912) "/dev/tty\00") + (data (i32.const 4928) "/proc/self/exe\00") + (data (i32.const 4944) "Unsupported request %d\00") + (data (i32.const 4976) "Dynamic loading not supported\00") + (data (i32.const 5008) "%.*e\00") + (data (i32.const 5040) "\00\00\00\00\00\00\e0?\00\00\00\00\00\00\e0\bf") + (data (i32.const 5056) "\16V\e7\9e\af\03\d2<\9b+\a1\86\9b\84\06=\82vIh\c2%<=\11\ea-\81\99\97q=\95dy\e1\7f\fd\a5=\bb\bd\d7\d9\df|\db=\95\d6&\e8\0b.\11>:\8c0\e2\8eyE>H\af\bc\9a\f2\d7z>\8d\ed\b5\a0\f7\c6\b0>\f1h\e3\88\b5\f8\e4>-C\1c\eb\e26\1a?\fc\a9\f1\d2MbP?{\14\aeG\e1z\84?\9a\99\99\99\99\99\b9?\00\00\00\00\00\00\f0?\00\00\00\00\00\00$@\00\00\00\00\00\00Y@\00\00\00\00\00@\8f@\00\00\00\00\00\88\c3@\00\00\00\00\00j\f8@\00\00\00\00\80\84.A\00\00\00\00\d0\12cA\00\00\00\00\84\d7\97A\00\00\00\00e\cd\cdA\00\00\00 _\a0\02B\00\00\00\e8vH7B\00\00\00\a2\94\1amB\00\00@\e5\9c0\a2B\00\00\90\1e\c4\bc\d6B\00\004&\f5k\0cC") + (data (i32.const 5312) "\95\bf\d63\bd7\865\ac\c5\'7\17\b7\d18o\12\83:\n\d7#<\cd\cc\cc=\00\00\80?\00\00 A\00\00\c8B\00\00zD\00@\1cF\00P\c3G\00$tI\80\96\18K") + (data (i32.const 5376) "]=\7ff\9e\a0\e6?\00\00\00\00\00\889=D\17u\faR\b0\e6?\00\00\00\00\00\00\d8<\fe\d9\0bu\12\c0\e6?\00\00\00\00\00x(\bd\bfv\d4\dd\dc\cf\e6?\00\00\00\00\00\c0\1e=)\1ae<\b2\df\e6?\00\00\00\00\00\00\d8\bc\e3:Y\98\92\ef\e6?\00\00\00\00\00\00\bc\bc\86\93Q\f9}\ff\e6?\00\00\00\00\00\d8/\bd\a3-\f4ft\0f\e7?\00\00\00\00\00\88,\bd\c3_\ec\e8u\1f\e7?\00\00\00\00\00\c0\13=\05\cf\ea\86\82/\e7?\00\00\00\00\0008\bdR\81\a5H\9a?\e7?\00\00\00\00\00\c0\00\bd\fc\cc\d75\bdO\e7?\00\00\00\00\00\88/=\f1gBV\eb_\e7?\00\00\00\00\00\e0\03=Hm\ab\b1$p\e7?\00\00\00\00\00\d0\'\bd8]\deOi\80\e7?\00\00\00\00\00\00\dd\bc\00\1d\ac8\b9\90\e7?\00\00\00\00\00\00\e3T\'\04\e8?\00\00\00\00\00\003=\1a\07\d1\ad\d2\14\e8?\00\00\00\00\00\00\0f=~\cdL\99\89%\e8?\00\00\00\00\00\c0!\bd\d0B\b9\1eL6\e8?\00\00\00\00\00\d0)=\b5\ca#F\1aG\e8?\00\00\00\00\00\10G=\bc[\9f\17\f4W\e8?\00\00\00\00\00`\"=\af\91D\9b\d9h\e8?\00\00\00\00\00\c42\bd\95\a31\d9\cay\e8?\00\00\00\00\00\00#\bd\b8e\8a\d9\c7\8a\e8?\00\00\00\00\00\80*\bd\00Xx\a4\d0\9b\e8?\00\00\00\00\00\00\ed\bc#\a2*B\e5\ac\e8?\00\00\00\00\00(3=\fa\19\d6\ba\05\be\e8?\00\00\00\00\00\b4B=\83C\b5\162\cf\e8?\00\00\00\00\00\d0.\bdLf\08^j\e0\e8?\00\00\00\00\00P \bd\07x\15\99\ae\f1\e8?\00\00\00\00\00((=\0e,(\d0\fe\02\e9?\00\00\00\00\00\b0\1c\bd\96\ff\91\0b[\14\e9?\00\00\00\00\00\e0\05\bd\f9/\aaS\c3%\e9?\00\00\00\00\00@\f5\b2\03U\ea?\00\00\00\00\00`\0b=\13b\f4\8aJg\ea?\00\00\00\00\00\888=\a7\b30\13\9ey\ea?\00\00\00\00\00 \11=\8d.\c1S\fe\8b\ea?\00\00\00\00\00\c0\06=\d2\fcyUk\9e\ea?\00\00\00\00\00\b8)\bd\b8o5!\e5\b0\ea?\00\00\00\00\00p+=\81\f3\d3\bfk\c3\ea?\00\00\00\00\00\00\d9<\80\'<:\ff\d5\ea?\00\00\00\00\00\00\e4<\a3\d2Z\99\9f\e8\ea?\00\00\00\00\00\90,\bdg\f3\"\e6L\fb\ea?\00\00\00\00\00P\16=\90\b7\8d)\07\0e\eb?\00\00\00\00\00\d4/=\a9\89\9al\ce \eb?\00\00\00\00\00p\12=K\1aO\b8\a23\eb?\00\00\00\00\00GM=\e7G\b7\15\84F\eb?\00\00\00\00\0088\bd:Y\e5\8drY\eb?\00\00\00\00\00\00\98\9a,\f0?\00\00\00\00\00\98\ef<\ca\bb\11.\d47\f0?\00\00\00\00\00@\c7\bc\89\7fn\e8\15C\f0?\00\00\00\00\000\d8\9e\f0?\00\00\00\00\00\00\98\bc09\1f\9b\c7\a9\f0?\00\00\00\00\00\a0\ff<\fc\88\f9lX\b5\f0?\00\00\00\00\00\c8\fa\bc\8al\e4E\f1\c0\f0?\00\00\00\00\00\c0\d9<\16Hr+\92\cc\f0?\00\00\00\00\00 \05=\d8]9#;\d8\f0?\00\00\00\00\00\d0\fa\bc\f3\d1\d32\ec\e3\f0?\00\00\00\00\00\ac\1b=\a6\a9\df_\a5\ef\f0?\00\00\00\00\00\e8\04\bd\f0\d2\fe\aff\fb\f0?\00\00\00\00\000\0d\bdK#\d7(0\07\f1?\00\00\00\00\00P\f1<[[\12\d0\01\13\f1?\00\00\00\00\00\00\ec<\f9*^\ab\db\1e\f1?\00\00\00\00\00\bc\16=\d51l\c0\bd*\f1?\00\00\00\00\00@\e8<}\04\f2\14\a86\f1?\00\00\00\00\00\d0\0e\bd\e9-\a9\ae\9aB\f1?\00\00\00\00\00\e0\e8<81O\93\95N\f1?\00\00\00\00\00@\ebc\f5\e1\df\84\f2?\00\00\00\00\00\c0\14\bd0\bb\91u\ba\91\f2?\00\00\00\00\00\d8\13\bd\t\df\1f\f5\9d\9e\f2?\00\00\00\00\00\b0\08=\9b\0e\d1f\8a\ab\f2?\00\00\00\00\00|\"\bd:\da\da\d0\7f\b8\f2?\00\00\00\00\004*=\f9\1aw9~\c5\f2?\00\00\00\00\00\80\10\bd\d9\02\e4\a6\85\d2\f2?\00\00\00\00\00\d0\0e\bdy\15d\1f\96\df\f2?\00\00\00\00\00 \f4\bc\cf.>\a9\af\ec\f2?\00\00\00\00\00\98$\bd\"\88\bdJ\d2\f9\f2?\00\00\00\00\000\16\bd%\b61\n\fe\06\f3?\00\00\00\00\0062\bd\0b\a5\ee\ed2\14\f3?\00\00\00\00\80\dfp\bd\b8\d7L\fcp!\f3?\00\00\00\00\00H\"\bd\a2\e9\a8;\b8.\f3?\00\00\00\00\00\98%\bdf\17d\b2\08<\f3?\00\00\00\00\00\d0\1e=\'\fa\e3fbI\f3?\00\00\00\00\00\00\dc\bc\0f\9f\92_\c5V\f3?\00\00\00\00\00\d80\bd\b9\88\de\a21d\f3?\00\00\00\00\00\c8\"=9\aa:7\a7q\f3?\00\00\00\00\00` =\fet\1e#&\7f\f3?\00\00\00\00\00`\16\bd8\d8\05m\ae\8c\f3?\00\00\00\00\00\e0\n\bd\c3>q\1b@\9a\f3?\00\00\00\00\00rD\bd \a0\e54\db\a7\f3?\00\00\00\00\00 \08=\95n\ec\bf\7f\b5\f3?\00\00\00\00\00\80>=\f2\a8\13\c3-\c3\f3?\00\00\00\00\00\80\ef<\"\e1\edD\e5\d0\f3?\00\00\00\00\00\a0\17\bd\bb4\12L\a6\de\f3?\00\00\00\00\000&=\ccN\1c\dfp\ec\f3?\00\00\00\00\00\a6H\bd\8c~\ac\04E\fa\f3?\00\00\00\00\00\dc<\bd\bb\a0g\c3\"\08\f4?\00\00\00\00\00\b8%=\95.\f7!\n\16\f4?\00\00\00\00\00\c0\1e=FF\t\'\fb#\f4?\00\00\00\00\00`\13\bd \a9P\d9\f51\f4?\00\00\00\00\00\98#=\eb\b9\84?\fa?\f4?\00\00\00\00\00\00\fa<\19\89a`\08N\f4?\00\00\00\00\00\c0\f6\bc\01\d2\a7B \\\f4?\00\00\00\00\00\c0\0b\bd\16\00\1d\edAj\f4?\00\00\00\00\00\80\12\bd&3\8bfmx\f4?\00\00\00\00\00\e00=\00<\c1\b5\a2\86\f4?\00\00\00\00\00@-\bd\04\af\92\e1\e1\94\f4?\00\00\00\00\00 \0c=r\d3\d7\f0*\a3\f4?\00\00\00\00\00P\1e\bd\01\b8m\ea}\b1\f4?\00\00\00\00\00\80\07=\e1)6\d5\da\bf\f4?\00\00\00\00\00\80\13\bd2\c1\17\b8A\ce\f4?\00\00\00\00\00\80\00=\db\dd\fd\99\b2\dc\f4?\00\00\00\00\00p,=\96\ab\d8\81-\eb\f4?\00\00\00\00\00\e0\1c\bd\02-\9dv\b2\f9\f4?\00\00\00\00\00 \19=\c11E\7fA\08\f5?\00\00\00\00\00\c0\08\bd*f\cf\a2\da\16\f5?\00\00\00\00\00\00\fa\bc\eaQ?\e8}%\f5?\00\00\00\00\00\08J=\daN\9dV+4\f5?\00\00\00\00\00\d8&\bd\1a\ac\f6\f4\e2B\f5?\00\00\00\00\00D2\bd\db\94]\ca\a4Q\f5?\00\00\00\00\00@@K\d1\e4\91\d5p@\"\bf\b3\"Ef\8a@\14\c2\\\9c|\97\8b@e\13\00\0eS\95j@1)\b3\f8j>\15\c0") + (data (i32.const 10512) "\82\cb\dej\03\cd2>B\08\8d\0e\ee\bf\b2?\f5\9c\14a\fc\c0\n@\dd\ae-\96\98OE@\1f\fd^\e2\dbYe@\e0!\fa\81|\d7d@") + (data (i32.const 10560) "\dbk\f7T;1\84>4>\88>\c5\be\b2?\9cw\'\e7\97\f8\ff?\e5o\f9\aa\bf\fd,@J\dc\fb)\8e\aa?@\b4K\81q\b1@0@") + (data (i32.const 10608) "\bc9[6\d5xd@c\05kNX\a2\bf@?\8c\d3TRf\01AC+\a5\83\da\83(A=\0b\de(k\a6)A\c50\95,m\fd\14\c1") + (data (i32.const 10656) "C\15^\fb\b3\b1T@\ce\c0!\da\a0;\a0@m\1eY{\d2g\d2@r#\e0\97\e3\b5\eb@\a0Tz\1f\18\91\e1@\t\c6\db\beW\ea\b4\c0") + (data (i32.const 10704) "\00\00\00\00\00\00\00\00,\fe\ff\ff\ff\bf\b2?\d64\b3[R\89\'@%\180\15cm\81@m\f4\18>\99M\c1@f\15\90\0e\d4\12\e2@") + (data (i32.const 10752) "\d9\8c\cc)\8f=\b4=L\b0r\d1\ff\bf\b2?\d3=\95\b9\b0W\17@\e9\88\87\n\92\e3`@\81\c4\c8\9d\f9\0c\90@\a6\e3\c6S\e9\17\9f@") + (data (i32.const 10800) "\94l\0fB\ca\c1\b4Cs3\95D\e6\ff\8cD\b8\94-C") + (data (i32.const 10832) "-\c3\b1A\f04\08C2<\87C\1a\e0\19C\9a\85jA") + (data (i32.const 10864) "\1b\08/\b1\b8\ff\8f\bd\95-\1a\c0R\ba\af\c1\12Qh\c2e\95\fb\c1") + (data (i32.const 10896) "\b7\98\be\b3\12\fb\8f\bd\cc\b1\b9\bf\9fW\f4\c06\173\c1\0d\f4N\c0") + (data (i32.const 10928) "\98\11\e9B\eb\9boE\db\95\1eG|\08\e4G\ba\0b:G") + (data (i32.const 10960) "\08\04sB\13h\83D\c4\d7\baE\c8e\16F\ee`\16E") + (data (i32.const 10992) "\00\00\00\00\00\00\90\bd\86N\01\c1\14\88\80\c3vS\1b\c5Z(\a4\c5") + (data (i32.const 11024) "\8a\c5H\ad\ff\ff\8f\bd\88\1b\85\c0{Y\87\c2\9b\9d\a5\c3y7\ad\c3") + (data (i32.const 11056) "\16\tCB\1cl1D_\82gEg\e3\c9EWE\1dEY?\15\c3") + (data (i32.const 11088) "\b8\ec\f2A\8f\ac\86C)2SD\e5\bb\\D\98\aaTCX\f3\a9\c0") + (data (i32.const 11120) "\1bh\961p\ff\95=\e3\07V@\c5|*B\df\ce*C\e4\bb&C") + (data (i32.const 11152) "\db\89!4*\f6\95=\bf\c4\ff?\fd\edgAqT\fdA\8c\05\82A") + (data (i32.const 11184) "\aa\c6#C\c2\12\fdE\932\0bH\d4\1eDIY3MIi\eb\a7\c8") + (data (i32.const 11216) "\a0\8d\a5B\07\dd\01E\94>\93F\1d\af]G\c1\88\0cG\beR\a7\c5") + (data (i32.const 11248) "\00\00\00\00\00\00\96=\93J{\d1![\f5\ff\bd?\8a\ad^\e8\bcv\0f@)\d1\a6\9dH\8fA@7\18,M\85\c3V@\e5>\a8\8e\8fGH@") + (data (i32.const 11456) "\f4DU\f6\d4\e9|>\83\0dv\beB\ff\bd?\c0\ae\8f\f9\b7\f2\02@d\a9q\7f7|(@\e2\8e\7f\17\a8\b11@\fe\c1t\a5IK\14@") + (data (i32.const 11504) "\acle\8eE\8d\\@O\'M\96\dc\85\ac@\7f\bb\c5\97\86\0b\e2@\bb\17\8f\b2,\d4\f7@-\0bzi\11\15\de@") + (data (i32.const 11552) "=c\af\a8\ea\a3M@\01g\06\1b6\fb\8e@\fb\b6\06WD\e9\b4@\15\bb\a5\b8\b0\a4\be@Q^o\030\80\97@") + (data (i32.const 11600) "\00\00\00\00\00\00\00\00\ce\fc\ff\ff\ff\ff\bd?\ce\7f\7f5\9dz*@\90\a5.e\d4\c0y@\cc2\a5\a3}E\ae@\dd\82\'\c3z\ea\be@") + (data (i32.const 11648) "}\ca\e1\dag\06\ad=C\00\c1\e2\ff\ff\bd?\e3\15cn\046\1b@\ed\02&E\b9\13[@I\d6R\d0\16-\80@\b7\0c~\bb\b8\85\80@") + (data (i32.const 11696) "\e4g\d3\cc#\d5G@>\ee1\c0\eb\0e\85@\9a|\8eDNh\aa@\a6T\1d\a6\ba\ab\b5@K\df\d4\0dz\bc\9d@\1f1\n)p\e6`\c0") + (data (i32.const 11744) "\ffd\aex\8a\88=@\ba\1c\82\dbh\9fo@\f7\a0I\ce\05\ac\87@)\c0\d4H%\1b\87@\d4\d8><^~c@k\e8\1b\e7\86\d6\13\c0") + (data (i32.const 11792) "O\c8\8f\d3\a9\cf5\beT\ed\aeQ\eb?\ba\bf\ff\d9\023\c2p\12\c0\da\16]\c2q\ecL\c0_\d5\18G\d3\87l\c0\f6\1b\\_\b9fk\c0") + (data (i32.const 11840) "\d2&\c6D&\f1\87\be\10\b0H\91\8e>\ba\bf\daN\bbi\84\04\06\c0\7f\90h\c1\e2\a93\c0\aaJ\10\de\a3)E\c0Rn\cf96_5\c0") + (data (i32.const 11888) "\e5\cd[\de\a6,d@\19\84\d8\d0b\91\be@\98^\b7\b0\9aW\00A\19\9c\86rS\f6%A\\\ad\19w\d2W$A\18\aa\a5\0ei\f9\11\c1") + (data (i32.const 11936) "\b2\11Z\ff\b2QT@9\f8{\e71\1f\9f@)\ced\0d\1f\0f\d1@\97\d1\ba\aamW\e8@K6|\cf\04K\db@\04\a0\ff\fc.o\b2\c0") + (data (i32.const 11984) "\00\00\00\00\00\00\00\00\f3\fd\ff\ff\ff?\ba\bf\f7yg\a2\91E0\c0v\b5\e4S\d0\bc\87\c0\15t\f8@\e7$\c7\c0j\9c\d0e\d0\a6\e7\c0") + (data (i32.const 12032) "\98\a0\a1\1aC\fa\b6\bd\ef\7fY\cb\ff?\ba\bfK\ad\03\ca\e6\1c \c0\b0\b9\a7lm\f5f\c0Os1i\c6t\95\c0\9d\a7\fd\88\e3h\a4\c0") + (data (i32.const 12080) "M*\0bB\98a\a8C\e3\db\82D\ed\b3^Dl\93\cfB") + (data (i32.const 12112) "\ec}\abA\99\94\faB\c7FhC\d7[\ebB\90\d5\05A") + (data (i32.const 12144) "\0d\e1O1\ab\ff\ef=\e7\b5{@Ez\0cB*\1c\b6B|") + (data (i32.const 13744) "\00\00\00\00\00\00\00\00\00\00\00@\03\b8\e2?") + (data (i32.const 13760) "\00\00\80?\00\00\c0?") + (data (i32.const 13768) "\00\00\00\00\dc\cf\d15") + (data (i32.const 13776) "\00\00\00\00\00\c0\15?") + (data (i32.const 13792) "/proc/self/fd/\00") + (data (i32.const 13808) "\00\00\00\00") + (data (i32.const 13832) "\1f\00\00\00") + (data (i32.const 13836) "$6\00\00") + (data (i32.const 13840) "\03\00\00\00") + (data (i32.const 13856) "\00\00\00\00-\f4QX\cf\8c\b1\c0F\f6\b5\cb)1\03\c7\04[p0\b4]\fd x\7f\8b\9a\d8Y)PhH\89\ab\a7V\03l\ff\b7\cd\88?\d4w\b4+\a5\a3p\f1\ba\e4\a8\fcA\83\fd\d9o\e1\8az/-t\96\07\1f\0d\t^\03v,p\f7@\a5,\a7oWA\a8\aat\df\a0Xd\03J\c7\c4?CGJMXYZ[\\]^_`acdefgijklrstyz{|\00") + (data (i32.const 16928) "Illegal byte sequence\00Domain error\00Result not representable\00Not a tty\00Permission denied\00Operation not permitted\00No such file or directory\00No such process\00File exists\00Value too large for data type\00No space left on device\00Out of memory\00Resource busy\00Interrupted system call\00Resource temporarily unavailable\00Invalid seek\00Cross-device link\00Read-only file system\00Directory not empty\00Connection reset by peer\00Operation timed out\00Connection refused\00Host is down\00Host is unreachable\00Address in use\00Broken pipe\00I/O error\00No such device or address\00Block device required\00No such device\00Not a directory\00Is a directory\00Text file busy\00Exec format error\00Invalid argument\00Argument list too long\00Symbolic link loop\00Filename too long\00Too many open files in system\00No file descriptors available\00Bad file descriptor\00No child process\00Bad address\00File too large\00Too many links\00No locks available\00Resource deadlock would occur\00State not recoverable\00Previous owner died\00Operation canceled\00Function not implemented\00No message of desired type\00Identifier removed\00Device not a stream\00No data available\00Device timeout\00Out of streams resources\00Link has been severed\00Protocol error\00Bad message\00File descriptor in bad state\00Not a socket\00Destination address required\00Message too large\00Protocol wrong type for socket\00Protocol not available\00Protocol not supported\00Socket type not supported\00Not supported\00Protocol family not supported\00Address family not supported by protocol\00Address not available\00Network is down\00Network unreachable\00Connection reset by network\00Connection aborted\00No buffer space available\00Socket is connected\00Socket not connected\00Cannot send after socket shutdown\00Operation already in progress\00Operation in progress\00Stale file handle\00Remote I/O error\00Quota exceeded\00No medium found\00Wrong medium type\00No error information\00\00") + (data (i32.const 18736) "/tmp\00") + (data (i32.const 18752) "temp\00") + (data (i32.const 18768) "\00\00\00\00\00\00\f0?\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00@\00\00\00\00\00\00\18@\00\00\00\00\00\008@\00\00\00\00\00\00^@\00\00\00\00\00\80\86@\00\00\00\00\00\b0\b3@\00\00\00\00\00\b0\e3@\00\00\00\00\00&\16A\00\00\00\00\80\afKA\00\00\00\00\a8\08\83A\00\00\00\00\fc\8c\bcA\00\00\00\c0\8c2\f7A\00\00\00(;L4B\00\00\80uw\07sB\00\00\80uw\07\b3B\00\00\d8\ec\ee7\f4B\00\00s\ca\ec\be6C\00\90h0\b9\02{C\00ZA\be\b3\e1\c0C \c6\b5\e9;(\06Dl\f0YaRwND") + (data (i32.const 18960) "\9e\a4\c1CQ\ea\15BWL\f5up\fc#B\1a\b6\8a\812\a1 B\1a&\e8\"\b5\b0\10B\e8\a1\a5\b3\c1\7f\f6A?\f3\d3\f5\18t\d5A*_\b9{\0c\ab\adA\98\cc]\f9v\f8}AL\f4\80P\e9\f1EA\eb\87\87\1fB\b6\06A\04\d8X\08\ac\87\bf@R;\bc{`Zj@\05\'\f6\1f\93\0d\04@") + (data (i32.const 19072) "\00\00\00\00\00\00\00\00\00\00\00\00\a8\08\83A\00\00\00\80i\bd\9cA\00\00\00\b0\a6\fd\a1A\00\00\00pq\18\99A\00\00\00\90\b6\ee\85A\00\00\00\e0qqiA\00\00\00\00{\1fDA\00\00\00\00\bc\d0\15A\00\00\00\00\80\e7\df@\00\00\00\00\00\14\9e@\00\00\00\00\00\80P@\00\00\00\00\00\00\f0?") + (data (i32.const 19184) "/tmp/tmpnam_XXXXXX\00") + (data (i32.const 19284) "@\00\00\00\00\00\00\00") + (data (i32.const 19292) "@\00\00\00\00\00\00\00") +) \ No newline at end of file