import * as env from 'env';


  var scratchBuffer = new ArrayBuffer(16);
  var i32ScratchView = new Int32Array(scratchBuffer);
  var f32ScratchView = new Float32Array(scratchBuffer);
  var f64ScratchView = new Float64Array(scratchBuffer);
  
  function wasm2js_scratch_load_i32(index) {
    return i32ScratchView[index];
  }
      
  function wasm2js_scratch_store_i32(index, value) {
    i32ScratchView[index] = value;
  }
      
  function wasm2js_scratch_load_f64() {
    return f64ScratchView[0];
  }
      
  function wasm2js_scratch_store_f64(value) {
    f64ScratchView[0] = value;
  }
      
  function wasm2js_scratch_load_f32() {
    return f32ScratchView[2];
  }
      
  function wasm2js_scratch_store_f32(value) {
    f32ScratchView[2] = value;
  }
      
function asmFunc(imports) {
 var Math_imul = Math.imul;
 var Math_fround = Math.fround;
 var Math_abs = Math.abs;
 var Math_clz32 = Math.clz32;
 var Math_min = Math.min;
 var Math_max = Math.max;
 var Math_floor = Math.floor;
 var Math_ceil = Math.ceil;
 var Math_trunc = Math.trunc;
 var Math_sqrt = Math.sqrt;
 var nan = NaN;
 var infinity = Infinity;
 var env = imports.env;
 var setTempRet0 = env.setTempRet0;
 var i64toi32_i32$HIGH_BITS = 0;
 function $3($0) {
  $0 = Math_fround($0);
  return ~~$0 | 0;
 }
 
 function $4($0) {
  $0 = Math_fround($0);
  return ~~$0 >>> 0 | 0;
 }
 
 function $5($0) {
  $0 = +$0;
  return ~~$0 | 0;
 }
 
 function $6($0) {
  $0 = +$0;
  return ~~$0 >>> 0 | 0;
 }
 
 function $11($0) {
  $0 = $0 | 0;
  return Math_fround(Math_fround($0 | 0));
 }
 
 function $13($0) {
  $0 = $0 | 0;
  return +($0 | 0);
 }
 
 function $15($0) {
  $0 = $0 | 0;
  return Math_fround(Math_fround($0 >>> 0));
 }
 
 function $17($0) {
  $0 = $0 | 0;
  return +($0 >>> 0);
 }
 
 function $19($0) {
  $0 = Math_fround($0);
  return +$0;
 }
 
 function $20($0) {
  $0 = +$0;
  return Math_fround(Math_fround($0));
 }
 
 function $21($0) {
  $0 = $0 | 0;
  return Math_fround((wasm2js_scratch_store_i32(2, $0), wasm2js_scratch_load_f32()));
 }
 
 function $23($0) {
  $0 = Math_fround($0);
  return (wasm2js_scratch_store_f32($0), wasm2js_scratch_load_i32(2)) | 0;
 }
 
 function legalstub$0($0) {
  i64toi32_i32$HIGH_BITS = $0 >> 31;
  setTempRet0(i64toi32_i32$HIGH_BITS | 0);
  return $0;
 }
 
 function legalstub$1($0) {
  i64toi32_i32$HIGH_BITS = 0;
  setTempRet0(0);
  return $0;
 }
 
 function legalstub$2($0, $1) {
  return $0;
 }
 
 function legalstub$7($0) {
  i64toi32_i32$HIGH_BITS = Math_fround(Math_abs($0)) >= Math_fround(1.0) ? ~~($0 > Math_fround(0.0) ? Math_fround(Math_min(Math_fround(Math_floor(Math_fround($0 * Math_fround(2.3283064365386963e-10)))), Math_fround(4294967296.0))) : Math_fround(Math_ceil(Math_fround(Math_fround($0 - Math_fround(~~$0 >>> 0 >>> 0)) * Math_fround(2.3283064365386963e-10))))) >>> 0 : 0;
  setTempRet0(i64toi32_i32$HIGH_BITS | 0);
  return ~~$0 >>> 0;
 }
 
 function legalstub$9($0) {
  i64toi32_i32$HIGH_BITS = Math_abs($0) >= 1.0 ? ~~($0 > 0.0 ? Math_min(Math_floor($0 * 2.3283064365386963e-10), 4294967295.0) : Math_ceil(($0 - +(~~$0 >>> 0 >>> 0)) * 2.3283064365386963e-10)) >>> 0 : 0;
  setTempRet0(i64toi32_i32$HIGH_BITS | 0);
  return ~~$0 >>> 0;
 }
 
 function legalstub$12($0, $1) {
  return Math_fround(+($0 >>> 0) + +($1 | 0) * 4294967296.0);
 }
 
 function legalstub$14($0, $1) {
  return +($0 >>> 0) + +($1 | 0) * 4294967296.0;
 }
 
 function legalstub$16($0, $1) {
  return Math_fround(+($0 >>> 0) + +($1 >>> 0) * 4294967296.0);
 }
 
 function legalstub$18($0, $1) {
  return +($0 >>> 0) + +($1 >>> 0) * 4294967296.0;
 }
 
 function legalstub$22($0, $1) {
  wasm2js_scratch_store_i32(0, $0 | 0);
  wasm2js_scratch_store_i32(1, $1 | 0);
  return +wasm2js_scratch_load_f64();
 }
 
 function legalstub$24($0) {
  var $1 = 0, $2 = 0;
  wasm2js_scratch_store_f64(+$0);
  $1 = wasm2js_scratch_load_i32(1) | 0;
  $2 = wasm2js_scratch_load_i32(0) | 0;
  i64toi32_i32$HIGH_BITS = $1;
  $1 = $2;
  setTempRet0(i64toi32_i32$HIGH_BITS | 0);
  return $1;
 }
 
 return {
  "i64_extend_s_i32": legalstub$0, 
  "i64_extend_u_i32": legalstub$1, 
  "i32_wrap_i64": legalstub$2, 
  "i32_trunc_s_f32": $3, 
  "i32_trunc_u_f32": $4, 
  "i32_trunc_s_f64": $5, 
  "i32_trunc_u_f64": $6, 
  "i64_trunc_s_f32": legalstub$7, 
  "i64_trunc_u_f32": legalstub$7, 
  "i64_trunc_s_f64": legalstub$9, 
  "i64_trunc_u_f64": legalstub$9, 
  "f32_convert_s_i32": $11, 
  "f32_convert_s_i64": legalstub$12, 
  "f64_convert_s_i32": $13, 
  "f64_convert_s_i64": legalstub$14, 
  "f32_convert_u_i32": $15, 
  "f32_convert_u_i64": legalstub$16, 
  "f64_convert_u_i32": $17, 
  "f64_convert_u_i64": legalstub$18, 
  "f64_promote_f32": $19, 
  "f32_demote_f64": $20, 
  "f32_reinterpret_i32": $21, 
  "f64_reinterpret_i64": legalstub$22, 
  "i32_reinterpret_f32": $23, 
  "i64_reinterpret_f64": legalstub$24
 };
}

