'개소리 왈왈 > 정치관련 신세한탄' 카테고리의 다른 글
인류문명의 멸망이 전쟁때문이 아니게 될 줄이야 (2) | 2021.11.08 |
---|---|
휴가 1일차 (0) | 2021.10.27 |
누리호 성공 (0) | 2021.10.21 |
최고의 대응책 (0) | 2021.07.07 |
지옥에 온 것을 환영하오 낮선이여!! (0) | 2021.04.29 |
인류문명의 멸망이 전쟁때문이 아니게 될 줄이야 (2) | 2021.11.08 |
---|---|
휴가 1일차 (0) | 2021.10.27 |
누리호 성공 (0) | 2021.10.21 |
최고의 대응책 (0) | 2021.07.07 |
지옥에 온 것을 환영하오 낮선이여!! (0) | 2021.04.29 |
옛날부터 쓰던 녀석인데
앞쪽으로 해서 보니 먼가 쇳가루 같은게 많아서 열어보니 전부 프라스틱 렌즈인데
LED쪽은 탔고 맞은편도 쇳구라와 열로 인한건진 모르겠으나
약간 우둘두둘한게 녹은건지 쇳가루로 인해서 갈린건진 모르게 손상이 있다.
그나저나 먼가 기구가 있어서 좀 효율적으로(?) 반사경이 있는줄 알았는데
앞에 렌즈로 촛점만 맞추는 식이라 어떻게 보면 촛점을 맞추면 오히려 어두워 지는 느낌이었는데
전체 광량에서는 손해보는게 맞는 걸지도?
라이트 손..상? (0) | 2023.05.21 |
---|---|
이런.. 자전거대행진 신청 실패 (0) | 2021.11.09 |
붕어가 되었군 -_ㅠ (0) | 2021.06.06 |
자전거 라이트 + 배터리 도착! (0) | 2021.05.06 |
안녕 엔도몬도 (0) | 2020.12.31 |
window USB VID,PID enumeration (0) | 2022.04.27 |
---|---|
c# postgresql 패키지 (0) | 2022.04.27 |
c# thread (0) | 2021.10.20 |
Dispatcher / Control BeginInvoke() (0) | 2021.10.20 |
this.BeginInvoke()가 느려! (0) | 2021.10.20 |
wasm 파일은 바이너리라 열어봐도 내용이 안보이는데, 크롬으로 실행하고 디버거로 보면 텍스트로 변환(?) 된다.
단순한(?!) hello world 하나 출력할 뿐인데 드럽게 기네
(module
(func $wasi_snapshot_preview1.fd_write (;0;) (import "wasi_snapshot_preview1" "fd_write") (param i32 i32 i32 i32) (result i32))
(func $env.emscripten_memcpy_big (;1;) (import "env" "emscripten_memcpy_big") (param i32 i32 i32) (result i32))
(func $env.setTempRet0 (;2;) (import "env" "setTempRet0") (param i32))
(table $__indirect_function_table (;0;) (export "__indirect_function_table") 6 6 funcref)
(memory $memory (;0;) (export "memory") 256 256)
(global $global0 (mut i32) (i32.const 5245984))
(global $global1 (mut i32) (i32.const 0))
(global $global2 (mut i32) (i32.const 0))
(elem $elem0 (i32.const 1) funcref (ref.func $func9) (ref.func $func8) (ref.func $func10) (ref.func $func41) (ref.func $func42))
(func $__wasm_call_ctors (;3;) (export "__wasm_call_ctors")
call $emscripten_stack_init
call $func24
)
(func $func4 (result i32)
(local $var0 i32) (local $var1 i32) (local $var2 i32) (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32)
global.get $global0
local.set $var0
i32.const 16
local.set $var1
local.get $var0
local.get $var1
i32.sub
local.set $var2
local.get $var2
global.set $global0
i32.const 0
local.set $var3
local.get $var2
local.get $var3
i32.store offset=12
i32.const 1078
local.set $var4
i32.const 0
local.set $var5
local.get $var4
local.get $var5
call $func44
drop
i32.const 0
local.set $var6
i32.const 16
local.set $var7
local.get $var2
local.get $var7
i32.add
local.set $var8
local.get $var8
global.set $global0
local.get $var6
return
)
(func $main (;5;) (export "main") (param $var0 i32) (param $var1 i32) (result i32)
(local $var2 i32)
call $func4
local.set $var2
local.get $var2
return
)
(func $__errno_location (;6;) (export "__errno_location") (result i32)
i32.const 1744
)
(func $func7 (param $var0 i32) (result i32)
block $label0
local.get $var0
br_if $label0
i32.const 0
return
end $label0
call $__errno_location
local.get $var0
i32.store
i32.const -1
)
(func $func8 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32)
global.get $global0
i32.const 32
i32.sub
local.tee $var3
global.set $global0
local.get $var3
local.get $var0
i32.load offset=28
local.tee $var4
i32.store offset=16
local.get $var0
i32.load offset=20
local.set $var5
local.get $var3
local.get $var2
i32.store offset=28
local.get $var3
local.get $var1
i32.store offset=24
local.get $var3
local.get $var5
local.get $var4
i32.sub
local.tee $var1
i32.store offset=20
local.get $var1
local.get $var2
i32.add
local.set $var6
i32.const 2
local.set $var7
local.get $var3
i32.const 16
i32.add
local.set $var1
block $label4
block $label2
block $label1
block $label0
local.get $var0
i32.load offset=60
local.get $var3
i32.const 16
i32.add
i32.const 2
local.get $var3
i32.const 12
i32.add
call $wasi_snapshot_preview1.fd_write
call $func7
br_if $label0
loop $label3
local.get $var6
local.get $var3
i32.load offset=12
local.tee $var4
i32.eq
br_if $label1
local.get $var4
i32.const -1
i32.le_s
br_if $label2
local.get $var1
local.get $var4
local.get $var1
i32.load offset=4
local.tee $var8
i32.gt_u
local.tee $var5
i32.const 3
i32.shl
i32.add
local.tee $var9
local.get $var9
i32.load
local.get $var4
local.get $var8
i32.const 0
local.get $var5
select
i32.sub
local.tee $var8
i32.add
i32.store
local.get $var1
i32.const 12
i32.const 4
local.get $var5
select
i32.add
local.tee $var9
local.get $var9
i32.load
local.get $var8
i32.sub
i32.store
local.get $var6
local.get $var4
i32.sub
local.set $var6
local.get $var0
i32.load offset=60
local.get $var1
i32.const 8
i32.add
local.get $var1
local.get $var5
select
local.tee $var1
local.get $var7
local.get $var5
i32.sub
local.tee $var7
local.get $var3
i32.const 12
i32.add
call $wasi_snapshot_preview1.fd_write
call $func7
i32.eqz
br_if $label3
end $label3
end $label0
local.get $var6
i32.const -1
i32.ne
br_if $label2
end $label1
local.get $var0
local.get $var0
i32.load offset=44
local.tee $var1
i32.store offset=28
local.get $var0
local.get $var1
i32.store offset=20
local.get $var0
local.get $var1
local.get $var0
i32.load offset=48
i32.add
i32.store offset=16
local.get $var2
local.set $var4
br $label4
end $label2
i32.const 0
local.set $var4
local.get $var0
i32.const 0
i32.store offset=28
local.get $var0
i64.const 0
i64.store offset=16
local.get $var0
local.get $var0
i32.load
i32.const 32
i32.or
i32.store
local.get $var7
i32.const 2
i32.eq
br_if $label4
local.get $var2
local.get $var1
i32.load offset=4
i32.sub
local.set $var4
end $label4
local.get $var3
i32.const 32
i32.add
global.set $global0
local.get $var4
)
(func $func9 (param $var0 i32) (result i32)
i32.const 0
)
(func $func10 (param $var0 i32) (param $var1 i64) (param $var2 i32) (result i64)
i64.const 0
)
(func $func11 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i64)
block $label0
local.get $var2
i32.eqz
br_if $label0
local.get $var2
local.get $var0
i32.add
local.tee $var3
i32.const -1
i32.add
local.get $var1
i32.store8
local.get $var0
local.get $var1
i32.store8
local.get $var2
i32.const 3
i32.lt_u
br_if $label0
local.get $var3
i32.const -2
i32.add
local.get $var1
i32.store8
local.get $var0
local.get $var1
i32.store8 offset=1
local.get $var3
i32.const -3
i32.add
local.get $var1
i32.store8
local.get $var0
local.get $var1
i32.store8 offset=2
local.get $var2
i32.const 7
i32.lt_u
br_if $label0
local.get $var3
i32.const -4
i32.add
local.get $var1
i32.store8
local.get $var0
local.get $var1
i32.store8 offset=3
local.get $var2
i32.const 9
i32.lt_u
br_if $label0
local.get $var0
i32.const 0
local.get $var0
i32.sub
i32.const 3
i32.and
local.tee $var4
i32.add
local.tee $var3
local.get $var1
i32.const 255
i32.and
i32.const 16843009
i32.mul
local.tee $var1
i32.store
local.get $var3
local.get $var2
local.get $var4
i32.sub
i32.const -4
i32.and
local.tee $var4
i32.add
local.tee $var2
i32.const -4
i32.add
local.get $var1
i32.store
local.get $var4
i32.const 9
i32.lt_u
br_if $label0
local.get $var3
local.get $var1
i32.store offset=8
local.get $var3
local.get $var1
i32.store offset=4
local.get $var2
i32.const -8
i32.add
local.get $var1
i32.store
local.get $var2
i32.const -12
i32.add
local.get $var1
i32.store
local.get $var4
i32.const 25
i32.lt_u
br_if $label0
local.get $var3
local.get $var1
i32.store offset=24
local.get $var3
local.get $var1
i32.store offset=20
local.get $var3
local.get $var1
i32.store offset=16
local.get $var3
local.get $var1
i32.store offset=12
local.get $var2
i32.const -16
i32.add
local.get $var1
i32.store
local.get $var2
i32.const -20
i32.add
local.get $var1
i32.store
local.get $var2
i32.const -24
i32.add
local.get $var1
i32.store
local.get $var2
i32.const -28
i32.add
local.get $var1
i32.store
local.get $var4
local.get $var3
i32.const 4
i32.and
i32.const 24
i32.or
local.tee $var5
i32.sub
local.tee $var2
i32.const 32
i32.lt_u
br_if $label0
local.get $var1
i64.extend_i32_u
i64.const 4294967297
i64.mul
local.set $var6
local.get $var3
local.get $var5
i32.add
local.set $var1
loop $label1
local.get $var1
local.get $var6
i64.store offset=24
local.get $var1
local.get $var6
i64.store offset=16
local.get $var1
local.get $var6
i64.store offset=8
local.get $var1
local.get $var6
i64.store
local.get $var1
i32.const 32
i32.add
local.set $var1
local.get $var2
i32.const -32
i32.add
local.tee $var2
i32.const 31
i32.gt_u
br_if $label1
end $label1
end $label0
local.get $var0
)
(func $func12 (param $var0 i32) (result i32)
local.get $var0
i32.const -48
i32.add
i32.const 10
i32.lt_u
)
(func $func13 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32) (local $var4 i32)
local.get $var2
i32.const 0
i32.ne
local.set $var3
block $label3
block $label1
block $label0
local.get $var0
i32.const 3
i32.and
i32.eqz
br_if $label0
local.get $var2
i32.eqz
br_if $label0
local.get $var1
i32.const 255
i32.and
local.set $var4
loop $label2
local.get $var0
i32.load8_u
local.get $var4
i32.eq
br_if $label1
local.get $var2
i32.const -1
i32.add
local.tee $var2
i32.const 0
i32.ne
local.set $var3
local.get $var0
i32.const 1
i32.add
local.tee $var0
i32.const 3
i32.and
i32.eqz
br_if $label0
local.get $var2
br_if $label2
end $label2
end $label0
local.get $var3
i32.eqz
br_if $label3
end $label1
block $label4
local.get $var0
i32.load8_u
local.get $var1
i32.const 255
i32.and
i32.eq
br_if $label4
local.get $var2
i32.const 4
i32.lt_u
br_if $label4
local.get $var1
i32.const 255
i32.and
i32.const 16843009
i32.mul
local.set $var4
loop $label5
local.get $var0
i32.load
local.get $var4
i32.xor
local.tee $var3
i32.const -1
i32.xor
local.get $var3
i32.const -16843009
i32.add
i32.and
i32.const -2139062144
i32.and
br_if $label4
local.get $var0
i32.const 4
i32.add
local.set $var0
local.get $var2
i32.const -4
i32.add
local.tee $var2
i32.const 3
i32.gt_u
br_if $label5
end $label5
end $label4
local.get $var2
i32.eqz
br_if $label3
local.get $var1
i32.const 255
i32.and
local.set $var3
loop $label7
block $label6
local.get $var0
i32.load8_u
local.get $var3
i32.ne
br_if $label6
local.get $var0
return
end $label6
local.get $var0
i32.const 1
i32.add
local.set $var0
local.get $var2
i32.const -1
i32.add
local.tee $var2
br_if $label7
end $label7
end $label3
i32.const 0
)
(func $func14 (param $var0 i32)
)
(func $func15 (param $var0 i32)
)
(func $func16 (result i32)
i32.const 2856
call $func14
i32.const 2864
)
(func $func17
i32.const 2856
call $func15
)
(func $func18 (param $var0 i32) (result i32)
(local $var1 i32)
local.get $var0
local.get $var0
i32.load8_u offset=74
local.tee $var1
i32.const -1
i32.add
local.get $var1
i32.or
i32.store8 offset=74
block $label0
local.get $var0
i32.load
local.tee $var1
i32.const 8
i32.and
i32.eqz
br_if $label0
local.get $var0
local.get $var1
i32.const 32
i32.or
i32.store
i32.const -1
return
end $label0
local.get $var0
i64.const 0
i64.store offset=4 align=4
local.get $var0
local.get $var0
i32.load offset=44
local.tee $var1
i32.store offset=28
local.get $var0
local.get $var1
i32.store offset=20
local.get $var0
local.get $var1
local.get $var0
i32.load offset=48
i32.add
i32.store offset=16
i32.const 0
)
(func $func19 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32) (local $var4 i32) (local $var5 i32)
block $label0
local.get $var2
i32.const 512
i32.lt_u
br_if $label0
local.get $var0
local.get $var1
local.get $var2
call $env.emscripten_memcpy_big
drop
local.get $var0
return
end $label0
local.get $var0
local.get $var2
i32.add
local.set $var3
block $label8
block $label1
local.get $var1
local.get $var0
i32.xor
i32.const 3
i32.and
br_if $label1
block $label3
block $label2
local.get $var0
i32.const 3
i32.and
br_if $label2
local.get $var0
local.set $var2
br $label3
end $label2
block $label4
local.get $var2
i32.const 1
i32.ge_s
br_if $label4
local.get $var0
local.set $var2
br $label3
end $label4
local.get $var0
local.set $var2
loop $label5
local.get $var2
local.get $var1
i32.load8_u
i32.store8
local.get $var1
i32.const 1
i32.add
local.set $var1
local.get $var2
i32.const 1
i32.add
local.tee $var2
i32.const 3
i32.and
i32.eqz
br_if $label3
local.get $var2
local.get $var3
i32.lt_u
br_if $label5
end $label5
end $label3
block $label6
local.get $var3
i32.const -4
i32.and
local.tee $var4
i32.const 64
i32.lt_u
br_if $label6
local.get $var2
local.get $var4
i32.const -64
i32.add
local.tee $var5
i32.gt_u
br_if $label6
loop $label7
local.get $var2
local.get $var1
i32.load
i32.store
local.get $var2
local.get $var1
i32.load offset=4
i32.store offset=4
local.get $var2
local.get $var1
i32.load offset=8
i32.store offset=8
local.get $var2
local.get $var1
i32.load offset=12
i32.store offset=12
local.get $var2
local.get $var1
i32.load offset=16
i32.store offset=16
local.get $var2
local.get $var1
i32.load offset=20
i32.store offset=20
local.get $var2
local.get $var1
i32.load offset=24
i32.store offset=24
local.get $var2
local.get $var1
i32.load offset=28
i32.store offset=28
local.get $var2
local.get $var1
i32.load offset=32
i32.store offset=32
local.get $var2
local.get $var1
i32.load offset=36
i32.store offset=36
local.get $var2
local.get $var1
i32.load offset=40
i32.store offset=40
local.get $var2
local.get $var1
i32.load offset=44
i32.store offset=44
local.get $var2
local.get $var1
i32.load offset=48
i32.store offset=48
local.get $var2
local.get $var1
i32.load offset=52
i32.store offset=52
local.get $var2
local.get $var1
i32.load offset=56
i32.store offset=56
local.get $var2
local.get $var1
i32.load offset=60
i32.store offset=60
local.get $var1
i32.const 64
i32.add
local.set $var1
local.get $var2
i32.const 64
i32.add
local.tee $var2
local.get $var5
i32.le_u
br_if $label7
end $label7
end $label6
local.get $var2
local.get $var4
i32.ge_u
br_if $label8
loop $label9
local.get $var2
local.get $var1
i32.load
i32.store
local.get $var1
i32.const 4
i32.add
local.set $var1
local.get $var2
i32.const 4
i32.add
local.tee $var2
local.get $var4
i32.lt_u
br_if $label9
br $label8
end $label9
unreachable
end $label1
block $label10
local.get $var3
i32.const 4
i32.ge_u
br_if $label10
local.get $var0
local.set $var2
br $label8
end $label10
block $label11
local.get $var3
i32.const -4
i32.add
local.tee $var4
local.get $var0
i32.ge_u
br_if $label11
local.get $var0
local.set $var2
br $label8
end $label11
local.get $var0
local.set $var2
loop $label12
local.get $var2
local.get $var1
i32.load8_u
i32.store8
local.get $var2
local.get $var1
i32.load8_u offset=1
i32.store8 offset=1
local.get $var2
local.get $var1
i32.load8_u offset=2
i32.store8 offset=2
local.get $var2
local.get $var1
i32.load8_u offset=3
i32.store8 offset=3
local.get $var1
i32.const 4
i32.add
local.set $var1
local.get $var2
i32.const 4
i32.add
local.tee $var2
local.get $var4
i32.le_u
br_if $label12
end $label12
end $label8
block $label13
local.get $var2
local.get $var3
i32.ge_u
br_if $label13
loop $label14
local.get $var2
local.get $var1
i32.load8_u
i32.store8
local.get $var1
i32.const 1
i32.add
local.set $var1
local.get $var2
i32.const 1
i32.add
local.tee $var2
local.get $var3
i32.ne
br_if $label14
end $label14
end $label13
local.get $var0
)
(func $func20 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32) (local $var4 i32) (local $var5 i32)
block $label1
block $label0
local.get $var2
i32.load offset=16
local.tee $var3
br_if $label0
i32.const 0
local.set $var4
local.get $var2
call $func18
br_if $label1
local.get $var2
i32.load offset=16
local.set $var3
end $label0
block $label2
local.get $var3
local.get $var2
i32.load offset=20
local.tee $var5
i32.sub
local.get $var1
i32.ge_u
br_if $label2
local.get $var2
local.get $var0
local.get $var1
local.get $var2
i32.load offset=36
call_indirect (param i32 i32 i32) (result i32)
return
end $label2
block $label4
block $label3
local.get $var2
i32.load8_s offset=75
i32.const 0
i32.ge_s
br_if $label3
i32.const 0
local.set $var3
br $label4
end $label3
local.get $var1
local.set $var4
loop $label6
block $label5
local.get $var4
local.tee $var3
br_if $label5
i32.const 0
local.set $var3
br $label4
end $label5
local.get $var0
local.get $var3
i32.const -1
i32.add
local.tee $var4
i32.add
i32.load8_u
i32.const 10
i32.ne
br_if $label6
end $label6
local.get $var2
local.get $var0
local.get $var3
local.get $var2
i32.load offset=36
call_indirect (param i32 i32 i32) (result i32)
local.tee $var4
local.get $var3
i32.lt_u
br_if $label1
local.get $var0
local.get $var3
i32.add
local.set $var0
local.get $var1
local.get $var3
i32.sub
local.set $var1
local.get $var2
i32.load offset=20
local.set $var5
end $label4
local.get $var5
local.get $var0
local.get $var1
call $func19
drop
local.get $var2
local.get $var2
i32.load offset=20
local.get $var1
i32.add
i32.store offset=20
local.get $var3
local.get $var1
i32.add
local.set $var4
end $label1
local.get $var4
)
(func $func21 (result i32)
i32.const 42
)
(func $func22 (result i32)
call $func21
)
(func $func23 (result i32)
i32.const 2868
)
(func $func24
i32.const 0
i32.const 2792
i32.const 40
i32.add
i32.store offset=3036
i32.const 0
call $func22
i32.store offset=2904
)
(func $func25 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32)
i32.const 1
local.set $var3
block $label1
block $label0
local.get $var0
i32.eqz
br_if $label0
local.get $var1
i32.const 127
i32.le_u
br_if $label1
block $label3
block $label2
call $func23
i32.load offset=168
i32.load
br_if $label2
local.get $var1
i32.const -128
i32.and
i32.const 57216
i32.eq
br_if $label1
call $__errno_location
i32.const 25
i32.store
br $label3
end $label2
block $label4
local.get $var1
i32.const 2047
i32.gt_u
br_if $label4
local.get $var0
local.get $var1
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=1
local.get $var0
local.get $var1
i32.const 6
i32.shr_u
i32.const 192
i32.or
i32.store8
i32.const 2
return
end $label4
block $label6
block $label5
local.get $var1
i32.const 55296
i32.lt_u
br_if $label5
local.get $var1
i32.const -8192
i32.and
i32.const 57344
i32.ne
br_if $label6
end $label5
local.get $var0
local.get $var1
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=2
local.get $var0
local.get $var1
i32.const 12
i32.shr_u
i32.const 224
i32.or
i32.store8
local.get $var0
local.get $var1
i32.const 6
i32.shr_u
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=1
i32.const 3
return
end $label6
block $label7
local.get $var1
i32.const -65536
i32.add
i32.const 1048575
i32.gt_u
br_if $label7
local.get $var0
local.get $var1
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=3
local.get $var0
local.get $var1
i32.const 18
i32.shr_u
i32.const 240
i32.or
i32.store8
local.get $var0
local.get $var1
i32.const 6
i32.shr_u
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=2
local.get $var0
local.get $var1
i32.const 12
i32.shr_u
i32.const 63
i32.and
i32.const 128
i32.or
i32.store8 offset=1
i32.const 4
return
end $label7
call $__errno_location
i32.const 25
i32.store
end $label3
i32.const -1
local.set $var3
end $label0
local.get $var3
return
end $label1
local.get $var0
local.get $var1
i32.store8
i32.const 1
)
(func $func26 (param $var0 i32) (param $var1 i32) (result i32)
block $label0
local.get $var0
br_if $label0
i32.const 0
return
end $label0
local.get $var0
local.get $var1
i32.const 0
call $func25
)
(func $func27 (param $var0 f64) (param $var1 i32) (result f64)
(local $var2 i64) (local $var3 i32)
block $label0
local.get $var0
i64.reinterpret_f64
local.tee $var2
i64.const 52
i64.shr_u
i32.wrap_i64
i32.const 2047
i32.and
local.tee $var3
i32.const 2047
i32.eq
br_if $label0
block $label1
local.get $var3
br_if $label1
block $label3
block $label2
local.get $var0
f64.const 0.0
f64.ne
br_if $label2
i32.const 0
local.set $var3
br $label3
end $label2
local.get $var0
f64.const 18446744073709552000
f64.mul
local.get $var1
call $func27
local.set $var0
local.get $var1
i32.load
i32.const -64
i32.add
local.set $var3
end $label3
local.get $var1
local.get $var3
i32.store
local.get $var0
return
end $label1
local.get $var1
local.get $var3
i32.const -1022
i32.add
i32.store
local.get $var2
i64.const -9218868437227405313
i64.and
i64.const 4602678819172646912
i64.or
f64.reinterpret_i64
local.set $var0
end $label0
local.get $var0
)
(func $func28 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
(local $var4 i64)
block $label1
block $label0
local.get $var3
i32.const 64
i32.and
i32.eqz
br_if $label0
local.get $var1
local.get $var3
i32.const -64
i32.add
i64.extend_i32_u
i64.shl
local.set $var2
i64.const 0
local.set $var1
br $label1
end $label0
local.get $var3
i32.eqz
br_if $label1
local.get $var1
i32.const 64
local.get $var3
i32.sub
i64.extend_i32_u
i64.shr_u
local.get $var2
local.get $var3
i64.extend_i32_u
local.tee $var4
i64.shl
i64.or
local.set $var2
local.get $var1
local.get $var4
i64.shl
local.set $var1
end $label1
local.get $var0
local.get $var1
i64.store
local.get $var0
local.get $var2
i64.store offset=8
)
(func $func29 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
(local $var4 i64)
block $label1
block $label0
local.get $var3
i32.const 64
i32.and
i32.eqz
br_if $label0
local.get $var2
local.get $var3
i32.const -64
i32.add
i64.extend_i32_u
i64.shr_u
local.set $var1
i64.const 0
local.set $var2
br $label1
end $label0
local.get $var3
i32.eqz
br_if $label1
local.get $var2
i32.const 64
local.get $var3
i32.sub
i64.extend_i32_u
i64.shl
local.get $var1
local.get $var3
i64.extend_i32_u
local.tee $var4
i64.shr_u
i64.or
local.set $var1
local.get $var2
local.get $var4
i64.shr_u
local.set $var2
end $label1
local.get $var0
local.get $var1
i64.store
local.get $var0
local.get $var2
i64.store offset=8
)
(func $func30 (param $var0 i64) (param $var1 i64) (result f64)
(local $var2 i32) (local $var3 i32) (local $var4 i64) (local $var5 i64)
global.get $global0
i32.const 32
i32.sub
local.tee $var2
global.set $global0
block $label2
block $label0
local.get $var1
i64.const 9223372036854775807
i64.and
local.tee $var4
i64.const -4323737117252386816
i64.add
local.get $var4
i64.const -4899634919602388992
i64.add
i64.ge_u
br_if $label0
local.get $var0
i64.const 60
i64.shr_u
local.get $var1
i64.const 4
i64.shl
i64.or
local.set $var4
block $label1
local.get $var0
i64.const 1152921504606846975
i64.and
local.tee $var0
i64.const 576460752303423489
i64.lt_u
br_if $label1
local.get $var4
i64.const 4611686018427387905
i64.add
local.set $var5
br $label2
end $label1
local.get $var4
i64.const 4611686018427387904
i64.add
local.set $var5
local.get $var0
i64.const 576460752303423488
i64.xor
i64.const 0
i64.ne
br_if $label2
local.get $var5
local.get $var4
i64.const 1
i64.and
i64.add
local.set $var5
br $label2
end $label0
block $label3
local.get $var0
i64.eqz
local.get $var4
i64.const 9223090561878065152
i64.lt_u
local.get $var4
i64.const 9223090561878065152
i64.eq
select
br_if $label3
local.get $var0
i64.const 60
i64.shr_u
local.get $var1
i64.const 4
i64.shl
i64.or
i64.const 2251799813685247
i64.and
i64.const 9221120237041090560
i64.or
local.set $var5
br $label2
end $label3
i64.const 9218868437227405312
local.set $var5
local.get $var4
i64.const 4899634919602388991
i64.gt_u
br_if $label2
i64.const 0
local.set $var5
local.get $var4
i64.const 48
i64.shr_u
i32.wrap_i64
local.tee $var3
i32.const 15249
i32.lt_u
br_if $label2
local.get $var2
i32.const 16
i32.add
local.get $var0
local.get $var1
i64.const 281474976710655
i64.and
i64.const 281474976710656
i64.or
local.tee $var4
local.get $var3
i32.const -15233
i32.add
call $func28
local.get $var2
local.get $var0
local.get $var4
i32.const 15361
local.get $var3
i32.sub
call $func29
local.get $var2
i64.load
local.tee $var4
i64.const 60
i64.shr_u
local.get $var2
i32.const 8
i32.add
i64.load
i64.const 4
i64.shl
i64.or
local.set $var5
block $label4
local.get $var4
i64.const 1152921504606846975
i64.and
local.get $var2
i64.load offset=16
local.get $var2
i32.const 16
i32.add
i32.const 8
i32.add
i64.load
i64.or
i64.const 0
i64.ne
i64.extend_i32_u
i64.or
local.tee $var4
i64.const 576460752303423489
i64.lt_u
br_if $label4
local.get $var5
i64.const 1
i64.add
local.set $var5
br $label2
end $label4
local.get $var4
i64.const 576460752303423488
i64.xor
i64.const 0
i64.ne
br_if $label2
local.get $var5
i64.const 1
i64.and
local.get $var5
i64.add
local.set $var5
end $label2
local.get $var2
i32.const 32
i32.add
global.set $global0
local.get $var5
local.get $var1
i64.const -9223372036854775808
i64.and
i64.or
f64.reinterpret_i64
)
(func $func31 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
(local $var5 i32) (local $var6 i32) (local $var7 i32)
global.get $global0
i32.const 208
i32.sub
local.tee $var5
global.set $global0
local.get $var5
local.get $var2
i32.store offset=204
i32.const 0
local.set $var2
local.get $var5
i32.const 160
i32.add
i32.const 0
i32.const 40
call $func11
drop
local.get $var5
local.get $var5
i32.load offset=204
i32.store offset=200
block $label1
block $label0
i32.const 0
local.get $var1
local.get $var5
i32.const 200
i32.add
local.get $var5
i32.const 80
i32.add
local.get $var5
i32.const 160
i32.add
local.get $var3
local.get $var4
call $func32
i32.const 0
i32.ge_s
br_if $label0
i32.const -1
local.set $var1
br $label1
end $label0
block $label2
local.get $var0
i32.load offset=76
i32.const 0
i32.lt_s
br_if $label2
local.get $var0
call $func45
local.set $var2
end $label2
local.get $var0
i32.load
local.set $var6
block $label3
local.get $var0
i32.load8_s offset=74
i32.const 0
i32.gt_s
br_if $label3
local.get $var0
local.get $var6
i32.const -33
i32.and
i32.store
end $label3
local.get $var6
i32.const 32
i32.and
local.set $var6
block $label5
block $label4
local.get $var0
i32.load offset=48
i32.eqz
br_if $label4
local.get $var0
local.get $var1
local.get $var5
i32.const 200
i32.add
local.get $var5
i32.const 80
i32.add
local.get $var5
i32.const 160
i32.add
local.get $var3
local.get $var4
call $func32
local.set $var1
br $label5
end $label4
local.get $var0
i32.const 80
i32.store offset=48
local.get $var0
local.get $var5
i32.const 80
i32.add
i32.store offset=16
local.get $var0
local.get $var5
i32.store offset=28
local.get $var0
local.get $var5
i32.store offset=20
local.get $var0
i32.load offset=44
local.set $var7
local.get $var0
local.get $var5
i32.store offset=44
local.get $var0
local.get $var1
local.get $var5
i32.const 200
i32.add
local.get $var5
i32.const 80
i32.add
local.get $var5
i32.const 160
i32.add
local.get $var3
local.get $var4
call $func32
local.set $var1
local.get $var7
i32.eqz
br_if $label5
local.get $var0
i32.const 0
i32.const 0
local.get $var0
i32.load offset=36
call_indirect (param i32 i32 i32) (result i32)
drop
local.get $var0
i32.const 0
i32.store offset=48
local.get $var0
local.get $var7
i32.store offset=44
local.get $var0
i32.const 0
i32.store offset=28
local.get $var0
i32.const 0
i32.store offset=16
local.get $var0
i32.load offset=20
local.set $var3
local.get $var0
i32.const 0
i32.store offset=20
local.get $var1
i32.const -1
local.get $var3
select
local.set $var1
end $label5
local.get $var0
local.get $var0
i32.load
local.tee $var3
local.get $var6
i32.or
i32.store
i32.const -1
local.get $var1
local.get $var3
i32.const 32
i32.and
select
local.set $var1
local.get $var2
i32.eqz
br_if $label1
local.get $var0
call $func46
end $label1
local.get $var5
i32.const 208
i32.add
global.set $global0
local.get $var1
)
(func $func32 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (param $var6 i32) (result i32)
(local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i64)
global.get $global0
i32.const 80
i32.sub
local.tee $var7
global.set $global0
local.get $var7
local.get $var1
i32.store offset=76
local.get $var7
i32.const 55
i32.add
local.set $var8
local.get $var7
i32.const 56
i32.add
local.set $var9
i32.const 0
local.set $var10
i32.const 0
local.set $var11
i32.const 0
local.set $var1
block $label24
loop $label8
block $label0
local.get $var11
i32.const 0
i32.lt_s
br_if $label0
block $label1
local.get $var1
i32.const 2147483647
local.get $var11
i32.sub
i32.le_s
br_if $label1
call $__errno_location
i32.const 61
i32.store
i32.const -1
local.set $var11
br $label0
end $label1
local.get $var1
local.get $var11
i32.add
local.set $var11
end $label0
local.get $var7
i32.load offset=76
local.tee $var12
local.set $var1
block $label29
block $label32
block $label45
block $label16
block $label2
local.get $var12
i32.load8_u
local.tee $var13
i32.eqz
br_if $label2
loop $label66
block $label5
block $label4
block $label3
local.get $var13
i32.const 255
i32.and
local.tee $var13
br_if $label3
local.get $var1
local.set $var13
br $label4
end $label3
local.get $var13
i32.const 37
i32.ne
br_if $label5
local.get $var1
local.set $var13
loop $label6
local.get $var1
i32.load8_u offset=1
i32.const 37
i32.ne
br_if $label4
local.get $var7
local.get $var1
i32.const 2
i32.add
local.tee $var14
i32.store offset=76
local.get $var13
i32.const 1
i32.add
local.set $var13
local.get $var1
i32.load8_u offset=2
local.set $var15
local.get $var14
local.set $var1
local.get $var15
i32.const 37
i32.eq
br_if $label6
end $label6
end $label4
local.get $var13
local.get $var12
i32.sub
local.set $var1
block $label7
local.get $var0
i32.eqz
br_if $label7
local.get $var0
local.get $var12
local.get $var1
call $func33
end $label7
local.get $var1
br_if $label8
i32.const -1
local.set $var16
i32.const 1
local.set $var13
local.get $var7
i32.load offset=76
i32.load8_s offset=1
call $func12
local.set $var14
local.get $var7
i32.load offset=76
local.set $var1
block $label9
local.get $var14
i32.eqz
br_if $label9
local.get $var1
i32.load8_u offset=2
i32.const 36
i32.ne
br_if $label9
local.get $var1
i32.load8_s offset=1
i32.const -48
i32.add
local.set $var16
i32.const 1
local.set $var10
i32.const 3
local.set $var13
end $label9
local.get $var7
local.get $var1
local.get $var13
i32.add
local.tee $var1
i32.store offset=76
i32.const 0
local.set $var17
block $label11
block $label10
local.get $var1
i32.load8_s
local.tee $var15
i32.const -32
i32.add
local.tee $var14
i32.const 31
i32.le_u
br_if $label10
local.get $var1
local.set $var13
br $label11
end $label10
i32.const 0
local.set $var17
local.get $var1
local.set $var13
i32.const 1
local.get $var14
i32.shl
local.tee $var14
i32.const 75913
i32.and
i32.eqz
br_if $label11
loop $label12
local.get $var7
local.get $var1
i32.const 1
i32.add
local.tee $var13
i32.store offset=76
local.get $var14
local.get $var17
i32.or
local.set $var17
local.get $var1
i32.load8_s offset=1
local.tee $var15
i32.const -32
i32.add
local.tee $var14
i32.const 32
i32.ge_u
br_if $label11
local.get $var13
local.set $var1
i32.const 1
local.get $var14
i32.shl
local.tee $var14
i32.const 75913
i32.and
br_if $label12
end $label12
end $label11
block $label18
block $label13
local.get $var15
i32.const 42
i32.ne
br_if $label13
block $label15
block $label14
local.get $var13
i32.load8_s offset=1
call $func12
i32.eqz
br_if $label14
local.get $var7
i32.load offset=76
local.tee $var13
i32.load8_u offset=2
i32.const 36
i32.ne
br_if $label14
local.get $var13
i32.load8_s offset=1
i32.const 2
i32.shl
local.get $var4
i32.add
i32.const -192
i32.add
i32.const 10
i32.store
local.get $var13
i32.const 3
i32.add
local.set $var1
local.get $var13
i32.load8_s offset=1
i32.const 3
i32.shl
local.get $var3
i32.add
i32.const -384
i32.add
i32.load
local.set $var18
i32.const 1
local.set $var10
br $label15
end $label14
local.get $var10
br_if $label16
i32.const 0
local.set $var10
i32.const 0
local.set $var18
block $label17
local.get $var0
i32.eqz
br_if $label17
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var1
i32.load
local.set $var18
end $label17
local.get $var7
i32.load offset=76
i32.const 1
i32.add
local.set $var1
end $label15
local.get $var7
local.get $var1
i32.store offset=76
local.get $var18
i32.const -1
i32.gt_s
br_if $label18
i32.const 0
local.get $var18
i32.sub
local.set $var18
local.get $var17
i32.const 8192
i32.or
local.set $var17
br $label18
end $label13
local.get $var7
i32.const 76
i32.add
call $func34
local.tee $var18
i32.const 0
i32.lt_s
br_if $label16
local.get $var7
i32.load offset=76
local.set $var1
end $label18
i32.const -1
local.set $var19
block $label19
local.get $var1
i32.load8_u
i32.const 46
i32.ne
br_if $label19
block $label20
local.get $var1
i32.load8_u offset=1
i32.const 42
i32.ne
br_if $label20
block $label21
local.get $var1
i32.load8_s offset=2
call $func12
i32.eqz
br_if $label21
local.get $var7
i32.load offset=76
local.tee $var1
i32.load8_u offset=3
i32.const 36
i32.ne
br_if $label21
local.get $var1
i32.load8_s offset=2
i32.const 2
i32.shl
local.get $var4
i32.add
i32.const -192
i32.add
i32.const 10
i32.store
local.get $var1
i32.load8_s offset=2
i32.const 3
i32.shl
local.get $var3
i32.add
i32.const -384
i32.add
i32.load
local.set $var19
local.get $var7
local.get $var1
i32.const 4
i32.add
local.tee $var1
i32.store offset=76
br $label19
end $label21
local.get $var10
br_if $label16
block $label23
block $label22
local.get $var0
br_if $label22
i32.const 0
local.set $var19
br $label23
end $label22
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var1
i32.load
local.set $var19
end $label23
local.get $var7
local.get $var7
i32.load offset=76
i32.const 2
i32.add
local.tee $var1
i32.store offset=76
br $label19
end $label20
local.get $var7
local.get $var1
i32.const 1
i32.add
i32.store offset=76
local.get $var7
i32.const 76
i32.add
call $func34
local.set $var19
local.get $var7
i32.load offset=76
local.set $var1
end $label19
i32.const 0
local.set $var13
loop $label25
local.get $var13
local.set $var14
i32.const -1
local.set $var20
local.get $var1
i32.load8_s
i32.const -65
i32.add
i32.const 57
i32.gt_u
br_if $label24
local.get $var7
local.get $var1
i32.const 1
i32.add
local.tee $var15
i32.store offset=76
local.get $var1
i32.load8_s
local.set $var13
local.get $var15
local.set $var1
local.get $var13
local.get $var14
i32.const 58
i32.mul
i32.add
i32.const 1039
i32.add
i32.load8_u
local.tee $var13
i32.const -1
i32.add
i32.const 8
i32.lt_u
br_if $label25
end $label25
block $label30
block $label28
block $label26
local.get $var13
i32.const 19
i32.eq
br_if $label26
local.get $var13
i32.eqz
br_if $label24
block $label27
local.get $var16
i32.const 0
i32.lt_s
br_if $label27
local.get $var4
local.get $var16
i32.const 2
i32.shl
i32.add
local.get $var13
i32.store
local.get $var7
local.get $var3
local.get $var16
i32.const 3
i32.shl
i32.add
i64.load
i64.store offset=64
br $label28
end $label27
local.get $var0
i32.eqz
br_if $label29
local.get $var7
i32.const 64
i32.add
local.get $var13
local.get $var2
local.get $var6
call $func35
local.get $var7
i32.load offset=76
local.set $var15
br $label30
end $label26
i32.const -1
local.set $var20
local.get $var16
i32.const -1
i32.gt_s
br_if $label24
end $label28
i32.const 0
local.set $var1
local.get $var0
i32.eqz
br_if $label8
end $label30
local.get $var17
i32.const -65537
i32.and
local.tee $var21
local.get $var17
local.get $var17
i32.const 8192
i32.and
select
local.set $var13
i32.const 0
local.set $var20
i32.const 1024
local.set $var16
local.get $var9
local.set $var17
block $label34
block $label33
block $label60
block $label59
block $label42
block $label44
block $label39
block $label54
block $label46
block $label35
block $label37
block $label31
block $label38
block $label36
block $label40
block $label41
local.get $var15
i32.const -1
i32.add
i32.load8_s
local.tee $var1
i32.const -33
i32.and
local.get $var1
local.get $var1
i32.const 15
i32.and
i32.const 3
i32.eq
select
local.get $var1
local.get $var14
select
local.tee $var1
i32.const -88
i32.add
br_table $label31 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label33 $label32 $label34 $label35 $label33 $label33 $label33 $label32 $label35 $label32 $label32 $label32 $label32 $label36 $label37 $label38 $label32 $label32 $label39 $label32 $label40 $label32 $label32 $label31 $label41
end $label41
local.get $var9
local.set $var17
block $label43
local.get $var1
i32.const -65
i32.add
br_table $label33 $label32 $label42 $label32 $label33 $label33 $label33 $label43
end $label43
local.get $var1
i32.const 83
i32.eq
br_if $label44
br $label45
end $label40
i32.const 0
local.set $var20
i32.const 1024
local.set $var16
local.get $var7
i64.load offset=64
local.set $var22
br $label46
end $label36
i32.const 0
local.set $var1
block $label53
block $label52
block $label51
block $label50
block $label49
block $label48
block $label47
local.get $var14
i32.const 255
i32.and
br_table $label47 $label48 $label49 $label50 $label51 $label8 $label52 $label53 $label8
end $label47
local.get $var7
i32.load offset=64
local.get $var11
i32.store
br $label8
end $label48
local.get $var7
i32.load offset=64
local.get $var11
i32.store
br $label8
end $label49
local.get $var7
i32.load offset=64
local.get $var11
i64.extend_i32_s
i64.store
br $label8
end $label50
local.get $var7
i32.load offset=64
local.get $var11
i32.store16
br $label8
end $label51
local.get $var7
i32.load offset=64
local.get $var11
i32.store8
br $label8
end $label52
local.get $var7
i32.load offset=64
local.get $var11
i32.store
br $label8
end $label53
local.get $var7
i32.load offset=64
local.get $var11
i64.extend_i32_s
i64.store
br $label8
end $label38
local.get $var19
i32.const 8
local.get $var19
i32.const 8
i32.gt_u
select
local.set $var19
local.get $var13
i32.const 8
i32.or
local.set $var13
i32.const 120
local.set $var1
end $label31
local.get $var7
i64.load offset=64
local.get $var9
local.get $var1
i32.const 32
i32.and
call $func36
local.set $var12
i32.const 0
local.set $var20
i32.const 1024
local.set $var16
local.get $var7
i64.load offset=64
i64.eqz
br_if $label54
local.get $var13
i32.const 8
i32.and
i32.eqz
br_if $label54
local.get $var1
i32.const 4
i32.shr_u
i32.const 1024
i32.add
local.set $var16
i32.const 2
local.set $var20
br $label54
end $label37
i32.const 0
local.set $var20
i32.const 1024
local.set $var16
local.get $var7
i64.load offset=64
local.get $var9
call $func37
local.set $var12
local.get $var13
i32.const 8
i32.and
i32.eqz
br_if $label54
local.get $var19
local.get $var9
local.get $var12
i32.sub
local.tee $var1
i32.const 1
i32.add
local.get $var19
local.get $var1
i32.gt_s
select
local.set $var19
br $label54
end $label35
block $label55
local.get $var7
i64.load offset=64
local.tee $var22
i64.const -1
i64.gt_s
br_if $label55
local.get $var7
i64.const 0
local.get $var22
i64.sub
local.tee $var22
i64.store offset=64
i32.const 1
local.set $var20
i32.const 1024
local.set $var16
br $label46
end $label55
block $label56
local.get $var13
i32.const 2048
i32.and
i32.eqz
br_if $label56
i32.const 1
local.set $var20
i32.const 1025
local.set $var16
br $label46
end $label56
i32.const 1026
i32.const 1024
local.get $var13
i32.const 1
i32.and
local.tee $var20
select
local.set $var16
end $label46
local.get $var22
local.get $var9
call $func38
local.set $var12
end $label54
local.get $var13
i32.const -65537
i32.and
local.get $var13
local.get $var19
i32.const -1
i32.gt_s
select
local.set $var13
block $label57
local.get $var7
i64.load offset=64
local.tee $var22
i64.const 0
i64.ne
br_if $label57
local.get $var19
br_if $label57
i32.const 0
local.set $var19
local.get $var9
local.set $var12
br $label45
end $label57
local.get $var19
local.get $var9
local.get $var12
i32.sub
local.get $var22
i64.eqz
i32.add
local.tee $var1
local.get $var19
local.get $var1
i32.gt_s
select
local.set $var19
br $label45
end $label39
i32.const 0
local.set $var20
local.get $var7
i32.load offset=64
local.tee $var1
i32.const 1071
local.get $var1
select
local.tee $var12
i32.const 0
local.get $var19
call $func13
local.tee $var1
local.get $var12
local.get $var19
i32.add
local.get $var1
select
local.set $var17
local.get $var21
local.set $var13
local.get $var1
local.get $var12
i32.sub
local.get $var19
local.get $var1
select
local.set $var19
br $label32
end $label44
block $label58
local.get $var19
i32.eqz
br_if $label58
local.get $var7
i32.load offset=64
local.set $var14
br $label59
end $label58
i32.const 0
local.set $var1
local.get $var0
i32.const 32
local.get $var18
i32.const 0
local.get $var13
call $func39
br $label60
end $label42
local.get $var7
i32.const 0
i32.store offset=12
local.get $var7
local.get $var7
i64.load offset=64
i64.store32 offset=8
local.get $var7
local.get $var7
i32.const 8
i32.add
i32.store offset=64
i32.const -1
local.set $var19
local.get $var7
i32.const 8
i32.add
local.set $var14
end $label59
i32.const 0
local.set $var1
block $label61
loop $label63
local.get $var14
i32.load
local.tee $var15
i32.eqz
br_if $label61
block $label62
local.get $var7
i32.const 4
i32.add
local.get $var15
call $func26
local.tee $var15
i32.const 0
i32.lt_s
local.tee $var12
br_if $label62
local.get $var15
local.get $var19
local.get $var1
i32.sub
i32.gt_u
br_if $label62
local.get $var14
i32.const 4
i32.add
local.set $var14
local.get $var19
local.get $var15
local.get $var1
i32.add
local.tee $var1
i32.gt_u
br_if $label63
br $label61
end $label62
end $label63
i32.const -1
local.set $var20
local.get $var12
br_if $label24
end $label61
local.get $var0
i32.const 32
local.get $var18
local.get $var1
local.get $var13
call $func39
block $label64
local.get $var1
br_if $label64
i32.const 0
local.set $var1
br $label60
end $label64
i32.const 0
local.set $var14
local.get $var7
i32.load offset=64
local.set $var15
loop $label65
local.get $var15
i32.load
local.tee $var12
i32.eqz
br_if $label60
local.get $var7
i32.const 4
i32.add
local.get $var12
call $func26
local.tee $var12
local.get $var14
i32.add
local.tee $var14
local.get $var1
i32.gt_s
br_if $label60
local.get $var0
local.get $var7
i32.const 4
i32.add
local.get $var12
call $func33
local.get $var15
i32.const 4
i32.add
local.set $var15
local.get $var14
local.get $var1
i32.lt_u
br_if $label65
end $label65
end $label60
local.get $var0
i32.const 32
local.get $var18
local.get $var1
local.get $var13
i32.const 8192
i32.xor
call $func39
local.get $var18
local.get $var1
local.get $var18
local.get $var1
i32.gt_s
select
local.set $var1
br $label8
end $label33
local.get $var0
local.get $var7
f64.load offset=64
local.get $var18
local.get $var19
local.get $var13
local.get $var1
local.get $var5
call_indirect (param i32 f64 i32 i32 i32 i32) (result i32)
local.set $var1
br $label8
end $label34
local.get $var7
local.get $var7
i64.load offset=64
i64.store8 offset=55
i32.const 1
local.set $var19
local.get $var8
local.set $var12
local.get $var9
local.set $var17
local.get $var21
local.set $var13
br $label32
end $label5
local.get $var7
local.get $var1
i32.const 1
i32.add
local.tee $var14
i32.store offset=76
local.get $var1
i32.load8_u offset=1
local.set $var13
local.get $var14
local.set $var1
br $label66
end $label66
unreachable
end $label2
local.get $var11
local.set $var20
local.get $var0
br_if $label24
local.get $var10
i32.eqz
br_if $label29
i32.const 1
local.set $var1
block $label67
loop $label68
local.get $var4
local.get $var1
i32.const 2
i32.shl
i32.add
i32.load
local.tee $var13
i32.eqz
br_if $label67
local.get $var3
local.get $var1
i32.const 3
i32.shl
i32.add
local.get $var13
local.get $var2
local.get $var6
call $func35
i32.const 1
local.set $var20
local.get $var1
i32.const 1
i32.add
local.tee $var1
i32.const 10
i32.ne
br_if $label68
br $label24
end $label68
unreachable
end $label67
i32.const 1
local.set $var20
local.get $var1
i32.const 10
i32.ge_u
br_if $label24
loop $label69
local.get $var4
local.get $var1
i32.const 2
i32.shl
i32.add
i32.load
br_if $label16
i32.const 1
local.set $var20
local.get $var1
i32.const 1
i32.add
local.tee $var1
i32.const 10
i32.eq
br_if $label24
br $label69
end $label69
unreachable
end $label16
i32.const -1
local.set $var20
br $label24
end $label45
local.get $var9
local.set $var17
end $label32
local.get $var0
i32.const 32
local.get $var20
local.get $var17
local.get $var12
i32.sub
local.tee $var15
local.get $var19
local.get $var19
local.get $var15
i32.lt_s
select
local.tee $var17
i32.add
local.tee $var14
local.get $var18
local.get $var18
local.get $var14
i32.lt_s
select
local.tee $var1
local.get $var14
local.get $var13
call $func39
local.get $var0
local.get $var16
local.get $var20
call $func33
local.get $var0
i32.const 48
local.get $var1
local.get $var14
local.get $var13
i32.const 65536
i32.xor
call $func39
local.get $var0
i32.const 48
local.get $var17
local.get $var15
i32.const 0
call $func39
local.get $var0
local.get $var12
local.get $var15
call $func33
local.get $var0
i32.const 32
local.get $var1
local.get $var14
local.get $var13
i32.const 8192
i32.xor
call $func39
br $label8
end $label29
end $label8
i32.const 0
local.set $var20
end $label24
local.get $var7
i32.const 80
i32.add
global.set $global0
local.get $var20
)
(func $func33 (param $var0 i32) (param $var1 i32) (param $var2 i32)
block $label0
local.get $var0
i32.load8_u
i32.const 32
i32.and
br_if $label0
local.get $var1
local.get $var2
local.get $var0
call $func20
drop
end $label0
)
(func $func34 (param $var0 i32) (result i32)
(local $var1 i32) (local $var2 i32) (local $var3 i32)
i32.const 0
local.set $var1
block $label0
local.get $var0
i32.load
i32.load8_s
call $func12
i32.eqz
br_if $label0
loop $label1
local.get $var0
i32.load
local.tee $var2
i32.load8_s
local.set $var3
local.get $var0
local.get $var2
i32.const 1
i32.add
i32.store
local.get $var3
local.get $var1
i32.const 10
i32.mul
i32.add
i32.const -48
i32.add
local.set $var1
local.get $var2
i32.load8_s offset=1
call $func12
br_if $label1
end $label1
end $label0
local.get $var1
)
(func $func35 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32)
block $label0
local.get $var1
i32.const 20
i32.gt_u
br_if $label0
block $label10
block $label9
block $label8
block $label7
block $label6
block $label5
block $label4
block $label3
block $label2
block $label1
local.get $var1
i32.const -9
i32.add
br_table $label1 $label2 $label3 $label4 $label5 $label6 $label7 $label8 $label9 $label10 $label0
end $label1
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i32.load
i32.store
return
end $label2
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load32_s
i64.store
return
end $label3
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load32_u
i64.store
return
end $label4
local.get $var2
local.get $var2
i32.load
i32.const 7
i32.add
i32.const -8
i32.and
local.tee $var1
i32.const 8
i32.add
i32.store
local.get $var0
local.get $var1
i64.load
i64.store
return
end $label5
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load16_s
i64.store
return
end $label6
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load16_u
i64.store
return
end $label7
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load8_s
i64.store
return
end $label8
local.get $var2
local.get $var2
i32.load
local.tee $var1
i32.const 4
i32.add
i32.store
local.get $var0
local.get $var1
i64.load8_u
i64.store
return
end $label9
local.get $var2
local.get $var2
i32.load
i32.const 7
i32.add
i32.const -8
i32.and
local.tee $var1
i32.const 8
i32.add
i32.store
local.get $var0
local.get $var1
f64.load
f64.store
return
end $label10
local.get $var0
local.get $var2
local.get $var3
call_indirect (param i32 i32)
end $label0
)
(func $func36 (param $var0 i64) (param $var1 i32) (param $var2 i32) (result i32)
(local $var3 i32)
block $label0
local.get $var0
i64.eqz
br_if $label0
loop $label1
local.get $var1
i32.const -1
i32.add
local.tee $var1
local.get $var0
i32.wrap_i64
i32.const 15
i32.and
i32.const 1568
i32.add
i32.load8_u
local.get $var2
i32.or
i32.store8
local.get $var0
i64.const 15
i64.gt_u
local.set $var3
local.get $var0
i64.const 4
i64.shr_u
local.set $var0
local.get $var3
br_if $label1
end $label1
end $label0
local.get $var1
)
(func $func37 (param $var0 i64) (param $var1 i32) (result i32)
(local $var2 i32)
block $label0
local.get $var0
i64.eqz
br_if $label0
loop $label1
local.get $var1
i32.const -1
i32.add
local.tee $var1
local.get $var0
i32.wrap_i64
i32.const 7
i32.and
i32.const 48
i32.or
i32.store8
local.get $var0
i64.const 7
i64.gt_u
local.set $var2
local.get $var0
i64.const 3
i64.shr_u
local.set $var0
local.get $var2
br_if $label1
end $label1
end $label0
local.get $var1
)
(func $func38 (param $var0 i64) (param $var1 i32) (result i32)
(local $var2 i64) (local $var3 i32) (local $var4 i32) (local $var5 i32)
block $label1
block $label0
local.get $var0
i64.const 4294967296
i64.ge_u
br_if $label0
local.get $var0
local.set $var2
br $label1
end $label0
loop $label2
local.get $var1
i32.const -1
i32.add
local.tee $var1
local.get $var0
local.get $var0
i64.const 10
i64.div_u
local.tee $var2
i64.const 10
i64.mul
i64.sub
i32.wrap_i64
i32.const 48
i32.or
i32.store8
local.get $var0
i64.const 42949672959
i64.gt_u
local.set $var3
local.get $var2
local.set $var0
local.get $var3
br_if $label2
end $label2
end $label1
block $label3
local.get $var2
i32.wrap_i64
local.tee $var3
i32.eqz
br_if $label3
loop $label4
local.get $var1
i32.const -1
i32.add
local.tee $var1
local.get $var3
local.get $var3
i32.const 10
i32.div_u
local.tee $var4
i32.const 10
i32.mul
i32.sub
i32.const 48
i32.or
i32.store8
local.get $var3
i32.const 9
i32.gt_u
local.set $var5
local.get $var4
local.set $var3
local.get $var5
br_if $label4
end $label4
end $label3
local.get $var1
)
(func $func39 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32)
(local $var5 i32)
global.get $global0
i32.const 256
i32.sub
local.tee $var5
global.set $global0
block $label0
local.get $var4
i32.const 73728
i32.and
br_if $label0
local.get $var2
local.get $var3
i32.le_s
br_if $label0
local.get $var5
local.get $var1
i32.const 255
i32.and
local.get $var2
local.get $var3
i32.sub
local.tee $var2
i32.const 256
local.get $var2
i32.const 256
i32.lt_u
local.tee $var3
select
call $func11
drop
block $label1
local.get $var3
br_if $label1
loop $label2
local.get $var0
local.get $var5
i32.const 256
call $func33
local.get $var2
i32.const -256
i32.add
local.tee $var2
i32.const 255
i32.gt_u
br_if $label2
end $label2
end $label1
local.get $var0
local.get $var5
local.get $var2
call $func33
end $label0
local.get $var5
i32.const 256
i32.add
global.set $global0
)
(func $func40 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
local.get $var0
local.get $var1
local.get $var2
i32.const 4
i32.const 5
call $func31
)
(func $func41 (param $var0 i32) (param $var1 f64) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (result i32)
(local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i32) (local $var23 i32) (local $var24 i64) (local $var25 i64) (local $var26 f64)
global.get $global0
i32.const 560
i32.sub
local.tee $var6
global.set $global0
i32.const 0
local.set $var7
local.get $var6
i32.const 0
i32.store offset=44
block $label1
block $label0
local.get $var1
call $func43
local.tee $var24
i64.const -1
i64.gt_s
br_if $label0
i32.const 1
local.set $var8
i32.const 1034
local.set $var9
local.get $var1
f64.neg
local.tee $var1
call $func43
local.set $var24
br $label1
end $label0
block $label2
local.get $var4
i32.const 2048
i32.and
i32.eqz
br_if $label2
i32.const 1
local.set $var8
i32.const 1037
local.set $var9
br $label1
end $label2
i32.const 1040
i32.const 1035
local.get $var4
i32.const 1
i32.and
local.tee $var8
select
local.set $var9
local.get $var8
i32.eqz
local.set $var7
end $label1
block $label4
block $label3
local.get $var24
i64.const 9218868437227405312
i64.and
i64.const 9218868437227405312
i64.ne
br_if $label3
local.get $var0
i32.const 32
local.get $var2
local.get $var8
i32.const 3
i32.add
local.tee $var10
local.get $var4
i32.const -65537
i32.and
call $func39
local.get $var0
local.get $var9
local.get $var8
call $func33
local.get $var0
i32.const 1053
i32.const 1061
local.get $var5
i32.const 32
i32.and
local.tee $var11
select
i32.const 1057
i32.const 1065
local.get $var11
select
local.get $var1
local.get $var1
f64.ne
select
i32.const 3
call $func33
local.get $var0
i32.const 32
local.get $var2
local.get $var10
local.get $var4
i32.const 8192
i32.xor
call $func39
br $label4
end $label3
local.get $var6
i32.const 16
i32.add
local.set $var12
block $label7
block $label8
block $label6
block $label5
local.get $var1
local.get $var6
i32.const 44
i32.add
call $func27
local.tee $var1
local.get $var1
f64.add
local.tee $var1
f64.const 0.0
f64.eq
br_if $label5
local.get $var6
local.get $var6
i32.load offset=44
local.tee $var11
i32.const -1
i32.add
i32.store offset=44
local.get $var5
i32.const 32
i32.or
local.tee $var13
i32.const 97
i32.ne
br_if $label6
br $label7
end $label5
local.get $var5
i32.const 32
i32.or
local.tee $var13
i32.const 97
i32.eq
br_if $label7
i32.const 6
local.get $var3
local.get $var3
i32.const 0
i32.lt_s
select
local.set $var14
local.get $var6
i32.load offset=44
local.set $var15
br $label8
end $label6
local.get $var6
local.get $var11
i32.const -29
i32.add
local.tee $var15
i32.store offset=44
i32.const 6
local.get $var3
local.get $var3
i32.const 0
i32.lt_s
select
local.set $var14
local.get $var1
f64.const 268435456
f64.mul
local.set $var1
end $label8
local.get $var6
i32.const 48
i32.add
local.get $var6
i32.const 336
i32.add
local.get $var15
i32.const 0
i32.lt_s
select
local.tee $var16
local.set $var17
loop $label11
block $label10
block $label9
local.get $var1
f64.const 4294967296
f64.lt
local.get $var1
f64.const 0.0
f64.ge
i32.and
i32.eqz
br_if $label9
local.get $var1
i32.trunc_f64_u
local.set $var11
br $label10
end $label9
i32.const 0
local.set $var11
end $label10
local.get $var17
local.get $var11
i32.store
local.get $var17
i32.const 4
i32.add
local.set $var17
local.get $var1
local.get $var11
f64.convert_i32_u
f64.sub
f64.const 1000000000
f64.mul
local.tee $var1
f64.const 0.0
f64.ne
br_if $label11
end $label11
block $label13
block $label12
local.get $var15
i32.const 1
i32.ge_s
br_if $label12
local.get $var15
local.set $var3
local.get $var17
local.set $var11
local.get $var16
local.set $var18
br $label13
end $label12
local.get $var16
local.set $var18
local.get $var15
local.set $var3
loop $label18
local.get $var3
i32.const 29
local.get $var3
i32.const 29
i32.lt_s
select
local.set $var3
block $label14
local.get $var17
i32.const -4
i32.add
local.tee $var11
local.get $var18
i32.lt_u
br_if $label14
local.get $var3
i64.extend_i32_u
local.set $var25
i64.const 0
local.set $var24
loop $label15
local.get $var11
local.get $var11
i64.load32_u
local.get $var25
i64.shl
local.get $var24
i64.const 4294967295
i64.and
i64.add
local.tee $var24
local.get $var24
i64.const 1000000000
i64.div_u
local.tee $var24
i64.const 1000000000
i64.mul
i64.sub
i64.store32
local.get $var11
i32.const -4
i32.add
local.tee $var11
local.get $var18
i32.ge_u
br_if $label15
end $label15
local.get $var24
i32.wrap_i64
local.tee $var11
i32.eqz
br_if $label14
local.get $var18
i32.const -4
i32.add
local.tee $var18
local.get $var11
i32.store
end $label14
block $label16
loop $label17
local.get $var17
local.tee $var11
local.get $var18
i32.le_u
br_if $label16
local.get $var11
i32.const -4
i32.add
local.tee $var17
i32.load
i32.eqz
br_if $label17
end $label17
end $label16
local.get $var6
local.get $var6
i32.load offset=44
local.get $var3
i32.sub
local.tee $var3
i32.store offset=44
local.get $var11
local.set $var17
local.get $var3
i32.const 0
i32.gt_s
br_if $label18
end $label18
end $label13
local.get $var14
i32.const 25
i32.add
i32.const 9
i32.div_s
local.set $var17
block $label19
local.get $var3
i32.const -1
i32.gt_s
br_if $label19
local.get $var17
i32.const 1
i32.add
local.set $var19
local.get $var13
i32.const 102
i32.eq
local.set $var20
loop $label23
i32.const 0
local.get $var3
i32.sub
local.tee $var17
i32.const 9
local.get $var17
i32.const 9
i32.lt_s
select
local.set $var10
block $label22
block $label20
local.get $var18
local.get $var11
i32.ge_u
br_if $label20
i32.const 1000000000
local.get $var10
i32.shr_u
local.set $var21
i32.const -1
local.get $var10
i32.shl
i32.const -1
i32.xor
local.set $var22
i32.const 0
local.set $var3
local.get $var18
local.set $var17
loop $label21
local.get $var17
local.get $var17
i32.load
local.tee $var23
local.get $var10
i32.shr_u
local.get $var3
i32.add
i32.store
local.get $var23
local.get $var22
i32.and
local.get $var21
i32.mul
local.set $var3
local.get $var17
i32.const 4
i32.add
local.tee $var17
local.get $var11
i32.lt_u
br_if $label21
end $label21
local.get $var18
i32.load
local.set $var17
local.get $var3
i32.eqz
br_if $label22
local.get $var11
local.get $var3
i32.store
local.get $var11
i32.const 4
i32.add
local.set $var11
br $label22
end $label20
local.get $var18
i32.load
local.set $var17
end $label22
local.get $var6
local.get $var6
i32.load offset=44
local.get $var10
i32.add
local.tee $var3
i32.store offset=44
local.get $var16
local.get $var18
local.get $var17
i32.eqz
i32.const 2
i32.shl
i32.add
local.tee $var18
local.get $var20
select
local.tee $var17
local.get $var19
i32.const 2
i32.shl
i32.add
local.get $var11
local.get $var11
local.get $var17
i32.sub
i32.const 2
i32.shr_s
local.get $var19
i32.gt_s
select
local.set $var11
local.get $var3
i32.const 0
i32.lt_s
br_if $label23
end $label23
end $label19
i32.const 0
local.set $var17
block $label24
local.get $var18
local.get $var11
i32.ge_u
br_if $label24
local.get $var16
local.get $var18
i32.sub
i32.const 2
i32.shr_s
i32.const 9
i32.mul
local.set $var17
i32.const 10
local.set $var3
local.get $var18
i32.load
local.tee $var23
i32.const 10
i32.lt_u
br_if $label24
loop $label25
local.get $var17
i32.const 1
i32.add
local.set $var17
local.get $var23
local.get $var3
i32.const 10
i32.mul
local.tee $var3
i32.ge_u
br_if $label25
end $label25
end $label24
block $label26
local.get $var14
i32.const 0
local.get $var17
local.get $var13
i32.const 102
i32.eq
select
i32.sub
local.get $var13
i32.const 103
i32.eq
local.get $var14
i32.const 0
i32.ne
i32.and
i32.sub
local.tee $var3
local.get $var11
local.get $var16
i32.sub
i32.const 2
i32.shr_s
i32.const 9
i32.mul
i32.const -9
i32.add
i32.ge_s
br_if $label26
local.get $var3
i32.const 9216
i32.add
local.tee $var23
i32.const 9
i32.div_s
local.tee $var21
i32.const 2
i32.shl
local.get $var6
i32.const 48
i32.add
i32.const 4
i32.const 292
local.get $var15
i32.const 0
i32.lt_s
select
i32.add
i32.add
i32.const -4096
i32.add
local.set $var10
i32.const 10
local.set $var3
block $label27
local.get $var23
local.get $var21
i32.const 9
i32.mul
i32.sub
local.tee $var23
i32.const 7
i32.gt_s
br_if $label27
loop $label28
local.get $var3
i32.const 10
i32.mul
local.set $var3
local.get $var23
i32.const 1
i32.add
local.tee $var23
i32.const 8
i32.ne
br_if $label28
end $label28
end $label27
local.get $var10
i32.const 4
i32.add
local.set $var22
block $label30
block $label29
local.get $var10
i32.load
local.tee $var23
local.get $var23
local.get $var3
i32.div_u
local.tee $var19
local.get $var3
i32.mul
i32.sub
local.tee $var21
br_if $label29
local.get $var22
local.get $var11
i32.eq
br_if $label30
end $label29
f64.const 0.5
f64.const 1
f64.const 1.5
local.get $var22
local.get $var11
i32.eq
select
f64.const 1.5
local.get $var21
local.get $var3
i32.const 1
i32.shr_u
local.tee $var22
i32.eq
select
local.get $var21
local.get $var22
i32.lt_u
select
local.set $var26
f64.const 9007199254740994
f64.const 9007199254740992
local.get $var19
i32.const 1
i32.and
select
local.set $var1
block $label31
local.get $var7
br_if $label31
local.get $var9
i32.load8_u
i32.const 45
i32.ne
br_if $label31
local.get $var26
f64.neg
local.set $var26
local.get $var1
f64.neg
local.set $var1
end $label31
local.get $var10
local.get $var23
local.get $var21
i32.sub
local.tee $var23
i32.store
local.get $var1
local.get $var26
f64.add
local.get $var1
f64.eq
br_if $label30
local.get $var10
local.get $var23
local.get $var3
i32.add
local.tee $var17
i32.store
block $label32
local.get $var17
i32.const 1000000000
i32.lt_u
br_if $label32
loop $label34
local.get $var10
i32.const 0
i32.store
block $label33
local.get $var10
i32.const -4
i32.add
local.tee $var10
local.get $var18
i32.ge_u
br_if $label33
local.get $var18
i32.const -4
i32.add
local.tee $var18
i32.const 0
i32.store
end $label33
local.get $var10
local.get $var10
i32.load
i32.const 1
i32.add
local.tee $var17
i32.store
local.get $var17
i32.const 999999999
i32.gt_u
br_if $label34
end $label34
end $label32
local.get $var16
local.get $var18
i32.sub
i32.const 2
i32.shr_s
i32.const 9
i32.mul
local.set $var17
i32.const 10
local.set $var3
local.get $var18
i32.load
local.tee $var23
i32.const 10
i32.lt_u
br_if $label30
loop $label35
local.get $var17
i32.const 1
i32.add
local.set $var17
local.get $var23
local.get $var3
i32.const 10
i32.mul
local.tee $var3
i32.ge_u
br_if $label35
end $label35
end $label30
local.get $var10
i32.const 4
i32.add
local.tee $var3
local.get $var11
local.get $var11
local.get $var3
i32.gt_u
select
local.set $var11
end $label26
block $label36
loop $label37
local.get $var11
local.tee $var23
local.get $var18
i32.le_u
local.tee $var3
br_if $label36
local.get $var23
i32.const -4
i32.add
local.tee $var11
i32.load
i32.eqz
br_if $label37
end $label37
end $label36
block $label39
block $label38
local.get $var13
i32.const 103
i32.eq
br_if $label38
local.get $var4
i32.const 8
i32.and
local.set $var22
br $label39
end $label38
local.get $var17
i32.const -1
i32.xor
i32.const -1
local.get $var14
i32.const 1
local.get $var14
select
local.tee $var11
local.get $var17
i32.gt_s
local.get $var17
i32.const -5
i32.gt_s
i32.and
local.tee $var10
select
local.get $var11
i32.add
local.set $var14
i32.const -1
i32.const -2
local.get $var10
select
local.get $var5
i32.add
local.set $var5
local.get $var4
i32.const 8
i32.and
local.tee $var22
br_if $label39
i32.const -9
local.set $var11
block $label40
local.get $var3
br_if $label40
local.get $var23
i32.const -4
i32.add
i32.load
local.tee $var10
i32.eqz
br_if $label40
i32.const 10
local.set $var3
i32.const 0
local.set $var11
local.get $var10
i32.const 10
i32.rem_u
br_if $label40
loop $label41
local.get $var11
local.tee $var21
i32.const 1
i32.add
local.set $var11
local.get $var10
local.get $var3
i32.const 10
i32.mul
local.tee $var3
i32.rem_u
i32.eqz
br_if $label41
end $label41
local.get $var21
i32.const -1
i32.xor
local.set $var11
end $label40
local.get $var23
local.get $var16
i32.sub
i32.const 2
i32.shr_s
i32.const 9
i32.mul
local.set $var3
block $label42
local.get $var5
i32.const -33
i32.and
i32.const 70
i32.ne
br_if $label42
i32.const 0
local.set $var22
local.get $var14
local.get $var3
local.get $var11
i32.add
i32.const -9
i32.add
local.tee $var11
i32.const 0
local.get $var11
i32.const 0
i32.gt_s
select
local.tee $var11
local.get $var14
local.get $var11
i32.lt_s
select
local.set $var14
br $label39
end $label42
i32.const 0
local.set $var22
local.get $var14
local.get $var17
local.get $var3
i32.add
local.get $var11
i32.add
i32.const -9
i32.add
local.tee $var11
i32.const 0
local.get $var11
i32.const 0
i32.gt_s
select
local.tee $var11
local.get $var14
local.get $var11
i32.lt_s
select
local.set $var14
end $label39
local.get $var14
local.get $var22
i32.or
i32.const 0
i32.ne
local.set $var19
block $label44
block $label43
local.get $var5
i32.const -33
i32.and
local.tee $var3
i32.const 70
i32.ne
br_if $label43
local.get $var17
i32.const 0
local.get $var17
i32.const 0
i32.gt_s
select
local.set $var11
br $label44
end $label43
block $label45
local.get $var12
local.get $var17
local.get $var17
i32.const 31
i32.shr_s
local.tee $var11
i32.add
local.get $var11
i32.xor
i64.extend_i32_u
local.get $var12
call $func38
local.tee $var11
i32.sub
i32.const 1
i32.gt_s
br_if $label45
loop $label46
local.get $var11
i32.const -1
i32.add
local.tee $var11
i32.const 48
i32.store8
local.get $var12
local.get $var11
i32.sub
i32.const 2
i32.lt_s
br_if $label46
end $label46
end $label45
local.get $var11
i32.const -2
i32.add
local.tee $var20
local.get $var5
i32.store8
local.get $var11
i32.const -1
i32.add
i32.const 45
i32.const 43
local.get $var17
i32.const 0
i32.lt_s
select
i32.store8
local.get $var12
local.get $var20
i32.sub
local.set $var11
end $label44
local.get $var0
i32.const 32
local.get $var2
local.get $var8
local.get $var14
i32.add
local.get $var19
i32.add
local.get $var11
i32.add
i32.const 1
i32.add
local.tee $var10
local.get $var4
call $func39
local.get $var0
local.get $var9
local.get $var8
call $func33
local.get $var0
i32.const 48
local.get $var2
local.get $var10
local.get $var4
i32.const 65536
i32.xor
call $func39
block $label64
block $label52
block $label53
block $label47
local.get $var3
i32.const 70
i32.ne
br_if $label47
local.get $var6
i32.const 16
i32.add
i32.const 8
i32.or
local.set $var21
local.get $var6
i32.const 16
i32.add
i32.const 9
i32.or
local.set $var3
local.get $var16
local.get $var18
local.get $var18
local.get $var16
i32.gt_u
select
local.tee $var18
local.set $var17
loop $label51
local.get $var17
i64.load32_u
local.get $var3
call $func38
local.set $var11
block $label49
block $label48
local.get $var17
local.get $var18
i32.eq
br_if $label48
local.get $var11
local.get $var6
i32.const 16
i32.add
i32.le_u
br_if $label49
loop $label50
local.get $var11
i32.const -1
i32.add
local.tee $var11
i32.const 48
i32.store8
local.get $var11
local.get $var6
i32.const 16
i32.add
i32.gt_u
br_if $label50
br $label49
end $label50
unreachable
end $label48
local.get $var11
local.get $var3
i32.ne
br_if $label49
local.get $var6
i32.const 48
i32.store8 offset=24
local.get $var21
local.set $var11
end $label49
local.get $var0
local.get $var11
local.get $var3
local.get $var11
i32.sub
call $func33
local.get $var17
i32.const 4
i32.add
local.tee $var17
local.get $var16
i32.le_u
br_if $label51
end $label51
i32.const 0
local.set $var11
local.get $var19
i32.eqz
br_if $label52
local.get $var0
i32.const 1069
i32.const 1
call $func33
local.get $var17
local.get $var23
i32.ge_u
br_if $label53
local.get $var14
i32.const 1
i32.lt_s
br_if $label53
loop $label56
block $label54
local.get $var17
i64.load32_u
local.get $var3
call $func38
local.tee $var11
local.get $var6
i32.const 16
i32.add
i32.le_u
br_if $label54
loop $label55
local.get $var11
i32.const -1
i32.add
local.tee $var11
i32.const 48
i32.store8
local.get $var11
local.get $var6
i32.const 16
i32.add
i32.gt_u
br_if $label55
end $label55
end $label54
local.get $var0
local.get $var11
local.get $var14
i32.const 9
local.get $var14
i32.const 9
i32.lt_s
select
call $func33
local.get $var14
i32.const -9
i32.add
local.set $var11
local.get $var17
i32.const 4
i32.add
local.tee $var17
local.get $var23
i32.ge_u
br_if $label52
local.get $var14
i32.const 9
i32.gt_s
local.set $var18
local.get $var11
local.set $var14
local.get $var18
br_if $label56
br $label52
end $label56
unreachable
end $label47
block $label57
local.get $var14
i32.const 0
i32.lt_s
br_if $label57
local.get $var23
local.get $var18
i32.const 4
i32.add
local.get $var23
local.get $var18
i32.gt_u
select
local.set $var21
local.get $var6
i32.const 16
i32.add
i32.const 9
i32.or
local.set $var3
local.get $var6
i32.const 16
i32.add
i32.const 8
i32.or
local.set $var16
local.get $var18
local.set $var17
loop $label63
block $label58
local.get $var17
i64.load32_u
local.get $var3
call $func38
local.tee $var11
local.get $var3
i32.ne
br_if $label58
local.get $var6
i32.const 48
i32.store8 offset=24
local.get $var16
local.set $var11
end $label58
block $label60
block $label59
local.get $var17
local.get $var18
i32.eq
br_if $label59
local.get $var11
local.get $var6
i32.const 16
i32.add
i32.le_u
br_if $label60
loop $label61
local.get $var11
i32.const -1
i32.add
local.tee $var11
i32.const 48
i32.store8
local.get $var11
local.get $var6
i32.const 16
i32.add
i32.gt_u
br_if $label61
br $label60
end $label61
unreachable
end $label59
local.get $var0
local.get $var11
i32.const 1
call $func33
local.get $var11
i32.const 1
i32.add
local.set $var11
block $label62
local.get $var14
i32.const 0
i32.gt_s
br_if $label62
local.get $var22
i32.eqz
br_if $label60
end $label62
local.get $var0
i32.const 1069
i32.const 1
call $func33
end $label60
local.get $var0
local.get $var11
local.get $var3
local.get $var11
i32.sub
local.tee $var23
local.get $var14
local.get $var14
local.get $var23
i32.gt_s
select
call $func33
local.get $var14
local.get $var23
i32.sub
local.set $var14
local.get $var17
i32.const 4
i32.add
local.tee $var17
local.get $var21
i32.ge_u
br_if $label57
local.get $var14
i32.const -1
i32.gt_s
br_if $label63
end $label63
end $label57
local.get $var0
i32.const 48
local.get $var14
i32.const 18
i32.add
i32.const 18
i32.const 0
call $func39
local.get $var0
local.get $var20
local.get $var12
local.get $var20
i32.sub
call $func33
br $label64
end $label53
local.get $var14
local.set $var11
end $label52
local.get $var0
i32.const 48
local.get $var11
i32.const 9
i32.add
i32.const 9
i32.const 0
call $func39
end $label64
local.get $var0
i32.const 32
local.get $var2
local.get $var10
local.get $var4
i32.const 8192
i32.xor
call $func39
br $label4
end $label7
local.get $var9
local.get $var5
i32.const 26
i32.shl
i32.const 31
i32.shr_s
i32.const 9
i32.and
i32.add
local.set $var14
block $label65
local.get $var3
i32.const 11
i32.gt_u
br_if $label65
i32.const 12
local.get $var3
i32.sub
local.set $var11
f64.const 8
local.set $var26
loop $label66
local.get $var26
f64.const 16
f64.mul
local.set $var26
local.get $var11
i32.const -1
i32.add
local.tee $var11
br_if $label66
end $label66
block $label67
local.get $var14
i32.load8_u
i32.const 45
i32.ne
br_if $label67
local.get $var26
local.get $var1
f64.neg
local.get $var26
f64.sub
f64.add
f64.neg
local.set $var1
br $label65
end $label67
local.get $var1
local.get $var26
f64.add
local.get $var26
f64.sub
local.set $var1
end $label65
block $label68
local.get $var6
i32.load offset=44
local.tee $var11
local.get $var11
i32.const 31
i32.shr_s
local.tee $var11
i32.add
local.get $var11
i32.xor
i64.extend_i32_u
local.get $var12
call $func38
local.tee $var11
local.get $var12
i32.ne
br_if $label68
local.get $var6
i32.const 48
i32.store8 offset=15
local.get $var6
i32.const 15
i32.add
local.set $var11
end $label68
local.get $var8
i32.const 2
i32.or
local.set $var22
local.get $var5
i32.const 32
i32.and
local.set $var18
local.get $var6
i32.load offset=44
local.set $var17
local.get $var11
i32.const -2
i32.add
local.tee $var21
local.get $var5
i32.const 15
i32.add
i32.store8
local.get $var11
i32.const -1
i32.add
i32.const 45
i32.const 43
local.get $var17
i32.const 0
i32.lt_s
select
i32.store8
local.get $var4
i32.const 8
i32.and
local.set $var23
local.get $var6
i32.const 16
i32.add
local.set $var17
loop $label73
local.get $var17
local.set $var11
block $label70
block $label69
local.get $var1
f64.abs
f64.const 2147483648
f64.lt
i32.eqz
br_if $label69
local.get $var1
i32.trunc_f64_s
local.set $var17
br $label70
end $label69
i32.const -2147483648
local.set $var17
end $label70
local.get $var11
local.get $var17
i32.const 1568
i32.add
i32.load8_u
local.get $var18
i32.or
i32.store8
local.get $var1
local.get $var17
f64.convert_i32_s
f64.sub
f64.const 16
f64.mul
local.set $var1
block $label71
local.get $var11
i32.const 1
i32.add
local.tee $var17
local.get $var6
i32.const 16
i32.add
i32.sub
i32.const 1
i32.ne
br_if $label71
block $label72
local.get $var1
f64.const 0.0
f64.ne
br_if $label72
local.get $var3
i32.const 0
i32.gt_s
br_if $label72
local.get $var23
i32.eqz
br_if $label71
end $label72
local.get $var11
i32.const 46
i32.store8 offset=1
local.get $var11
i32.const 2
i32.add
local.set $var17
end $label71
local.get $var1
f64.const 0.0
f64.ne
br_if $label73
end $label73
block $label75
block $label74
local.get $var3
i32.eqz
br_if $label74
local.get $var17
local.get $var6
i32.const 16
i32.add
i32.sub
i32.const -2
i32.add
local.get $var3
i32.ge_s
br_if $label74
local.get $var3
local.get $var12
i32.add
local.get $var21
i32.sub
i32.const 2
i32.add
local.set $var11
br $label75
end $label74
local.get $var12
local.get $var6
i32.const 16
i32.add
local.get $var21
i32.add
i32.sub
local.get $var17
i32.add
local.set $var11
end $label75
local.get $var0
i32.const 32
local.get $var2
local.get $var11
local.get $var22
i32.add
local.tee $var10
local.get $var4
call $func39
local.get $var0
local.get $var14
local.get $var22
call $func33
local.get $var0
i32.const 48
local.get $var2
local.get $var10
local.get $var4
i32.const 65536
i32.xor
call $func39
local.get $var0
local.get $var6
i32.const 16
i32.add
local.get $var17
local.get $var6
i32.const 16
i32.add
i32.sub
local.tee $var17
call $func33
local.get $var0
i32.const 48
local.get $var11
local.get $var17
local.get $var12
local.get $var21
i32.sub
local.tee $var18
i32.add
i32.sub
i32.const 0
i32.const 0
call $func39
local.get $var0
local.get $var21
local.get $var18
call $func33
local.get $var0
i32.const 32
local.get $var2
local.get $var10
local.get $var4
i32.const 8192
i32.xor
call $func39
end $label4
local.get $var6
i32.const 560
i32.add
global.set $global0
local.get $var2
local.get $var10
local.get $var10
local.get $var2
i32.lt_s
select
)
(func $func42 (param $var0 i32) (param $var1 i32)
(local $var2 i32)
local.get $var1
local.get $var1
i32.load
i32.const 7
i32.add
i32.const -8
i32.and
local.tee $var2
i32.const 16
i32.add
i32.store
local.get $var0
local.get $var2
i64.load
local.get $var2
i32.const 8
i32.add
i64.load
call $func30
f64.store
)
(func $func43 (param $var0 f64) (result i64)
local.get $var0
i64.reinterpret_f64
)
(func $func44 (param $var0 i32) (param $var1 i32) (result i32)
(local $var2 i32)
global.get $global0
i32.const 16
i32.sub
local.tee $var2
global.set $global0
local.get $var2
local.get $var1
i32.store offset=12
i32.const 0
i32.load offset=1096
local.get $var0
local.get $var1
call $func40
local.set $var1
local.get $var2
i32.const 16
i32.add
global.set $global0
local.get $var1
)
(func $func45 (param $var0 i32) (result i32)
i32.const 1
)
(func $func46 (param $var0 i32)
)
(func $stackSave (;47;) (export "stackSave") (result i32)
global.get $global0
)
(func $stackRestore (;48;) (export "stackRestore") (param $var0 i32)
local.get $var0
global.set $global0
)
(func $stackAlloc (;49;) (export "stackAlloc") (param $var0 i32) (result i32)
(local $var1 i32) (local $var2 i32)
global.get $global0
local.get $var0
i32.sub
i32.const -16
i32.and
local.tee $var1
global.set $global0
local.get $var1
)
(func $emscripten_stack_init (;50;) (export "emscripten_stack_init")
i32.const 5245984
global.set $global2
i32.const 3092
i32.const 15
i32.add
i32.const -16
i32.and
global.set $global1
)
(func $emscripten_stack_get_free (;51;) (export "emscripten_stack_get_free") (result i32)
global.get $global0
global.get $global1
i32.sub
)
(func $emscripten_stack_get_end (;52;) (export "emscripten_stack_get_end") (result i32)
global.get $global1
)
(func $fflush (;53;) (export "fflush") (param $var0 i32) (result i32)
(local $var1 i32) (local $var2 i32)
block $label2
block $label0
local.get $var0
i32.eqz
br_if $label0
block $label1
local.get $var0
i32.load offset=76
i32.const -1
i32.gt_s
br_if $label1
local.get $var0
call $func54
return
end $label1
local.get $var0
call $func45
local.set $var1
local.get $var0
call $func54
local.set $var2
local.get $var1
i32.eqz
br_if $label2
local.get $var0
call $func46
local.get $var2
return
end $label0
i32.const 0
local.set $var2
block $label3
i32.const 0
i32.load offset=1728
i32.eqz
br_if $label3
i32.const 0
i32.load offset=1728
call $fflush
local.set $var2
end $label3
block $label4
call $func16
i32.load
local.tee $var0
i32.eqz
br_if $label4
loop $label8
i32.const 0
local.set $var1
block $label5
local.get $var0
i32.load offset=76
i32.const 0
i32.lt_s
br_if $label5
local.get $var0
call $func45
local.set $var1
end $label5
block $label6
local.get $var0
i32.load offset=20
local.get $var0
i32.load offset=28
i32.le_u
br_if $label6
local.get $var0
call $func54
local.get $var2
i32.or
local.set $var2
end $label6
block $label7
local.get $var1
i32.eqz
br_if $label7
local.get $var0
call $func46
end $label7
local.get $var0
i32.load offset=56
local.tee $var0
br_if $label8
end $label8
end $label4
call $func17
end $label2
local.get $var2
)
(func $func54 (param $var0 i32) (result i32)
(local $var1 i32) (local $var2 i32)
block $label0
local.get $var0
i32.load offset=20
local.get $var0
i32.load offset=28
i32.le_u
br_if $label0
local.get $var0
i32.const 0
i32.const 0
local.get $var0
i32.load offset=36
call_indirect (param i32 i32 i32) (result i32)
drop
local.get $var0
i32.load offset=20
br_if $label0
i32.const -1
return
end $label0
block $label1
local.get $var0
i32.load offset=4
local.tee $var1
local.get $var0
i32.load offset=8
local.tee $var2
i32.ge_u
br_if $label1
local.get $var0
local.get $var1
local.get $var2
i32.sub
i64.extend_i32_s
i32.const 1
local.get $var0
i32.load offset=40
call_indirect (param i32 i64 i32) (result i64)
drop
end $label1
local.get $var0
i32.const 0
i32.store offset=28
local.get $var0
i64.const 0
i64.store offset=16
local.get $var0
i64.const 0
i64.store offset=4 align=4
i32.const 0
)
(func $func55 (param $var0 i32) (param $var1 i32) (param $var2 i64) (param $var3 i32) (result i64)
local.get $var1
local.get $var2
local.get $var3
local.get $var0
call_indirect (param i32 i64 i32) (result i64)
)
(func $dynCall_jiji (;56;) (export "dynCall_jiji") (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
(local $var5 i64)
local.get $var0
local.get $var1
local.get $var2
i64.extend_i32_u
local.get $var3
i64.extend_i32_u
i64.const 32
i64.shl
i64.or
local.get $var4
call $func55
local.set $var5
local.get $var5
i64.const 32
i64.shr_u
i32.wrap_i64
call $env.setTempRet0
local.get $var5
i32.wrap_i64
)
(data (i32.const 1024) "-+ 0X0x\00-0X+0X 0X-0x+0x 0x\00nan\00inf\00NAN\00INF\00.\00(null)\00hello, world!\0a\00\00\00\000\06\00\00\00\00\00\00\11\00\0a\00\11\11\11\00\00\00\00\05\00\00\00\00\00\00\09\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0f\0a\11\11\11\03\0a\07\00\01\00\09\0b\0b\00\00\09\06\0b\00\00\0b\00\06\11\00\00\00\11\11\11\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0a\0a\11\11\11\00\0a\00\00\02\00\09\0b\00\00\00\09\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\0d\00\00\00\04\0d\00\00\00\00\09\0e\00\00\00\00\00\0e\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\00\0f\00\00\00\00\09\10\00\00\00\00\00\10\00\00\10\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\0a\00\00\00\00\09\0b\00\00\00\00\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\000123456789ABCDEF")
(data (i32.const 1584) "\05\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\03\00\00\00\e8\06\00\00\00\04\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\ff\ff\ff\ff\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000\06\00\00")
)
[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Understanding_the_text_format]
wasm 배열 예제 (0) | 2023.01.31 |
---|---|
wasm interfacing example (0) | 2021.11.25 |
wasm text 와 binary 상호변환 (0) | 2021.10.26 |
emcc wasm 빌드 (0) | 2021.10.25 |
wasm from c, cpp (0) | 2021.10.24 |
나름 컴파일 된거니, 디컴파일이라고 해야하나 애매하긴 하네
$ wat2wasm simple.wat -o simple.wasm $ wasm2wat simple.wasm -o text.wat |
[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Text_format_to_wasm]
emcc 와는 다르게 패키지로 존재하나 보다
$ wat2wasm 명령어 'wat2wasm' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다: sudo apt install wabt $ wasm2wat 명령어 'wasm2wat' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다: sudo apt install wabt |
$ wat2wasm usage: wat2wasm [options] filename read a file in the wasm text format, check it for errors, and convert it to the wasm binary format. examples: # parse and typecheck test.wat $ wat2wasm test.wat # parse test.wat and write to binary file test.wasm $ wat2wasm test.wat -o test.wasm # parse spec-test.wast, and write verbose output to stdout (including # the meaning of every byte) $ wat2wasm spec-test.wast -v options: --help Print this help message --version Print version information -v, --verbose Use multiple times for more info --debug-parser Turn on debugging the parser of wat files -d, --dump-module Print a hexdump of the module to stdout --enable-exceptions Enable Experimental exception handling --disable-mutable-globals Disable Import/export mutable globals --enable-saturating-float-to-int Enable Saturating float-to-int operators --enable-sign-extension Enable Sign-extension operators --enable-simd Enable SIMD support --enable-threads Enable Threading support --enable-multi-value Enable Multi-value --enable-tail-call Enable Tail-call support --enable-bulk-memory Enable Bulk-memory operations --enable-reference-types Enable Reference types (anyref) --enable-annotations Enable Custom annotation syntax --enable-all Enable all features -o, --output=FILE output wasm binary file -r, --relocatable Create a relocatable wasm binary (suitable for linking with e.g. lld) --no-canonicalize-leb128s Write all LEB128 sizes as 5-bytes instead of their minimal size --debug-names Write debug names to the generated binary file --no-check Don't check for invalid modules expected filename argument. $ wasm2wat usage: wasm2wat [options] filename Read a file in the WebAssembly binary format, and convert it to the WebAssembly text format. examples: # parse binary file test.wasm and write text file test.wast $ wasm2wat test.wasm -o test.wat # parse test.wasm, write test.wat, but ignore the debug names, if any $ wasm2wat test.wasm --no-debug-names -o test.wat options: --help Print this help message --version Print version information -v, --verbose Use multiple times for more info -o, --output=FILENAME Output file for the generated wast file, by default use stdout -f, --fold-exprs Write folded expressions where possible --enable-exceptions Enable Experimental exception handling --disable-mutable-globals Disable Import/export mutable globals --enable-saturating-float-to-int Enable Saturating float-to-int operators --enable-sign-extension Enable Sign-extension operators --enable-simd Enable SIMD support --enable-threads Enable Threading support --enable-multi-value Enable Multi-value --enable-tail-call Enable Tail-call support --enable-bulk-memory Enable Bulk-memory operations --enable-reference-types Enable Reference types (anyref) --enable-annotations Enable Custom annotation syntax --enable-all Enable all features --inline-exports Write all exports inline --inline-imports Write all imports inline --no-debug-names Ignore debug names in the binary file --ignore-custom-section-errors Ignore errors in custom sections --generate-names Give auto-generated names to non-named functions, types, etc. --no-check Don't check for invalid modules expected filename argument. |
wasm interfacing example (0) | 2021.11.25 |
---|---|
wasm text format (0) | 2021.10.26 |
emcc wasm 빌드 (0) | 2021.10.25 |
wasm from c, cpp (0) | 2021.10.24 |
wasm (0) | 2021.10.22 |
귀찮아서 로컬 파일로 접근하니 안열린다 -_ㅠ
node.js http-server 하려다가 안되서 걍 python -m http.server로 구동
별건 없고.. 그냥 hello world!만 나오고 끝!
# If Python version returned above is 3.X # On Windows, try "python -m http.server" or "py -3 -m http.server" python3 -m http.server # If Python version returned above is 2.X python -m SimpleHTTPServer |
[링크 : https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server]
빌드는 아래의 명령어로 수행 가능한데
-o hello.html을 하면 .js .wasm .html 3개를 생성한다.
-s WASM=1은 주던 안 주던 영향을 받지 않는 듯하다.
$ emcc emcc: error: no input files $ cat hello.c #include <stdio.h> int main() { printf("hello, world!\n"); return 0; } $ emcc -o hello.js hello.c $ ls -al 합계 148 drwxrwxr-x 2 minimonk minimonk 4096 10월 25 15:40 . drwxrwxr-x 8 minimonk minimonk 4096 10월 25 15:39 .. -rw-rw-r-- 1 minimonk minimonk 76 10월 25 15:39 hello.c -rw-rw-r-- 1 minimonk minimonk 126915 10월 25 15:39 hello.js -rwxrwxr-x 1 minimonk minimonk 11522 10월 25 15:39 hello.wasm $ file * hello.c: C source, ASCII text hello.js: ASCII text, with very long lines hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP) |
$ emcc hello.c -s WASM=1 -o hello.html $ ls -al 합계 252 drwxrwxr-x 2 minimonk minimonk 4096 10월 25 17:47 . drwxrwxr-x 8 minimonk minimonk 4096 10월 25 15:39 .. -rw-rw-r-- 1 minimonk minimonk 76 10월 25 15:39 hello.c -rw-rw-r-- 1 minimonk minimonk 102675 10월 25 17:47 hello.html -rw-rw-r-- 1 minimonk minimonk 126915 10월 25 17:47 hello.js -rwxrwxr-x 1 minimonk minimonk 11522 10월 25 17:47 hello.wasm $ file * hello.c: C source, ASCII text hello.html: HTML document, ASCII text, with very long lines hello.js: ASCII text, with very long lines hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP) |
[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]
+
$ cat hello.js
// The Module object: Our interface to the outside world. We import
// and export values on it. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to check if Module already exists (e.g. case 3 above).
// Substitution will be replaced with actual code on later stage of the build,
// this way Closure Compiler will not mangle it (e.g. case 4. above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module = typeof Module !== 'undefined' ? Module : {};
// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
// {{PRE_JSES}}
// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
var key;
for (key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
var arguments_ = [];
var thisProgram = './this.program';
var quit_ = function(status, toThrow) {
throw toThrow;
};
// Determine the runtime environment we are in. You can customize this by
// setting the ENVIRONMENT setting at compile time (see settings.js).
// Attempt to auto-detect the environment
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
// N.b. Electron.js environment is simultaneously a NODE-environment, but
// also a web environment.
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
if (Module['ENVIRONMENT']) {
throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)');
}
// `/` should be present at the end if `scriptDirectory` is not empty
var scriptDirectory = '';
function locateFile(path) {
if (Module['locateFile']) {
return Module['locateFile'](path, scriptDirectory);
}
return scriptDirectory + path;
}
// Hooks that are implemented differently in different runtime environments.
var read_,
readAsync,
readBinary,
setWindowTitle;
// Normally we don't log exceptions but instead let them bubble out the top
// level where the embedding environment (e.g. the browser) can handle
// them.
// However under v8 and node we sometimes exit the process direcly in which case
// its up to use us to log the exception before exiting.
// If we fix https://github.com/emscripten-core/emscripten/issues/15080
// this may no longer be needed under node.
function logExceptionOnExit(e) {
if (e instanceof ExitStatus) return;
var toLog = e;
if (e && typeof e === 'object' && e.stack) {
toLog = [e, e.stack];
}
err('exiting due to exception: ' + toLog);
}
var nodeFS;
var nodePath;
if (ENVIRONMENT_IS_NODE) {
if (!(typeof process === 'object' && typeof require === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = require('path').dirname(scriptDirectory) + '/';
} else {
scriptDirectory = __dirname + '/';
}
// include: node_shell_read.js
read_ = function shell_read(filename, binary) {
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
return nodeFS['readFileSync'](filename, binary ? null : 'utf8');
};
readBinary = function readBinary(filename) {
var ret = read_(filename, true);
if (!ret.buffer) {
ret = new Uint8Array(ret);
}
assert(ret.buffer);
return ret;
};
readAsync = function readAsync(filename, onload, onerror) {
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
nodeFS['readFile'](filename, function(err, data) {
if (err) onerror(err);
else onload(data.buffer);
});
};
// end include: node_shell_read.js
if (process['argv'].length > 1) {
thisProgram = process['argv'][1].replace(/\\/g, '/');
}
arguments_ = process['argv'].slice(2);
if (typeof module !== 'undefined') {
module['exports'] = Module;
}
process['on']('uncaughtException', function(ex) {
// suppress ExitStatus exceptions from showing an error
if (!(ex instanceof ExitStatus)) {
throw ex;
}
});
// Without this older versions of node (< v15) will log unhandled rejections
// but return 0, which is not normally the desired behaviour. This is
// not be needed with node v15 and about because it is now the default
// behaviour:
// See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
process['on']('unhandledRejection', function(reason) { throw reason; });
quit_ = function(status, toThrow) {
if (keepRuntimeAlive()) {
process['exitCode'] = status;
throw toThrow;
}
logExceptionOnExit(toThrow);
process['exit'](status);
};
Module['inspect'] = function () { return '[Emscripten Module object]'; };
} else
if (ENVIRONMENT_IS_SHELL) {
if ((typeof process === 'object' && typeof require === 'function') || typeof window === 'object' || typeof importScripts === 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
if (typeof read != 'undefined') {
read_ = function shell_read(f) {
return read(f);
};
}
readBinary = function readBinary(f) {
var data;
if (typeof readbuffer === 'function') {
return new Uint8Array(readbuffer(f));
}
data = read(f, 'binary');
assert(typeof data === 'object');
return data;
};
readAsync = function readAsync(f, onload, onerror) {
setTimeout(function() { onload(readBinary(f)); }, 0);
};
if (typeof scriptArgs != 'undefined') {
arguments_ = scriptArgs;
} else if (typeof arguments != 'undefined') {
arguments_ = arguments;
}
if (typeof quit === 'function') {
quit_ = function(status, toThrow) {
logExceptionOnExit(toThrow);
quit(status);
};
}
if (typeof print !== 'undefined') {
// Prefer to use print/printErr where they exist, as they usually work better.
if (typeof console === 'undefined') console = /** @type{!Console} */({});
console.log = /** @type{!function(this:Console, ...*): undefined} */ (print);
console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print);
}
} else
// Note that this includes Node.js workers when relevant (pthreads is enabled).
// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
// ENVIRONMENT_IS_NODE.
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
scriptDirectory = self.location.href;
} else if (typeof document !== 'undefined' && document.currentScript) { // web
scriptDirectory = document.currentScript.src;
}
// blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
// otherwise, slice off the final part of the url to find the script directory.
// if scriptDirectory does not contain a slash, lastIndexOf will return -1,
// and scriptDirectory will correctly be replaced with an empty string.
// If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
// they are removed because they could contain a slash.
if (scriptDirectory.indexOf('blob:') !== 0) {
scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1);
} else {
scriptDirectory = '';
}
if (!(typeof window === 'object' || typeof importScripts === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
// Differentiate the Web Worker from the Node Worker case, as reading must
// be done differently.
{
// include: web_or_worker_shell_read.js
read_ = function(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
};
if (ENVIRONMENT_IS_WORKER) {
readBinary = function(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';
xhr.send(null);
return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
};
}
readAsync = function(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
onload(xhr.response);
return;
}
onerror();
};
xhr.onerror = onerror;
xhr.send(null);
};
// end include: web_or_worker_shell_read.js
}
setWindowTitle = function(title) { document.title = title };
} else
{
throw new Error('environment detection error');
}
var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.warn.bind(console);
// Merge back in the overrides
for (key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
// Free the object hierarchy contained in the overrides, this lets the GC
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
moduleOverrides = null;
// Emit code to handle expected values on the Module object. This applies Module.x
// to the proper local x. This has two benefits: first, we only emit it if it is
// expected to arrive, and second, by using a local everywhere else that can be
// minified.
if (Module['arguments']) arguments_ = Module['arguments'];
if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) {
Object.defineProperty(Module, 'arguments', {
configurable: true,
get: function() {
abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (Module['thisProgram']) thisProgram = Module['thisProgram'];
if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) {
Object.defineProperty(Module, 'thisProgram', {
configurable: true,
get: function() {
abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (Module['quit']) quit_ = Module['quit'];
if (!Object.getOwnPropertyDescriptor(Module, 'quit')) {
Object.defineProperty(Module, 'quit', {
configurable: true,
get: function() {
abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
// Assertions on removed incoming Module JS APIs.
assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)');
assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)');
assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');
if (!Object.getOwnPropertyDescriptor(Module, 'read')) {
Object.defineProperty(Module, 'read', {
configurable: true,
get: function() {
abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) {
Object.defineProperty(Module, 'readAsync', {
configurable: true,
get: function() {
abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) {
Object.defineProperty(Module, 'readBinary', {
configurable: true,
get: function() {
abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) {
Object.defineProperty(Module, 'setWindowTitle', {
configurable: true,
get: function() {
abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); }
assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable.");
var STACK_ALIGN = 16;
function getPointerSize() {
return 4;
}
function getNativeTypeSize(type) {
switch (type) {
case 'i1': case 'i8': return 1;
case 'i16': return 2;
case 'i32': return 4;
case 'i64': return 8;
case 'float': return 4;
case 'double': return 8;
default: {
if (type[type.length-1] === '*') {
return getPointerSize();
} else if (type[0] === 'i') {
var bits = Number(type.substr(1));
assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type);
return bits / 8;
} else {
return 0;
}
}
}
}
function warnOnce(text) {
if (!warnOnce.shown) warnOnce.shown = {};
if (!warnOnce.shown[text]) {
warnOnce.shown[text] = 1;
err(text);
}
}
// include: runtime_functions.js
// Wraps a JS function as a wasm function with a given signature.
function convertJsFunctionToWasm(func, sig) {
// If the type reflection proposal is available, use the new
// "WebAssembly.Function" constructor.
// Otherwise, construct a minimal wasm module importing the JS function and
// re-exporting it.
if (typeof WebAssembly.Function === "function") {
var typeNames = {
'i': 'i32',
'j': 'i64',
'f': 'f32',
'd': 'f64'
};
var type = {
parameters: [],
results: sig[0] == 'v' ? [] : [typeNames[sig[0]]]
};
for (var i = 1; i < sig.length; ++i) {
type.parameters.push(typeNames[sig[i]]);
}
return new WebAssembly.Function(type, func);
}
// The module is static, with the exception of the type section, which is
// generated based on the signature passed in.
var typeSection = [
0x01, // id: section,
0x00, // length: 0 (placeholder)
0x01, // count: 1
0x60, // form: func
];
var sigRet = sig.slice(0, 1);
var sigParam = sig.slice(1);
var typeCodes = {
'i': 0x7f, // i32
'j': 0x7e, // i64
'f': 0x7d, // f32
'd': 0x7c, // f64
};
// Parameters, length + signatures
typeSection.push(sigParam.length);
for (var i = 0; i < sigParam.length; ++i) {
typeSection.push(typeCodes[sigParam[i]]);
}
// Return values, length + signatures
// With no multi-return in MVP, either 0 (void) or 1 (anything else)
if (sigRet == 'v') {
typeSection.push(0x00);
} else {
typeSection = typeSection.concat([0x01, typeCodes[sigRet]]);
}
// Write the overall length of the type section back into the section header
// (excepting the 2 bytes for the section id and length)
typeSection[1] = typeSection.length - 2;
// Rest of the module is static
var bytes = new Uint8Array([
0x00, 0x61, 0x73, 0x6d, // magic ("\0asm")
0x01, 0x00, 0x00, 0x00, // version: 1
].concat(typeSection, [
0x02, 0x07, // import section
// (import "e" "f" (func 0 (type 0)))
0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00,
0x07, 0x05, // export section
// (export "f" (func 0 (type 0)))
0x01, 0x01, 0x66, 0x00, 0x00,
]));
// We can compile this wasm module synchronously because it is very small.
// This accepts an import (at "e.f"), that it reroutes to an export (at "f")
var module = new WebAssembly.Module(bytes);
var instance = new WebAssembly.Instance(module, {
'e': {
'f': func
}
});
var wrappedFunc = instance.exports['f'];
return wrappedFunc;
}
var freeTableIndexes = [];
// Weak map of functions in the table to their indexes, created on first use.
var functionsInTableMap;
function getEmptyTableSlot() {
// Reuse a free index if there is one, otherwise grow.
if (freeTableIndexes.length) {
return freeTableIndexes.pop();
}
// Grow the table
try {
wasmTable.grow(1);
} catch (err) {
if (!(err instanceof RangeError)) {
throw err;
}
throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.';
}
return wasmTable.length - 1;
}
function updateTableMap(offset, count) {
for (var i = offset; i < offset + count; i++) {
var item = getWasmTableEntry(i);
// Ignore null values.
if (item) {
functionsInTableMap.set(item, i);
}
}
}
// Add a function to the table.
// 'sig' parameter is required if the function being added is a JS function.
function addFunction(func, sig) {
assert(typeof func !== 'undefined');
// Check if the function is already in the table, to ensure each function
// gets a unique index. First, create the map if this is the first use.
if (!functionsInTableMap) {
functionsInTableMap = new WeakMap();
updateTableMap(0, wasmTable.length);
}
if (functionsInTableMap.has(func)) {
return functionsInTableMap.get(func);
}
// It's not in the table, add it now.
var ret = getEmptyTableSlot();
// Set the new value.
try {
// Attempting to call this with JS function will cause of table.set() to fail
setWasmTableEntry(ret, func);
} catch (err) {
if (!(err instanceof TypeError)) {
throw err;
}
assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func);
var wrapped = convertJsFunctionToWasm(func, sig);
setWasmTableEntry(ret, wrapped);
}
functionsInTableMap.set(func, ret);
return ret;
}
function removeFunction(index) {
functionsInTableMap.delete(getWasmTableEntry(index));
freeTableIndexes.push(index);
}
// end include: runtime_functions.js
// include: runtime_debug.js
// end include: runtime_debug.js
var tempRet0 = 0;
var setTempRet0 = function(value) {
tempRet0 = value;
};
var getTempRet0 = function() {
return tempRet0;
};
// === Preamble library stuff ===
// Documentation for the public APIs defined in this file must be updated in:
// site/source/docs/api_reference/preamble.js.rst
// A prebuilt local version of the documentation is available at:
// site/build/text/docs/api_reference/preamble.js.txt
// You can also build docs locally as HTML or other formats in site/
// An online HTML version (which may be of a different version of Emscripten)
// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
var wasmBinary;
if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) {
Object.defineProperty(Module, 'wasmBinary', {
configurable: true,
get: function() {
abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
var noExitRuntime = Module['noExitRuntime'] || true;
if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) {
Object.defineProperty(Module, 'noExitRuntime', {
configurable: true,
get: function() {
abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
if (typeof WebAssembly !== 'object') {
abort('no native wasm support detected');
}
// include: runtime_safe_heap.js
// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking.
// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties)
/** @param {number} ptr
@param {number} value
@param {string} type
@param {number|boolean=} noSafe */
function setValue(ptr, value, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32';
switch (type) {
case 'i1': HEAP8[((ptr)>>0)] = value; break;
case 'i8': HEAP8[((ptr)>>0)] = value; break;
case 'i16': HEAP16[((ptr)>>1)] = value; break;
case 'i32': HEAP32[((ptr)>>2)] = value; break;
case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break;
case 'float': HEAPF32[((ptr)>>2)] = value; break;
case 'double': HEAPF64[((ptr)>>3)] = value; break;
default: abort('invalid type for setValue: ' + type);
}
}
/** @param {number} ptr
@param {string} type
@param {number|boolean=} noSafe */
function getValue(ptr, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32';
switch (type) {
case 'i1': return HEAP8[((ptr)>>0)];
case 'i8': return HEAP8[((ptr)>>0)];
case 'i16': return HEAP16[((ptr)>>1)];
case 'i32': return HEAP32[((ptr)>>2)];
case 'i64': return HEAP32[((ptr)>>2)];
case 'float': return HEAPF32[((ptr)>>2)];
case 'double': return Number(HEAPF64[((ptr)>>3)]);
default: abort('invalid type for getValue: ' + type);
}
return null;
}
// end include: runtime_safe_heap.js
// Wasm globals
var wasmMemory;
//========================================
// Runtime essentials
//========================================
// whether we are quitting the application. no code should run after this.
// set in exit() and abort()
var ABORT = false;
// set by exit() and abort(). Passed to 'onExit' handler.
// NOTE: This is also used as the process return code code in shell environments
// but only when noExitRuntime is false.
var EXITSTATUS;
/** @type {function(*, string=)} */
function assert(condition, text) {
if (!condition) {
abort('Assertion failed: ' + text);
}
}
// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
var func = Module['_' + ident]; // closure exported function
assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
return func;
}
// C calling interface.
/** @param {string|null=} returnType
@param {Array=} argTypes
@param {Arguments|Array=} args
@param {Object=} opts */
function ccall(ident, returnType, argTypes, args, opts) {
// For fast lookup of conversion functions
var toC = {
'string': function(str) {
var ret = 0;
if (str !== null && str !== undefined && str !== 0) { // null string
// at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
var len = (str.length << 2) + 1;
ret = stackAlloc(len);
stringToUTF8(str, ret, len);
}
return ret;
},
'array': function(arr) {
var ret = stackAlloc(arr.length);
writeArrayToMemory(arr, ret);
return ret;
}
};
function convertReturnValue(ret) {
if (returnType === 'string') return UTF8ToString(ret);
if (returnType === 'boolean') return Boolean(ret);
return ret;
}
var func = getCFunc(ident);
var cArgs = [];
var stack = 0;
assert(returnType !== 'array', 'Return type should not be "array".');
if (args) {
for (var i = 0; i < args.length; i++) {
var converter = toC[argTypes[i]];
if (converter) {
if (stack === 0) stack = stackSave();
cArgs[i] = converter(args[i]);
} else {
cArgs[i] = args[i];
}
}
}
var ret = func.apply(null, cArgs);
function onDone(ret) {
if (stack !== 0) stackRestore(stack);
return convertReturnValue(ret);
}
ret = onDone(ret);
return ret;
}
/** @param {string=} returnType
@param {Array=} argTypes
@param {Object=} opts */
function cwrap(ident, returnType, argTypes, opts) {
return function() {
return ccall(ident, returnType, argTypes, arguments, opts);
}
}
// We used to include malloc/free by default in the past. Show a helpful error in
// builds with assertions.
function _malloc() {
abort("malloc() called but not included in the build - add '_malloc' to EXPORTED_FUNCTIONS");
}
function _free() {
// Show a helpful error since we used to include free by default in the past.
abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS");
}
var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
// normally not use allocate(), and instead allocate memory using _malloc(),
// initialize it with setValue(), and so forth.
// @slab: An array of data.
// @allocator: How to allocate memory, see ALLOC_*
/** @type {function((Uint8Array|Array<number>), number)} */
function allocate(slab, allocator) {
var ret;
assert(typeof allocator === 'number', 'allocate no longer takes a type argument')
assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0')
if (allocator == ALLOC_STACK) {
ret = stackAlloc(slab.length);
} else {
ret = abort('malloc was not included, but is needed in allocate. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
}
if (slab.subarray || slab.slice) {
HEAPU8.set(/** @type {!Uint8Array} */(slab), ret);
} else {
HEAPU8.set(new Uint8Array(slab), ret);
}
return ret;
}
// include: runtime_strings.js
// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime.
// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
// a copy of that string as a Javascript String object.
var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
/**
* @param {number} idx
* @param {number=} maxBytesToRead
* @return {string}
*/
function UTF8ArrayToString(heap, idx, maxBytesToRead) {
var endIdx = idx + maxBytesToRead;
var endPtr = idx;
// TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
// Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
// (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity)
while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
return UTF8Decoder.decode(heap.subarray(idx, endPtr));
} else {
var str = '';
// If building with TextDecoder, we have already computed the string length above, so test loop end condition against that
while (idx < endPtr) {
// For UTF8 byte structure, see:
// http://en.wikipedia.org/wiki/UTF-8#Description
// https://www.ietf.org/rfc/rfc2279.txt
// https://tools.ietf.org/html/rfc3629
var u0 = heap[idx++];
if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
var u1 = heap[idx++] & 63;
if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
var u2 = heap[idx++] & 63;
if ((u0 & 0xF0) == 0xE0) {
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
} else {
if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);
}
if (u0 < 0x10000) {
str += String.fromCharCode(u0);
} else {
var ch = u0 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
}
}
}
return str;
}
// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a
// copy of that string as a Javascript String object.
// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit
// this parameter to scan the string until the first \0 byte. If maxBytesToRead is
// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the
// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will
// not produce a string of exact length [ptr, ptr+maxBytesToRead[)
// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may
// throw JS JIT optimizations off, so it is worth to consider consistently using one
// style or the other.
/**
* @param {number} ptr
* @param {number=} maxBytesToRead
* @return {string}
*/
function UTF8ToString(ptr, maxBytesToRead) {
;
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
}
// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element.
// outIdx: The starting offset in the array to begin the copying.
// maxBytesToWrite: The maximum number of bytes this function can write to the array.
// This count should include the null terminator,
// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
return 0;
var startIdx = outIdx;
var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
var u = str.charCodeAt(i); // possibly a lead surrogate
if (u >= 0xD800 && u <= 0xDFFF) {
var u1 = str.charCodeAt(++i);
u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
}
if (u <= 0x7F) {
if (outIdx >= endIdx) break;
heap[outIdx++] = u;
} else if (u <= 0x7FF) {
if (outIdx + 1 >= endIdx) break;
heap[outIdx++] = 0xC0 | (u >> 6);
heap[outIdx++] = 0x80 | (u & 63);
} else if (u <= 0xFFFF) {
if (outIdx + 2 >= endIdx) break;
heap[outIdx++] = 0xE0 | (u >> 12);
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
heap[outIdx++] = 0x80 | (u & 63);
} else {
if (outIdx + 3 >= endIdx) break;
if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).');
heap[outIdx++] = 0xF0 | (u >> 18);
heap[outIdx++] = 0x80 | ((u >> 12) & 63);
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
heap[outIdx++] = 0x80 | (u & 63);
}
}
// Null-terminate the pointer to the buffer.
heap[outIdx] = 0;
return outIdx - startIdx;
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF8(str, outPtr, maxBytesToWrite) {
assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
}
// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF8(str) {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var u = str.charCodeAt(i); // possibly a lead surrogate
if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
if (u <= 0x7F) ++len;
else if (u <= 0x7FF) len += 2;
else if (u <= 0xFFFF) len += 3;
else len += 4;
}
return len;
}
// end include: runtime_strings.js
// include: runtime_strings_extra.js
// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime.
// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function AsciiToString(ptr) {
var str = '';
while (1) {
var ch = HEAPU8[((ptr++)>>0)];
if (!ch) return str;
str += String.fromCharCode(ch);
}
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP.
function stringToAscii(str, outPtr) {
return writeAsciiToMemory(str, outPtr, false);
}
// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;
function UTF16ToString(ptr, maxBytesToRead) {
assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!');
var endPtr = ptr;
// TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
// Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
var idx = endPtr >> 1;
var maxIdx = idx + maxBytesToRead / 2;
// If maxBytesToRead is not passed explicitly, it will be undefined, and this
// will always evaluate to true. This saves on code size.
while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
endPtr = idx << 1;
if (endPtr - ptr > 32 && UTF16Decoder) {
return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
} else {
var str = '';
// If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition
// will always evaluate to true. The loop is then terminated on the first null char.
for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
if (codeUnit == 0) break;
// fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
str += String.fromCharCode(codeUnit);
}
return str;
}
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP.
// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// outPtr: Byte address in Emscripten HEAP where to write the string to.
// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else.
// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF16(str, outPtr, maxBytesToWrite) {
assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!');
assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 2) return 0;
maxBytesToWrite -= 2; // Null terminator.
var startPtr = outPtr;
var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length;
for (var i = 0; i < numCharsToWrite; ++i) {
// charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
HEAP16[((outPtr)>>1)] = codeUnit;
outPtr += 2;
}
// Null-terminate the pointer to the HEAP.
HEAP16[((outPtr)>>1)] = 0;
return outPtr - startPtr;
}
// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF16(str) {
return str.length*2;
}
function UTF32ToString(ptr, maxBytesToRead) {
assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!');
var i = 0;
var str = '';
// If maxBytesToRead is not passed explicitly, it will be undefined, and this
// will always evaluate to true. This saves on code size.
while (!(i >= maxBytesToRead / 4)) {
var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
if (utf32 == 0) break;
++i;
// Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
// See http://unicode.org/faq/utf_bom.html#utf16-3
if (utf32 >= 0x10000) {
var ch = utf32 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
} else {
str += String.fromCharCode(utf32);
}
}
return str;
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP.
// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// outPtr: Byte address in Emscripten HEAP where to write the string to.
// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else.
// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF32(str, outPtr, maxBytesToWrite) {
assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!');
assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 4) return 0;
var startPtr = outPtr;
var endPtr = startPtr + maxBytesToWrite - 4;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
var trailSurrogate = str.charCodeAt(++i);
codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
}
HEAP32[((outPtr)>>2)] = codeUnit;
outPtr += 4;
if (outPtr + 4 > endPtr) break;
}
// Null-terminate the pointer to the HEAP.
HEAP32[((outPtr)>>2)] = 0;
return outPtr - startPtr;
}
// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF32(str) {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i);
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate.
len += 4;
}
return len;
}
// Allocate heap space for a JS string, and write it there.
// It is the responsibility of the caller to free() that memory.
function allocateUTF8(str) {
var size = lengthBytesUTF8(str) + 1;
var ret = abort('malloc was not included, but is needed in allocateUTF8. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
if (ret) stringToUTF8Array(str, HEAP8, ret, size);
return ret;
}
// Allocate stack space for a JS string, and write it there.
function allocateUTF8OnStack(str) {
var size = lengthBytesUTF8(str) + 1;
var ret = stackAlloc(size);
stringToUTF8Array(str, HEAP8, ret, size);
return ret;
}
// Deprecated: This function should not be called because it is unsafe and does not provide
// a maximum length limit of how many bytes it is allowed to write. Prefer calling the
// function stringToUTF8Array() instead, which takes in a maximum length that can be used
// to be secure from out of bounds writes.
/** @deprecated
@param {boolean=} dontAddNull */
function writeStringToMemory(string, buffer, dontAddNull) {
warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!');
var /** @type {number} */ lastChar, /** @type {number} */ end;
if (dontAddNull) {
// stringToUTF8Array always appends null. If we don't want to do that, remember the
// character that existed at the location where the null will be placed, and restore
// that after the write (below).
end = buffer + lengthBytesUTF8(string);
lastChar = HEAP8[end];
}
stringToUTF8(string, buffer, Infinity);
if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character.
}
function writeArrayToMemory(array, buffer) {
assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)')
HEAP8.set(array, buffer);
}
/** @param {boolean=} dontAddNull */
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff);
HEAP8[((buffer++)>>0)] = str.charCodeAt(i);
}
// Null-terminate the pointer to the HEAP.
if (!dontAddNull) HEAP8[((buffer)>>0)] = 0;
}
// end include: runtime_strings_extra.js
// Memory management
function alignUp(x, multiple) {
if (x % multiple > 0) {
x += multiple - (x % multiple);
}
return x;
}
var HEAP,
/** @type {ArrayBuffer} */
buffer,
/** @type {Int8Array} */
HEAP8,
/** @type {Uint8Array} */
HEAPU8,
/** @type {Int16Array} */
HEAP16,
/** @type {Uint16Array} */
HEAPU16,
/** @type {Int32Array} */
HEAP32,
/** @type {Uint32Array} */
HEAPU32,
/** @type {Float32Array} */
HEAPF32,
/** @type {Float64Array} */
HEAPF64;
function updateGlobalBufferAndViews(buf) {
buffer = buf;
Module['HEAP8'] = HEAP8 = new Int8Array(buf);
Module['HEAP16'] = HEAP16 = new Int16Array(buf);
Module['HEAP32'] = HEAP32 = new Int32Array(buf);
Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
}
var TOTAL_STACK = 5242880;
if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime')
var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) {
Object.defineProperty(Module, 'INITIAL_MEMORY', {
configurable: true,
get: function() {
abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
}
});
}
assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')');
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined,
'JS engine does not provide full typed array support');
// If memory is defined in wasm, the user can't provide it.
assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally');
assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically');
// include: runtime_init_table.js
// In regular non-RELOCATABLE mode the table is exported
// from the wasm module and this will be assigned once
// the exports are available.
var wasmTable;
// end include: runtime_init_table.js
// include: runtime_stack_check.js
// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
function writeStackCookie() {
var max = _emscripten_stack_get_end();
assert((max & 3) == 0);
// The stack grows downwards
HEAPU32[(max >> 2)+1] = 0x2135467;
HEAPU32[(max >> 2)+2] = 0x89BACDFE;
// Also test the global address 0 for integrity.
HEAP32[0] = 0x63736d65; /* 'emsc' */
}
function checkStackCookie() {
if (ABORT) return;
var max = _emscripten_stack_get_end();
var cookie1 = HEAPU32[(max >> 2)+1];
var cookie2 = HEAPU32[(max >> 2)+2];
if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) {
abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16));
}
// Also test the global address 0 for integrity.
if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
}
// end include: runtime_stack_check.js
// include: runtime_assertions.js
// Endianness check
(function() {
var h16 = new Int16Array(1);
var h8 = new Int8Array(h16.buffer);
h16[0] = 0x6373;
if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)';
})();
// end include: runtime_assertions.js
var __ATPRERUN__ = []; // functions called before the runtime is initialized
var __ATINIT__ = []; // functions called during startup
var __ATMAIN__ = []; // functions called when main() is to be run
var __ATEXIT__ = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the main() is called
var runtimeInitialized = false;
var runtimeExited = false;
var runtimeKeepaliveCounter = 0;
function keepRuntimeAlive() {
return noExitRuntime || runtimeKeepaliveCounter > 0;
}
function preRun() {
if (Module['preRun']) {
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
while (Module['preRun'].length) {
addOnPreRun(Module['preRun'].shift());
}
}
callRuntimeCallbacks(__ATPRERUN__);
}
function initRuntime() {
checkStackCookie();
assert(!runtimeInitialized);
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function preMain() {
checkStackCookie();
callRuntimeCallbacks(__ATMAIN__);
}
function exitRuntime() {
checkStackCookie();
runtimeExited = true;
}
function postRun() {
checkStackCookie();
if (Module['postRun']) {
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
while (Module['postRun'].length) {
addOnPostRun(Module['postRun'].shift());
}
}
callRuntimeCallbacks(__ATPOSTRUN__);
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb);
}
function addOnInit(cb) {
__ATINIT__.unshift(cb);
}
function addOnPreMain(cb) {
__ATMAIN__.unshift(cb);
}
function addOnExit(cb) {
}
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb);
}
// include: runtime_math.js
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
// end include: runtime_math.js
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// Module.preRun (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
var runDependencyTracking = {};
function getUniqueRunDependency(id) {
var orig = id;
while (1) {
if (!runDependencyTracking[id]) return id;
id = orig + Math.random();
}
}
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (id) {
assert(!runDependencyTracking[id]);
runDependencyTracking[id] = 1;
if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
// Check for missing dependencies every few seconds
runDependencyWatcher = setInterval(function() {
if (ABORT) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
return;
}
var shown = false;
for (var dep in runDependencyTracking) {
if (!shown) {
shown = true;
err('still waiting on run dependencies:');
}
err('dependency: ' + dep);
}
if (shown) {
err('(end of list)');
}
}, 10000);
}
} else {
err('warning: run dependency added without ID');
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (id) {
assert(runDependencyTracking[id]);
delete runDependencyTracking[id];
} else {
err('warning: run dependency removed without ID');
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback(); // can add another dependenciesFulfilled
}
}
}
Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data
/** @param {string|number=} what */
function abort(what) {
{
if (Module['onAbort']) {
Module['onAbort'](what);
}
}
what = 'Aborted(' + what + ')';
// TODO(sbc): Should we remove printing and leave it up to whoever
// catches the exception?
err(what);
ABORT = true;
EXITSTATUS = 1;
// Use a wasm runtime error, because a JS error might be seen as a foreign
// exception, which means we'd run destructors on it. We need the error to
// simply make the program stop.
var e = new WebAssembly.RuntimeError(what);
// Throw the error whether or not MODULARIZE is set because abort is used
// in code paths apart from instantiation where an exception is expected
// to be thrown when abort is called.
throw e;
}
// {{MEM_INITIALIZER}}
// include: memoryprofiler.js
// end include: memoryprofiler.js
// show errors on likely calls to FS when it was not included
var FS = {
error: function() {
abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1');
},
init: function() { FS.error() },
createDataFile: function() { FS.error() },
createPreloadedFile: function() { FS.error() },
createLazyFile: function() { FS.error() },
open: function() { FS.error() },
mkdev: function() { FS.error() },
registerDevice: function() { FS.error() },
analyzePath: function() { FS.error() },
loadFilesFromDB: function() { FS.error() },
ErrnoError: function ErrnoError() { FS.error() },
};
Module['FS_createDataFile'] = FS.createDataFile;
Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
// include: URIUtils.js
// Prefix of data URIs emitted by SINGLE_FILE and related options.
var dataURIPrefix = 'data:application/octet-stream;base64,';
// Indicates whether filename is a base64 data URI.
function isDataURI(filename) {
// Prefix of data URIs emitted by SINGLE_FILE and related options.
return filename.startsWith(dataURIPrefix);
}
// Indicates whether filename is delivered via file protocol (as opposed to http/https)
function isFileURI(filename) {
return filename.startsWith('file://');
}
// end include: URIUtils.js
function createExportWrapper(name, fixedasm) {
return function() {
var displayName = name;
var asm = fixedasm;
if (!fixedasm) {
asm = Module['asm'];
}
assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization');
assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
if (!asm[name]) {
assert(asm[name], 'exported native function `' + displayName + '` not found');
}
return asm[name].apply(null, arguments);
};
}
var wasmBinaryFile;
wasmBinaryFile = 'hello.wasm';
if (!isDataURI(wasmBinaryFile)) {
wasmBinaryFile = locateFile(wasmBinaryFile);
}
function getBinary(file) {
try {
if (file == wasmBinaryFile && wasmBinary) {
return new Uint8Array(wasmBinary);
}
if (readBinary) {
return readBinary(file);
} else {
throw "both async and sync fetching of the wasm failed";
}
}
catch (err) {
abort(err);
}
}
function getBinaryPromise() {
// If we don't have the binary yet, try to to load it asynchronously.
// Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
// See https://github.com/github/fetch/pull/92#issuecomment-140665932
// Cordova or Electron apps are typically loaded from a file:// url.
// So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
if (typeof fetch === 'function'
&& !isFileURI(wasmBinaryFile)
) {
return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
if (!response['ok']) {
throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
}
return response['arrayBuffer']();
}).catch(function () {
return getBinary(wasmBinaryFile);
});
}
else {
if (readAsync) {
// fetch is not available or url is file => try XHR (readAsync uses XHR internally)
return new Promise(function(resolve, reject) {
readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject)
});
}
}
}
// Otherwise, getBinary should be able to get it synchronously
return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); });
}
// Create the wasm instance.
// Receives the wasm imports, returns the exports.
function createWasm() {
// prepare imports
var info = {
'env': asmLibraryArg,
'wasi_snapshot_preview1': asmLibraryArg,
};
// Load the wasm module and create an instance of using native support in the JS engine.
// handle a generated wasm instance, receiving its exports and
// performing other necessary setup
/** @param {WebAssembly.Module=} module*/
function receiveInstance(instance, module) {
var exports = instance.exports;
Module['asm'] = exports;
wasmMemory = Module['asm']['memory'];
assert(wasmMemory, "memory not found in wasm exports");
// This assertion doesn't hold when emscripten is run in --post-link
// mode.
// TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
//assert(wasmMemory.buffer.byteLength === 16777216);
updateGlobalBufferAndViews(wasmMemory.buffer);
wasmTable = Module['asm']['__indirect_function_table'];
assert(wasmTable, "table not found in wasm exports");
addOnInit(Module['asm']['__wasm_call_ctors']);
removeRunDependency('wasm-instantiate');
}
// we can't run yet (except in a pthread, where we have a custom sync instantiator)
addRunDependency('wasm-instantiate');
// Prefer streaming instantiation if available.
// Async compilation can be confusing when an error on the page overwrites Module
// (for example, if the order of elements is wrong, and the one defining Module is
// later), so we save Module and check it later.
var trueModule = Module;
function receiveInstantiationResult(result) {
// 'result' is a ResultObject object which has both the module and instance.
// receiveInstance() will swap in the exports (to Module.asm) so they can be called
assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
trueModule = null;
// TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
// When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
receiveInstance(result['instance']);
}
function instantiateArrayBuffer(receiver) {
return getBinaryPromise().then(function(binary) {
return WebAssembly.instantiate(binary, info);
}).then(function (instance) {
return instance;
}).then(receiver, function(reason) {
err('failed to asynchronously prepare wasm: ' + reason);
// Warn on some common problems.
if (isFileURI(wasmBinaryFile)) {
err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing');
}
abort(reason);
});
}
function instantiateAsync() {
if (!wasmBinary &&
typeof WebAssembly.instantiateStreaming === 'function' &&
!isDataURI(wasmBinaryFile) &&
// Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
!isFileURI(wasmBinaryFile) &&
typeof fetch === 'function') {
return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
var result = WebAssembly.instantiateStreaming(response, info);
return result.then(
receiveInstantiationResult,
function(reason) {
// We expect the most common failure cause to be a bad MIME type for the binary,
// in which case falling back to ArrayBuffer instantiation should work.
err('wasm streaming compile failed: ' + reason);
err('falling back to ArrayBuffer instantiation');
return instantiateArrayBuffer(receiveInstantiationResult);
});
});
} else {
return instantiateArrayBuffer(receiveInstantiationResult);
}
}
// User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
// to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
// to any other async startup actions they are performing.
if (Module['instantiateWasm']) {
try {
var exports = Module['instantiateWasm'](info, receiveInstance);
return exports;
} catch(e) {
err('Module.instantiateWasm callback failed with error: ' + e);
return false;
}
}
instantiateAsync();
return {}; // no exports yet; we'll fill them in later
}
// Globals used by JS i64 conversions (see makeSetValue)
var tempDouble;
var tempI64;
// === Body ===
var ASM_CONSTS = {
};
function callRuntimeCallbacks(callbacks) {
while (callbacks.length > 0) {
var callback = callbacks.shift();
if (typeof callback == 'function') {
callback(Module); // Pass the module as the first argument.
continue;
}
var func = callback.func;
if (typeof func === 'number') {
if (callback.arg === undefined) {
getWasmTableEntry(func)();
} else {
getWasmTableEntry(func)(callback.arg);
}
} else {
func(callback.arg === undefined ? null : callback.arg);
}
}
}
function withStackSave(f) {
var stack = stackSave();
var ret = f();
stackRestore(stack);
return ret;
}
function demangle(func) {
warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling');
return func;
}
function demangleAll(text) {
var regex =
/\b_Z[\w\d_]+/g;
return text.replace(regex,
function(x) {
var y = demangle(x);
return x === y ? x : (y + ' [' + x + ']');
});
}
var wasmTableMirror = [];
function getWasmTableEntry(funcPtr) {
var func = wasmTableMirror[funcPtr];
if (!func) {
if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;
wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
}
assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!");
return func;
}
function handleException(e) {
// Certain exception types we do not treat as errors since they are used for
// internal control flow.
// 1. ExitStatus, which is thrown by exit()
// 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
// that wish to return to JS event loop.
if (e instanceof ExitStatus || e == 'unwind') {
return EXITSTATUS;
}
quit_(1, e);
}
function jsStackTrace() {
var error = new Error();
if (!error.stack) {
// IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
// so try that as a special-case.
try {
throw new Error();
} catch(e) {
error = e;
}
if (!error.stack) {
return '(no stack trace available)';
}
}
return error.stack.toString();
}
function setWasmTableEntry(idx, func) {
wasmTable.set(idx, func);
wasmTableMirror[idx] = func;
}
function stackTrace() {
var js = jsStackTrace();
if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
return demangleAll(js);
}
function _emscripten_memcpy_big(dest, src, num) {
HEAPU8.copyWithin(dest, src, src + num);
}
function flush_NO_FILESYSTEM() {
// flush anything remaining in the buffers during shutdown
if (typeof _fflush !== 'undefined') _fflush(0);
var buffers = SYSCALLS.buffers;
if (buffers[1].length) SYSCALLS.printChar(1, 10);
if (buffers[2].length) SYSCALLS.printChar(2, 10);
}
var SYSCALLS = {mappings:{},buffers:[null,[],[]],printChar:function(stream, curr) {
var buffer = SYSCALLS.buffers[stream];
assert(buffer);
if (curr === 0 || curr === 10) {
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
buffer.length = 0;
} else {
buffer.push(curr);
}
},varargs:undefined,get:function() {
assert(SYSCALLS.varargs != undefined);
SYSCALLS.varargs += 4;
var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
return ret;
},getStr:function(ptr) {
var ret = UTF8ToString(ptr);
return ret;
},get64:function(low, high) {
if (low >= 0) assert(high === 0);
else assert(high === -1);
return low;
}};
function _fd_write(fd, iov, iovcnt, pnum) {
;
// hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[((iov)>>2)];
var len = HEAP32[(((iov)+(4))>>2)];
iov += 8;
for (var j = 0; j < len; j++) {
SYSCALLS.printChar(fd, HEAPU8[ptr+j]);
}
num += len;
}
HEAP32[((pnum)>>2)] = num
return 0;
}
function _setTempRet0(val) {
setTempRet0(val);
}
var ASSERTIONS = true;
/** @type {function(string, boolean=, number=)} */
function intArrayFromString(stringy, dontAddNull, length) {
var len = length > 0 ? length : lengthBytesUTF8(stringy)+1;
var u8array = new Array(len);
var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
if (dontAddNull) u8array.length = numBytesWritten;
return u8array;
}
function intArrayToString(array) {
var ret = [];
for (var i = 0; i < array.length; i++) {
var chr = array[i];
if (chr > 0xFF) {
if (ASSERTIONS) {
assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.');
}
chr &= 0xFF;
}
ret.push(String.fromCharCode(chr));
}
return ret.join('');
}
var asmLibraryArg = {
"emscripten_memcpy_big": _emscripten_memcpy_big,
"fd_write": _fd_write,
"setTempRet0": _setTempRet0
};
var asm = createWasm();
/** @type {function(...*):?} */
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors");
/** @type {function(...*):?} */
var _main = Module["_main"] = createExportWrapper("main");
/** @type {function(...*):?} */
var _fflush = Module["_fflush"] = createExportWrapper("fflush");
/** @type {function(...*):?} */
var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location");
/** @type {function(...*):?} */
var stackSave = Module["stackSave"] = createExportWrapper("stackSave");
/** @type {function(...*):?} */
var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore");
/** @type {function(...*):?} */
var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc");
/** @type {function(...*):?} */
var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() {
return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() {
return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() {
return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");
// === Auto-generated postamble setup entry stuff ===
if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = function() { abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = function() { abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setFileTime")) Module["setFileTime"] = function() { abort("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = function() { abort("'abortOnCannotGrowMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = function() { abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = function() { abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = function() { abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = function() { abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = function() { abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = function() { abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = function() { abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = function() { abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = function() { abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = function() { abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = function() { abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = function() { abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = function() { abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = function() { abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = function() { abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = function() { abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = function() { abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = function() { abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = function() { abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = function() { abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = function() { abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = function() { abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = function() { abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = function() { abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = function() { abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = function() { abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = function() { abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = function() { abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = function() { abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = function() { abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = function() { abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = function() { abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = function() { abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = function() { abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = function() { abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = function() { abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = function() { abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = function() { abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = function() { abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = function() { abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = function() { abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = function() { abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = function() { abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = function() { abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = function() { abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = function() { abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = function() { abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = function() { abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = function() { abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = function() { abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = function() { abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = function() { abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = function() { abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = function() { abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = function() { abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = function() { abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = function() { abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = function() { abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = function() { abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = function() { abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = function() { abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = function() { abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = function() { abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = function() { abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = function() { abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = function() { abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = function() { abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = function() { abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = function() { abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = function() { abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = function() { abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = function() { abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = function() { abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = function() { abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = function() { abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = function() { abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = function() { abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = function() { abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "flush_NO_FILESYSTEM")) Module["flush_NO_FILESYSTEM"] = function() { abort("'flush_NO_FILESYSTEM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = function() { abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = function() { abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = function() { abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = function() { abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = function() { abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = function() { abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = function() { abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = function() { abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = function() { abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = function() { abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = function() { abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = function() { abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = function() { abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = function() { abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = function() { abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = function() { abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = function() { abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = function() { abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = function() { abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = function() { abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = function() { abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = function() { abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = function() { abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
Module["writeStackCookie"] = writeStackCookie;
Module["checkStackCookie"] = checkStackCookie;
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });
var calledRun;
/**
* @constructor
* @this {ExitStatus}
*/
function ExitStatus(status) {
this.name = "ExitStatus";
this.message = "Program terminated with exit(" + status + ")";
this.status = status;
}
var calledMain = false;
dependenciesFulfilled = function runCaller() {
// If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
if (!calledRun) run();
if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
};
function callMain(args) {
assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])');
assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');
var entryFunction = Module['_main'];
args = args || [];
var argc = args.length+1;
var argv = stackAlloc((argc + 1) * 4);
HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram);
for (var i = 1; i < argc; i++) {
HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]);
}
HEAP32[(argv >> 2) + argc] = 0;
try {
var ret = entryFunction(argc, argv);
// In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as
// execution is asynchronously handed off to a pthread.
// if we're not running an evented main loop, it's time to exit
exit(ret, /* implicit = */ true);
return ret;
}
catch (e) {
return handleException(e);
} finally {
calledMain = true;
}
}
function stackCheckInit() {
// This is normally called automatically during __wasm_call_ctors but need to
// get these values before even running any of the ctors so we call it redundantly
// here.
// TODO(sbc): Move writeStackCookie to native to to avoid this.
_emscripten_stack_init();
writeStackCookie();
}
/** @type {function(Array=)} */
function run(args) {
args = args || arguments_;
if (runDependencies > 0) {
return;
}
stackCheckInit();
preRun();
// a preRun added a dependency, run will be called later
if (runDependencies > 0) {
return;
}
function doRun() {
// run may have just been called through dependencies being fulfilled just in this very frame,
// or while the async setStatus time below was happening
if (calledRun) return;
calledRun = true;
Module['calledRun'] = true;
if (ABORT) return;
initRuntime();
preMain();
if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
if (shouldRunNow) callMain(args);
postRun();
}
if (Module['setStatus']) {
Module['setStatus']('Running...');
setTimeout(function() {
setTimeout(function() {
Module['setStatus']('');
}, 1);
doRun();
}, 1);
} else
{
doRun();
}
checkStackCookie();
}
Module['run'] = run;
function checkUnflushedContent() {
// Compiler settings do not allow exiting the runtime, so flushing
// the streams is not possible. but in ASSERTIONS mode we check
// if there was something to flush, and if so tell the user they
// should request that the runtime be exitable.
// Normally we would not even include flush() at all, but in ASSERTIONS
// builds we do so just for this check, and here we see if there is any
// content to flush, that is, we check if there would have been
// something a non-ASSERTIONS build would have not seen.
// How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
// mode (which has its own special function for this; otherwise, all
// the code is inside libc)
var oldOut = out;
var oldErr = err;
var has = false;
out = err = function(x) {
has = true;
}
try { // it doesn't matter if it fails
var flush = flush_NO_FILESYSTEM;
if (flush) flush();
} catch(e) {}
out = oldOut;
err = oldErr;
if (has) {
warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.');
warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)');
}
}
/** @param {boolean|number=} implicit */
function exit(status, implicit) {
EXITSTATUS = status;
checkUnflushedContent();
if (keepRuntimeAlive()) {
// if exit() was called, we may warn the user if the runtime isn't actually being shut down
if (!implicit) {
var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)';
err(msg);
}
} else {
exitRuntime();
}
procExit(status);
}
function procExit(code) {
EXITSTATUS = code;
if (!keepRuntimeAlive()) {
if (Module['onExit']) Module['onExit'](code);
ABORT = true;
}
quit_(code, new ExitStatus(code));
}
if (Module['preInit']) {
if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
while (Module['preInit'].length > 0) {
Module['preInit'].pop()();
}
}
// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;
if (Module['noInitialRun']) shouldRunNow = false;
run();
wasm text format (0) | 2021.10.26 |
---|---|
wasm text 와 binary 상호변환 (0) | 2021.10.26 |
wasm from c, cpp (0) | 2021.10.24 |
wasm (0) | 2021.10.22 |
web assembly (0) | 2021.10.19 |
2017년 글
APP가 Approach 인가? 30~60마일 용이니 이게 들리면 좋겠네
근데 30~60마일이면 계산해보니 대충 50~100km 인데
내가 있는 과천쪽에서는 해당 주파수로 통신할 이유도 없고(약 20km)
관악산 때문에 가려져서 수신이 안 될 수도 있으니 다음기회에 근처에 가면 해봐야 할 듯.
[링크 : https://blog.daum.net/monobac/5643867]
[링크 : https://skyl.airportal.go.kr:446/info/info_area05.do]
119.75MHz 인가?
[링크 : https://namu.wiki/w/김포국제공항/시설#s-2.3.1]
김포공항 기준 오는 비행기 보기
iss 주파수 (0) | 2021.12.19 |
---|---|
아부지 HAM 장비 뽀려뽀려 (0) | 2021.12.18 |
아마추어 무선통신 자격증이 왔어용! (2) | 2013.02.27 |
아마추어 무선통신 - 시험관련 (0) | 2013.02.21 |
아마추어 무선통신 - 붙은건가? (0) | 2013.02.21 |
idle 인데도 자꾸 팬이 꽤나 세게 돌아서 온도를 보니
어라.. 0% cpu 인데도 45도를 찍네?
$ sensors BAT0-acpi-0 Adapter: ACPI interface in0: 12.58 V curr1: 728.00 mA coretemp-isa-0000 Adapter: ISA adapter Package id 0: +45.0°C (high = +86.0°C, crit = +100.0°C) Core 0: +42.0°C (high = +86.0°C, crit = +100.0°C) Core 1: +45.0°C (high = +86.0°C, crit = +100.0°C) acpitz-acpi-0 Adapter: ACPI interface temp1: +42.0°C (crit = +128.0°C) temp2: +0.0°C (crit = +128.0°C) temp3: +37.0°C (crit = +128.0°C) temp4: +37.0°C (crit = +128.0°C) temp5: +25.0°C (crit = +128.0°C) temp6: +0.0°C (crit = +128.0°C) |
백퍼.. 써멀 굳은 것 같은데 분해하는걸 찾아보니.. 으아아 메인보드를 드러내야 하는 완전 대공사!!
포기할까 ㅠㅠ
VGA to HDMI 컨버터 분..해? (0) | 2021.12.20 |
---|---|
2760p 써멀 재도포 (0) | 2021.10.29 |
에어컨 안켜서 그런가!? (플렉스 알파) (0) | 2021.10.15 |
다이소 16GB/5000 원 샌디스크 USB (0) | 2021.08.20 |
삼성 플렉스 알파 써보니 불편한 점 (0) | 2021.08.18 |
hello world 정도만 출력하는 예제를 해보는데
이걸로는 성능이 오르는지 알기 어렵지 않나?
최소한 외부 입력을 받고 리턴하는 것 정도는 찾아봐야 할 듯..
[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]
[링크 : https://emscripten.org/docs/getting_started/downloads.html]
[링크 : https://wasmbyexample.dev/examples/hello-world/hello-world.c.en-us.html#]
wasm text 와 binary 상호변환 (0) | 2021.10.26 |
---|---|
emcc wasm 빌드 (0) | 2021.10.25 |
wasm (0) | 2021.10.22 |
web assembly (0) | 2021.10.19 |
wasm emcc (0) | 2018.10.24 |
아오.. 망할 첫째
배위로 점프하는 바람에 튕겨서 액정이 거실 샤시에 쾅... -_-
오늘의 지름 (0) | 2022.04.06 |
---|---|
v50s 액정 사설 수리 비용 (0) | 2022.03.04 |
포켓몬 커뮤니티 데이 / 딥상어동 (0) | 2021.06.06 |
눈물의 액정수리 (0) | 2021.05.15 |
LG v50s HDMI연결 (DeX) (0) | 2021.05.14 |