diff --git a/.github/workflows/scala.yml b/.github/workflows/scala.yml index 4677da77..d2f8348b 100644 --- a/.github/workflows/scala.yml +++ b/.github/workflows/scala.yml @@ -79,3 +79,4 @@ jobs: sbt 'testOnly gensym.wasm.TestConcolic' sbt 'testOnly gensym.wasm.TestDriver' sbt 'testOnly gensym.wasm.TestStagedEval' + sbt 'testOnly gensym.wasm.TestStagedConcolicEval' diff --git a/benchmarks/wasm/Makefile b/benchmarks/wasm/Makefile new file mode 100644 index 00000000..bad47a22 --- /dev/null +++ b/benchmarks/wasm/Makefile @@ -0,0 +1,7 @@ +.PHONY: clean + +clean: + find . -type f -name '*.cpp' -delete + find . -type f -name '*.cpp.exe' -delete + find . -type d -name '*.dSYM' -exec rm -rf {} + + find . -type f -name '*.dot' -delete diff --git a/benchmarks/wasm/branch-strip-buggy.wat b/benchmarks/wasm/branch-strip-buggy.wat index c957db7f..0685f0be 100644 --- a/benchmarks/wasm/branch-strip-buggy.wat +++ b/benchmarks/wasm/branch-strip-buggy.wat @@ -29,6 +29,7 @@ else i32.const 0 call 2 + i32.const 1 ;; to satisfy the type checker, this line will never be reached end end ) diff --git a/benchmarks/wasm/btree/2o1u-unlabeled.wat b/benchmarks/wasm/btree/2o1u-unlabeled.wat index 096f1004..443bf5d4 100644 --- a/benchmarks/wasm/btree/2o1u-unlabeled.wat +++ b/benchmarks/wasm/btree/2o1u-unlabeled.wat @@ -2626,9 +2626,12 @@ i32.and drop) (func (;7;) (type 4) - i32.const 3 i32.const 2 + i32.symbolic i32.const 1 + i32.symbolic + i32.const 0 + i32.symbolic call 6) (memory (;0;) 2) (export "main" (func 7)) diff --git a/benchmarks/wasm/compare_wasp/Makefile b/benchmarks/wasm/compare_wasp/Makefile new file mode 100644 index 00000000..1c3e58c6 --- /dev/null +++ b/benchmarks/wasm/compare_wasp/Makefile @@ -0,0 +1,20 @@ +.PHONY: all run clean + +all: large-branch.wat.cpp.imm.noreuse.exe large-branch.wat.cpp.imm.exe large-branch.wat.cpp.imm.cost-model.exe + +large-branch.wat.cpp.imm.noreuse.exe: large-branch.wat.cpp + g++ large-branch.wat.cpp -o large-branch.wat.cpp.imm.noreuse.exe -DUSE_IMM -I ../../../headers -lz3 -DENABLE_PROFILE_TIME -O3 -DNO_REUSE -DENABLE_PROFILE_STEP + +large-branch.wat.cpp.imm.exe: large-branch.wat.cpp + g++ large-branch.wat.cpp -o large-branch.wat.cpp.imm.exe -DUSE_IMM -I ../../../headers -lz3 -DENABLE_PROFILE_TIME -O3 -DENABLE_PROFILE_STEP + +large-branch.wat.cpp.imm.cost-model.exe: large-branch.wat.cpp + g++ large-branch.wat.cpp -o large-branch.wat.cpp.imm.cost-model.exe -DUSE_IMM -I ../../../headers -lz3 -DENABLE_PROFILE_TIME -O3 -DUSE_COST_MODEL + + +run: all + ./large-branch.wat.cpp.imm.noreuse.exe + ./large-branch.wat.cpp.imm.exe + +clean: + rm -f *.exe \ No newline at end of file diff --git a/benchmarks/wasm/compare_wasp/large-branch.wat b/benchmarks/wasm/compare_wasp/large-branch.wat new file mode 100644 index 00000000..76e40191 --- /dev/null +++ b/benchmarks/wasm/compare_wasp/large-branch.wat @@ -0,0 +1,591 @@ +(module + (type (;0;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32))) + (type (;1;) (func (result i32))) + (import "spectest" "print_i32" (func (;0;) (param i32))) + + (func (;1;) (type 0) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) + local.get 0 + i32.const 0 + i32.gt_s + if ;; label = @1 + local.get 7 + local.get 13 + i32.add + i32.const 13 + i32.add + local.set 0 + end + local.get 1 + i32.const 1 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 7 + i32.add + i32.const 35 + i32.add + local.set 1 + end + local.get 2 + i32.const 2 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 4 + i32.add + i32.const 69 + i32.add + local.set 2 + end + local.get 3 + i32.const 3 + i32.gt_s + if ;; label = @1 + local.get 13 + local.get 14 + i32.add + i32.const 91 + i32.add + local.set 3 + end + local.get 4 + i32.const 4 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 10 + i32.add + i32.const 47 + i32.add + local.set 4 + end + local.get 5 + i32.const 5 + i32.gt_s + if ;; label = @1 + local.get 15 + local.get 6 + i32.add + i32.const 74 + i32.add + local.set 5 + end + local.get 6 + i32.const 6 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 8 + i32.add + i32.const 15 + i32.add + local.set 6 + end + local.get 7 + i32.const 7 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 9 + i32.add + i32.const 34 + i32.add + local.set 7 + end + local.get 8 + i32.const 8 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 12 + i32.add + i32.const 57 + i32.add + local.set 8 + end + local.get 9 + i32.const 9 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 11 + i32.add + i32.const 3 + i32.add + local.set 9 + end + local.get 10 + i32.const 10 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 6 + i32.add + i32.const 21 + i32.add + local.set 10 + end + local.get 11 + i32.const 11 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 5 + i32.add + i32.const 72 + i32.add + local.set 11 + end + local.get 12 + i32.const 12 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 6 + i32.add + i32.const 55 + i32.add + local.set 12 + end + local.get 13 + i32.const 13 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 3 + i32.add + i32.const 12 + i32.add + local.set 13 + end + local.get 14 + i32.const 14 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 12 + i32.add + i32.const 69 + i32.add + local.set 14 + end + local.get 15 + i32.const 15 + i32.gt_s + if ;; label = @1 + local.get 18 + local.get 5 + i32.add + i32.const 92 + i32.add + local.set 15 + end + local.get 16 + i32.const 16 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 12 + i32.add + i32.const 39 + i32.add + local.set 16 + end + local.get 17 + i32.const 17 + i32.gt_s + if ;; label = @1 + local.get 15 + local.get 8 + i32.add + i32.const 39 + i32.add + local.set 17 + end + local.get 18 + i32.const 18 + i32.gt_s + if ;; label = @1 + local.get 17 + local.get 3 + i32.add + i32.const 64 + i32.add + local.set 18 + end + local.get 19 + i32.const 19 + i32.gt_s + if ;; label = @1 + local.get 11 + local.get 5 + i32.add + i32.const 78 + i32.add + local.set 19 + end + local.get 6 + i32.const 6 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 8 + i32.add + i32.const 15 + i32.add + local.set 6 + end + local.get 7 + i32.const 7 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 9 + i32.add + i32.const 34 + i32.add + local.set 7 + end + local.get 8 + i32.const 8 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 12 + i32.add + i32.const 57 + i32.add + local.set 8 + end + local.get 9 + i32.const 9 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 11 + i32.add + i32.const 3 + i32.add + local.set 9 + end + local.get 10 + i32.const 10 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 6 + i32.add + i32.const 21 + i32.add + local.set 10 + end + local.get 11 + i32.const 11 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 5 + i32.add + i32.const 72 + i32.add + local.set 11 + end + local.get 12 + i32.const 12 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 6 + i32.add + i32.const 55 + i32.add + local.set 12 + end + local.get 13 + i32.const 13 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 3 + i32.add + i32.const 12 + i32.add + local.set 13 + end + local.get 14 + i32.const 14 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 12 + i32.add + i32.const 69 + i32.add + local.set 14 + end + local.get 15 + i32.const 15 + i32.gt_s + if ;; label = @1 + local.get 18 + local.get 5 + i32.add + i32.const 92 + i32.add + local.set 15 + end + local.get 16 + i32.const 16 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 12 + i32.add + i32.const 39 + i32.add + local.set 16 + end + local.get 1 + local.get 2 + i32.add + local.get 3 + i32.add + local.get 4 + i32.add + local.get 5 + i32.add + local.get 6 + i32.add + local.get 7 + i32.add + local.get 8 + i32.add + local.get 9 + i32.add + local.get 10 + i32.add + local.get 11 + i32.add + local.get 12 + i32.add + local.get 13 + i32.add + local.get 14 + i32.add + local.get 15 + i32.add + local.get 16 + i32.add + local.get 17 + i32.add + local.get 18 + i32.add + local.get 19 + i32.add) + (func (;2;) (type 1) (result i32) + i32.const 0 + i32.symbolic + i32.const 1 + i32.symbolic + i32.const 2 + i32.symbolic + i32.const 3 + i32.symbolic + i32.const 4 + i32.symbolic + i32.const 5 + i32.symbolic + i32.const 6 + i32.symbolic + i32.const 7 + i32.symbolic + i32.const 8 + i32.symbolic + i32.const 9 + i32.symbolic + i32.const 10 + i32.const 11 + i32.const 12 + i32.const 13 + i32.const 14 + i32.const 15 + i32.const 16 + i32.const 17 + i32.const 18 + i32.const 19 + call 3) + (func (;3;) (type 0) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) + local.get 0 + i32.const 0 + i32.gt_s + if ;; label = @1 + local.get 7 + local.get 13 + i32.add + i32.const 13 + i32.add + local.set 0 + end + local.get 1 + i32.const 1 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 7 + i32.add + i32.const 35 + i32.add + local.set 1 + end + local.get 2 + i32.const 2 + i32.gt_s + if ;; label = @1 + local.get 0 + local.get 4 + i32.add + i32.const 69 + i32.add + local.set 2 + end + local.get 3 + i32.const 3 + i32.gt_s + if ;; label = @1 + local.get 13 + local.get 14 + i32.add + i32.const 91 + i32.add + local.set 3 + end + local.get 4 + i32.const 4 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 10 + i32.add + i32.const 47 + i32.add + local.set 4 + end + local.get 5 + i32.const 5 + i32.gt_s + if ;; label = @1 + local.get 15 + local.get 6 + i32.add + i32.const 74 + i32.add + local.set 5 + end + local.get 6 + i32.const 6 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 8 + i32.add + i32.const 15 + i32.add + local.set 6 + end + local.get 6 + i32.const 6 + i32.gt_s + if ;; label = @1 + local.get 19 + local.get 8 + i32.add + i32.const 15 + i32.add + local.set 6 + end + local.get 7 + i32.const 7 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 9 + i32.add + i32.const 34 + i32.add + local.set 7 + end + local.get 8 + i32.const 8 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 12 + i32.add + i32.const 57 + i32.add + local.set 8 + end + local.get 9 + i32.const 9 + i32.gt_s + if ;; label = @1 + local.get 10 + local.get 11 + i32.add + i32.const 3 + i32.add + local.set 9 + end + local.get 10 + i32.const 10 + i32.gt_s + if ;; label = @1 + local.get 6 + local.get 6 + i32.add + i32.const 21 + i32.add + local.set 10 + end + local.get 1 + local.get 2 + i32.add + local.get 3 + i32.add + local.get 4 + i32.add + local.get 5 + i32.add + local.get 6 + i32.add + local.get 7 + i32.add + local.get 8 + i32.add + local.get 9 + i32.add + local.get 10 + i32.add + local.get 11 + i32.add + local.get 12 + i32.add + local.get 13 + i32.add + local.get 14 + i32.add + local.get 15 + i32.add + local.get 16 + i32.add + local.get 17 + i32.add + local.get 18 + i32.add + local.get 19 + i32.add + ) + (export "f" (func 1)) + (export "main" (func 2)) + (start 2)) + diff --git a/benchmarks/wasm/compare_wasp/small-snapshot.wat b/benchmarks/wasm/compare_wasp/small-snapshot.wat new file mode 100644 index 00000000..991a3d25 --- /dev/null +++ b/benchmarks/wasm/compare_wasp/small-snapshot.wat @@ -0,0 +1,22301 @@ +(module + (type (;0;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32))) + (type (;1;) (func (result i32))) + (import "spectest" "print_i32" (func (;0;) (param i32))) + + (func (;1;) (type 0) (result i32) + i32.const 0 + i32.symbolic + call 2 + if (result i32) + i32.const 42 + else + i32.const 19 + end) + + (func (;2;) (param i32) (result i32) + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + i32.const 3 + drop + local.get 0) + (export "f" (func 2)) + (export "main" (func 1)) + (start 1)) + diff --git a/benchmarks/wasm/global-sym.wat b/benchmarks/wasm/global-sym.wat new file mode 100644 index 00000000..54f55894 --- /dev/null +++ b/benchmarks/wasm/global-sym.wat @@ -0,0 +1,21 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32) (result i32))) + + (func (;0;) (type 2) (param i32) (result i32) + local.get 0 + global.set 0 + global.get 0 + ) + (func (;1;) (type 1) + i32.const 0 + i32.symbolic + ;; TODO Somehow this value is always 0? + call 0 + ) + (start 1) + (memory (;0;) 2) + (export "main" (func 1)) + (global (;0;) (mut i32) (i32.const 42)) +) \ No newline at end of file diff --git a/benchmarks/wasm/load-offset.wat b/benchmarks/wasm/load-offset.wat new file mode 100644 index 00000000..1c42df1b --- /dev/null +++ b/benchmarks/wasm/load-offset.wat @@ -0,0 +1,19 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (func (;0;) (type 0) (result i32) + i32.const 0 + i32.const 256 + i32.store + i32.const 0 + i32.load offset=1 + ) + (func (;1;) (type 1) + call 0 + ;; should be 1 + ;; drop + ) + (start 1) + (memory (;0;) 2) + (export "main" (func 1)) +) \ No newline at end of file diff --git a/benchmarks/wasm/load-overflow1.wat b/benchmarks/wasm/load-overflow1.wat new file mode 100644 index 00000000..9f005ea1 --- /dev/null +++ b/benchmarks/wasm/load-overflow1.wat @@ -0,0 +1,19 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (func (;0;) (type 0) (result i32) + i32.const 0 + i32.const 256 + i32.store + i32.const 1 + i32.load + ) + (func (;1;) (type 1) + call 0 + ;; should be 1 + ;; drop + ) + (start 1) + (memory (;0;) 2) + (export "main" (func 1)) +) \ No newline at end of file diff --git a/benchmarks/wasm/load-overflow2.wat b/benchmarks/wasm/load-overflow2.wat new file mode 100644 index 00000000..86c1a574 --- /dev/null +++ b/benchmarks/wasm/load-overflow2.wat @@ -0,0 +1,19 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (func (;0;) (type 0) (result i32) + i32.const 0 + i32.const 65536 + i32.store + i32.const 2 + i32.load + ) + (func (;1;) (type 1) + call 0 + ;; should be 1 + ;; drop + ) + (start 1) + (memory (;0;) 2) + (export "main" (func 1)) +) \ No newline at end of file diff --git a/benchmarks/wasm/load.wat b/benchmarks/wasm/load.wat index 916328aa..6c43d79b 100644 --- a/benchmarks/wasm/load.wat +++ b/benchmarks/wasm/load.wat @@ -10,7 +10,7 @@ ) (func (;1;) (type 1) call 0 - ;; should be 65536 + ;; should be 1 ;; drop ) (start 1) diff --git a/benchmarks/wasm/mem-sym-extract.wat b/benchmarks/wasm/mem-sym-extract.wat new file mode 100644 index 00000000..ca7e70eb --- /dev/null +++ b/benchmarks/wasm/mem-sym-extract.wat @@ -0,0 +1,32 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32) (result i32))) + (type (;3;) (func (param i32))) + (import "console" "assert" (func (type 3))) + (func (;1;) (type 2) (param i32) (result i32) + i32.const 0 + local.get 0 + i32.store + i32.const 0 + i32.load + i32.const 1 + i32.eq + if (result i32) ;; if x == 256 + i32.const 1 ;; return 1 + else + i32.const 0 + call 0 ;; assert false + i32.const 1 ;; to satisfy the type checker, this line will never be reached + end + ) + (func (;2;) (type 1) + i32.const 0 + i32.symbolic ;; call it x + call 1 + ) + (start 2) + (memory (;0;) 2) + (export "main" (func 1)) + (global (;0;) (mut i32) (i32.const 42)) +) \ No newline at end of file diff --git a/benchmarks/wasm/mem-sym.wat b/benchmarks/wasm/mem-sym.wat new file mode 100644 index 00000000..45b9d1c3 --- /dev/null +++ b/benchmarks/wasm/mem-sym.wat @@ -0,0 +1,43 @@ +(module + (type (;0;) (func (result i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32) (result i32))) + (type (;3;) (func (param i32))) + (import "console" "assert" (func (type 3))) + (func (;1;) (type 2) (param i32) (result i32) + i32.const 0 + local.get 0 + i32.store + i32.const 0 + i32.load + i32.const 25 + i32.eq + if (result i32) ;; if x == 25 + i32.const 0 + call 0 ;; assert false + i32.const 1 ;; to satisfy the type checker, this line will never be reached + else + i32.const 1 + i32.load + i32.const 1 + i32.eq + if (result i32) ;; if x >> 8 == 1 + i32.const 0 + call 0 ;; assert false + i32.const 1 ;; to satisfy the type checker, this line will never be reached + else + i32.const 1 + end + i32.const 1 + end + ) + (func (;2;) (type 1) + i32.const 0 + i32.symbolic ;; call it x + call 1 + ) + (start 2) + (memory (;0;) 2) + (export "main" (func 1)) + (global (;0;) (mut i32) (i32.const 42)) +) \ No newline at end of file diff --git a/benchmarks/wasm/staged/brtable_concolic.wat b/benchmarks/wasm/staged/brtable_concolic.wat new file mode 100644 index 00000000..04429e90 --- /dev/null +++ b/benchmarks/wasm/staged/brtable_concolic.wat @@ -0,0 +1,22 @@ +(module $brtable + (global (;0;) (mut i32) (i32.const 1048576)) + (type (;0;) (func (param i32))) + (func (;0;) (type 1) (result i32) + i32.const 2 + (block + (block + (block + i32.const 0 + i32.symbolic + br_table 0 1 2 0 ;; br_table will consume an element from the stack + ) + i32.const 1 + call 1 + br 1 + ) + i32.const 0 + call 1 + ) + ) + (import "console" "assert" (func (type 0))) + (start 0)) diff --git a/benchmarks/wasm/staged/long-trivial-execution.wat b/benchmarks/wasm/staged/long-trivial-execution.wat new file mode 100644 index 00000000..2a23f007 --- /dev/null +++ b/benchmarks/wasm/staged/long-trivial-execution.wat @@ -0,0 +1,54 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (param i32))) + (import "console" "assert" (func (type 1))) + (func (;1;) (type 0) + (local i32 i32) + i32.const 1 + local.set 0 + i32.const 0 + local.set 1 + block + loop + local.get 0 + i32.const 10000 + i32.ge_s + br_if 1 + local.get 1 + i32.const 0 + i32.add + local.set 1 + local.get 0 + i32.const 1 + i32.add + local.set 0 + br 0 + end + end + i32.const 10000 + local.set 0 + i32.const 0 + local.set 1 + block + loop + local.get 0 + i32.eqz + br_if 1 ;; break if counter == 0 + local.get 1 + i32.const 0 + i32.sub ;; acc - 0 (no change) + local.set 1 + local.get 0 + i32.const 1 + i32.sub + local.set 0 ;; counter-- + br 0 ;; repeat loop + end + end + local.get 1 + if + i32.const 0 + call 0 + end + ) + (start 1)) diff --git a/benchmarks/wasm/staged/return_poly.wat b/benchmarks/wasm/staged/return_poly.wat new file mode 100644 index 00000000..1bab5ef0 --- /dev/null +++ b/benchmarks/wasm/staged/return_poly.wat @@ -0,0 +1,19 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (result i32))) + ;; TODO: It seems that our parser or preprocessor has some problems; the result type of the last line doesn't take effect + (func (result i32) + block + i32.const 21 + i32.const 35 + i32.const 42 + return + end + i32.const 100 + ) + (func (type 0) + call 0 + ;; unreachable + ) + (export "$real_main" (func 1)) +) diff --git a/benchmarks/wasm/staged/simple_global.wat b/benchmarks/wasm/staged/simple_global.wat new file mode 100644 index 00000000..4877f42c --- /dev/null +++ b/benchmarks/wasm/staged/simple_global.wat @@ -0,0 +1,22 @@ +(module $simple_global + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (result i32))) + (type (;2;) (func (param i32))) + (func $real_main (type 1) (result i32) + (local i32) + i32.const 0 + i32.symbolic + local.tee 0 + local.get 0 + global.set 0 + if + else + i32.const 0 + call 1 + end) + (import "console" "assert" (func (type 2))) + (memory (;0;) 16) + (global $__stack_pointer (mut i32) (i32.const 1048576)) + (global (;1;) i32 (i32.const 1048576)) + (global (;2;) i32 (i32.const 1048576)) + (export "real_main" (func 0))) diff --git a/headers/wasm.hpp b/headers/wasm.hpp index 21da2ff7..aa93e379 100644 --- a/headers/wasm.hpp +++ b/headers/wasm.hpp @@ -1,6 +1,11 @@ #ifndef WASM_HEADERS #define WASM_HEADERS +#include "wasm/concolic_driver.hpp" #include "wasm/concrete_rt.hpp" +#include "wasm/controls.hpp" +#include "wasm/profile.hpp" +#include "wasm/symbolic_rt.hpp" +#include "wasm/utils.hpp" #endif \ No newline at end of file diff --git a/headers/wasm/concolic_driver.hpp b/headers/wasm/concolic_driver.hpp new file mode 100644 index 00000000..80ff38d5 --- /dev/null +++ b/headers/wasm/concolic_driver.hpp @@ -0,0 +1,153 @@ +#ifndef CONCOLIC_DRIVER_HPP +#define CONCOLIC_DRIVER_HPP + +#include "concrete_rt.hpp" +#include "config.hpp" +#include "profile.hpp" +#include "smt_solver.hpp" +#include "symbolic_rt.hpp" +#include "utils.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +class ConcolicDriver { + friend class ManagedConcolicCleanup; + +public: + ConcolicDriver(std::function entrypoint, + std::optional tree_file, int branchCount) + : entrypoint(entrypoint), tree_file(tree_file) { + ExploreTree.true_branch_cov_map.assign(branchCount, false); + ExploreTree.false_branch_cov_map.assign(branchCount, false); + } + void run(); + +private: + void main_exploration_loop(); + Solver solver; + std::function entrypoint; + std::optional tree_file; + std::vector work_list; +}; + +class ManagedConcolicCleanup { + const ConcolicDriver &driver; + +public: + ManagedConcolicCleanup(const ConcolicDriver &driver) : driver(driver) {} + ~ManagedConcolicCleanup() { + // put any cleanup code that needs to be done after each execution here + + // Dump the explore tree if needed + if (driver.tree_file.has_value()) + ExploreTree.dump_graphviz(driver.tree_file.value()); + + // Clear the symbol bookkeeper + SymBookKeeper.clear(); + } +}; + +static std::monostate reset_stacks(); + +inline void ConcolicDriver::main_exploration_loop() { + + // Register a collector to ExploreTree to add new nodes to work_list + ExploreTree.register_new_node_collector( + [&](NodeBox *new_node) { work_list.push_back(new_node); }); + + std::set visited; + + assert(ExploreTree.get_root()->isUnexplored() && + "Before main loop, root should be unexplored!"); + work_list.push_back(ExploreTree.get_root()); + + while (!work_list.empty()) { + ManagedConcolicCleanup cleanup{*this}; + // Pick an unexplored node from the work list + auto node = work_list.back(); + work_list.pop_back(); + + if (visited.find(node) != visited.end()) { + continue; + } else { + visited.insert(node); + } + + if (!node->isUnexplored()) { + // if it's not unexplored anymore, skip it + continue; + } + + if (INTERACTIVE_MODE) { + std::cout << "Press Enter to continue to the next path..." << std::endl; + std::cin.get(); + } + + auto cond = node->collect_path_conds(); + auto result = solver.solve(cond); + if (!result.has_value()) { + GENSYM_INFO("Found an unreachable path, marking it as unreachable..."); + node->fillUnreachableNode(); + continue; + } + auto new_env = result.value(); + + // update global symbolic environment from SMT solved model + SymEnv.update(std::move(new_env)); + try { + GENSYM_INFO("Now execute the program with symbolic environment: "); + GENSYM_INFO(SymEnv.to_string()); + { node->reach_here(entrypoint); } + + GENSYM_INFO("Execution finished successfully with symbolic environment:"); + GENSYM_INFO(SymEnv.to_string()); + } catch (std::runtime_error &e) { + std::cout << "Caught runtime error: " << e.what() << std::endl; + ExploreTree.fillFailedNode(); + GENSYM_INFO("Caught runtime error with symbolic environment:"); + GENSYM_INFO(SymEnv.to_string()); + switch (EXPLORE_MODE) { + case ExploreMode::EarlyExit: + return; + case ExploreMode::ExitByCoverage: + if (ExploreTree.all_branch_covered()) { + GENSYM_INFO("All branches covered, exiting..."); + return; + } else { + GENSYM_INFO( + "Found a bug, but not all branches covered, continuing..."); + } + std::cout << e.what() << std::endl; + } + } +#if defined(RUN_ONCE) + return; +#endif + } +} + +inline void ConcolicDriver::run() { + main_exploration_loop(); + Profile.print_summary(); +} + +static void start_concolic_execution_with( + std::function entrypoint, int branchCount) { + + const char *env_tree_file = std::getenv("TREE_FILE"); + + auto tree_file = + env_tree_file ? std::make_optional(env_tree_file) : std::nullopt; + + ConcolicDriver driver = ConcolicDriver( + [=]() { entrypoint(std::monostate{}); }, tree_file, branchCount); + driver.run(); +} + +#endif // CONCOLIC_DRIVER_HPP \ No newline at end of file diff --git a/headers/wasm/concrete_rt.hpp b/headers/wasm/concrete_rt.hpp index 34d739f4..ea321f45 100644 --- a/headers/wasm/concrete_rt.hpp +++ b/headers/wasm/concrete_rt.hpp @@ -1,79 +1,85 @@ +#ifndef WASM_CONCRETE_RT_HPP +#define WASM_CONCRETE_RT_HPP + +#include "wasm/profile.hpp" +#include "wasm/utils.hpp" #include #include #include #include #include #include +#include #include #include -void info() { -#ifdef DEBUG - std::cout << std::endl; -#endif -} - -template -void info(const T &first, const Args &...args) { -#ifdef DEBUG - std::cout << first << " "; - info(args...); -#endif -} - struct Num { Num(int64_t value) : value(value) {} Num() : value(0) {} int64_t value; - int32_t toInt() { return static_cast(value); } + int32_t toInt() const { return static_cast(value); } - bool operator==(const Num &other) const { return value == other.value; } + // TODO: support different bit width operations, for now we just assume all + // oprands are i32 + bool operator==(const Num &other) const { return toInt() == other.toInt(); } bool operator!=(const Num &other) const { return !(*this == other); } - Num operator+(const Num &other) const { return Num(value + other.value); } - Num operator-(const Num &other) const { return Num(value - other.value); } - Num operator*(const Num &other) const { return Num(value * other.value); } + Num operator+(const Num &other) const { return Num(toInt() + other.toInt()); } + Num operator-(const Num &other) const { return Num(toInt() - other.toInt()); } + Num operator*(const Num &other) const { return Num(toInt() * other.toInt()); } Num operator/(const Num &other) const { - if (other.value == 0) { + if (other.toInt() == 0) { throw std::runtime_error("Division by zero"); } - return Num(value / other.value); + return Num(toInt() / other.toInt()); + } + Num operator<(const Num &other) const { return Num(toInt() < other.toInt()); } + Num operator<=(const Num &other) const { + return Num(toInt() <= other.toInt()); } - Num operator<(const Num &other) const { return Num(value < other.value); } - Num operator<=(const Num &other) const { return Num(value <= other.value); } - Num operator>(const Num &other) const { return Num(value > other.value); } - Num operator>=(const Num &other) const { return Num(value >= other.value); } - Num operator&(const Num &other) const { return Num(value & other.value); } + Num operator>(const Num &other) const { return Num(toInt() > other.toInt()); } + Num operator>=(const Num &other) const { + return Num(toInt() >= other.toInt()); + } + Num operator&(const Num &other) const { return Num(toInt() & other.toInt()); } }; static Num I32V(int v) { return v; } static Num I64V(int64_t v) { return v; } -using Slice = std::vector; - const int STACK_SIZE = 1024 * 64; class Stack_t { public: - Stack_t() : count(0), stack_ptr(new Num[STACK_SIZE]) {} + Stack_t() : count(0), stack_ptr(new Num[STACK_SIZE]) { + size_t page_size = (size_t)sysconf(_SC_PAGESIZE); + // pre touch the memory to avoid page faults during execution + for (int i = 0; i < STACK_SIZE; i += page_size) { + stack_ptr[i] = Num(0); + } + } std::monostate push(Num &&num) { + Profile.step(StepProfileKind::PUSH); stack_ptr[count] = num; count++; return std::monostate{}; } std::monostate push(Num &num) { + Profile.step(StepProfileKind::PUSH); stack_ptr[count] = num; count++; return std::monostate{}; } Num pop() { + Profile.step(StepProfileKind::POP); #ifdef DEBUG - if (count == 0) { - throw std::runtime_error("Stack underflow"); - } + assert(count > 0 && "Stack underflow"); + printf("[Debug] popping a value %ld from stack, size of concrete stack is: " + "%d\n", + stack_ptr[count - 1].value, count); #endif Num num = stack_ptr[count - 1]; count--; @@ -81,6 +87,7 @@ class Stack_t { } Num peek() { + Profile.step(StepProfileKind::PEEK); #ifdef DEBUG if (count == 0) { throw std::runtime_error("Stack underflow"); @@ -92,6 +99,7 @@ class Stack_t { int32_t size() { return count; } void shift(int32_t offset, int32_t size) { + Profile.step(StepProfileKind::SHIFT); #ifdef DEBUG if (offset < 0) { throw std::out_of_range("Invalid offset: " + std::to_string(offset)); @@ -99,9 +107,13 @@ class Stack_t { if (size < 0) { throw std::out_of_range("Invalid size: " + std::to_string(size)); } + std::cout << "Shifting stack by offset " << offset << " and size " << size + << std::endl; + std::cout << "Current stack size: " << count << std::endl; #endif // shift last `size` of numbers forward of `offset` for (int32_t i = count - size; i < count; ++i) { + assert(i - offset >= 0); stack_ptr[i - offset] = stack_ptr[i]; } count -= offset; @@ -115,7 +127,20 @@ class Stack_t { } void initialize() { - // do nothing for now + // todo: remove this method + reset(); + } + + void reset() { count = 0; } + + void resize(int32_t new_size) { + assert(new_size >= 0); + count = new_size; + } + + void set_from_front(int32_t index, const Num &num) { + assert(index >= 0 && index < count); + stack_ptr[index] = num; } private: @@ -128,7 +153,13 @@ const int FRAME_SIZE = 1024; class Frames_t { public: - Frames_t() : count(0), stack_ptr(new Num[FRAME_SIZE]) {} + Frames_t() : count(0), stack_ptr(new Num[FRAME_SIZE]) { + size_t page_size = (size_t)sysconf(_SC_PAGESIZE); + // pre touch the memory to avoid page faults during execution + for (int i = 0; i < FRAME_SIZE; i += page_size) { + stack_ptr[i] = Num(0); + } + } std::monostate popFrame(std::int32_t size) { assert(size >= 0); @@ -137,23 +168,42 @@ class Frames_t { } Num get(std::int32_t index) { + Profile.step(StepProfileKind::GET); auto ret = stack_ptr[count - 1 - index]; return ret; } - void set(std::int32_t index, Num num) { stack_ptr[count - 1 - index] = num; } + void set(std::int32_t index, Num num) { + Profile.step(StepProfileKind::SET); + stack_ptr[count - 1 - index] = num; + } void pushFrame(std::int32_t size) { assert(size >= 0); count += size; } + void reset() { count = 0; } + + size_t size() const { return count; } + + void set_from_front(int32_t index, const Num &num) { + assert(index >= 0 && index < count && "Index out of bounds"); + stack_ptr[index] = num; + } + + void resize(int32_t new_size) { + assert(new_size >= 0); + count = new_size; + } + private: int32_t count; Num *stack_ptr; }; static Frames_t Frames; +static Frames_t Globals; static void initRand() { // for now, just do nothing @@ -164,32 +214,77 @@ static std::monostate unreachable() { throw std::runtime_error("Unreachable code reached"); } +static const int PRE_ALLOC_PAGES = 20; static int32_t pagesize = 65536; static int32_t page_count = 0; struct Memory_t { + // TODO: We assign a SymVal to each byte in memory std::vector memory; - Memory_t(int32_t init_page_count) : memory(init_page_count * pagesize) {} + int init_page_count; + int page_count; + int allocated_pages; + + Memory_t(int32_t init_page_count) + : memory(PRE_ALLOC_PAGES * pagesize), init_page_count(init_page_count), + page_count(init_page_count), allocated_pages(PRE_ALLOC_PAGES) {} int32_t loadInt(int32_t base, int32_t offset) { - return *reinterpret_cast(static_cast(memory.data()) + - base + offset); +#ifdef DEBUG + std::cout << "[Debug] loading int from memory at address: " + << (base + offset) << std::endl; +#endif + // just load a 4-byte integer from memory of the vector + int32_t addr = base + offset; + if (!(addr + 3 < memory.size())) { + throw std::runtime_error("Invalid memory access " + std::to_string(addr)); + } + int32_t result = 0; + // Little-endian: lowest byte at lowest address + for (int i = 0; i < 4; ++i) { + result |= static_cast(memory[addr + i]) << (8 * i); + } + return result; } std::monostate storeInt(int32_t base, int32_t offset, int32_t value) { - *reinterpret_cast(static_cast(memory.data()) + base + - offset) = value; + int32_t addr = base + offset; +#ifdef DEBUG + std::cout << "[Debug] storing int " << value << " to memory at address " + << addr << std::endl; +#endif + // Ensure we don't write out of bounds + if (!(addr + 3 < memory.size())) { + throw std::runtime_error("Invalid memory access " + std::to_string(addr)); + } + for (int i = 0; i < 4; ++i) { + memory[addr + i] = static_cast((value >> (8 * i)) & 0xFF); + // Optionally, update memory[addr + i].second (SymVal) if needed + } + return std::monostate{}; + } + + std::monostate store_byte(int32_t addr, uint8_t value) { + assert(addr < memory.size()); + memory[addr] = value; return std::monostate{}; } // grow memory by delta bytes when bytes > 0. return -1 if failed, return old // size when success int32_t grow(int32_t delta) { + Profile.step(StepProfileKind::MEM_GROW); if (delta <= 0) { - return memory.size(); + return page_count * pagesize; + } + + if (page_count + delta < allocated_pages) { + page_count += delta; + return page_count * pagesize; } try { + assert(false && "Use pre-allocated memory, should not reach here"); memory.resize(memory.size() + delta * pagesize); auto old_page_count = page_count; page_count += delta; @@ -198,6 +293,16 @@ struct Memory_t { return -1; } } + + void reset() { + page_count = init_page_count; + allocated_pages = PRE_ALLOC_PAGES; + for (int i = 0; i < memory.size() && i < page_count * pagesize; ++i) { + memory[i] = 0; + } + } }; -static Memory_t Memory(1); // 1 page memory \ No newline at end of file +static Memory_t Memory(1); // 1 page memory + +#endif // WASM_CONCRETE_RT_HPP \ No newline at end of file diff --git a/headers/wasm/config.hpp b/headers/wasm/config.hpp new file mode 100644 index 00000000..037c6263 --- /dev/null +++ b/headers/wasm/config.hpp @@ -0,0 +1,64 @@ +#ifndef CONFIG_HPP +#define CONFIG_HPP + +// This file contains configuration settings for the concolic execution + +// If ENABLE_PROFILE_STEP defined, the compiled program will collect and print +// profiling how much steps of each data structure's operations are executed +#ifdef ENABLE_PROFILE_STEP +const bool PROFILE_STEP = true; +#else +const bool PROFILE_STEP = false; +#endif + +// If ENABLE_PROFILE_TIME defined, the compiled program will collect and print +// the profile of time spent in main loop and constraint solving +#ifdef ENABLE_PROFILE_TIME +const bool PROFILE_TIME = true; +#else +const bool PROFILE_TIME = false; +#endif + +// This variable define when concolic execution will stop +enum class ExploreMode { + EarlyExit, // Stop at the first error encountered + + ExitByCoverage // Exit when all syntactic branches are covered +}; + +#ifdef EARLY_EXIT +static const ExploreMode EXPLORE_MODE = ExploreMode::EarlyExit; +#elif defined(BY_COVERAGE) +static const ExploreMode EXPLORE_MODE = ExploreMode::ExitByCoverage; +#else +static const ExploreMode EXPLORE_MODE = ExploreMode::EarlyExit; +#endif + +// This variable decides whether we enable the snapshot reuse optimization +#ifdef NO_REUSE +static const bool REUSE_SNAPSHOT = false; +#else +static const bool REUSE_SNAPSHOT = true; +#endif + +// If we use immutable data structures for symbolic states to reduce the cost of +// copying. +#ifdef USE_IMM +static const bool IMMUTABLE_SYMS = true; +#else +static const bool IMMUTABLE_SYMS = false; +#endif + +#ifdef INTERACTIVE +static const bool INTERACTIVE_MODE = true; +#else +static const bool INTERACTIVE_MODE = false; +#endif + +#ifdef USE_COST_MODEL +static const bool ENABLE_COST_MODEL = true; +#else +static const bool ENABLE_COST_MODEL = false; +#endif + +#endif // CONFIG_HPP \ No newline at end of file diff --git a/headers/wasm/controls.hpp b/headers/wasm/controls.hpp new file mode 100644 index 00000000..97ba0130 --- /dev/null +++ b/headers/wasm/controls.hpp @@ -0,0 +1,19 @@ + +#ifndef WASM_CONTROLS_HPP +#define WASM_CONTROLS_HPP + +#include + +#include + +using MCont_t = std::function; +using Cont_t = std::function; + +struct Control { + Cont_t cont; + MCont_t mcont; + + Control(Cont_t cont, MCont_t mcont) : cont(cont), mcont(mcont) {} +}; + +#endif // WASM_CONTROLS_HPP \ No newline at end of file diff --git a/headers/wasm/heap_mem_bookkeeper.hpp b/headers/wasm/heap_mem_bookkeeper.hpp new file mode 100644 index 00000000..c4cc7313 --- /dev/null +++ b/headers/wasm/heap_mem_bookkeeper.hpp @@ -0,0 +1,24 @@ +#ifndef HEAP_MEM_BOOKKEEPER_HPP +#define HEAP_MEM_BOOKKEEPER_HPP + +#include +#include + +// Todo: remove this later, this is just a workaround to make sure that the +// SymVals' memory will not be freed during the main execution. +// We can leave the SymVal's memory unmanaged if reference counting is not +// performant +template struct MemBookKeeper { + std::set> allocated; + + template + std::shared_ptr allocate(Args &&...args) { + auto ptr = std::make_shared(std::forward(args)...); + // allocated.insert(ptr); + return ptr; + } + + void clear() { allocated.clear(); } +}; + +#endif // HEAP_MEM_BOOKKEEPER_HPP \ No newline at end of file diff --git a/headers/wasm/profile.hpp b/headers/wasm/profile.hpp new file mode 100644 index 00000000..9814b5eb --- /dev/null +++ b/headers/wasm/profile.hpp @@ -0,0 +1,174 @@ +#ifndef PROFILE_HPP +#define PROFILE_HPP + +#include "config.hpp" +#include "utils.hpp" +#include +#include +#include +#include + +enum class StepProfileKind { + PUSH, + POP, + PEEK, + SHIFT, + SET, + GET, + BINARY, + TREE_FILL, + CURSOR_MOVE, + MEM_GROW, + SNAPSHOT_CREATE, + SYM_EVAL, + OperationCount // keep this as the last element, this is used to get the + // number of kinds of operations +}; + +enum class TimeProfileKind { + INSTR, + SOLVER, + RESUME_SNAPSHOT, + COUNT_SYM_SIZE, + TimeOperationCount // keep this as the last element, this is used to get the + // number of kinds of operations +}; + +class Profile_t { +public: + Profile_t() : step_count(0) {} + std::monostate step() { + if (PROFILE_STEP) + step_count++; + return std::monostate(); + } + std::monostate step(StepProfileKind op) { + if (PROFILE_STEP) + op_count[static_cast(op)]++; + return std::monostate(); + } + void print_summary() { + if (PROFILE_STEP) { + std::cout << "Profile Summary:" << std::endl; + std::cout << "Total PUSH operations: " + << op_count[static_cast(StepProfileKind::PUSH)] + << std::endl; + std::cout << "Total POP operations: " + << op_count[static_cast(StepProfileKind::POP)] + << std::endl; + std::cout << "Total PEEK operations: " + << op_count[static_cast(StepProfileKind::PEEK)] + << std::endl; + std::cout << "Total SHIFT operations: " + << op_count[static_cast(StepProfileKind::SHIFT)] + << std::endl; + std::cout << "Total SET operations: " + << op_count[static_cast(StepProfileKind::SET)] + << std::endl; + std::cout << "Total GET operations: " + << op_count[static_cast(StepProfileKind::GET)] + << std::endl; + std::cout << "Total BINARY operations: " + << op_count[static_cast(StepProfileKind::BINARY)] + << std::endl; + std::cout + << "Total TREE_FILL operations: " + << op_count[static_cast(StepProfileKind::TREE_FILL)] + << std::endl; + std::cout + << "Total CURSOR_MOVE operations: " + << op_count[static_cast(StepProfileKind::CURSOR_MOVE)] + << std::endl; + std::cout << "Total other instructions executed: " << step_count + << std::endl; + std::cout << "Total MEM_GROW operations: " + << op_count[static_cast(StepProfileKind::MEM_GROW)] + << std::endl; + std::cout << "Total SNAPSHOT_CREATE operations: " + << op_count[static_cast( + StepProfileKind::SNAPSHOT_CREATE)] + << std::endl; + std::cout << "Total SYM_EVAL operations: " + << op_count[static_cast(StepProfileKind::SYM_EVAL)] + << std::endl; + std::cout << "Total time for instruction execution (s): " + << std::setprecision(15) << execution_time << std::endl; + } + if (PROFILE_TIME) { + std::cout << "Time Profile Summary:" << std::endl; + std::cout << "Total time in instruction execution (s): " + << std::setprecision(15) + << time_count[static_cast(TimeProfileKind::INSTR)] + << std::endl; + std::cout << "Total time in solver (s): " << std::setprecision(15) + << time_count[static_cast(TimeProfileKind::SOLVER)] + << std::endl; + std::cout << "Total time in resuming from snapshot (s): " + << std::setprecision(15) + << time_count[static_cast( + TimeProfileKind::RESUME_SNAPSHOT)] + << std::endl; + std::cout << "Total time in counting symbolic size (s): " + << std::setprecision(15) + << time_count[static_cast( + TimeProfileKind::COUNT_SYM_SIZE)] + << std::endl; + } + } + + // record the time spent in main instruction execution, in seconds + void add_instruction_time(TimeProfileKind kind, double time) { + time_count[static_cast(kind)] += time; + } + +private: + int step_count; + std::array(StepProfileKind::OperationCount)> + op_count; + std::array(TimeProfileKind::TimeOperationCount)> + time_count; + double execution_time = 0.0; +}; + +static Profile_t Profile; + +class ManagedTimer { +public: + ManagedTimer() = delete; + ManagedTimer(TimeProfileKind kind) : kind(kind) { + start = std::chrono::high_resolution_clock::now(); + } + ~ManagedTimer() { + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = end - start; + Profile.add_instruction_time(kind, elapsed.count()); + } + +private: + TimeProfileKind kind; + std::chrono::high_resolution_clock::time_point start; +}; + +struct CostManager_t { + int instr_cost; + + CostManager_t() : instr_cost(0) {} + + std::monostate add_instr_cost(int n) { + instr_cost += n; + return {}; + } + + int dump_instr_cost() { + auto cost = instr_cost; + instr_cost = 0; + return normalize_cost(cost); + } + + int normalize_cost(int cost) { return 1 * cost; } +}; + +static CostManager_t CostManager; + +#endif // PROFILE_HPP \ No newline at end of file diff --git a/headers/wasm/smt_solver.hpp b/headers/wasm/smt_solver.hpp new file mode 100644 index 00000000..5df683f7 --- /dev/null +++ b/headers/wasm/smt_solver.hpp @@ -0,0 +1,153 @@ +#ifndef SMT_SOLVER_HPP +#define SMT_SOLVER_HPP + +#include "concrete_rt.hpp" +#include "symbolic_rt.hpp" +#include "utils.hpp" +#include "wasm/profile.hpp" +#include "z3++.h" +#include +#include +#include +#include +#include + +class Solver { +public: + Solver() {} + std::optional solve(const std::vector &conditions) { + z3::solver z3_solver(z3_ctx); + z3::check_result solver_result; + { + // make an conjunction of all conditions + auto conjunction = to_z3_conjunction(conditions); + // call z3 to solve the condition + auto timer = ManagedTimer(TimeProfileKind::SOLVER); + z3_solver.add(conjunction); // NOTE: half of the solver time is spent in solver.add + solver_result = z3_solver.check(); + } + switch (solver_result) { + case z3::unsat: + return std::nullopt; // No solution found + case z3::sat: { + z3::model model = z3_solver.get_model(); + NumMap result; + // Reference: + // https://github.com/Z3Prover/z3/blob/master/examples/c%2B%2B/example.cpp#L59 + GENSYM_INFO("Solved Z3 model"); + GENSYM_INFO(model); + for (unsigned i = 0; i < model.size(); ++i) { + z3::func_decl var = model[i]; + z3::expr value = model.get_const_interp(var); + std::string name = var.name().str(); + if (starts_with(name, "s_")) { + int id = std::stoi(name.substr(2)); + result[id] = Num(value.get_numeral_int64()); + } else { + GENSYM_INFO("Find a variable that is not created by GenSym: " + name); + } + } + return result; + } + case z3::unknown: + throw std::runtime_error("Z3 solver returned unknown status"); + } + return std::nullopt; // Should not reach here + } + +private: + z3::expr to_z3_conjunction(const std::vector &conditions) { + z3::expr conjunction = z3_ctx.bool_val(true); + for (const auto &cond : conditions) { + auto z3_cond = build_z3_expr(cond); + conjunction = conjunction && z3_cond != z3_ctx.bv_val(0, 32); + } +#ifdef DEBUG + std::cout << "Symbolic conditions size: " << conditions.size() << std::endl; + std::cout << "Solving conditions: " << conjunction << std::endl; +#endif + return conjunction; + } + + z3::context z3_ctx; + z3::expr build_z3_expr(const SymVal &sym_val); +}; + +inline z3::expr Solver::build_z3_expr(const SymVal &sym_val) { + if (auto sym = std::dynamic_pointer_cast(sym_val.symptr)) { + return z3_ctx.bv_const(("s_" + std::to_string(sym->get_id())).c_str(), 32); + } else if (auto concrete = + std::dynamic_pointer_cast(sym_val.symptr)) { + return z3_ctx.bv_val(concrete->value.value, 32); + } else if (auto smallbv = + std::dynamic_pointer_cast(sym_val.symptr)) { + return z3_ctx.bv_val(smallbv->get_value(), smallbv->get_size()); + } else if (auto binary = + std::dynamic_pointer_cast(sym_val.symptr)) { + auto bit_width = 32; + z3::expr zero_bv = + z3_ctx.bv_val(0, bit_width); // Represents 0 as a 32-bit bitvector + z3::expr one_bv = + z3_ctx.bv_val(1, bit_width); // Represents 1 as a 32-bit bitvector + + z3::expr left = build_z3_expr(binary->lhs); + z3::expr right = build_z3_expr(binary->rhs); + // TODO: make sure the semantics of these operations are aligned with wasm + switch (binary->op) { + case EQ: { + auto temp_bool = left == right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case NEQ: { + auto temp_bool = left != right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case LT: { + auto temp_bool = left < right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case LEQ: { + auto temp_bool = left <= right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case GT: { + auto temp_bool = left > right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case GEQ: { + auto temp_bool = left >= right; + return z3::ite(temp_bool, one_bv, zero_bv); + } + case ADD: { + return left + right; + } + case SUB: { + return left - right; + } + case MUL: { + return left * right; + } + case DIV: { + return left / right; + } + case B_AND: { + return left & right; + } + case CONCAT: { + return z3::concat(left, right); + } + default: + throw std::runtime_error("Operation not supported: " + + std::to_string(binary->op)); + } + } else if (auto extract = dynamic_cast(sym_val.symptr.get())) { + assert(extract); + int high = extract->high * 8 - 1; + int low = extract->low * 8 - 8; + auto s = build_z3_expr(extract->value); + auto res = s.extract(high, low); + return res; + } + throw std::runtime_error("Unsupported symbolic value type"); +} +#endif // SMT_SOLVER_HPP \ No newline at end of file diff --git a/headers/wasm/symbolic_rt.hpp b/headers/wasm/symbolic_rt.hpp new file mode 100644 index 00000000..6edef6ee --- /dev/null +++ b/headers/wasm/symbolic_rt.hpp @@ -0,0 +1,1250 @@ +#ifndef WASM_SYMBOLIC_RT_HPP +#define WASM_SYMBOLIC_RT_HPP + +#include "concrete_rt.hpp" +#include "config.hpp" +#include "controls.hpp" +#include "heap_mem_bookkeeper.hpp" +#include "immer/map.hpp" +#include "immer/map_transient.hpp" +#include "immer/vector_transient.hpp" +#include "profile.hpp" +#include "utils.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Symbolic { +public: + Symbolic() {} + virtual ~Symbolic() = default; // Make Symbolic polymorphic + virtual int size() = 0; +}; + +static int max_id = 0; + +class Symbol : public Symbolic { +public: + // TODO: add type information to determine the size of bitvector + // for now we just assume that only i32 will be used + Symbol(int id) : id(id) { max_id = std::max(max_id, id); } + int get_id() const { return id; } + int size() override { return 1; } + +private: + int id; +}; + +class SymConcrete : public Symbolic { +public: + Num value; + SymConcrete(Num num) : value(num) {} + int size() override { return 1; } +}; + +class SmallBV : public Symbolic { +public: + SmallBV(int width, int64_t value) : width(width), value(value) {} + int get_size() const { return width; } + int64_t get_value() const { return value; } + int size() override { return 1; } + +private: + int width; // in bits + int64_t value; +}; +struct SymBinary; + +enum Operation { + ADD, // Addition + SUB, // Subtraction + MUL, // Multiplication + DIV, // Division + EQ, // Equal + NEQ, // Not equal + LT, // Less than + LEQ, // Less than or equal + GT, // Greater than + GEQ, // Greater than or equal + B_AND, // Bitwise AND + CONCAT, // Byte-level concatenation +}; +static MemBookKeeper SymBookKeeper; + +static std::shared_ptr ZERO = + SymBookKeeper.allocate(I32V(0)); +static std::shared_ptr ZeroByte = + SymBookKeeper.allocate(8, 0); + +struct SymVal { + std::shared_ptr symptr; + + SymVal() : symptr(ZERO) {} + SymVal(std::shared_ptr symptr) : symptr(symptr) {} + + // data structure operations + SymVal makeSymbolic() const; + + // bitvector arithmetic operations + SymVal is_zero() const; + SymVal add(const SymVal &other) const; + SymVal minus(const SymVal &other) const; + SymVal mul(const SymVal &other) const; + SymVal div(const SymVal &other) const; + SymVal eq(const SymVal &other) const; + SymVal neq(const SymVal &other) const; + SymVal lt(const SymVal &other) const; + SymVal le(const SymVal &other) const; + SymVal gt(const SymVal &other) const; + SymVal ge(const SymVal &other) const; + SymVal negate() const; + SymVal bitwise_and(const SymVal &other) const; + SymVal concat(const SymVal &other) const; + SymVal extract(int high, int low) const; + // TODO: add bitwise operations, and use the underlying bitvector theory + + bool is_concrete() const; + int size() const { return symptr->size(); } + +private: + static SymVal make_binary(Operation op, const SymVal &lhs, const SymVal &rhs); +}; + +static SymVal make_symbolic(int index) { + return SymVal(SymBookKeeper.allocate(index)); +} + +static std::unordered_map concrete_pool; + +inline SymVal Concrete(Num num) { + if (concrete_pool.find(num.toInt()) != concrete_pool.end()) { + return concrete_pool[num.toInt()]; + } + + auto new_val = SymVal(SymBookKeeper.allocate(num)); + concrete_pool[num.toInt()] = new_val; + return new_val; +} + +// Extract is different from other operations, it only has one symbolic operand, +// the other two operands are constants +// Extract from value, both high and low are inclusive byte indexes +struct SymExtract : Symbolic { + SymVal value; + int high; + int low; + + SymExtract(SymVal value, int high, int low) + : value(value), high(high), low(low) {} + int size() override { return 1 + value.size(); } +}; + +struct SymBinary : Symbolic { + Operation op; + SymVal lhs; + SymVal rhs; + + SymBinary(Operation op, SymVal lhs, SymVal rhs) + : op(op), lhs(lhs), rhs(rhs) {} + int size() override { return 1 + lhs.size() + rhs.size(); } +}; + +inline SymVal SymVal::add(const SymVal &other) const { + return make_binary(ADD, *this, other); +} + +inline SymVal SymVal::minus(const SymVal &other) const { + return make_binary(SUB, *this, other); +} + +inline SymVal SymVal::mul(const SymVal &other) const { + return make_binary(MUL, *this, other); +} + +inline SymVal SymVal::div(const SymVal &other) const { + return make_binary(DIV, *this, other); +} + +inline SymVal SymVal::eq(const SymVal &other) const { + return make_binary(EQ, *this, other); +} + +inline SymVal SymVal::neq(const SymVal &other) const { + return make_binary(NEQ, *this, other); +} + +inline SymVal SymVal::lt(const SymVal &other) const { + return make_binary(LT, *this, other); +} + +inline SymVal SymVal::le(const SymVal &other) const { + return make_binary(LEQ, *this, other); +} + +inline SymVal SymVal::gt(const SymVal &other) const { + return make_binary(GT, *this, other); +} + +inline SymVal SymVal::ge(const SymVal &other) const { + return make_binary(GEQ, *this, other); +} + +inline SymVal SymVal::is_zero() const { + return make_binary(EQ, *this, Concrete(I32V(0))); +} + +inline SymVal SymVal::negate() const { + return make_binary(EQ, *this, Concrete(I32V(0))); +} + +inline SymVal SymVal::concat(const SymVal &other) const { + return make_binary(CONCAT, *this, other); +} + +inline SymVal SymVal::extract(int high, int low) const { + assert(high >= low && "Invalid extract range"); + return SymVal(SymBookKeeper.allocate(*this, high, low)); +} + +inline SymVal SymVal::bitwise_and(const SymVal &other) const { + return make_binary(B_AND, *this, other); +} +inline SymVal SymVal::make_binary(Operation op, const SymVal &lhs, + const SymVal &rhs) { + assert(lhs.symptr != nullptr && rhs.symptr != nullptr); + return SymVal(SymBookKeeper.allocate(op, lhs, rhs)); +} +inline SymVal SymVal::makeSymbolic() const { + auto concrete = dynamic_cast(symptr.get()); + if (concrete) { + // If the symbolic value is a concrete value, use it to create a symbol + return SymVal(SymBookKeeper.allocate(concrete->value.toInt())); + } else { + throw std::runtime_error( + "Cannot make symbolic a non-concrete symbolic value"); + } +} + +inline bool SymVal::is_concrete() const { + return dynamic_cast(symptr.get()) != nullptr; +} + +class Snapshot_t; + +class SymStack_t { +public: + void push(SymVal val) { + // Push a symbolic value to the stack + stack.push_back(val); + } + + SymVal pop() { + // Pop a symbolic value from the stack + +#ifdef DEBUG + printf("[Debug] poping from stack, size of symbolic stack is: %zu\n", + stack.size()); +#endif +#ifdef USE_IMM + auto ret = *(stack.end() - 1); + stack.take(stack.size() - 1); + return ret; +#else + auto ret = stack.back(); + stack.pop_back(); + return ret; +#endif + } + + SymVal peek() { return *(stack.end() - 1); } + + std::monostate shift(int32_t offset, int32_t size) { + auto n = stack.size(); + for (size_t i = n - size; i < n; ++i) { + assert(i - offset >= 0); +#ifdef USE_IMM + stack.set(i - offset, stack[i]); +#else + stack[i - offset] = stack[i]; +#endif + } +#ifdef USE_IMM + stack.take(n - offset); +#else + stack.resize(n - offset); +#endif + return std::monostate(); + } + + void reset() { +// Reset the symbolic stack +#ifdef USE_IMM + stack = immer::vector_transient(); +#else + stack.clear(); +#endif + } + + size_t size() const { return stack.size(); } + + SymVal operator[](size_t index) const { return stack[index]; } + + int cost_of_copy() const { + int cost = 0; + for (size_t i = 0; i < stack.size(); ++i) { + cost += stack[i].size(); + } + return cost; + } + +private: +#ifdef USE_IMM + immer::vector_transient stack; +#else + std::vector stack; +#endif +}; + +static SymStack_t SymStack; + +class SymFrames_t { + +public: + void pushFrame(int size) { + // Push a new frame with the given size +#ifdef USE_IMM + for (int i = 0; i < size; ++i) { + stack.push_back(SymVal()); + } +#else + stack.resize(size + stack.size()); +#endif + } + std::monostate popFrame(int size) { + // Pop the frame of the given size + +#ifdef USE_IMM + stack.take(stack.size() - size); +#else + stack.resize(stack.size() - size); +#endif + return std::monostate(); + } + + SymVal get(int index) { + // Get the symbolic value at the given frame index + auto res = stack[stack.size() - 1 - index]; + return res; + } + + void set(int index, SymVal val) { + // Set the symbolic value at the given index + assert(val.symptr != nullptr); +#ifdef USE_IMM + stack.set(stack.size() - 1 - index, val); +#else + stack[stack.size() - 1 - index] = val; +#endif + } + + void reset() { + // Reset the symbolic frames + +#ifdef USE_IMM + stack = immer::vector_transient(); +#else + stack.clear(); +#endif + } + + size_t size() const { return stack.size(); } + + SymVal operator[](size_t index) const { return stack[index]; } + + int cost_of_copy() const { + int cost = 0; + for (size_t i = 0; i < stack.size(); ++i) { + cost += stack[i].size(); + } + return cost; + } + +private: +#ifdef USE_IMM + immer::vector_transient stack; +#else + std::vector stack; +#endif +}; + +struct NodeBox; +struct SymEnv_t; + +class SymMemory_t { +public: +#ifdef USE_IMM + immer::map_transient memory; +#else + std::unordered_map memory; +#endif + + SymVal loadSymByte(int32_t addr) { +// if the address is not in the memory, it must be a zero-initialized memory +#ifdef USE_IMM + auto it = memory.find(addr); + if (it != nullptr) { + return *it; + } else { + auto s = SymVal(ZeroByte); + return s; + } +#else + auto it = memory.find(addr); + SymVal s = (it != memory.end()) ? it->second : SymVal(ZeroByte); + return s; +#endif + } + + SymVal loadSym(int32_t base, int32_t offset) { + // calculate the real address + +#ifdef USE_IMM + int32_t addr = base + offset; + auto it = memory.find(addr); + SymVal s0 = it ? *it : SymVal(ZeroByte); + it = memory.find(addr + 1); + SymVal s1 = it ? *it : SymVal(ZeroByte); + it = memory.find(addr + 2); + SymVal s2 = it ? *it : SymVal(ZeroByte); + it = memory.find(addr + 3); + SymVal s3 = it ? *it : SymVal(ZeroByte); + + return s3.concat(s2).concat(s1).concat(s0); +#else + int32_t addr = base + offset; + auto it = memory.find(addr); + SymVal s0 = (it != memory.end()) ? it->second : SymVal(ZeroByte); + it = memory.find(addr + 1); + SymVal s1 = (it != memory.end()) ? it->second : SymVal(ZeroByte); + it = memory.find(addr + 2); + SymVal s2 = (it != memory.end()) ? it->second : SymVal(ZeroByte); + it = memory.find(addr + 3); + SymVal s3 = (it != memory.end()) ? it->second : SymVal(ZeroByte); + + return s3.concat(s2).concat(s1).concat(s0); +#endif + } + + // when loading a symval, we need to concat 4 symbolic values + // This sounds terribly bad for SMT... + // Load a 4-byte symbolic value from memory + // Store a 4-byte symbolic value to memory + std::monostate storeSym(int32_t base, int32_t offset, SymVal value) { + int32_t addr = base + offset; + // Extract 4 bytes from that symbol + SymVal s0 = value.extract(1, 1); + SymVal s1 = value.extract(2, 2); + SymVal s2 = value.extract(3, 3); + SymVal s3 = value.extract(4, 4); +#ifdef USE_IMM + memory.set(addr, s0); + memory.set(addr + 1, s1); + memory.set(addr + 2, s2); + memory.set(addr + 3, s3); +#else + memory[addr] = s0; + memory[addr + 1] = s1; + memory[addr + 2] = s2; + memory[addr + 3] = s3; +#endif + return std::monostate{}; + } + + std::monostate reset() { +#ifdef USE_IMM + memory = immer::map_transient(); +#else + memory.clear(); +#endif + return std::monostate{}; + } + + int cost_of_copy() const { +#ifdef USE_IMM + // If we use immer, the copy cost should be negligible + return 0; +#else + return memory.size(); +#endif + } +}; + +static SymMemory_t SymMemory; + +// A snapshot of the symbolic state and execution context (control) +class Snapshot_t { +public: + explicit Snapshot_t(Cont_t cont, MCont_t mcont, SymStack_t stack, + SymFrames_t frames, SymMemory_t memory); + explicit Snapshot_t() {} + + SymStack_t get_stack() const { return stack; } + SymFrames_t get_frames() const { return frames; } + SymMemory_t get_memory() const { return memory; } + + std::monostate resume_execution(NodeBox *node) const; + + static int cost_of_snapshot(); + +private: + SymStack_t stack; + SymFrames_t frames; + SymMemory_t memory; + // The continuation at the snapshot point + Cont_t cont; + MCont_t mcont; +}; + +static SymFrames_t SymFrames; +static SymFrames_t SymGlobals; + +static Control makeControl(Cont_t cont, MCont_t mcont) { + return Control(cont, mcont); +} + +static Snapshot_t makeSnapshot(Control control) { + // create a snapshot from the current symbolic states and the control + return Snapshot_t(control.cont, control.mcont, SymStack, SymFrames, + SymMemory); +} + +struct Node; + +struct NodeBox { + explicit NodeBox(NodeBox *parent); + std::unique_ptr node; + NodeBox *parent; + int cost; + int instr_cost; + + bool fillIfElseNode(SymVal cond, int id); + std::monostate fillFinishedNode(); + std::monostate fillFailedNode(); + std::monostate fillUnreachableNode(); + std::monostate fillSnapshotNode(Snapshot_t snapshot); + bool isUnexplored() const; + std::vector collect_path_conds(); + int min_cost_of_reaching_here(); + void reach_here(std::function); +}; + +struct Node { + virtual ~Node(){}; + virtual std::string to_string() = 0; + void to_graphviz(std::ostream &os) { + os << "digraph G {\n"; + os << " rankdir=TB;\n"; + os << " node [shape=box, style=filled, fillcolor=lightblue];\n"; + current_id = 0; + generate_dot(os, -1, ""); + + os << "}\n"; + } + virtual void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) = 0; + +protected: + // Counter for unique node IDs across the entire graph, only for generating + // graphviz purpose + static int current_id; + void graphviz_node(std::ostream &os, const int node_id, + const std::string &label, const std::string &shape, + const std::string &fillcolor) { + os << " node" << node_id << " [label=\"" << label << "\", shape=" << shape + << ", style=filled, fillcolor=" << fillcolor << "];\n"; + } + + void graphviz_edge(std::ostream &os, int from_id, int target_id, + const std::string &edge_label) { + os << " node" << from_id << " -> node" << target_id; + if (!edge_label.empty()) { + os << " [label=\"" << edge_label << "\"]"; + } + os << ";\n"; + } +}; + +// TODO: use this header file in multiple compilation units will cause problems +// during linking +int Node::current_id = 0; + +struct IfElseNode : Node { + SymVal cond; + std::unique_ptr true_branch; + std::unique_ptr false_branch; + int id; + std::optional snapshot; + + IfElseNode(SymVal cond, NodeBox *parent, int id) + : cond(cond), true_branch(std::make_unique(parent)), + false_branch(std::make_unique(parent)), id(id), + snapshot(std::nullopt) {} + + IfElseNode(SymVal cond, NodeBox *parent, int id, Snapshot_t snapshot) + : cond(cond), true_branch(std::make_unique(parent)), + false_branch(std::make_unique(parent)), id(id), + snapshot(snapshot) {} + + std::string to_string() override { + std::string result = "IfElseNode {\n"; + result += " true_branch: "; + if (true_branch) { + result += true_branch->node->to_string(); + } else { + result += "nullptr"; + } + result += "\n"; + + result += " false_branch: "; + if (false_branch) { + result += false_branch->node->to_string(); + } else { + result += "nullptr"; + } + result += "\n"; + result += "}"; + return result; + } + + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id; + current_id += 1; + + graphviz_node(os, current_node_dot_id, "If", "diamond", "lightyellow"); + + // Draw edge from parent if this is not the root node + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + assert(true_branch != nullptr); + assert(true_branch->node != nullptr); + true_branch->node->generate_dot(os, current_node_dot_id, "true"); + assert(false_branch != nullptr); + assert(false_branch->node != nullptr); + false_branch->node->generate_dot(os, current_node_dot_id, "false"); + } +}; + +struct UnExploredNode : Node { + UnExploredNode() {} + std::string to_string() override { return "UnexploredNode"; } + +protected: + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id++; + graphviz_node(os, current_node_dot_id, "Unexplored", "octagon", + "lightgrey"); + + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + } +}; + +struct SnapshotNode : Node { + SnapshotNode(Snapshot_t snapshot) : snapshot(snapshot) {} + std::string to_string() override { return "SnapshotNode"; } + const Snapshot_t &get_snapshot() const { return snapshot; } + Snapshot_t move_out_snapshot() { return std::move(snapshot); } + +protected: + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id++; + graphviz_node(os, current_node_dot_id, "Snapshot", "box", "lightblue"); + + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + } + +private: + Snapshot_t snapshot; +}; + +struct Finished : Node { + Finished() {} + std::string to_string() override { return "FinishedNode"; } + +protected: + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id++; + graphviz_node(os, current_node_dot_id, "Finished", "box", "lightgreen"); + + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + } +}; + +struct Failed : Node { + Failed() {} + std::string to_string() override { return "FailedNode"; } + +protected: + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id++; + graphviz_node(os, current_node_dot_id, "Failed", "box", "red"); + + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + } +}; + +struct Unreachable : Node { + Unreachable() {} + std::string to_string() override { return "UnreachableNode"; } + +protected: + void generate_dot(std::ostream &os, int parent_dot_id, + const std::string &edge_label) override { + int current_node_dot_id = current_id++; + graphviz_node(os, current_node_dot_id, "Unreachable", "box", "orange"); + + if (parent_dot_id != -1) { + graphviz_edge(os, parent_dot_id, current_node_dot_id, edge_label); + } + } +}; + +inline NodeBox::NodeBox(NodeBox *parent) + : node(std::make_unique()), + /* TODO: avoid allocation of unexplored node */ + parent(parent), cost(-1), instr_cost(0) {} + +inline bool NodeBox::fillIfElseNode(SymVal cond, int id) { + // fill the current NodeBox with an ifelse branch node when it's unexplored + if (auto ptr = dynamic_cast(node.get())) { + node = + std::make_unique(cond, this, id, ptr->move_out_snapshot()); + return true; + } else if (dynamic_cast(node.get())) { + node = std::make_unique(cond, this, id); + return true; + } + assert( + dynamic_cast(node.get()) != nullptr && + "Current node is not an Unexplored nor an IfElseNode, cannot fill it!"); + return false; +} + +inline std::monostate NodeBox::fillSnapshotNode(Snapshot_t snapshot) { + if (this->isUnexplored()) { + node = std::make_unique(snapshot); + } + return std::monostate(); +} + +inline std::monostate NodeBox::fillFinishedNode() { + if (this->isUnexplored()) { + node = std::make_unique(); + } else { + assert(dynamic_cast(node.get()) != nullptr); + } + return std::monostate(); +} + +inline std::monostate NodeBox::fillFailedNode() { + if (this->isUnexplored()) { + node = std::make_unique(); + } else { + assert(dynamic_cast(node.get()) != nullptr); + } + return std::monostate(); +} + +inline std::monostate NodeBox::fillUnreachableNode() { + if (this->isUnexplored()) { + node = std::make_unique(); + } else { + assert(dynamic_cast(node.get()) != nullptr); + } + return std::monostate(); +} + +inline bool NodeBox::isUnexplored() const { + assert(node != nullptr); + if (dynamic_cast(node.get()) != nullptr) { + return true; + } + if (dynamic_cast(node.get()) != nullptr) { + return true; + } + return false; +} + +inline std::vector NodeBox::collect_path_conds() { + auto box = this; + auto result = std::vector(); + while (box->parent) { + auto parent = box->parent; + auto if_else_node = dynamic_cast(parent->node.get()); + if (if_else_node) { + if (if_else_node->true_branch.get() == box) { + // If the current box is the true branch, add the condition + result.push_back(if_else_node->cond); + } else if (if_else_node->false_branch.get() == box) { + // If the current box is the false branch, add the negated condition + result.push_back(if_else_node->cond.negate()); + } else { + throw std::runtime_error("Unexpected node structure in explore tree"); + } + } + // Move to parent + box = box->parent; + } + return result; +} + +inline int NodeBox::min_cost_of_reaching_here() { + if (cost != -1) { + return cost; + } + + if (auto snapshot = dynamic_cast(node.get())) { + cost = snapshot->get_snapshot().cost_of_snapshot(); + return cost; + } + + if (parent != nullptr) { + auto parent_cost = parent->min_cost_of_reaching_here(); + cost = parent_cost + instr_cost; + return cost; + } + cost = instr_cost; + return cost; +} + +inline Snapshot_t::Snapshot_t(Cont_t cont, MCont_t mcont, SymStack_t stack, + SymFrames_t frames, SymMemory_t memory) + : stack(std::move(stack)), frames(std::move(frames)), + memory(std::move(memory)), cont(cont), mcont(mcont) { + Profile.step(StepProfileKind::SNAPSHOT_CREATE); +#ifdef DEBUG + std::cout << "Creating snapshot of size " << stack.size() << std::endl; +#endif +} + +inline int Snapshot_t::cost_of_snapshot() { + auto cost_of_stack_copy = SymStack.cost_of_copy(); + auto cost_of_frame_copy = SymFrames.cost_of_copy(); + auto cost_of_memory_copy = SymMemory.cost_of_copy(); + return 5.336 * + (cost_of_stack_copy + cost_of_frame_copy + cost_of_memory_copy); +} +class ExploreTree_t { +public: + explicit ExploreTree_t() + : root(std::make_unique(nullptr)), cursor(root.get()) {} + + void reset_cursor() { + GENSYM_INFO("Resetting cursor to root"); + // Reset the cursor to the root of the tree + cursor = root.get(); + } + + void clear() { + GENSYM_INFO("Clearing the explore tree"); + root = std::make_unique(nullptr); + cursor = root.get(); + true_branch_cov_map.clear(); + false_branch_cov_map.clear(); + } + + void set_cursor(NodeBox *new_cursor) { + GENSYM_INFO("Setting cursor to a new node"); + cursor = new_cursor; + assert(dynamic_cast(cursor->node.get()) != nullptr); + } + + std::monostate fillFinishedNode() { return cursor->fillFinishedNode(); } + + std::monostate fillFailedNode() { return cursor->fillFailedNode(); } + + std::monostate fillIfElseNode(SymVal cond, int id) { + if (cursor->fillIfElseNode(cond, id)) { + auto if_else_node = dynamic_cast(cursor->node.get()); + register_new_node(if_else_node->true_branch.get()); + register_new_node(if_else_node->false_branch.get()); + } + return std::monostate(); + } + + bool worth_to_create_snapshot() { + if (!ENABLE_COST_MODEL) { + return REUSE_SNAPSHOT; + } + // find out the best way to reach the current position via our cost model + auto snapshot_cost = Snapshot_t::cost_of_snapshot(); + int reach_parent_cost = 0; + if (cursor->parent) { + reach_parent_cost = cursor->parent->min_cost_of_reaching_here(); + } else { + reach_parent_cost = 0; + } + auto parent_cost = + cursor->parent ? cursor->parent->min_cost_of_reaching_here() : 0; + auto exec_from_parent_cost = reach_parent_cost + cursor->instr_cost; + GENSYM_INFO("The score of snapshot tendency: " + std::to_string(exec_from_parent_cost - + snapshot_cost)); + return snapshot_cost <= exec_from_parent_cost; + } + + std::monostate moveCursor(bool branch, Control control) { + Profile.step(StepProfileKind::CURSOR_MOVE); + assert(cursor != nullptr); + auto if_else_node = dynamic_cast(cursor->node.get()); + assert( + if_else_node != nullptr && + "Can't move cursor when the branch node is not initialized correctly!"); + int cost_from_parent = CostManager.dump_instr_cost(); + if (branch) { + true_branch_cov_map[if_else_node->id] = true; + if (worth_to_create_snapshot()) { + auto snapshot = makeSnapshot(control); + if_else_node->false_branch->fillSnapshotNode(snapshot); + } else { + // Do nothing, the initial value of the branch is an unexplored node + } + cursor = if_else_node->true_branch.get(); + } else { + false_branch_cov_map[if_else_node->id] = true; + if (worth_to_create_snapshot()) { + auto snapshot = makeSnapshot(control); + if_else_node->true_branch->fillSnapshotNode(snapshot); + } else { + // Do nothing, the initial value of the branch is an unexplored node + } + cursor = if_else_node->false_branch.get(); + } + + return std::monostate(); + } + + std::monostate print() { + std::cout << root->node->to_string() << std::endl; + return std::monostate(); + } + + std::monostate to_graphviz(std::ostream &os) { + root->node->to_graphviz(os); + return std::monostate(); + } + + std::monostate dump_graphviz(std::string filepath) { + std::ofstream ofs(filepath); + if (!ofs.is_open()) { + throw std::runtime_error("Failed to open " + filepath + " for writing"); + } + to_graphviz(ofs); + return std::monostate(); + } + + NodeBox *pick_unexplored() { + // Pick an unexplored node from the tree + // For now, we just iterate through the tree and return the first unexplored + return pick_unexplored_of(root.get()); + } + std::vector true_branch_cov_map; + std::vector false_branch_cov_map; + bool all_branch_covered() const { + for (bool covered : true_branch_cov_map) { + if (!covered) + return false; + } + for (bool covered : false_branch_cov_map) { + if (!covered) + return false; + } + return true; + } + + NodeBox *get_root() const { return root.get(); } + + void register_new_node_collector(std::function func) { + new_node_collectors.push_back(func); + } + +private: + NodeBox *pick_unexplored_of(NodeBox *node) { + if (node->isUnexplored()) { + return node; + } + auto if_else_node = dynamic_cast(node->node.get()); + if (if_else_node) { + NodeBox *result = pick_unexplored_of(if_else_node->true_branch.get()); + if (result) { + return result; + } + return pick_unexplored_of(if_else_node->false_branch.get()); + } + return nullptr; // No unexplored node found + } + void register_new_node(NodeBox *node) { + for (auto &func : new_node_collectors) { + func(node); + } + } + std::unique_ptr root; + NodeBox *cursor; + std::vector> new_node_collectors; +}; + +static ExploreTree_t ExploreTree; + +using NumMap = std::unordered_map; + +class SymEnv_t { +public: + Num read(const Symbol &symbol) { +#if DEBUG + std::cout << "Read symbol: " << symbol.get_id() + << " from symbolic environment" << std::endl; + std::cout << "Current symbolic environment: " << to_string() << std::endl; +#endif + map.try_emplace(symbol.get_id(), Num(I32V(0))); + return map.at(symbol.get_id()); + } + + Num read(SymVal sym) { + // Read the value of a symbolic value from the environment, it will update + // the environment if the key does not exist. + auto symbol = dynamic_cast(sym.symptr.get()); + assert(symbol); + return read(*symbol); + } + + void update(NumMap new_env) { map = std::move(new_env); } + + std::string to_string() const { + std::string result; + result += "(\n"; + for (const auto &[id, num] : map) { + result += + " (" + std::to_string(id) + "->" + std::to_string(num.value) + ")\n"; + } + result += ")"; + return result; + } + + size_t size() const { return map.size(); } + +private: + NumMap map; // The symbolic environment, a vector of Num +}; + +static SymEnv_t SymEnv; + +static std::monostate reset_stacks() { + Stack.reset(); + SymStack.reset(); + Frames.reset(); + SymFrames.reset(); + Memory.reset(); + SymMemory.reset(); + initRand(); + return std::monostate{}; +} + +inline void NodeBox::reach_here(std::function entrypoint) { + // reach the node of exploration tree with given input (symbolic environment) + if (auto snapshot = dynamic_cast(node.get())) { + assert(REUSE_SNAPSHOT); + auto snap = snapshot->get_snapshot(); + snap.resume_execution(this); + return; + } else if (parent == nullptr) { + // if it's the root node, the only way to reach here is to reset everything + // and start a new execution + assert(this == ExploreTree.get_root() && + "Only the root node can have no parent"); + auto timer = ManagedTimer(TimeProfileKind::INSTR); + ExploreTree.reset_cursor(); + reset_stacks(); + entrypoint(); + return; + } + // Reach the parent node, then from the parent node, we can reach here + // TODO: short circuit the lookup + parent->reach_here(entrypoint); + return; +} + +struct EvalRes { + Num value; + int width; // in bits + EvalRes(Num value, int width) : value(value), width(width) {} +}; + +// TODO: reduce the re-computation of the same symbolic expression, it's better +// if it can be done by the smt solver +static EvalRes eval_sym_expr(const SymVal &sym, SymEnv_t &sym_env) { + Profile.step(StepProfileKind::SYM_EVAL); + assert(sym.symptr != nullptr && "Symbolic expression is null"); + if (auto concrete = dynamic_cast(sym.symptr.get())) { + return EvalRes(concrete->value, 32); + } else if (auto extract = dynamic_cast(sym.symptr.get())) { + auto res = eval_sym_expr(extract->value, sym_env); + int high = extract->high; + int low = extract->low; + assert(high >= low && "Invalid extract range"); + int size = high - low + 1; // size in bytes + int64_t mask = (1LL << (size * 8)) - 1; + int64_t extracted_value = (res.value.toInt() >> ((low - 1) * 8)) & mask; + return EvalRes(Num(I64V(extracted_value)), size * 8); + } else if (auto smallbv = dynamic_cast(sym.symptr.get())) { + return EvalRes(Num(I64V(smallbv->get_value())), smallbv->get_size()); + } else if (auto operation = dynamic_cast(sym.symptr.get())) { + // If it's a operation, we need to evaluate it + auto lhs_res = eval_sym_expr(operation->lhs, sym_env); + auto rhs_res = eval_sym_expr(operation->rhs, sym_env); + auto lhs = lhs_res.value; + auto rhs = rhs_res.value; + switch (operation->op) { + case ADD: + return EvalRes(lhs + rhs, 32); + case SUB: + return EvalRes(lhs - rhs, 32); + case MUL: + return EvalRes(lhs * rhs, 32); + case DIV: + return EvalRes(lhs / rhs, 32); + case LT: + return EvalRes(lhs < rhs, 32); + case LEQ: + return EvalRes(lhs <= rhs, 32); + case GT: + return EvalRes(lhs > rhs, 32); + case GEQ: + return EvalRes(lhs >= rhs, 32); + case NEQ: + return EvalRes(lhs != rhs, 32); + case EQ: + return EvalRes(lhs == rhs, 32); + case B_AND: + return EvalRes(Num(I64V(lhs.value & rhs.value)), 32); + case CONCAT: { + auto lhs_width = lhs_res.width; + auto rhs_width = rhs_res.width; + auto conc_value = (lhs.value << rhs_width) | (rhs.value); + auto new_width = lhs_width + rhs_width; + return EvalRes(Num(I64V(conc_value)), new_width); + } + default: + assert(false && "Operation not supported in evaluation"); + } + } else if (auto symbol = dynamic_cast(sym.symptr.get())) { + auto sym_id = symbol->get_id(); + GENSYM_INFO("Reading symbol: " + std::to_string(sym_id)); + return EvalRes(sym_env.read(sym), 32); + } + throw std::runtime_error("Not supported symbolic expression"); +} + +static void resume_conc_stack(const SymStack_t &sym_stack, Stack_t &stack, + SymEnv_t &sym_env) { + stack.resize(sym_stack.size()); + for (size_t i = 0; i < sym_stack.size(); ++i) { + auto sym = sym_stack[i]; + auto res = eval_sym_expr(sym, sym_env); + auto conc = res.value; + stack.set_from_front(i, conc); + } +} + +static void resume_conc_frames(const SymFrames_t &sym_frame, Frames_t &frames, + SymEnv_t &sym_env) { + frames.resize(sym_frame.size()); + for (size_t i = 0; i < sym_frame.size(); ++i) { + auto sym = sym_frame[i]; + assert(sym.symptr != nullptr); + auto res = eval_sym_expr(sym, sym_env); + auto conc = res.value; + frames.set_from_front(i, conc); + } +} + +static void resume_conc_memory(const SymMemory_t &sym_memory, Memory_t &memory, + SymEnv_t &sym_env) { + memory.reset(); + for (const auto &pair : sym_memory.memory) { + int32_t addr = pair.first; + SymVal sym = pair.second; + assert(sym.symptr != nullptr); + auto res = eval_sym_expr(sym, sym_env); + auto conc = res.value; + assert(res.width == 8 && "Memory should only store bytes"); + memory.store_byte(addr, conc.value & 0xFF); + } +} + +static void resume_conc_states(const SymStack_t &sym_stack, + const SymFrames_t &sym_frame, + const SymMemory_t &sym_memory, Stack_t &stack, + Frames_t &frames, Memory_t &memory, + SymEnv_t &sym_env) { + resume_conc_stack(sym_stack, stack, sym_env); + resume_conc_frames(sym_frame, frames, sym_env); + resume_conc_memory(sym_memory, memory, sym_env); +} + +inline std::monostate Snapshot_t::resume_execution(NodeBox *node) const { + // Reset explore tree's cursor + ExploreTree.set_cursor(node); + + // Restore the symbolic state from the snapshot + GENSYM_INFO("Reusing symbolic state from snapshot"); + SymStack = stack; + SymFrames = frames; + SymMemory = memory; + { + auto timer = ManagedTimer(TimeProfileKind::RESUME_SNAPSHOT); + // Restore the concrete states from the symbolic states + resume_conc_states(stack, frames, memory, Stack, Frames, Memory, SymEnv); + } + int sym_size = 0; + { + auto timer = ManagedTimer(TimeProfileKind::COUNT_SYM_SIZE); + for (size_t i = 0; i < stack.size(); ++i) { + sym_size += stack[i].size(); + } + for (size_t i = 0; i < frames.size(); ++i) { + sym_size += frames[i].size(); + } + } + std::cout << "[Info] Resumed symbolic execution from snapshot, total " + "symbolic expression and frame size: " + << sym_size << std::endl; + + // Resume execution from the continuation + auto timer = ManagedTimer(TimeProfileKind::INSTR); + return cont(mcont); +} + +#endif // WASM_SYMBOLIC_RT_HPP diff --git a/headers/wasm/utils.hpp b/headers/wasm/utils.hpp new file mode 100644 index 00000000..8b7b0471 --- /dev/null +++ b/headers/wasm/utils.hpp @@ -0,0 +1,74 @@ +#ifndef UTILS_HPP +#define UTILS_HPP +#include +#include + +#ifndef GENSYM_ASSERT +#define GENSYM_ASSERT(condition) \ + do { \ + if (!(condition)) { \ + throw std::runtime_error(std::string("Assertion failed: ") + " (" + \ + __FILE__ + ":" + std::to_string(__LINE__) + \ + ")"); \ + } \ + } while (0) +#endif + +#ifndef NO_DBG +#define GENSYM_DBG(obj) \ + do { \ + std::cout << "LOG: " << obj << " (" << __FILE__ << ":" \ + << std::to_string(__LINE__) << ")" << std::endl; \ + } while (0) +#else +#define GENSYM_LOG(message) \ + do { \ + } while (0) +#endif + +#ifndef NO_INFO +#define GENSYM_INFO(obj) \ + do { \ + std::cout << obj << std::endl; \ + } while (0) +#else +#define GENSYM_INFO(message) \ + do { \ + } while (0) + +#endif + +#if __cplusplus < 202002L +#include + +inline bool starts_with(const std::string &str, const std::string &prefix) { + return str.size() >= prefix.size() && + std::equal(prefix.begin(), prefix.end(), str.begin()); +} +#else +#include +inline bool starts_with(const std::string &str, const std::string &prefix) { + return str.starts_with(prefix); +} +#endif + +inline std::monostate info() { +#ifdef DEBUG + std::cout << std::endl; +#endif + return std::monostate{}; +} + +template +std::monostate info(const T &first, const Args &...args) { +#ifdef DEBUG + std::cout << first << " "; + info(args...); +#endif + return std::monostate{}; +} + +inline std::monostate get_unit() { return std::monostate{}; } +inline std::monostate get_unit(std::monostate x) { return std::monostate{}; } + +#endif // UTILS_HPP \ No newline at end of file diff --git a/src/main/scala/wasm/StagedConcolicMiniWasm.scala b/src/main/scala/wasm/StagedConcolicMiniWasm.scala new file mode 100644 index 00000000..cafddbf0 --- /dev/null +++ b/src/main/scala/wasm/StagedConcolicMiniWasm.scala @@ -0,0 +1,1631 @@ +package gensym.wasm.stagedconcolicminiwasm + +import scala.collection.mutable.{ArrayBuffer, HashMap} + +import lms.core.stub.Adapter +import lms.core.virtualize +import lms.macros.SourceContext +import lms.core.stub.{Base, ScalaGenBase, CGenBase} +import lms.core.Backend._ +import lms.core.Backend.{Block => LMSBlock, Const => LMSConst} +import lms.core.Graph + +import gensym.wasm.ast._ +import gensym.wasm.ast.{Const => WasmConst, Block => WasmBlock} +import gensym.wasm.miniwasm.{ModuleInstance} +import gensym.wasm.symbolic.{SymVal} +import gensym.lmsx.{SAIDriver, StringOps, SAIOps, SAICodeGenBase, CppSAIDriver, CppSAICodeGenBase} +import gensym.wasm.symbolic.Concrete +import gensym.wasm.symbolic.ExploreTree +import gensym.structure.freer.Explore + +object Counter { + var currentId: Int = 0 + + // WIR is the branch's corresponding ast, while the Int stands for the nth + // branch of the AST(a WIR may contain multiple branches, e.g., br_table) + private val dict = new HashMap[(WIR, Int), Int]() + + def reset(): Unit = { + currentId = 0 + dict.clear() + } + + def getId(wir: WIR, nth: Int = 0): Int = { + if (dict.contains((wir, nth))) { + dict((wir, nth)) + } else { + val id = currentId + currentId += 1 + dict((wir, nth)) = id + id + } + + } + + def getId(wir: WIR): Int = { + getId(wir, 0) + } +} +@virtualize +trait StagedWasmEvaluator extends SAIOps { + def module: ModuleInstance + + case class StagedConcreteNum(tipe: ValueType, i: Rep[Num]) + + + case class StagedSymbolicNum(tipe: ValueType, s: Rep[SymVal]) + + def toStagedNum(num: Num): StagedConcreteNum = { + num match { + case I32V(_) => StagedConcreteNum(NumType(I32Type), num) + case I64V(_) => StagedConcreteNum(NumType(I64Type), num) + case F32V(_) => StagedConcreteNum(NumType(F32Type), num) + case F64V(_) => StagedConcreteNum(NumType(F64Type), num) + } + } + + def toStagedSymbolicNum(num: Num): StagedSymbolicNum = { + num match { + case I32V(_) => StagedSymbolicNum(NumType(I32Type), Concrete(num)) + case I64V(_) => StagedSymbolicNum(NumType(I64Type), Concrete(num)) + case F32V(_) => StagedSymbolicNum(NumType(F32Type), Concrete(num)) + case F64V(_) => StagedSymbolicNum(NumType(F64Type), Concrete(num)) + } + } + + implicit class ValueTypeOps(ty: ValueType) { + def size: Int = ty match { + case NumType(I32Type) => 4 + case NumType(I64Type) => 8 + case NumType(F32Type) => 4 + case NumType(F64Type) => 8 + } + } + + case class Context( + stackTypes: List[ValueType], + frameTypes: List[ValueType] + ) { + def push(ty: ValueType): Context = { + this.copy(stackTypes = ty :: stackTypes) + } + + def peek: ValueType = { + stackTypes.head + } + + def pop(): (ValueType, Context) = { + val (ty :: rest) = stackTypes + (ty, this.copy(stackTypes = rest)) + } + + def take(n: Int): Context = { + Predef.assert(n <= stackTypes.size, s"Context.take size $n is larger than stack size ${stackTypes.size}") + val (taken, rest) = stackTypes.splitAt(n) + this.copy(stackTypes = rest) + } + + def shift(offset: Int, size: Int): Context = { + // Predef.println(s"[DEBUG] Shifting stack by $offset, size $size, $this") + Predef.assert(offset >= 0, s"Context shift offset must be non-negative, get $offset") + if (offset == 0) { + this + } else { + this.copy( + stackTypes = stackTypes.take(size) ++ stackTypes.drop(offset + size) + ) + } + } + } + + type MCont[A] = Unit => A + type Cont[A] = (MCont[A]) => A + type Trail[A] = List[Context => Rep[Cont[A]]] + + // a cache storing the compiled code for each function, to reduce re-compilation + val compileCache = new HashMap[Int, Rep[(MCont[Unit]) => Unit]] + + def makeDummy: Rep[Unit] = "dummy".reflectCtrlWith[Unit]() + + def funHere[A:Manifest,B:Manifest](f: Rep[A] => Rep[B], dummy: Rep[Unit]): Rep[A => B] = { + // to avoid LMS lifting a function, we create a dummy node and read it inside function + fun((x: Rep[A]) => { + "dummy-op".reflectCtrlWith[Unit](dummy) + f(x) + }) + } + + trait Control + + // Save the current control information into a structure Control + // We need to store the control information, so we can resume the execution later + def makeControl(kont: Rep[Cont[Unit]], mkont: Rep[MCont[Unit]]): Rep[Control] = { + "control-make".reflectCtrlWith[Control](kont, mkont) + } + + var instrCost: Int = 0 + + def addInstrCost(): Rep[Unit] = { + "add-instr-cost".reflectCtrlWith[Unit](instrCost) + instrCost = 0 + () + } + + def eval(insts: List[Instr], + kont: Context => Rep[Cont[Unit]], + mkont: Rep[MCont[Unit]], + trail: Trail[Unit]) + (implicit ctx: Context): Rep[Unit] = { + if (insts.isEmpty) return kont(ctx)(mkont) + instrCost += 1 + // Predef.println(s"[DEBUG] Evaluating instructions: ${insts.mkString(", ")}") + // Predef.println(s"[DEBUG] Current context: $ctx") + + val (inst, rest) = (insts.head, insts.tail) + inst match { + case Drop => + val (ty, newCtx) = ctx.pop() + Stack.popC(ty) + Stack.popS(ty) + eval(rest, kont, mkont, trail)(newCtx) + case WasmConst(num) => + Stack.pushC(toStagedNum(num)) + Stack.pushS(toStagedSymbolicNum(num)) + val newCtx = ctx.push(num.tipe(module)) + eval(rest, kont, mkont, trail)(newCtx) + case Symbolic(ty) => + Stack.popC(ty) + val id = Stack.popS(ty) + val symVal = id.makeSymbolic(ty) + val num = SymEnv.read(symVal.s) + Stack.pushC(StagedConcreteNum(ty, num)) + Stack.pushS(symVal) + val newCtx = ctx.pop()._2.push(ty) + eval(rest, kont, mkont, trail)(newCtx) + case LocalGet(i) => + Stack.pushC(Frames.getC(i)) + Stack.pushS(Frames.getS(i)) + val newCtx = ctx.push(ctx.frameTypes(i)) + eval(rest, kont, mkont, trail)(newCtx) + case LocalSet(i) => + val (ty, newCtx) = ctx.pop() + val num = Stack.popC(ty) + val sym = Stack.popS(ty) + Frames.setC(i, num) + Frames.setS(i, sym) + eval(rest, kont, mkont, trail)(newCtx) + case LocalTee(i) => + val ty = ctx.pop()._1 + val num = Stack.peekC(ty) + val sym = Stack.peekS(ty) + Frames.setC(i, num) + Frames.setS(i, sym) + eval(rest, kont, mkont, trail)(ctx) + case GlobalGet(i) => + Stack.pushC(Globals.getC(i)) + Stack.pushS(Globals.getS(i)) + val newCtx = ctx.push(module.globals(i).ty.ty) + eval(rest, kont, mkont, trail)(newCtx) + case GlobalSet(i) => + val (ty, newCtx) = ctx.pop() + val num = Stack.popC(ty) + val sym = Stack.popS(ty) + module.globals(i).ty match { + case GlobalType(tipe, true) => { + Globals.setC(i, num) + Globals.setS(i, sym) + } + case _ => throw new Exception("Cannot set immutable global") + } + eval(rest, kont, mkont, trail)(newCtx) + case Store(StoreOp(align, offset, ty, None)) => + val (ty1, newCtx1) = ctx.pop() + val value = Stack.popC(ty1) + val symValue = Stack.popS(ty1) + val (ty2, newCtx2) = newCtx1.pop() + val addr = Stack.popC(ty2) + val symAddr = Stack.popS(ty2) + Memory.storeInt(addr.toInt, offset, (value.toInt, symValue)) + eval(rest, kont, mkont, trail)(newCtx2) + case Nop => eval(rest, kont, mkont, trail) + case Load(LoadOp(align, offset, ty, None, None)) => + val (ty1, newCtx1) = ctx.pop() + val addr = Stack.popC(ty1) + Stack.popS(ty1) + val num = Memory.loadIntC(addr.toInt, offset) + val sym = Memory.loadIntS(addr.toInt, offset) + Stack.pushC(num) + Stack.pushS(sym) + val newCtx2 = newCtx1.push(ty) + eval(rest, kont, mkont, trail)(newCtx2) + case MemorySize => ??? + case MemoryGrow => + val (ty, newCtx) = ctx.pop() + val delta = Stack.popC(ty) + Stack.popS(ty) + val ret = Memory.grow(delta.toInt) + val retNum = Values.I32V(ret) + // For now, we assume that the result of memory.grow only depends on the execution path, + // we can relax this by turning it return to a symbol value and mimic the memory.grow's result as input. + val retSym = "Concrete".reflectCtrlWith[SymVal](retNum) + Stack.pushC(StagedConcreteNum(NumType(I32Type), retNum)) + Stack.pushS(StagedSymbolicNum(NumType(I32Type), retSym)) + val newCtx2 = newCtx.push(NumType(I32Type)) + eval(rest, kont, mkont, trail)(newCtx2) + case MemoryFill => ??? + case Unreachable => unreachable() + case Test(op) => + val (ty, newCtx1) = ctx.pop() + val v = Stack.popC(ty) + val s = Stack.popS(ty) + Stack.pushC(evalTestOpC(op, v)) + Stack.pushS(evalTestOpS(op, s)) + val newCtx2 = newCtx1.push(v.tipe) + eval(rest, kont, mkont, trail)(newCtx2) + case Unary(op) => + val (ty, newCtx1) = ctx.pop() + val v = Stack.popC(ty) + val s = Stack.popS(ty) + val res = evalUnaryOpC(op, v) + Stack.pushC(res) + Stack.pushS(evalUnaryOpS(op, s)) + val newCtx2 = newCtx1.push(res.tipe) + eval(rest, kont, mkont, trail)(newCtx2) + case Binary(op) => + val (ty2, newCtx1) = ctx.pop() + val v2 = Stack.popC(ty2) + val s2 = Stack.popS(ty2) + val (ty1, newCtx2) = newCtx1.pop() + val v1 = Stack.popC(ty1) + val s1 = Stack.popS(ty1) + val res = evalBinOpC(op, v1, v2) + Stack.pushC(res) + Stack.pushS(evalBinOpS(op, s1, s2)) + val newCtx3 = newCtx2.push(res.tipe) + eval(rest, kont, mkont, trail)(newCtx3) + case Compare(op) => + val (ty2, newCtx1) = ctx.pop() + val v2 = Stack.popC(ty2) + val s2 = Stack.popS(ty2) + val (ty1, newCtx2) = newCtx1.pop() + val v1 = Stack.popC(ty1) + val s1 = Stack.popS(ty1) + val res = evalRelOpC(op, v1, v2) + Stack.pushC(res) + Stack.pushS(evalRelOpS(op, s1, s2)) + val newCtx3 = newCtx2.push(res.tipe) + eval(rest, kont, mkont, trail)(newCtx3) + case WasmBlock(ty, inner) => + // no need to modify the stack when entering a block + // the type system guarantees that we will never take more than the input size from the stack + val funcTy = ty.funcType + val exitSize = ctx.stackTypes.size - funcTy.inps.size + funcTy.out.size + val dummy = makeDummy + def restK(restCtx: Context): Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Exiting the block, stackSize =", Stack.size) + val offset = restCtx.stackTypes.size - exitSize + Stack.shiftC(offset, funcTy.out.size) + Stack.shiftS(offset, funcTy.out.size) + val newRestCtx = restCtx.shift(offset, funcTy.out.size) + eval(rest, kont, mk, trail)(newRestCtx) + }) + eval(inner, restK _, mkont, restK _ :: trail) + case Loop(ty, inner) => + val funcTy = ty.funcType + val exitSize = ctx.stackTypes.size - funcTy.inps.size + funcTy.out.size + val dummy = makeDummy + def restK(restCtx: Context): Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Exiting the loop, stackSize =", Stack.size) + val offset = restCtx.stackTypes.size - exitSize + Stack.shiftC(offset, funcTy.out.size) + Stack.shiftS(offset, funcTy.out.size) + val newRestCtx = restCtx.shift(offset, funcTy.out.size) + eval(rest, kont, mk, trail)(newRestCtx) + }) + val enterSize = ctx.stackTypes.size + def loop(restCtx: Context): Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entered the loop, stackSize =", Stack.size) + val offset = restCtx.stackTypes.size - enterSize + Stack.shiftC(offset, funcTy.inps.size) + Stack.shiftS(offset, funcTy.inps.size) + val newRestCtx = restCtx.shift(offset, funcTy.inps.size) + eval(inner, restK _, mk, loop _ :: trail)(newRestCtx) + }) + loop(ctx)(mkont) + case If(ty, thn, els) => + val funcTy = ty.funcType + val (condTy, newCtx) = ctx.pop() + val cond = Stack.popC(condTy) + val symCond = Stack.popS(condTy) + val exitSize = newCtx.stackTypes.size - funcTy.inps.size + funcTy.out.size + def restK(restCtx: Context): Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Exiting the if, stackSize =", Stack.size) + val offset = restCtx.stackTypes.size - exitSize + Stack.shiftC(offset, funcTy.out.size) + Stack.shiftS(offset, funcTy.out.size) + val newRestCtx = restCtx.shift(offset, funcTy.out.size) + eval(rest, kont, mk, trail)(newRestCtx) + }) + val id = Counter.getId(inst) + ExploreTree.fillWithIfElse(symCond.s, id) + def thnK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entering the true branch $id of the if") + eval(thn, restK _, mk, restK _ :: trail)(newCtx) + }) + def elsK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entering the false branch $id of the if") + eval(els, restK _, mk, restK _ :: trail)(newCtx) + }) + if (cond.toInt != 0) { + val control = makeControl(elsK, mkont) + ExploreTree.moveCursor(true, control) + thnK(mkont) + } else { + val control = makeControl(thnK, mkont) + ExploreTree.moveCursor(false, control) + elsK(mkont) + } + () + case Br(label) => + info(s"Jump to $label") + addInstrCost() + trail(label)(ctx)(mkont) + case BrIf(label) => + addInstrCost() + val (ty, newCtx) = ctx.pop() + val cond = Stack.popC(ty) + val symCond = Stack.popS(ty) + info(s"The br_if(${label})'s condition is ", cond.toInt) + val id = Counter.getId(inst) + ExploreTree.fillWithIfElse(symCond.s, id) + def thnK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + trail(label)(newCtx)(mk) + }) + def elsK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + eval(rest, kont, mk, trail)(newCtx) + }) + if (cond.toInt != 0) { + info(s"Jump to $label") + val control = makeControl(elsK, mkont) + ExploreTree.moveCursor(true, control) + thnK(mkont) + } else { + info(s"Continue") + val control = makeControl(thnK, mkont) + ExploreTree.moveCursor(false, control) + elsK(mkont) + } + () + case BrTable(labels, default) => + addInstrCost() + val (ty, newCtx) = ctx.pop() + def aux(choices: List[Int], idx: Int, mkont: Rep[MCont[Unit]]): Rep[Unit] = { + if (choices.isEmpty) { + Stack.popC(ty) + Stack.popS(ty) + trail(default)(newCtx)(mkont) + } else { + val label = Stack.peekC(ty) + val labelSym = Stack.peekS(ty) + val cond = (label - toStagedNum(I32V(idx))).isZero() + val condSym = (labelSym - toStagedSymbolicNum(I32V(idx))).isZero() + val id = Counter.getId(inst, idx) + ExploreTree.fillWithIfElse(condSym.s, id) + // When moving the cursor to a branch, we mark another branch as + // snapshotNode (this is done by moveCursor's runtime implementation) + // TODO: store snapshot into this snapshot node + def thnK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entering the true branch $id of the br_table") + Stack.popC(ty) + Stack.popS(ty) + trail(choices.head)(newCtx)(mk) + }) + def elsK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entering the false branch $id of the br_table") + aux(choices.tail, idx + 1, mk) + }) + if (cond.toInt != 0) { + val control = makeControl(elsK, mkont) + ExploreTree.moveCursor(true, control) + thnK(mkont) + } + else { + val control = makeControl(thnK, mkont) + ExploreTree.moveCursor(false, control) + elsK(mkont) + } + } + } + aux(labels, 0, mkont) + case Return => trail.last(ctx)(mkont) + case Call(f) => evalCall(rest, kont, mkont, trail, f, false) + case ReturnCall(f) => evalCall(rest, kont, mkont, trail, f, true) + case _ => + val todo = "todo-op".reflectCtrlWith[Unit]() + eval(rest, kont, mkont, trail) + } + } + + def forwardKont: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => mk(())) + + + def evalCall(rest: List[Instr], + kont: Context => Rep[Cont[Unit]], + mkont: Rep[MCont[Unit]], + trail: Trail[Unit], + funcIndex: Int, + isTail: Boolean) + (implicit ctx: Context): Rep[Unit] = { + module.funcs(funcIndex) match { + case FuncDef(_, FuncBodyDef(ty, _, bodyLocals, body)) => + val locals = bodyLocals ++ ty.inps + instrCost += locals.size * 2 - 1 + addInstrCost() + val callee = + if (compileCache.contains(funcIndex)) { + compileCache(funcIndex) + } else { + val callee = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Entered the function at $funcIndex, stackSize =", Stack.size) + // the return instruction is also stack polymorphic + def retK(ctx: Context): Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Exiting the function at $funcIndex, stackSize =", Stack.size) + val offset = ctx.stackTypes.size - ty.out.size + Stack.shiftC(offset, ty.out.size) + Stack.shiftS(offset, ty.out.size) + mk(()) + }) + eval(body, retK _, mk, retK _::Nil)(Context(Nil, locals)) + }) + compileCache(funcIndex) = callee + callee + } + // Predef.println(s"[DEBUG] locals size: ${locals.size}") + val newCtx = ctx.take(ty.inps.size) + val argsC = Stack.takeC(ty.inps) + val argsS = Stack.takeS(ty.inps) + if (isTail) { + // when tail call, return to the caller's return continuation + Frames.popFrameC(ctx.frameTypes.size) + Frames.popFrameS(ctx.frameTypes.size) + Frames.pushFrameC(locals) + Frames.pushFrameS(locals) + Frames.putAllC(argsC) + Frames.putAllS(argsS) + callee(mkont) + } else { + // We make a new trail by `restK`, since function creates a new block to escape + // (more or less like `return`) + val restK: Rep[Cont[Unit]] = topFun((mk: Rep[MCont[Unit]]) => { + info(s"Exiting the function at $funcIndex, stackSize =", Stack.size) + Frames.popFrameC(locals.size) + Frames.popFrameS(locals.size) + eval(rest, kont, mk, trail)(newCtx.copy(stackTypes = ty.out.reverse ++ ctx.stackTypes.drop(ty.inps.size))) + }) + val dummy = makeDummy + val newMKont: Rep[MCont[Unit]] = funHere((_u: Rep[Unit]) => { + restK(mkont) + }, dummy) + Frames.pushFrameC(locals) + Frames.pushFrameS(locals) + Frames.putAllC(argsC) + Frames.putAllS(argsS) + callee(newMKont) + } + case Import("console", "log", _) + | Import("spectest", "print_i32", _) => + //println(s"[DEBUG] current stack: $stack") + addInstrCost() + val (ty, newCtx) = ctx.pop() + val v = Stack.popC(ty) + Stack.popS(ty) + println(v.toInt) + eval(rest, kont, mkont, trail)(newCtx) + case Import("console", "assert", _) => + addInstrCost() + val (ty, newCtx) = ctx.pop() + val v = Stack.popC(ty) + // TODO: We should also add s into exploration tree + val s = Stack.popS(ty) + runtimeAssert(v.toInt != 0) + eval(rest, kont, mkont, trail)(newCtx) + case Import(_, _, _) => throw new Exception(s"Unknown import at $funcIndex") + case _ => throw new Exception(s"Definition at $funcIndex is not callable") + } + } + + def evalTestOpC(op: TestOp, value: StagedConcreteNum): StagedConcreteNum = op match { + case Eqz(_) => value.isZero + } + + def evalTestOpS(op: TestOp, value: StagedSymbolicNum): StagedSymbolicNum = op match { + case Eqz(_) => value.isZero + } + + def evalUnaryOpC(op: UnaryOp, value: StagedConcreteNum): StagedConcreteNum = op match { + case Clz(_) => value.clz() + case Ctz(_) => value.ctz() + case Popcnt(_) => value.popcnt() + case _ => ??? + } + + def evalUnaryOpS(op: UnaryOp, value: StagedSymbolicNum): StagedSymbolicNum = op match { + case Clz(_) => value.clz() + case Ctz(_) => value.ctz() + case Popcnt(_) => value.popcnt() + case _ => ??? + } + + def evalBinOpC(op: BinOp, v1: StagedConcreteNum, v2: StagedConcreteNum): StagedConcreteNum = op match { + case Add(_) => v1 + v2 + case Mul(_) => v1 * v2 + case Sub(_) => v1 - v2 + case Shl(_) => v1 << v2 + // case ShrS(_) => v1 >> v2 // TODO: signed shift right + case ShrU(_) => v1 >> v2 + case And(_) => v1 & v2 + case DivS(_) => v1 / v2 + case DivU(_) => v1 / v2 + case _ => + throw new Exception(s"Unknown binary operation $op") + } + + def evalBinOpS(op: BinOp, v1: StagedSymbolicNum, v2: StagedSymbolicNum): StagedSymbolicNum = op match { + case Add(_) => v1 + v2 + case Mul(_) => v1 * v2 + case Sub(_) => v1 - v2 + case Shl(_) => v1 << v2 + // case ShrS(_) => v1 >> v2 // TODO: signed shift right + case ShrU(_) => v1 >> v2 + case And(_) => v1 & v2 + case DivS(_) => v1 / v2 + case DivU(_) => v1 / v2 + case _ => + throw new Exception(s"Unknown binary operation $op") + } + + def evalRelOpC(op: RelOp, v1: StagedConcreteNum, v2: StagedConcreteNum): StagedConcreteNum = op match { + case Eq(_) => v1 numEq v2 + case Ne(_) => v1 numNe v2 + case LtS(_) => v1 < v2 + case LtU(_) => v1 ltu v2 + case GtS(_) => v1 > v2 + case GtU(_) => v1 gtu v2 + case LeS(_) => v1 <= v2 + case LeU(_) => v1 leu v2 + case GeS(_) => v1 >= v2 + case GeU(_) => v1 geu v2 + case _ => ??? + } + + def evalRelOpS(op: RelOp, v1: StagedSymbolicNum, v2: StagedSymbolicNum): StagedSymbolicNum = op match { + case Eq(_) => v1 numEq v2 + case Ne(_) => v1 numNe v2 + case LtS(_) => v1 < v2 + case LtU(_) => v1 ltu v2 + case GtS(_) => v1 > v2 + case GtU(_) => v1 gtu v2 + case LeS(_) => v1 <= v2 + case LeU(_) => v1 leu v2 + case GeS(_) => v1 >= v2 + case GeU(_) => v1 geu v2 + case _ => ??? + } + + def evalTop(mkont: Rep[MCont[Unit]], main: Option[String]): Rep[Unit] = { + Counter.reset() + val funBody: FuncBodyDef = main match { + case Some(func_name) => + module.defs.flatMap({ + case Export(`func_name`, ExportFunc(fid)) => + Predef.println(s"Now compiling start with function $main") + module.funcs(fid) match { + case FuncDef(_, body@FuncBodyDef(_,_,_,_)) => Some(body) + case _ => throw new Exception("Entry function has no concrete body") + } + case _ => None + }).head + case None => + val startIds = module.defs.flatMap { + case Start(id) => Some(id) + case _ => None + } + val startId = startIds.headOption.getOrElse { throw new Exception("No start function") } + module.funcs(startId) match { + case FuncDef(_, body@FuncBodyDef(_,_,_,_)) => body + case _ => + throw new Exception("Entry function has no concrete body") + } + } + val (instrs, locals) = (funBody.body, funBody.locals) + // resetStacks() // Don't manually reset the global states (like stack), manage them in the driver + initGlobals(module.globals) + Frames.pushFrameC(locals) + Frames.pushFrameS(locals) + eval(instrs, (_: Context) => forwardKont, mkont, ((_: Context) => forwardKont)::Nil)(Context(Nil, locals)) + Frames.popFrameC(locals.size) + Frames.popFrameS(locals.size) + } + + def evalTop(main: Option[String], printRes: Boolean): Rep[Unit] = { + val haltK: Rep[Unit] => Rep[Unit] = (_) => { + info("Exiting the program...") + if (printRes) { + Stack.print() + } + ExploreTree.fillWithFinished() + "no-op".reflectCtrlWith[Unit]() + } + val temp: Rep[MCont[Unit]] = topFun(haltK) + evalTop(temp, main) + } + + def runtimeAssert(b: Rep[Boolean]): Rep[Unit] = { + "assert-true".reflectCtrlWith[Unit](b) + } + + // stack operations + object Stack { + def shiftC(offset: Int, size: Int) = { + if (offset > 0) { + "stack-shift".reflectCtrlWith[Unit](offset, size) + } + } + + def shiftS(offset: Int, size: Int) = { + if (offset > 0) { + "sym-stack-shift".reflectCtrlWith[Unit](offset, size) + } + } + + def initialize(): Rep[Unit] = { + "stack-init".reflectCtrlWith[Unit]() + } + + def popC(ty: ValueType): StagedConcreteNum = { + StagedConcreteNum(ty, "stack-pop".reflectCtrlWith[Num]()) + } + + def popS(ty: ValueType): StagedSymbolicNum = { + StagedSymbolicNum(ty, "sym-stack-pop".reflectCtrlWith[SymVal]()) + } + + def peekC(ty: ValueType): StagedConcreteNum = { + StagedConcreteNum(ty, "stack-peek".reflectCtrlWith[Num]()) + } + + def peekS(ty: ValueType): StagedSymbolicNum = { + StagedSymbolicNum(ty, "sym-stack-peek".reflectCtrlWith[SymVal]()) + } + + def pushC(num: StagedConcreteNum) = "stack-push".reflectCtrlWith[Unit](num.i) + + def pushS(num: StagedSymbolicNum) = "sym-stack-push".reflectCtrlWith[Unit](num.s) + + def takeC(types: List[ValueType]): List[StagedConcreteNum] = types match { + case Nil => Nil + case t :: ts => + val v = popC(t) + val rest = takeC(ts) + v :: rest + } + + def takeS(types: List[ValueType]): List[StagedSymbolicNum] = types match { + case Nil => Nil + case t :: ts => + val v = popS(t) + val rest = takeS(ts) + v :: rest + } + + def print(): Rep[Unit] = { + "stack-print".reflectCtrlWith[Unit]() + } + + def size: Rep[Int] = { + "stack-size".reflectCtrlWith[Int]() + } + } + + object Frames { + def getC(i: Int)(implicit ctx: Context): StagedConcreteNum = { + // val offset = ctx.frameTypes.take(i).map(_.size).sum + StagedConcreteNum(ctx.frameTypes(i), "frame-get".reflectCtrlWith[Num](i)) + } + + def getS(i: Int)(implicit ctx: Context): StagedSymbolicNum = { + StagedSymbolicNum(ctx.frameTypes(i), "sym-frame-get".reflectCtrlWith[SymVal](i)) + } + + def setC(i: Int, v: StagedConcreteNum): Rep[Unit] = { + "frame-set".reflectCtrlWith[Unit](i, v.i) + } + + def setS(i: Int, s: StagedSymbolicNum): Rep[Unit] = { + "sym-frame-set".reflectCtrlWith[Unit](i, s.s) + } + + def pushFrameC(locals: List[ValueType]): Rep[Unit] = { + // Predef.println(s"[DEBUG] push frame: $locals") + val size = locals.size + "frame-push".reflectCtrlWith[Unit](size) + } + + def pushFrameS(locals: List[ValueType]): Rep[Unit] = { + // Predef.println(s"[DEBUG] push frame: $locals") + val size = locals.size + "sym-frame-push".reflectCtrlWith[Unit](size) + } + + def popFrameC(size: Int): Rep[Unit] = { + "frame-pop".reflectCtrlWith[Unit](size) + } + + def popFrameS(size: Int): Rep[Unit] = { + "sym-frame-pop".reflectCtrlWith[Unit](size) + } + + def putAllC(args: List[StagedConcreteNum]): Rep[Unit] = { + for ((arg, i) <- args.view.reverse.zipWithIndex) { + Frames.setC(i, arg) + } + } + + def putAllS(args: List[StagedSymbolicNum]): Rep[Unit] = { + for ((arg, i) <- args.view.reverse.zipWithIndex) { + Frames.setS(i, arg) + } + } + } + + object Memory { + // TODO: why this is only one function, rather than `storeInC` and `storeInS`? + // TODO: what should the type of SymVal be? + def storeInt(base: Rep[Int], offset: Int, value: (Rep[Int], StagedSymbolicNum)): Rep[Unit] = { + "memory-store-int".reflectCtrlWith[Unit](base, offset, value._1) + "sym-store-int".reflectCtrlWith[Unit](base, offset, value._2.s) + } + + def loadIntC(base: Rep[Int], offset: Int): StagedConcreteNum = { + StagedConcreteNum(NumType(I32Type), "I32V".reflectCtrlWith[Num]("memory-load-int".reflectCtrlWith[Int](base, offset))) + } + + def loadIntS(base: Rep[Int], offset: Int): StagedSymbolicNum = { + StagedSymbolicNum(NumType(I32Type), "sym-load-int".reflectCtrlWith[SymVal](base, offset)) + } + + // Returns the previous memory size on success, or -1 if the memory cannot be grown. + def grow(delta: Rep[Int]): Rep[Int] = { + "memory-grow".reflectCtrlWith[Int](delta) + } + } + + def resetStacks(): Rep[Unit] = { + "reset-stacks".reflectCtrlWith[Unit]() + } + + def initGlobals(globals: List[RTGlobal]): Rep[Unit] = { + Globals.reserveSpace(globals.size) + for ((g, i) <- globals.view.zipWithIndex) { + val initValue = g.value match { + case n: Num => n + case _ => throw new RuntimeException("Non-numeric global value is not supported yet") + } + Globals.setC(i, toStagedNum(initValue)) + Globals.setS(i, toStagedSymbolicNum(initValue)) + } + } + + // call unreachable + def unreachable(): Rep[Unit] = { + "unreachable".reflectCtrlWith[Unit]() + } + + def info(xs: Rep[_]*): Rep[Unit] = { + "info".reflectCtrlWith[Unit](xs: _*) + } + + // runtime values + object Values { + def I32V(i: Rep[Int]): Rep[Num] = { + "I32V".reflectCtrlWith[Num](i) + } + + def I64V(i: Rep[Long]): Rep[Num] = { + "I64V".reflectCtrlWith[Num](i) + } + } + + // global read/write + object Globals { + def reserveSpace(size: Int): Rep[Unit] = { + "global-reserve".reflectCtrlWith[Unit](size) + "sym-global-reserve".reflectCtrlWith[Unit](size) + } + + def getC(i: Int): StagedConcreteNum = { + StagedConcreteNum(module.globals(i).ty.ty, "global-get".reflectCtrlWith[Num](i)) + } + + def getS(i: Int): StagedSymbolicNum = { + StagedSymbolicNum(module.globals(i).ty.ty, "sym-global-get".reflectCtrlWith[SymVal](i)) + } + + def setC(i: Int, v: StagedConcreteNum): Rep[Unit] = { + "global-set".reflectCtrlWith[Unit](i, v.i) + } + + def setS(i: Int, s: StagedSymbolicNum): Rep[Unit] = { + "sym-global-set".reflectCtrlWith[Unit](i, s.s) + } + } + + // Exploration tree, + object ExploreTree { + def fillWithIfElse(s: Rep[SymVal], id: Int): Rep[Unit] = { + "tree-fill-if-else".reflectCtrlWith[Unit](s, id) + } + + def fillWithFinished(): Rep[Unit] = { + "tree-fill-finished".reflectCtrlWith[Unit]() + } + + def moveCursor(branch: Boolean, control: Rep[Control]): Rep[Unit] = { + // when moving cursor from to an unexplored node, we need to change the reuse state + "tree-move-cursor".reflectCtrlWith[Unit](branch, control) + } + + def print(): Rep[Unit] = { + "tree-print".reflectCtrlWith[Unit]() + } + + def dumpGraphiviz(filePath: String): Rep[Unit] = { + "tree-dump-graphviz".reflectCtrlWith[Unit](filePath) + } + } + + object SymEnv { + def read(sym: Rep[SymVal]): Rep[Num] = { + "sym-env-read".reflectCtrlWith[Num](sym) + } + } + + // runtime Num type + implicit class StagedConcreteNumOps(num: StagedConcreteNum) { + + def makeSymbolic(ty: ValueType): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => + StagedSymbolicNum(NumType(I32Type), "make-symbolic-concrete".reflectCtrlWith[SymVal](num.toInt)) + } + + def toInt: Rep[Int] = "num-to-int".reflectCtrlWith[Int](num.i) + + def isZero(): StagedConcreteNum = num.tipe match { + case NumType(I32Type) => + StagedConcreteNum(NumType(I32Type), Values.I32V("is-zero".reflectCtrlWith[Int](num.toInt))) + } + + def clz(): StagedConcreteNum = num.tipe match { + case NumType(I32Type) => StagedConcreteNum(NumType(I32Type), "clz".reflectCtrlWith[Num](num.i)) + case NumType(I64Type) => StagedConcreteNum(NumType(I64Type), "clz".reflectCtrlWith[Num](num.i)) + } + + def ctz(): StagedConcreteNum = num.tipe match { + case NumType(I32Type) => StagedConcreteNum(NumType(I32Type), "ctz".reflectCtrlWith[Num](num.i)) + case NumType(I64Type) => StagedConcreteNum(NumType(I64Type), "ctz".reflectCtrlWith[Num](num.i)) + } + + def popcnt(): StagedConcreteNum = num.tipe match { + case NumType(I32Type) => StagedConcreteNum(NumType(I32Type), "popcnt".reflectCtrlWith[Num](num.i)) + case NumType(I64Type) => StagedConcreteNum(NumType(I64Type), "popcnt".reflectCtrlWith[Num](num.i)) + } + + def +(rhs: StagedConcreteNum): StagedConcreteNum = (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-add".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-add".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-add".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-add".reflectCtrlWith[Num](num.i, rhs.i)) + } + + def -(rhs: StagedConcreteNum): StagedConcreteNum = (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-sub".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-sub".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-sub".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-sub".reflectCtrlWith[Num](num.i, rhs.i)) + } + + def *(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-mul".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-mul".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-mul".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-mul".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def /(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-div".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-div".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-div".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-div".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def <<(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-shl".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-shl".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-shl".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-shl".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def >>(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-shr".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-shr".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-shr".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-shr".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def &(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "binary-and".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I64Type), "binary-and".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F32Type), NumType(F32Type)) => + StagedConcreteNum(NumType(F32Type), "binary-and".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(F64Type), NumType(F64Type)) => + StagedConcreteNum(NumType(F64Type), "binary-and".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def numEq(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-eq".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-eq".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def numNe(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ne".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ne".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def <(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-lt".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-lt".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def ltu(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ltu".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ltu".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def >(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-gt".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-gt".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def gtu(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-gtu".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-gtu".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def <=(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-le".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-le".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def leu(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-leu".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-leu".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def >=(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ge".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-ge".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + + def geu(rhs: StagedConcreteNum): StagedConcreteNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedConcreteNum(NumType(I32Type), "relation-geu".reflectCtrlWith[Num](num.i, rhs.i)) + case (NumType(I64Type), NumType(I64Type)) => + StagedConcreteNum(NumType(I32Type), "relation-geu".reflectCtrlWith[Num](num.i, rhs.i)) + } + } + } + + implicit class StagedSymbolicNumOps(num: StagedSymbolicNum) { + def makeSymbolic(ty: ValueType): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => StagedSymbolicNum(NumType(I32Type), "make-symbolic".reflectCtrlWith[SymVal](num.s)) + case _ => throw new RuntimeException("Symbol index must be an i32") + } + + def isZero(): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => StagedSymbolicNum(NumType(I32Type), "sym-is-zero".reflectCtrlWith[SymVal](num.s)) + } + + def clz(): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => StagedSymbolicNum(NumType(I32Type), "sym-clz".reflectCtrlWith[SymVal](num.s)) + case NumType(I64Type) => StagedSymbolicNum(NumType(I64Type), "sym-clz".reflectCtrlWith[SymVal](num.s)) + } + + def ctz(): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => StagedSymbolicNum(NumType(I32Type), "sym-ctz".reflectCtrlWith[SymVal](num.s)) + case NumType(I64Type) => StagedSymbolicNum(NumType(I64Type), "sym-ctz".reflectCtrlWith[SymVal](num.s)) + } + + def popcnt(): StagedSymbolicNum = num.tipe match { + case NumType(I32Type) => StagedSymbolicNum(NumType(I32Type), "sym-popcnt".reflectCtrlWith[SymVal](num.s)) + case NumType(I64Type) => StagedSymbolicNum(NumType(I64Type), "sym-popcnt".reflectCtrlWith[SymVal](num.s)) + } + + def +(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-add".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-add".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-add".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-add".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def -(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-sub".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-sub".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-sub".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-sub".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def *(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-mul".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-mul".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-mul".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-mul".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def /(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-div".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-div".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-div".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-div".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def <<(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-shl".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-shl".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-shl".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-shl".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def >>(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-shr".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-shr".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-shr".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-shr".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def &(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-binary-and".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I64Type), "sym-binary-and".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F32Type), NumType(F32Type)) => + StagedSymbolicNum(NumType(F32Type), "sym-binary-and".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(F64Type), NumType(F64Type)) => + StagedSymbolicNum(NumType(F64Type), "sym-binary-and".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def numEq(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-eq".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-eq".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def numNe(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-ne".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-ne".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def <(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-lt".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-lt".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def ltu(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "relation-ltu".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "relation-ltu".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def >(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-gt".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-gt".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def gtu(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-gtu".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-gtu".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def <=(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-le".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-le".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def leu(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-leu".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-leu".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def >=(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-ge".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-ge".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + + def geu(rhs: StagedSymbolicNum): StagedSymbolicNum = { + (num.tipe, rhs.tipe) match { + case (NumType(I32Type), NumType(I32Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-geu".reflectCtrlWith[SymVal](num.s, rhs.s)) + case (NumType(I64Type), NumType(I64Type)) => + StagedSymbolicNum(NumType(I32Type), "sym-relation-geu".reflectCtrlWith[SymVal](num.s, rhs.s)) + } + } + } + + implicit class SymbolicOps(s: Rep[SymVal]) { + def not(): Rep[SymVal] = { + "sym-not".reflectCtrlWith(s) + } + } +} + +trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase { + // clear include path and headers by first + includePaths.clear() + headers.clear() + + registerHeader("headers", "\"wasm.hpp\"") + registerHeader("") + registerHeader("") + registerHeader("") + registerHeader("") + + override def mayInline(n: Node): Boolean = n match { + case Node(_, "stack-pop", _, _) + | Node(_, "stack-peek", _, _) + | Node(_, "sym-stack-pop", _, _) + => false + case _ => super.mayInline(n) + } + + override def remap(m: Manifest[_]): String = { + if (m.toString.endsWith("Num")) "Num" + else if (m.toString.endsWith("Frame")) "Frame" + else if (m.toString.endsWith("Stack")) "Stack" + else if (m.toString.endsWith("Global")) "Global" + else if (m.toString.endsWith("I32V")) "I32V" + else if (m.toString.endsWith("I64V")) "I64V" + else if (m.toString.endsWith("SymVal")) "SymVal" + else if (m.toString.endsWith("Snapshot")) "Snapshot_t" + else super.remap(m) + } + + override def traverse(n: Node): Unit = n match { + case Node(_, "stack-push", List(value), _) => + emit("Stack.push("); shallow(value); emit(");\n") + case Node(_, "sym-stack-push", List(s_value), _) => + emit("SymStack.push("); shallow(s_value); emit(");\n") + case Node(_, "stack-drop", List(n), _) => + emit("Stack.drop("); shallow(n); emit(");\n") + case Node(_, "stack-init", _, _) => + emit("Stack.initialize();\n") + case Node(_, "stack-print", _, _) => + emit("Stack.print();\n") + case Node(_, "frame-push", List(i), _) => + emit("Frames.pushFrame("); shallow(i); emit(");\n") + case Node(_, "sym-frame-push", List(i), _) => + emit("SymFrames.pushFrame("); shallow(i); emit(");\n") + case Node(_, "frame-pop", List(i), _) => + emit("Frames.popFrame("); shallow(i); emit(");\n") + case Node(_, "frame-set", List(i, value), _) => + emit("Frames.set("); shallow(i); emit(", "); shallow(value); emit(");\n") + case Node(_, "sym-frame-set", List(i, s_value), _) => + emit("SymFrames.set("); shallow(i); emit(", "); shallow(s_value); emit(");\n") + // Note: The following code is copied from the traverse of CppBackend.scala, try to avoid duplicated code + case n @ Node(f, "λ", (b: LMSBlock)::LMSConst(0)::rest, _) => + // TODO: Is a leading block followed by 0 a hint for top function? + super.traverse(n) + case n @ Node(f, "λ", (b: LMSBlock)::rest, _) => + val retType = remap(typeBlockRes(b.res)) + val argTypes = b.in.map(a => remap(typeMap(a))).mkString(", ") + emitln(s"std::function<$retType(${argTypes})> ${quote(f)};") + emit(quote(f)); emit(" = ") + // We need to capture by value here, because we want to save a function in + // snapshot, and use the function later, while the local variables have + // been released. + quoteTypedBlock(b, false, true, capture = "=") + emitln(";") + case _ => super.traverse(n) + } + + override def shallow(n: Node): Unit = n match { + case Node(_, "reset-stacks", _, _) => + emit("reset_stacks()") + case Node(_, "frame-get", List(i), _) => + emit("Frames.get("); shallow(i); emit(")") + case Node(_, "sym-frame-get", List(i), _) => + emit("SymFrames.get("); shallow(i); emit(")") + case Node(_, "stack-drop", List(n), _) => + emit("Stack.drop("); shallow(n); emit(")") + case Node(_, "stack-push", List(value), _) => + emit("Stack.push("); shallow(value); emit(")") + case Node(_, "stack-shift", List(offset, size), _) => + emit("Stack.shift("); shallow(offset); emit(", "); shallow(size); emit(")") + case Node(_, "sym-stack-shift", List(offset, size), _) => + emit("SymStack.shift("); shallow(offset); emit(", "); shallow(size); emit(")") + case Node(_, "stack-pop", _, _) => + emit("Stack.pop()") + case Node(_, "sym-stack-pop", _, _) => + emit("SymStack.pop()") + case Node(_, "control-make", List(k, mk), _) => + emit("makeControl("); shallow(k); emit(", "); shallow(mk); emit(")") + case Node(_, "frame-pop", List(i), _) => + emit("Frames.popFrame("); shallow(i); emit(")") + case Node(_, "sym-frame-pop", List(i), _) => + emit("SymFrames.popFrame("); shallow(i); emit(")") + case Node(_, "stack-peek", _, _) => + emit("Stack.peek()") + case Node(_, "sym-stack-peek", _, _) => + emit("SymStack.peek()") + case Node(_, "stack-take", List(n), _) => + emit("Stack.take("); shallow(n); emit(")") + case Node(_, "slice-reverse", List(slice), _) => + shallow(slice); emit(".reverse") + case Node(_, "memory-store-int", List(base, offset, value), _) => + emit("Memory.storeInt("); shallow(base); emit(", "); shallow(offset); emit(", "); shallow(value); emit(")") + case Node(_, "memory-load-int", List(base, offset), _) => + emit("Memory.loadInt("); shallow(base); emit(", "); shallow(offset); emit(")") + case Node(_, "memory-grow", List(delta), _) => + emit("Memory.grow("); shallow(delta); emit(")") + case Node(_, "stack-size", _, _) => + emit("Stack.size()") + // Symbolic Memory + case Node(_, "sym-store-int", List(base, offset, s_value), _) => + emit("SymMemory.storeSym("); shallow(base); emit(", "); shallow(offset); emit(", "); shallow(s_value); emit(")") + case Node(_, "sym-load-int", List(base, offset), _) => + emit("SymMemory.loadSym("); shallow(base); emit(", "); shallow(offset); emit(")") + case Node(_, "sym-memory-grow", List(delta), _) => + emit("SymMemory.grow("); shallow(delta); emit(")") + // Globals + case Node(_, "global-get", List(i), _) => + emit("Globals.get("); shallow(i); emit(")") + case Node(_, "sym-global-get", List(i), _) => + emit("SymGlobals.get("); shallow(i); emit(")") + case Node(_, "global-set", List(i, value), _) => + emit("Globals.set("); shallow(i); emit(", "); shallow(value); emit(")") + case Node(_, "sym-global-set", List(i, s_value), _) => + emit("SymGlobals.set("); shallow(i); emit(", "); shallow(s_value); emit(")") + case Node(_, "global-reserve", List(i), _) => + emit("Globals.pushFrame("); shallow(i); emit(")") + case Node(_, "sym-global-reserve", List(i), _) => + emit("SymGlobals.pushFrame("); shallow(i); emit(")") + case Node(_, "is-zero", List(num), _) => + emit("(0 == "); shallow(num); emit(")") + case Node(_, "sym-is-zero", List(s_num), _) => + shallow(s_num); emit(".is_zero()") + case Node(_, "binary-add", List(lhs, rhs), _) => + shallow(lhs); emit(" + "); shallow(rhs) + case Node(_, "binary-sub", List(lhs, rhs), _) => + // todo: avoid using c++ operator, use explicit method call so operator's precedence issues won't exist + emit("("); shallow(lhs); emit(" - "); shallow(rhs); emit(")") + case Node(_, "binary-mul", List(lhs, rhs), _) => + shallow(lhs); emit(" * "); shallow(rhs) + case Node(_, "binary-div", List(lhs, rhs), _) => + shallow(lhs); emit(" / "); shallow(rhs) + case Node(_, "binary-shl", List(lhs, rhs), _) => + shallow(lhs); emit(" << "); shallow(rhs) + case Node(_, "binary-shr", List(lhs, rhs), _) => + shallow(lhs); emit(" >> "); shallow(rhs) + case Node(_, "binary-and", List(lhs, rhs), _) => + shallow(lhs); emit(" & "); shallow(rhs) + case Node(_, "relation-eq", List(lhs, rhs), _) => + shallow(lhs); emit(" == "); shallow(rhs) + case Node(_, "relation-ne", List(lhs, rhs), _) => + shallow(lhs); emit(" != "); shallow(rhs) + case Node(_, "relation-lt", List(lhs, rhs), _) => + shallow(lhs); emit(" < "); shallow(rhs) + case Node(_, "relation-ltu", List(lhs, rhs), _) => + shallow(lhs); emit(" < "); shallow(rhs) + case Node(_, "relation-gt", List(lhs, rhs), _) => + shallow(lhs); emit(" > "); shallow(rhs) + case Node(_, "relation-gtu", List(lhs, rhs), _) => + shallow(lhs); emit(" > "); shallow(rhs) + case Node(_, "relation-le", List(lhs, rhs), _) => + shallow(lhs); emit(" <= "); shallow(rhs) + case Node(_, "relation-leu", List(lhs, rhs), _) => + shallow(lhs); emit(" <= "); shallow(rhs) + case Node(_, "relation-ge", List(lhs, rhs), _) => + shallow(lhs); emit(" >= "); shallow(rhs) + case Node(_, "relation-geu", List(lhs, rhs), _) => + shallow(lhs); emit(" >= "); shallow(rhs) + case Node(_, "sym-binary-add", List(lhs, rhs), _) => + shallow(lhs); emit(".add("); shallow(rhs); emit(")") + case Node(_, "sym-binary-sub", List(lhs, rhs), _) => + shallow(lhs); emit(".minus("); shallow(rhs); emit(")") + case Node(_, "sym-binary-mul", List(lhs, rhs), _) => + shallow(lhs); emit(".mul("); shallow(rhs); emit(")") + case Node(_, "sym-binary-div", List(lhs, rhs), _) => + shallow(lhs); emit(".div("); shallow(rhs); emit(")") + case Node(_, "sym-binary-and", List(lhs, rhs), _) => + shallow(lhs); emit(".bitwise_and("); shallow(rhs); emit(")") + case Node(_, "sym-relation-le", List(lhs, rhs), _) => + shallow(lhs); emit(".le("); shallow(rhs); emit(")") + case Node(_, "sym-relation-leu", List(lhs, rhs), _) => + shallow(lhs); emit(".leu("); shallow(rhs); emit(")") + case Node(_, "sym-relation-lt", List(lhs, rhs), _) => + shallow(lhs); emit(".lt("); shallow(rhs); emit(")") + case Node(_, "sym-relation-ge", List(lhs, rhs), _) => + shallow(lhs); emit(".ge("); shallow(rhs); emit(")") + case Node(_, "sym-relation-geu", List(lhs, rhs), _) => + shallow(lhs); emit(".geu("); shallow(rhs); emit(")") + case Node(_, "sym-relation-eq", List(lhs, rhs), _) => + shallow(lhs); emit(".eq("); shallow(rhs); emit(")") + case Node(_, "sym-relation-ne", List(lhs, rhs), _) => + shallow(lhs); emit(".neq("); shallow(rhs); emit(")") + case Node(_, "sym-relation-gt", List(lhs, rhs), _) => + shallow(lhs); emit(".gt("); shallow(rhs); emit(")") + case Node(_, "num-to-int", List(num), _) => + shallow(num); emit(".toInt()") + case Node(_, "make-symbolic", List(num), _) => + shallow(num); emit(".makeSymbolic()") + case Node(_, "make-symbolic-concrete", List(num), _) => + emit("make_symbolic("); shallow(num); emit(")") + case Node(_, "sym-env-read", List(sym), _) => + emit("SymEnv.read("); shallow(sym); emit(")") + case Node(_, "assert-true", List(cond), _) => + emit("GENSYM_ASSERT("); shallow(cond); emit(")") + case Node(_, "tree-fill-if-else", List(sym, id), _) => + emit("ExploreTree.fillIfElseNode("); shallow(sym); emit(", "); emit(id.toString); emit(")") + case Node(_, "tree-fill-finished", List(), _) => + emit("ExploreTree.fillFinishedNode()") + case Node(_, "tree-move-cursor", List(b, snapshot), _) => + emit("ExploreTree.moveCursor("); shallow(b); emit(", "); shallow(snapshot); emit(")") + case Node(_, "add-instr-cost", List(n), _) => + emit("CostManager.add_instr_cost("); shallow(n); emit(")") + case Node(_, "tree-print", List(), _) => + emit("ExploreTree.print()") + case Node(_, "tree-dump-graphviz", List(f), _) => + emit("ExploreTree.dump_graphviz("); shallow(f); emit(")") + case Node(_, "sym-not", List(s), _) => + shallow(s); emit(".negate()") + case Node(_, "dummy", _, _) => emit("std::monostate()") + case Node(_, "dummy-op", _, _) => emit("std::monostate()") + case Node(_, "no-op", _, _) => + emit("std::monostate()") + case _ => super.shallow(n) + } + + override def registerTopLevelFunction(id: String, streamId: String = "general")(f: => Unit) = + if (!registeredFunctions(id)) { + //if (ongoingFun(streamId)) ??? + //ongoingFun += streamId + registeredFunctions += id + withStream(functionsStreams.getOrElseUpdate(id, { + val functionsStream = new java.io.ByteArrayOutputStream() + val functionsWriter = new java.io.PrintStream(functionsStream) + (functionsWriter, functionsStream) + })._1)(f) + //ongoingFun -= streamId + } else { + // If a function is registered, don't re-register it. + // withStream(functionsStreams(id)._1)(f) + } + + override def emitAll(g: Graph, name: String)(m1: Manifest[_], m2: Manifest[_]): Unit = { + val ng = init(g) + emitHeaders(stream) + emitln(""" + |/***************************************** + |Emitting Generated Code + |*******************************************/ + """.stripMargin) + val src = run(name, ng) + emitFunctionDecls(stream) + emitDatastructures(stream) + emitFunctions(stream) + emit(src) + emitln(s""" + |/***************************************** + |End of Generated Code + |*******************************************/ + |int main(int argc, char *argv[]) { + | start_concolic_execution_with(Snippet, ${Counter.currentId}); + | return 0; + |}""".stripMargin) + } +} + +trait WasmToCppCompilerDriver[A, B] extends CppSAIDriver[A, B] with StagedWasmEvaluator { q => + override val codegen = new StagedWasmCppGen { + val IR: q.type = q + import IR._ + } +} + +object WasmToCppCompiler { + case class GeneratedCpp(source: String, headerFolders: List[String]) + + def compile(moduleInst: ModuleInstance, main: Option[String], printRes: Boolean): GeneratedCpp = { + println(s"Now compiling wasm module with entry function $main") + val driver = new WasmToCppCompilerDriver[Unit, Unit] { + def module: ModuleInstance = moduleInst + def snippet(x: Rep[Unit]): Rep[Unit] = { + evalTop(main, printRes) + } + } + GeneratedCpp(driver.code, driver.codegen.includePaths.toList) + } + + def compileToExe(moduleInst: ModuleInstance, + main: Option[String], + outputCpp: String, + outputExe: String, + printRes: Boolean, + optimizeLevel: Int, + macros: String*): Unit = { + val generated = compile(moduleInst, main, printRes) + val code = generated.source + + val writer = new java.io.PrintWriter(new java.io.File(outputCpp)) + try { + writer.write(code) + } finally { + writer.close() + } + + import sys.process._ + val includeFlags = generated.headerFolders.map(f => s"-I$f").mkString(" ") + val macroFlags = macros.map(m => s"-D$m").mkString(" ") + val command = s"g++ -std=c++17 $outputCpp -o $outputExe -O$optimizeLevel -g -l z3 " + includeFlags + " " + macroFlags + if (command.! != 0) { + throw new RuntimeException(s"Compilation failed for $outputCpp") + } + } + +} + + diff --git a/src/main/scala/wasm/StagedMiniWasm.scala b/src/main/scala/wasm/StagedMiniWasm.scala index 2e22e7a7..ea9dc9c6 100644 --- a/src/main/scala/wasm/StagedMiniWasm.scala +++ b/src/main/scala/wasm/StagedMiniWasm.scala @@ -1,4 +1,4 @@ -package gensym.wasm.miniwasm +package gensym.wasm.stagedminiwasm import scala.collection.mutable.{ArrayBuffer, HashMap} @@ -12,6 +12,7 @@ import lms.core.Graph import gensym.wasm.ast._ import gensym.wasm.ast.{Const => WasmConst, Block => WasmBlock} +import gensym.wasm.miniwasm.ModuleInstance import gensym.lmsx.{SAIDriver, StringOps, SAIOps, SAICodeGenBase, CppSAIDriver, CppSAICodeGenBase} @virtualize @@ -433,10 +434,10 @@ trait StagedWasmEvaluator extends SAIOps { def push(v: StagedNum)(implicit ctx: Context): Context = { v match { - case I32(v) => NumType(I32Type); "stack-push".reflectCtrlWith[Unit](v) - case I64(v) => NumType(I64Type); "stack-push".reflectCtrlWith[Unit](v) - case F32(v) => NumType(F32Type); "stack-push".reflectCtrlWith[Unit](v) - case F64(v) => NumType(F64Type); "stack-push".reflectCtrlWith[Unit](v) + case I32(v) => "stack-push".reflectCtrlWith[Unit](v) + case I64(v) => "stack-push".reflectCtrlWith[Unit](v) + case F32(v) => "stack-push".reflectCtrlWith[Unit](v) + case F64(v) => "stack-push".reflectCtrlWith[Unit](v) } ctx.push(v.tipe) } diff --git a/src/test/scala/genwasym/TestStagedConcolicEval.scala b/src/test/scala/genwasym/TestStagedConcolicEval.scala new file mode 100644 index 00000000..86f55daa --- /dev/null +++ b/src/test/scala/genwasym/TestStagedConcolicEval.scala @@ -0,0 +1,181 @@ +package gensym.wasm + +import org.scalatest.FunSuite + +import lms.core.stub.Adapter + +import gensym.wasm.miniwasm.{ModuleInstance} +import gensym.wasm.parser._ +import gensym.wasm.stagedconcolicminiwasm._ + +class TestStagedConcolicEval extends FunSuite { + def testFileConcolicCpp(filename: String, + main: Option[String] = None, + exitByCoverage: Boolean = false) = { + import sys.process._ + + + val moduleInst = ModuleInstance(Parser.parseFile(filename)) + val cppFile = s"$filename.cpp" + val exploreTreeFile = { + // Do concolic execution with snapshot reuse + val exe = s"$cppFile.exe" + val exploreTreeFile = s"$filename.tree.dot" + WasmToCppCompiler.compileToExe(moduleInst, main, cppFile, exe, true, optimizeLevel=0, if (exitByCoverage) "BY_COVERAGE" else "EARLY_EXIT") + println(s"Running compiled concolic execution with snapshot reuse: $exe") + val result = Process(s"./$exe", None, "TREE_FILE" -> exploreTreeFile).!! + println(result) + exploreTreeFile + } + val exploreTreeFileNoReuse = { + // Do concolic execution without snapshot reuse + val exe = s"$cppFile.noreuse.exe" + val exploreTreeFile = s"$filename.noreuse.tree.dot" + WasmToCppCompiler.compileToExe(moduleInst, main, cppFile, exe, false, optimizeLevel=0, if (exitByCoverage) "BY_COVERAGE" else "EARLY_EXIT") + println(s"Running compiled concolic execution without snapshot reuse: $exe") + val result = Process(s"./$exe", None, "TREE_FILE" -> exploreTreeFile).!! + println(result) + exploreTreeFile + } + val exploreTreeFileImm = { + // Do concolic execution with immutable data structure and snapshot reuse + val exe = s"$cppFile.imm.exe" + val exploreTreeFile = s"$filename.imm.tree.dot" + WasmToCppCompiler.compileToExe(moduleInst, main, cppFile, exe, true, optimizeLevel=0, if (exitByCoverage) "BY_COVERAGE" else "EARLY_EXIT", "USE_IMM") + println(s"Running compiled concolic execution with immutable data structure and snapshot reuse: $exe") + val result = Process(s"./$exe", None, "TREE_FILE" -> exploreTreeFile).!! + println(result) + exploreTreeFile + } + // The explore tree generated by two executions should be same + import java.nio.file.Files + assert( + Files.readAllBytes(java.nio.file.Paths.get(exploreTreeFile)) + sameElements Files.readAllBytes(java.nio.file.Paths.get(exploreTreeFileNoReuse)), + s"Explore trees $exploreTreeFile and $exploreTreeFileNoReuse are different!" + ) + assert( + Files.readAllBytes(java.nio.file.Paths.get(exploreTreeFile)) + sameElements Files.readAllBytes(java.nio.file.Paths.get(exploreTreeFileImm)), + s"Explore trees $exploreTreeFile and $exploreTreeFileImm are different!" + ) + } + + // only test concrete execution and its result + def testFileConcreteCpp(filename: String, main: Option[String] = None, expect: Option[List[Float]] = None) = { + val moduleInst = ModuleInstance(Parser.parseFile(filename)) + val cppFile = s"$filename.cpp" + val exe = s"$cppFile.exe" + WasmToCppCompiler.compileToExe(moduleInst, main, cppFile, exe, true, optimizeLevel=0, "NO_INFO", "RUN_ONCE", "USE_IMM") + + import sys.process._ + val result = s"./$exe".!! + println(result) + + expect.map(vs => { + val stackValues = result + .split("Stack contents: \n")(1) + .split("\n") + .map(_.toFloat) + .toList + assert(vs == stackValues) + }) + } + + test("ack-cpp-concolic") { testFileConcolicCpp("./benchmarks/wasm/ack.wat", Some("real_main")) } + + test("bug-finding-concolic") { + testFileConcolicCpp("./benchmarks/wasm/branch-strip-buggy.wat", Some("real_main")) + } + + test("brtable-bug-finding-concolic") { + testFileConcolicCpp("./benchmarks/wasm/staged/brtable_concolic.wat") + } + + test("bug-finding-cov-concolic") { + testFileConcolicCpp("./benchmarks/wasm/branch-strip-buggy.wat", Some("real_main"), exitByCoverage=true) + } + + test("brtable-bug-finding-cov-concolic") { + testFileConcolicCpp("./benchmarks/wasm/staged/brtable_concolic.wat", exitByCoverage=true) + } + + test("simple-global-bug-finding-cov-concolic") { + testFileConcolicCpp("./benchmarks/wasm/staged/simple_global.wat", Some("real_main"), exitByCoverage=true) + } + + test("mem-sym-concolic") { + testFileConcolicCpp("./benchmarks/wasm/mem-sym.wat", None, exitByCoverage=true) + } + + test("mem-sym-extract-concolic") { + testFileConcolicCpp("./benchmarks/wasm/mem-sym-extract.wat", None, exitByCoverage=true) + } + test("btree-bug-finding-concolic") { testFileConcolicCpp("./benchmarks/wasm/btree/2o1u-unlabeled.wat", exitByCoverage = true) } + + test("long-trivial-execution-concrete") { + // This is a example to show how much performance improvement we can get by immutable data structure + testFileConcreteCpp("./benchmarks/wasm/staged/long-trivial-execution.wat", None) + } + + test("return-poly - concrete") { + testFileConcreteCpp("./benchmarks/wasm/staged/return_poly.wat", Some("$real_main"), expect=Some(List(42))) + } + test("ack-cpp - concrete") { testFileConcreteCpp("./benchmarks/wasm/ack.wat", Some("real_main"), expect=Some(List(7))) } + test("power - concrete") { testFileConcreteCpp("./benchmarks/wasm/pow.wat", Some("real_main"), expect=Some(List(1024))) } + test("start - concrete") { testFileConcreteCpp("./benchmarks/wasm/start.wat") } + test("fact - concrete") { testFileConcreteCpp("./benchmarks/wasm/fact.wat", None, expect=Some(List(120))) } + // TODO: Waiting more symbolic operators' implementations + // test("loop - concrete") { testFileConcreteCpp("./benchmarks/wasm/loop.wat", None, expect=Some(List(10))) } + test("even-odd - concrete") { testFileConcreteCpp("./benchmarks/wasm/even_odd.wat", None, expect=Some(List(1))) } + test("global - concrete") { testFileConcreteCpp("./benchmarks/wasm/global-sym.wat", None) } + // TODO: Waiting symbolic memory's implementations + test("load - concrete") { testFileConcreteCpp("./benchmarks/wasm/load.wat", None, expect=Some(List(1))) } + test("load overflow 1 - concrete") { testFileConcreteCpp("./benchmarks/wasm/load-overflow1.wat", None, expect=Some(List(1))) } + test("load overflow 2 - concrete") { testFileConcreteCpp("./benchmarks/wasm/load-overflow2.wat", None, expect=Some(List(1))) } + + test("load offset - concrete") { testFileConcreteCpp("./benchmarks/wasm/load-offset.wat", None, expect=Some(List(1))) } + + // test("btree - concrete") { testFileConcreteCpp("./benchmarks/wasm/btree/2o1u-unlabeled.wat") } + test("fib - concrete") { testFileConcreteCpp("./benchmarks/wasm/fib.wat", None, expect=Some(List(144))) } + test("tribonacci - concrete") { testFileConcreteCpp("./benchmarks/wasm/tribonacci.wat", None, expect=Some(List(504))) } + + // test("return - concrete") { + // Since all of the thrown exceptions had been captured in concolic driver, this test is not valid anymore + // intercept[java.lang.RuntimeException] { + // testFileConcreteCpp("./benchmarks/wasm/return.wat", Some("$real_main")) + // } + // } + + test("return_call - concrete") { + testFileConcreteCpp("./benchmarks/wasm/sum.wat", Some("sum10"), expect=Some(List(55))) + } + + test("block input - concrete") { + testFileConcreteCpp("./benchmarks/wasm/block.wat", Some("real_main"), expect=Some(List(9))) + } + test("loop block input - concrete") { + testFileConcreteCpp("./benchmarks/wasm/block.wat", Some("test_loop_input"), expect=Some(List(55))) + } + test("if block input - concrete") { + testFileConcreteCpp("./benchmarks/wasm/block.wat", Some("test_if_input"), expect=Some(List(25))) + } + test("block input - poly br - concrete") { + testFileConcreteCpp("./benchmarks/wasm/block.wat", Some("test_poly_br"), expect=Some(List(0))) + } + test("loop block - poly br - concrete") { + testFileConcreteCpp("./benchmarks/wasm/loop_poly.wat", None, expect=Some(List(2, 1))) + } + + test("brtable-cpp - concrete") { + testFileConcreteCpp("./benchmarks/wasm/staged/brtable.wat") + } + + test("large-branch-concrete") { + testFileConcreteCpp("./benchmarks/wasm/compare_wasp/large-branch.wat") + } + + test("small-snapshot-concrete") { + testFileConcreteCpp("./benchmarks/wasm/compare_wasp/small-snapshot.wat", Some("main")) + } +} diff --git a/src/test/scala/genwasym/TestStagedEval.scala b/src/test/scala/genwasym/TestStagedEval.scala index d4d1e960..3769428f 100644 --- a/src/test/scala/genwasym/TestStagedEval.scala +++ b/src/test/scala/genwasym/TestStagedEval.scala @@ -6,6 +6,7 @@ import lms.core.stub.Adapter import gensym.wasm.parser._ import gensym.wasm.miniwasm._ +import gensym.wasm.stagedminiwasm._ class TestStagedEval extends FunSuite { def testFileToScala(filename: String, main: Option[String] = None, printRes: Boolean = false) = {