var retasmFunc = asmFunc({
  "env": env,
});
export var i64_extend_s_i32 = retasmFunc.i64_extend_s_i32;
export var i64_extend_u_i32 = retasmFunc.i64_extend_u_i32;
export var i32_wrap_i64 = retasmFunc.i32_wrap_i64;
export var i32_trunc_s_f32 = retasmFunc.i32_trunc_s_f32;
export var i32_trunc_u_f32 = retasmFunc.i32_trunc_u_f32;
export var i32_trunc_s_f64 = retasmFunc.i32_trunc_s_f64;
export var i32_trunc_u_f64 = retasmFunc.i32_trunc_u_f64;
export var i64_trunc_s_f32 = retasmFunc.i64_trunc_s_f32;
export var i64_trunc_u_f32 = retasmFunc.i64_trunc_u_f32;
export var i64_trunc_s_f64 = retasmFunc.i64_trunc_s_f64;
export var i64_trunc_u_f64 = retasmFunc.i64_trunc_u_f64;
export var f32_convert_s_i32 = retasmFunc.f32_convert_s_i32;
export var f32_convert_s_i64 = retasmFunc.f32_convert_s_i64;
export var f64_convert_s_i32 = retasmFunc.f64_convert_s_i32;
export var f64_convert_s_i64 = retasmFunc.f64_convert_s_i64;
export var f32_convert_u_i32 = retasmFunc.f32_convert_u_i32;
export var f32_convert_u_i64 = retasmFunc.f32_convert_u_i64;
export var f64_convert_u_i32 = retasmFunc.f64_convert_u_i32;
export var f64_convert_u_i64 = retasmFunc.f64_convert_u_i64;
export var f64_promote_f32 = retasmFunc.f64_promote_f32;
export var f32_demote_f64 = retasmFunc.f32_demote_f64;
export var f32_reinterpret_i32 = retasmFunc.f32_reinterpret_i32;
export var f64_reinterpret_i64 = retasmFunc.f64_reinterpret_i64;
export var i32_reinterpret_f32 = retasmFunc.i32_reinterpret_f32;
export var i64_reinterpret_f64 = retasmFunc.i64_reinterpret_f64;
