recorder-core
Version:
Recorder库: html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码
474 lines (434 loc) • 627 kB
JavaScript
/*
Resorder使用的 AMR格式解码编码器
https://github.com/xiangyuecn/Recorder
由此源码改动而来 (2023-09-25 大幅精简代码,移除了大量从未调用的函数、条件分支)
https://raw.githubusercontent.com/BenzLeung/benz-amr-recorder/462c6b91a67f7d9f42d0579fb5906fad9edb2c9d/src/amrnb.js
*/
(function(factory){
var browser=typeof window=="object" && !!window.document;
var win=browser?window:Object; //非浏览器环境,Recorder挂载在Object下面
var rec=win.Recorder;
factory(rec);
}(function(Recorder){ //需要在Worker中运行,不能使用Recorder里的方法,包括$T
"use strict";
function Create(){
//实时解码器
var Decoder=function(){
var This=this;
var decoder = AMR.Decoder_Interface_init();
var buf = Module._malloc(AMR.AMR_BUFFER_COUNT);
var decodeInBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, AMR.AMR_BUFFER_COUNT);
buf = Module._malloc(AMR.PCM_BUFFER_COUNT * 2);
var decodeOutBuffer = new Int16Array(Module.HEAPU8.buffer, buf, AMR.PCM_BUFFER_COUNT);
var lastBytes=[];
This.decode=function(bytes){
if(lastBytes.length){
var a2=new Uint8Array(lastBytes.length+bytes.length);
a2.set(lastBytes);
a2.set(bytes,lastBytes.length);
bytes=a2;
}
var out = null;
var inOffset = 0, outOffset = 0;
while (inOffset + 1 < bytes.length) {
var size = AMR.SIZES[bytes[inOffset] >> 3 & 15];
if(size==null) throw new Error("Invalid amr frame type: "+bytes[inOffset]);
size=size+1;
if(!out) out=new Int16Array(Math.floor(bytes.length / Math.max(13,size) * AMR.PCM_BUFFER_COUNT));
if (inOffset + size > bytes.length) {
break
}
decodeInBuffer.set(bytes.subarray(inOffset, inOffset + size));
AMR.Decoder_Interface_Decode(decoder, decodeInBuffer.byteOffset, decodeOutBuffer.byteOffset, 0);
if (outOffset + AMR.PCM_BUFFER_COUNT > out.length) {
var newOut = new Int16Array(out.length * 2);
newOut.set(out.subarray(0, outOffset));
out = newOut
}
inOffset += size;
out.set(decodeOutBuffer, outOffset);
outOffset += AMR.PCM_BUFFER_COUNT;
}
lastBytes=bytes.subarray(inOffset);
return new Int16Array(out==null?0:out.subarray(0, outOffset));
};
This.flush=function(){
Module._free(decodeInBuffer.byteOffset);
Module._free(decodeOutBuffer.byteOffset);
AMR.Decoder_Interface_exit(decoder);
return new Int16Array(0);
};
};
//实时编码器
var Encoder=function(bitRate){
var This=this;
var mode = AMR.Mode[AMR.BitRate(bitRate)];
var encoder = AMR.Encoder_Interface_init();
var buf = Module._malloc(AMR.PCM_BUFFER_COUNT * 2);
var encodeInBuffer = new Int16Array(Module.HEAPU8.buffer, buf, AMR.PCM_BUFFER_COUNT);
buf = Module._malloc(AMR.AMR_BUFFER_COUNT);
var encodeOutBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, AMR.AMR_BUFFER_COUNT);
var lastPcm=[];
This.encode=function(pcm){//pcm : 8000hz Int16Array
if(lastPcm.length){
var pcm2=new Int16Array(lastPcm.length+pcm.length);
pcm2.set(lastPcm);
pcm2.set(pcm,lastPcm.length);
pcm=pcm2;
}
var blockSize = AMR.SIZES[mode] + 1;
var out = new Uint8Array(Math.ceil(pcm.length / AMR.PCM_BUFFER_COUNT * blockSize));
var inOffset = 0, outOffset=0;
while (inOffset + AMR.PCM_BUFFER_COUNT < pcm.length) {
encodeInBuffer.set(pcm.subarray(inOffset, inOffset + AMR.PCM_BUFFER_COUNT));
var n = AMR.Encoder_Interface_Encode(encoder, mode, encodeInBuffer.byteOffset, encodeOutBuffer.byteOffset, 0);
if (n != blockSize) {
console.error([n, blockSize]);
break
}
inOffset += AMR.PCM_BUFFER_COUNT;
out.set(encodeOutBuffer.subarray(0, n), outOffset);
outOffset += n;
}
lastPcm=pcm.subarray(inOffset);
return new Uint8Array(out.subarray(0, outOffset));
};
This.flush=function(){
Module._free(encodeInBuffer.byteOffset);
Module._free(encodeOutBuffer.byteOffset);
AMR.Encoder_Interface_exit(encoder);
return new Uint8Array(0);
};
};
var AMR = {
//获取实时解码器
GetDecoder:function(){
return Create().DecG_(); //重新获得一个AMR对象操作,避免出错后内存无法重新分配
}
//获取实时编码器
,GetEncoder:function(bitRate){
return Create().EncG_(bitRate);
}
//解码amr文件得到pcm
,decode: function (amrBytes,True,False) {
Create().dec__(amrBytes,True,False);
}
//编码pcm成amr文件
,encode: function (pcm,True,False,bitRate) {//pcm : 8000hz Int16Array
Create().enc__(pcm,True,False,bitRate);
}
,DecG_: function(){ return new Decoder() }
,dec__: function (amrBytes,True,False) {
var This=this,decode=new Decoder();
var buffers=[],size=0;
var endFlush=function(){//flush没有结果,只做释放
try{ decode.flush() }catch(e){ console.error(e) }
};
var inOffset=0,hasHead=0;
if (String.fromCharCode.apply(null, amrBytes.subarray(0, this.AMR_HEADER.length)) == this.AMR_HEADER) {
inOffset+=this.AMR_HEADER.length; hasHead=1;
}
var blockSize=(AMR.SIZES[amrBytes[inOffset] >> 3 & 15]||31)+1;
blockSize=Math.max(13,blockSize)*1000/20*5; //20ms一帧,一帧13-32字节,5秒数据一次
var run=function(){
try{
var startIdx=inOffset;
if(startIdx<amrBytes.length){
inOffset+=blockSize;
var buf=decode.decode(amrBytes.subarray(startIdx,inOffset));
buffers.push(buf); size+=buf.length;
}
if(inOffset<amrBytes.length){
setTimeout(run);
return;
};
}catch(e){
console.error(e);
endFlush();
False("AMR Decoder: "+(hasHead?e.message:"Not an amr audio file"));
return;
};
endFlush();
var pcm=new Int16Array(size);
for(var i=0,j=0;i<buffers.length;i++){
var buf=buffers[i];
pcm.set(buf,j); j+=buf.length;
}
True(pcm);
};
run();
}
,EncG_: function(bitRate){ return new Encoder(bitRate) }
,enc__: function (pcm,True,False,bitRate) {//pcm : 8000hz Int16Array
var This=this,encode=new Encoder(bitRate);
var buffers=[This.GetHeader()],size=buffers[0].length;
var endFlush=function(){//flush没有结果,只做释放
try{ encode.flush() }catch(e){ console.error(e) }
};
var blockSize=40000; blockSize-=blockSize%This.PCM_BUFFER_COUNT;//5秒数据一次
var inOffset=0;
var run=function(){
try{
var startIdx=inOffset;
if(startIdx<pcm.length){
inOffset+=blockSize;
var buf=encode.encode(pcm.subarray(startIdx,inOffset));
buffers.push(buf); size+=buf.length;
}
if(inOffset<pcm.length){
setTimeout(run);
return;
};
}catch(e){ //精简代码调用了abort
console.error(e);
endFlush();
False("AMR Encoder: "+e.message);
return;
};
endFlush();
var bytes=new Uint8Array(size);
for(var i=0,j=0;i<buffers.length;i++){
var buf=buffers[i];
bytes.set(buf,j); j+=buf.length;
}
True(bytes);
};
run();
},
//获取AMR头二进制数据
GetHeader:function(){
var str=this.AMR_HEADER;
var bytes=new Uint8Array(str.length);
for(var i=0;i<str.length;i++)bytes[i]=str.charCodeAt(i);
return bytes;
},
//返回一个匹配的比特率
BitRate:function(bitRate){
var keys=this.Mode;
if(bitRate){
if(keys[bitRate]!=null) return bitRate;
var s=[];
for(var k in keys) s.push({v:+k,s:Math.abs((k-bitRate)||(k-12.2))});
s.sort(function(a,b){return a.s-b.s});
return s[0].v;
}
return 12.2;
},
//精简
Mode: {"4.75": 0, "5.15": 1, "5.9": 2, "6.7": 3, "7.4": 4, "7.95": 5, "10.2": 6, "12.2": 7},
SIZES: [12, 13, 15, 17, 19, 20, 26, 31, 5, 6, 5, 5, 0, 0, 0, 0],
AMR_BUFFER_COUNT: 32,
PCM_BUFFER_COUNT: 160,
AMR_HEADER: "#!AMR\n",
WAV_HEADER_SIZE: 44
};
var Module = {
_main: (function () {
AMR.Decoder_Interface_init = Module._Decoder_Interface_init;
AMR.Decoder_Interface_exit = Module._Decoder_Interface_exit;
AMR.Decoder_Interface_Decode = Module._Decoder_Interface_Decode;
AMR.Encoder_Interface_init = Module._Encoder_Interface_init;
AMR.Encoder_Interface_exit = Module._Encoder_Interface_exit;
AMR.Encoder_Interface_Encode = Module._Encoder_Interface_Encode;
return 0
})
};
AMR.Module=Module;
//精简
var Runtime = {
//精简
staticAlloc: (function (size) {
var ret = STATICTOP;
STATICTOP = STATICTOP + size | 0;
STATICTOP = STATICTOP + 15 & -16;
return ret
}), dynamicAlloc: (function (size) {
var ret = DYNAMICTOP;
DYNAMICTOP = DYNAMICTOP + size | 0;
DYNAMICTOP = DYNAMICTOP + 15 & -16;
if (DYNAMICTOP >= TOTAL_MEMORY) {
var success = enlargeMemory();
if (!success) {
DYNAMICTOP = ret;
return 0
}
}
return ret
}), alignMemory: (function (size, quantum) {
var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);
return ret
//}), 精简
}), GLOBAL_BASE: 8
};
Module["Runtime"] = Runtime;
var ABORT = false;
//精简
function assert(condition, text) {
if (!condition) {
abort("Assertion failed: " + text)
}
}
//精简
var ALLOC_STATIC = 2;
var ALLOC_NONE = 4;
Module["ALLOC_STATIC"] = ALLOC_STATIC;
Module["ALLOC_NONE"] = ALLOC_NONE;
function allocate(slab, types, allocator, ptr) {
var zeroinit, size;
if (typeof slab === "number") {
zeroinit = true;
size = slab
} else {
zeroinit = false;
size = slab.length
}
var singleType = typeof types === "string" ? types : null;
var ret;
if (allocator == ALLOC_NONE) {
ret = ptr
} else {
if(allocator!=ALLOC_STATIC)abort("fix !ALLOC_STATIC");//精简
ret = Runtime.staticAlloc(Math.max(size, singleType ? 1 : types.length))
}
if (zeroinit) {
var ptr = ret, stop;
assert((ret & 3) == 0);
stop = ret + (size & ~3);
for (; ptr < stop; ptr += 4) {
HEAP32[ptr >> 2] = 0
}
stop = ret + size;
while (ptr < stop) {
HEAP8[ptr++ >> 0] = 0
}
return ret
}
if (singleType === "i8") {
if (slab.subarray || slab.slice) {
HEAPU8.set(slab, ret)
} else {
HEAPU8.set(new Uint8Array(slab), ret)
}
return ret
}
abort("fix allocate")
}
Module["allocate"] = allocate;
//精简
var PAGE_SIZE = 4096;
function alignMemoryPage(x) {
if (x % 4096 > 0) {
x += 4096 - x % 4096
}
return x
}
var HEAP;
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false;
var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0;
var DYNAMIC_BASE = 0, DYNAMICTOP = 0;
function enlargeMemory() {
abort("enlargeMemory")
}
var TOTAL_STACK = Module["TOTAL_STACK"] || 65536;
var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 524288;
var totalMemory = 64 * 1024;
while (totalMemory < TOTAL_MEMORY || totalMemory < 2 * TOTAL_STACK) {
if (totalMemory < 16 * 1024 * 1024) {
totalMemory *= 2
} else {
totalMemory += 16 * 1024 * 1024
}
}
if (totalMemory !== TOTAL_MEMORY) {
abort('fix t!==T')
}
//精简
var buffer;
buffer = new ArrayBuffer(TOTAL_MEMORY);
HEAP8 = new Int8Array(buffer);
HEAP16 = new Int16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPU8 = new Uint8Array(buffer);
HEAPU16 = new Uint16Array(buffer);
HEAPU32 = new Uint32Array(buffer);
HEAPF32 = new Float32Array(buffer);
HEAPF64 = new Float64Array(buffer);
HEAP32[0] = 255;
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, "fix !LE");
Module["HEAP"] = HEAP;
Module["buffer"] = buffer;
Module["HEAP8"] = HEAP8;
Module["HEAP16"] = HEAP16;
Module["HEAP32"] = HEAP32;
Module["HEAPU8"] = HEAPU8;
Module["HEAPU16"] = HEAPU16;
Module["HEAPU32"] = HEAPU32;
Module["HEAPF32"] = HEAPF32;
Module["HEAPF64"] = HEAPF64;
//精简
if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5) Math["imul"] = function imul(a, b) {
var ah = a >>> 16;
var al = a & 65535;
var bh = b >>> 16;
var bl = b & 65535;
return al * bl + (ah * bl + al * bh << 16) | 0
};
Math.imul = Math["imul"];
if (!Math["clz32"]) Math["clz32"] = (function (x) {
x = x >>> 0;
for (var i = 0; i < 32; i++) {
if (x & 1 << 31 - i) return i
}
return 32
});
Math.clz32 = Math["clz32"];
var Math_abs = Math.abs;
var Math_cos = Math.cos;
var Math_sin = Math.sin;
var Math_tan = Math.tan;
var Math_acos = Math.acos;
var Math_asin = Math.asin;
var Math_atan = Math.atan;
var Math_atan2 = Math.atan2;
var Math_exp = Math.exp;
var Math_log = Math.log;
var Math_sqrt = Math.sqrt;
var Math_ceil = Math.ceil;
var Math_floor = Math.floor;
var Math_pow = Math.pow;
var Math_imul = Math.imul;
var Math_fround = Math.fround;
var Math_min = Math.min;
var Math_clz32 = Math.clz32;
//精简
STATIC_BASE = 8;
STATICTOP = STATIC_BASE + 31776;
//精简 负优化
Module.b64Atob=function(input) {
//低版本Worker里面没有atob https://developer.mozilla.org/en-US/docs/Web/API/atob
//测试: s=new Array(1024*10).fill();s=s.map(v=>String.fromCharCode(~~(Math.random()*256)));t=s.join("");s=btoa(t);b64Atob(s)==atob(s)
var bc = 0, bs, buffer, idx = 0, output = '';
while(true){
buffer = input.charCodeAt(idx++);
if(!buffer || buffer==61) break //""||"="
if(buffer>64&&buffer<91) buffer-=65;
else if(buffer>96&&buffer<123) buffer-=71; //97-26
else if(buffer>47&&buffer<58) buffer+=4; //48-26-26
else if(buffer==43) buffer=62;// +
else if(buffer==47) buffer=63;// /
else continue;
bs = bc % 4 ? bs * 64 + buffer : buffer;
if(bc++ % 4) output += String.fromCharCode(255 & bs >> (-2 * bc & 6));
}
return output;
};
Module.b64Dec=function(str){
var s=typeof atob=="function"?atob(str):Module.b64Atob(str);
var a=new Uint8Array(s.length);
for(var i=0;i<s.length;i++)a[i]=s.charCodeAt(i);
return a;
};
allocate(Module.b64Dec("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CQAUAFQAAQD+/wIAAwAGAAUACQAUAFQAAQD+/wIAAwAGAAUACQAUAFQAAQD+/wIAAwAGAAoAEwAUAFQAAQD+/wIAAwAGAAUACQAUAF4AAAD9/wMAAwAGAAUACQASAAAAAAAAAAAAAAAAAAAAAAAAABEAEwATABMAEwAXACcAOQAFAAgACAAHAAgABwACAAgABAAHAAIABAAHAAIACAAEAAcAAgAIAAgABwAIAAcAAgAGAAQABwACAAYABAAHAAIABgAEAAcAAgAGAAgACQAJAAgACQACAAYABAAJAAIABgAIAAkAAgAGAAQACQACAAYACAAJAAkACAALAAMABwAEAAsAAwAHAAgACwADAAcABAALAAMABwAIAAkACQAIAA0ABAAHAAUADQAEAAcACAANAAQABwAFAA0ABAAHAAkACQAJAAgADQAEAAQABQAGAA0ABAAEAAUACAANAAQABAAFAAYADQAEAAQABQAIAAkACQAIAAEAAQABAAEACgAKAAcABwAFAAEAAQABAAEACgAKAAcABwAIAAEAAQABAAEACgAKAAcABwAFAAEAAQABAAEACgAKAAcABwAHAAgACQAIAAYACQAEAAQABAAEAAQABAADAAMAAwADAAMABQAGAAQABAAEAAQABAAEAAMAAwADAAMAAwAFAAkABAAEAAQABAAEAAQAAwADAAMAAwADAAUABgAEAAQABAAEAAQABAADAAMAAwADAAMABQADAAgACQAJAAYAXwBnAHYAhgCUAJ8AzAD0ACcAKwAmACUAAAAAAAAAAAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABcAGAAZABoAGwAcADAAMQA9AD4AUgBTAC8ALgAtACwAUQBQAE8ATgARABIAFAAWAE0ATABLAEoAHQAeACsAKgApACgAJgAnABAAEwAVADIAMwA7ADwAPwBAAEgASQBUAFUAXQBeACAAIQAjACQANQA2ADgAOQBCAEMARQBGAFcAWABaAFsAIgA3AEQAWQAlADoARwBcAB8ANABBAFYABwAGAAUABAADAAIAAQAAAA8ADgANAAwACwAKAAkACAAXABgAGQAaABsALgBBAFQALQAsACsAQAA/AD4AUwBSAFEAZgBlAGQAKgA9AFAAYwAcAC8AQgBVABIAKQA8AE8AYgAdADAAQwARABQAFgAoADsATgBhABUAHgAxAEQAVgATABAAVwAnACYAOgA5AE0AIwA2AEkAXABMAGAAXwAkADcASgBdACAAMwAhADQARgBHAFkAWgAfADIARQBYACUAOABLAF4AIgA1AEgAWwAAAAEABAAFAAMABgAHAAIADQAPAAgACQALAAwADgAKABAAHABKAB0ASwAbAEkAGgBIAB4ATAAzAGEAMgBHAGAAdQAfAE0ANABiADEARgBfAHQANQBjACAATgAhAE8AMABFAF4AcwAvAEQAXQByAC4AQwBcAHEAEwAVABcAFgASABEAFAAYAG8AKwBZAG4AQABBACwAWgAZAC0AQgBbAHAANgBkACgAPQBWAGsAJwA8AFUAagAkADkAUgBnACMAOABRAGYAIgA3AFAAZQAqAD8AWABtACkAPgBXAGwAJgA7AFQAaQAlADoAUwBoAAAAAQAEAAMABQAGAA0ABwACAAgACQALAA8ADAAOAAoAHABSAB0AUwAbAFEAGgBQAB4AVAAQADcAbQA4AG4AHwBVADkAbwAwAEkAZgB/ACAAVgAzAEwAaQCCADQATQBqAIMAOgBwACEAVwATABcANQBOAGsAhAAVABYAEgARABQAGAAZADIASwBoAIEALwBIAGUAfgA2AE8AbACFAC4ARwBkAH0AgABnAEoAMQAtAEYAYwB8ACoAQwBgAHkAJwBAAF0AdgAmAD8AXAB1ACMAPABZAHIAIgA7AFgAcQAsAEUAYgB7ACsARABhAHoAKQBCAF8AeAAoAEEAXgB3ACUAPgBbAHQAJAA9AFoAcwAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAGgBXABsAWAAcAFkAHQBaAB4AWwAzAFAAcACNADQAUQBxAI4ANgBTAHMAkAA3AFQAdACRADoAdwA7AHgAFQAWABcAEQASABMAHwA8AFwAeQA4AFUAdQCSABQAGAAZADIATwBvAIwAOQBWAHYAkwAxAE4AbgCLADAATQA1AFIAcgCPAG0AigAvAEwAbACJACAAIQA9AD4AXQBeAHoAewApACoAKwAsAC0ALgBGAEcASABJAEoASwBmAGcAaABpAGoAawCDAIQAhQCGAIcAiAAiAD8AXwB8ACMAQABgAH0AJABBAGEAfgAlAEIAYgB/ACYAQwBjAIAAJwBEAGQAgQAoAEUAZQCCAAgABwAGAAUABAADAAIADgAQAAkACgAMAA0ADwALABEAFAAWABgAFwATABIAFQA4AFgAegCaADkAWQB7AJsAOgBaAHwAnAA0AFQAdgCWADUAVQB3AJcAGwBdABwAXgAdAF8AHgBgAB8AYQA9AH8APgCAAD8AgQA7AFsAfQCdACAAYgBAAIIAAQAAABkAGgAhAGMAIgBkAEEAgwBCAIQANgBWAHgAmAA8AFwAfgCeADcAVwB5AJkAdQB0AHMALgBOAHAAkAArAEsAbQCNACgASABqAIoAJABEAGYAhgByAJUAlACTAJIAUwBSAFEAUAAzADIAMQAwAC8ALQAsACoAJwAjAE8ATQBMAEoARwBDAHEAbwBuAGwAaQBlAJEAjwCOAIwAiQCFACkASQBrAIsAJQBFAGcAhwAmAEYAaACIAAcABgAFAAQAAwACAAEAAAAQAA8ADgANAAwACwAKAAkACAAaABsAHAAdAB4AHwBzAHQAdQB2AHcAeABIAEkAoQCiAEEARABFAGwAbwBwAJoAnQCeAMUAyADJACAAIQB5AHoASgBLAKMApABCAG0AmwDGABMAFwAVABYAEgARABQAGAAZACUAJAAjACIAUABPAE4ATQB+AH0AfAB7AKkAqACnAKYARgBDAEcAcQBuAHIAnwCcAKAAygDHAMsATAClAFEAUgBcAFsAXQBTAF8AVQBUAF4AZQBmAGAAaABWAGcAVwBhAH8AgACKAIkAiwCBAI0AgwCCAIwAkwCUAI4AlgCEAJUAhQCPAKoAqwC1ALQAtgCsALgArgCtALcAvgC/ALkAwQCvAMAAsAC6ACYAJwAxADAAMgAoADQAKgApADMAOgA7ADUAPQArADwALAA2AMIAswC9AMQAsQDDALIAuwC8AJcAiACSAJkAhgCYAIcAkACRAGkAWgBkAGsAWABqAFkAYgBjAD4ALwA5AEAALQA/AC4ANwA4AAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOABcADwAQABEAEgATABQAFQAWABgAGQAaABsAHAAmAI0AJwCOACgAjwApAJAAKgCRACsAkgAsAJMALQCUAC4AlQAvAGEAlgDIADAAYgCXAMkAMQBjAJgAygBWAIgAvQDvAFcAiQC+APAAWACKAL8A8QBbAMIAXADDAF0AxABeAMUAXwDGAB0AHgAfACAAIQAiACMAMgBkAJkA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"), "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
allocate(Module.b64Dec("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"), "i8", ALLOC_NONE, Runtime.GLOBAL_BASE + 10240);
allocate(Module.b64Dec("IQCTAE7/mQOXBoEHu/7w/Ub4AgDj/o4Djf4W/hr/AABVAtoHEP51/r78JQCxA/UAtQBg/3D/yQVdBU0Fnf6n/Qr7KgFCAaACP/+w/k0AQQT9BZoDsQDZ/5v75AMNAxgCyAFuAVD+hwWICecILv4K/ev20f4D/oMBKf3T/UIAb/+DAuAE4P1c/Wz8H/9eA0wCaP8oAOv9pwGPBRYGxP21/If7gP9VAM0BEv///rj9XQLsAl0DGAA2/3/6HQPnAS8BS/9sAUr/aAJiBX4LEv6s/F/63P49ACwDrP8t/Ur/KwIUAuIFk/4T/t/7NgNMAgsA8v/u/xr/6QN5BasFJv7H/fT6LgE+ACYEuv+I/iL/1gPOA30EPP8W/+X83wFKBPMBagE6AEYAewQVCCkLGf6S/OD4SQDg/lwBmv4M/gT+xwDRAtoEsv9H/eX8aQEYAsQAdgFuACH9TwMbBGgHkv43/WL7OwFAAa0BSAAp/z7+9wJ2A1MF4v9U/r78XQNzAhwDdgDUAen+SwVbB2UHRP9+/bT5PwBR/64EXv4t/zMAngFLAikKFv/T/ab8qAF5A94AiACb/1MAhQXmCGcFrP9D/pP6ngE5ARUEHQCp/kEAEAZvBtQDtwCl/8P8+QSFBWgBKQIQAZX/MwZNDCsKaAUdCFwN9BNWGrofhyZUK6oxhTU9/tf77/3n+j7+DP0P/qH8gP6V/WP+Y/3D/ub9tf7U/WL+BP5Y/ob+7v68/k7+mv0e/wz+GP/+/fn+h/7W/mb+af86/VL/zvxr/2T+ZP9T/uD+Mv5G/zX/Vv/S/kH/v/59/23/1/51/hz/Kv8L/0D/vf/E/rn/uf6Y/zP/ov9J/3H/2v8//6H/EAC0/4T/CP8XABP/GAAM/xIAeP8sAJH/3//o/+f/AACVABMAFwBx/54AV/+uAEv/hQDJ/6UA5v9vAFQAYgBLAFcAtwCN//X/+P+CAAsAqgD+AE0AzQARALcAcAAGAcIAygAfAV8AvQDW/5f/6gCzACcAugCjAFkBTAHHACsBoQDK/x0Bsv8ZAXv/jQBK/28A+QBVAQ8BbAFdAJMBSwCHAVwA/gF2/9wAR//j/97/aQGN/0ABAwAqAmMAHgHaAE8CC/+WAfT+xQEAAEQCGQBeAhMBFAKUAMIBt//jAuP+BgLg/l4ANf+iAnT/tv/NAMoCjv8rAbAAmwO2AC0C8ADBAvD/AQLlAVECJQGAAcMBaQLa/zIAMwIRAi8B0QDLAWsBsQHEAcIBxgFvAV4C3QHlArABYQFwAQsBaQHMAhEBRwLFAaYA/gGsAMkAdQISAb8AOAJ/Ai4BKgF6AoMBgwJeAUsCMAJkAjUCWAIUA+cBoAIAAvcDQQFNAWUBVgOD/50B2gHIAhEAaf80Ah0BDgEP/8sDeQPpAdwA/gGAAyUCnANHATkDIgGPAxwCVASeACUDxwC9A/8B2gJkAGoDDQAXA7MBeAKkAswD+QCEA9MBwgQNAzIESQIRA+n/nQILARMEawI8BGcCeQRuAokDlAMZBFAASwFIAjMEWQB/AtwDwQMCA9ACHgO7AuwBvwGDA3MCDwGkBNUCNQVXAFsCQANDBmgCZwR6A+EF6AOEBGID8QPjAzsDfQRaAzEDqgUFAygF9AFtBTgBgQTs/zwEQAADBQIAlASPAU0HAgKqBvYBZAZ2A/IFoAFYAmsERgX7BG4FeQMDB5ID5gbjAJ8E4gQiB/kBPgeXAzEJOf+vAZgAxwYr/+T/iAE2BWf/zP/SA38Evf5w/i0DpwZ4/1QAqQXfB7X+cf93/6gEAP8WAmP/BwTN/kn+HgLbArf+XP6f/2gClv5Y/77+bgEJ/5L/Lf9ZADz/y/4UADsAlP4x/uL+WQCw/q8AUP6NAIX+Qv9O/jz/sf+WAOr+Hf/o/qYA1f1a/mX/HQKS/jYA4/+t/9P++vy6AHQCc/74/vIAJQE7/7f9fACaATUAe/8KAFQBxv3X+0EAQv5EABP+fwGpA5v+Of2Z/gb/W/3U+yQB5v9rAQYAXwIhBYH/9v/pBV4HyQLMA70FhQijBeAHofnA+fz4Dvf9+xb5tPsX+AP7lPqp+gL6TfxL+jT8DPoZ/Dr7BPxs+9H8Jfwg/KX6QPsS/Pf6uvsY/Qz7Df3z+qL8Zfx3/Cj8Wv3l+1P95vvB+yf82vtZ/SP8f/2Z+zD8Bv1y/Yb82vy//L37Pv2L/ZP92vyA/dT8+fyG/fX84f0c/Mv9zfu8/d79nf3E/ZX9CP3e/pH88v3J/DL+5fwD/9f9Yf6z/Un+6/2s/kz9WfwH/vz8Qv2V+/n+zv41/B3+Q/62/9X93P2a/X//S/0W/3T+Cv8l/gb/9/5s/oj+/v1f/gL+1P7H/rL+aP0x/tL8fv5A/a/+mf0W/zf/F/8R/1n/yf01/5X9bf9h/o3/oP5a/xL9Vf8H/fL+kfz4/nn8kf4Y/SsAJf4OAHP9KwBi/QsAQP7F//f9gv+J/2X/m/3W/6H85f9d/IgAHf63ACz+NwDW/jcA0P45AZ/9OQEw/UIBWf9kAOP9/f+J/5H/Rf/pABT/BAEW/xoAW/+GANP/2P/b/WgBNf96AXz+wgGB/hMBFAC2AJn/9gCR/68BJQDOAW7/5wFj/+T+xf/3AUj/GAA1AP3/NgB6AAMBTQFCAOQBaAC0AUQAwwB0AL4AzgANAff/4gFgAX4BHQGPARUBxAEAAUUAugANACkB8/8DAaH/HgA4AIoBxACpAc0AyAEZAUECDwC/AHcBIgGXAUACyP/jACAClQEAACUCpP8QAhv/XwEL/1IBlv6zAacADwK1/y4BWwA4A4EAVwLwAacCugDtApkA4QLn/lgCpP5nAhT/AQMpAHEDJgB6AyT/SQOb/nMDd/6HA4b92gFE/lIDUf+mAhP+8gD5/REDNv1GAuP9bgHh/bIBq/30AQP93gBC/ZUDGf3CA5v89QF9/CQChf7IAE3+nQDN/NYAo/ydAJr9KACI/V4AjfzK/xv9BAIL/ioBmv1V/5r8X/+f/On/zvxdAAn89f5q/Zn+2/0CAEb+h/+H/gAAHf8hAGL+gv9//9QAWvwiAMb75v6h+/T+Ov3H/Fz+Qf/M+2D8a/yj/4z9mv5hAAcAMv93/pv/GAA1/yYAWP9TAKn9Wf7p/qoBRP12ALX/zgAr/F/9WP2hAZH+JQDp/toBf//C/j8BKAGO/dn/VwFaAkj92f/R/qwDaADpAIT+iQDc/w0Btf8q/3gAKwDv/SP+ywGkADb/G//P/1n/YQIYA2IAJP+TA5QAJQEbAWUDWwA/AooBRgGy/80CQwBtAb3+aALc/9sCGwBrAu4AeAIRAcABYwAhA9wBZQMRAa0CQAAVA0gA/QPZABkDywHeAmgBhgLgAWgBQgGtAdABfgKuAfQCawHoA5QBqwIQAloCZwKPAp0BsgOvAqkDWgKIA1wCKwLhAhIDlgLTAY4CagFNAqEDxgLyAd4BnwGkAbUCcwMtA6sCDQOdA5EDqwPWAtwC6wFVAxMCtAPeAsMDOwEoA/kC8wJ4BPgCjwI0BDoDIQRDBEYD6wMoAxcEbQSTAk0E4AMaBDIEMwTLA7YCygQeBDsCSQN0A3wFYwVIBDgEXQPPBN8CBAX4AvgE3wNXBR0E6QS8AhoEFgLcA8UB8ARXAnQEpwJVBi8DaAUJAiUFiQEcBiUDqAWuAiwEiAJrAzMBOwRpARcEPQGJBcQDowI7AoAETwBaBNH/+gU3AbkGOgGOBLECAgKi/10BGgGEBUgBAQTnAb//OQAlA8oDJAA+AAED+f4XA6b+fQK7Anf/bAIWAh0CIf3CAMcCLAH0/qH8ngMBAzz9VP76Aa4AhPyK/bMBIwJl+v7+bQLXAQb8qPp3/gkCaPxS/ef/FAAq/Hz7VAEJAOr5kfug/jAA1flu/on8BgB8+4j83P2g/pX5cPth/2ICGPg9/B//wQCI+Vj4C/8T/jz8cPlY/IX97fow+ZT6pP38+b38i/p5/8z53v56+Tj9Jfig+YH55f8u99X8e/u4AA/7vQCp+koCJfjJAOr8yAJG+wMA9/soAx37PgOR/3sCnPm/ATH+S/xD/mD8CP52+wv+RfuQAKH+jP7k++X+3fvp/p37wf1i+rX9svlZ/Cj85QCyAmf8Mf1t/lIFU/0v/moDjQED/tL/PQE2BRv+yAEtA7cBZf5TAYIDKwRX/i4AoQXxAXP84Py5BRYEAv+//pYFjQREAF4BCgSaAnIBCwAfBRYDjwDoABEEGgaO/5cCUAY2BMYBQwL7BBAEtP+NA/ACKwSZAAACXAG+BGYCgQEzBygDDQEKBMsAPgSMAvkD9wZqBK0BLwWDAWgFz/+fBLj/vwRg/ukDIALVBqD+xwQK/q8Es/05Ah3/XgZy/yoGGv+zBjb9CAW6/HYFawRNBTD/0AS1AcUDX/wyAysDggVbA+MFpAC8BGsFAQfkAVIHyAEPCOQDkgQuBXoFJAVQBW8E7gTSBFIGUQXoBo0FywQwBkMFVgOgApUGHgZzBPYE4AchB+0GLQb8BbQFzwWyA3sG/QPQBrwEcAXRA+wGiQQiB4wEtgaVBbUHNwahBGADVAglBAcHLgMuB/UCOAgjBQYI6gRBCJMDGwmiA7sFewQeCp8FxQjQBioIVAY2Ca4FagriBVQHLQcWCLcHywYpBqoCCQUwBv0HrgUyCMIJ1AeXChII1gI0BsQKIAnkAE8DmAl7BiQALQGWB6UHQv6g/2oIdAX9BU0EDgBgAmX8JP1nBb4HQQW4A1j9QQEBBfQExvltAa0DsgM3+cr8RgnjCh0H5Ars+B33qfgX9pj5yPhh+Sz4PPuI+Dv7xvfp+cz52/ns+VX7sfk4+0H5sfqB+7D5ZPgG+5H65/qF+rn5Zft0+eH6Xfo6+qn6fvwY+937zfqS+yr8k/uD+yD6yPvk+gT8Yfss/DL6Ofwp+iT8Zvzp+8v7uvxl+6b8OvuV++/72PsB/Zj8e/tD/ZD8Pv12/Pr8CPy+/cj73/w6+rH9qfuw/Yb7N/2U+oD9oPqr/d37YP55/FL9wPxr/Tz9RP6c/Bb+Z/yK/vj8lf1u+7f92/3//OX8Tf5t/e79G/0O/rv8m/6r/en+mfwN/4n85v5n/ej+Zf1b/9D9dv55/Jb+Zv5A/rn9Z/7C/cf+m/6D/dz9xv1M/oD8CP6C/gv9xv8f/lv/lv1B/4r+Fv+C/iL/Vf3n/yD+Xv6Z/ib9n/68/mP/UP6+/nb+0f7k/pj/p/3f/tT9PP+0/Wr/bf2g/Sf+6P+8/0D+Jv74/wb+0/8U/Uj/tPwE/3v8pf+4/Z//dP2KAAT9ff9a/fT/Yv2lAP3+/f+4/JX/c/wlACD8LACq/GH+ufwNABf88f7++8v+4vwi/sD8GP5R/KgAqPt9/l/7m/9h+9j/U/zE/vr7/vzs+4/9x/vm/Tj71f7g+kz+U/tp/XH7X/9A+079K/vB/Gj6MP2F+hP+fvwc/Wb83/yy+27+1fk8/Nv7gv0L+2L6Jfpa/CL6gfzC+cz9Rfkz/aL9q/1y+8P7p/os/mb4K/rS+Ef8dPhd/CX6RP+d+Vv+T/qu/lj66v9q+Fr+KvgH/xD+jv+K+A399/quAFX6k/8e/v/+O/sE/q/5lwBi+dAAcv1rAI35HQCL+xcBQfsyATT7Bv4m/VH/LPub/zf8JwKa/BYByfw7Ac39eAHl++QABf4YAan9GQEK/f0Az/57AQ39ev+d/ZQCyPwYAs/8hgJj/jEAq/6xADv+DgIe/k0Cuf9TAW/9CAEM/ycBE/87AX3+OQIG/vf/h/4OAGD/lQIo/ygAzP7S/18A1gAO/6cAqv/AAMj/GwC0/x8AJAA1AZb/Sv+P/0oAR/7q/xcAiwBRAPX/LAAPAKn/d/+K/zH/Yv/G/xABpP9k/0f+CAB4/4AAI/9lACb/KAA7/7T/OP4JAEP+IQBZ/uIAPABJACL/nABx/hgBwv71AKv+pgAN/lMBQv9HASX/RQF3/6f/rP1kAI39kABb/ecBHAD8AHn+1gDX/xoB5P9jAOL+SwExAMsBfP41Ao/+tAEcAFAB9/+NAVn/agIiAFQC7/8xAnT/KwFPAAoCfQDLAAIA9AAgAf8A0wCvAFIAVAK7AAUCbAB9Af8AbQEpAfEBYAFHAa7/GQDSAHMB9QAFAQMAIQLBAYwAJgEsACcB1ABbAfQA7gFLARACyQAzAV0BmwFlAhwBZgKdAdABQgFwAo0BYQDIAGD/gAGVAGoB7wENAg0BSQIhAOsBh/+xAasBYwLyAQQCqwC7AfEBmgK4ARMBNgI/ApIAfwKbAJ4C3/+tANQAuAJa/1kCQf+3Ahf+9wGvAOYC1gDcAXQBOwRCAhICSgIJA6kBagM7AUkDdgFQA1v/NQIjAN8D2f8mBEkByAISA0gDhQIbA5UCpAI7ApYDeAI3BKECMQM+AYQBagP0AzQCUANwA2wCLQLfAZ8CxQG0AtQBSAOCAkwDhQL6AawBgQM3AkUDgwHCA/MBswIxAqsDngMPAygBFgMMAQQEEgJqA0kBJAKPAKMCIwH3AUIAEQRnARIDYQAlAyEARQPWAf8BMQBEBEcBlgRDAQMA8gBoA9oBsQKtATEFpgISBGwCVQSYAkEBwQB5A7YDgQRqA30DewJtA14DtAORAw0FmQIoBX8C5QMZA3oFBgSYBPQDVgS/A4IFnQN7BZMDHwJeA1wExgRDA6YEQwOmBL8DfAR7BGAFFAWpBIcFzwQ3BT0F6gJEBK8GAwVtBTEENgUeBoEEwwVtBnEEIQfEBCAEZgXxBcIGYAYJBlQGBgZXAzwGYQODBrUCdQO0Bu8FjwQQBaEI4AagB9UF5AfKBf4FSgeeBtgHHgbsAuEGOQMmAXAFPAQKCG0CIwVtAQcFxgAEBOgBgAX5AJMB9gMZBkQBawFtBhQEwQBvAfIHQwcF/0MC7gLiAw3/HgAtBW8D5P9X/3AClQM7/p8AugBaBZr9BgAZAogBov/d/g0D5QCA/9b+9QDrAUP9eP3MAxUDC/6A/bIA/wCT/nr+Af89AUL82v5B/+QA+fxB/p0AE/9v/TD9af5cAIv/nf1OARr/Wf3E+3D/w/57/KP8Hv2Y/qv/Kf2m/+38ZADq/3n++f7I/7f/r/4O/QUAQ/8+/ZD9WQCo/nn/p/uf/hP/VP2R++3+svvz/k37mACRAC79MPsxAFAAIPv4/Aj/hwEk/d391QHaAAH/oPxFAG4BWv8b/lD9vwBE+1T7Vv9X/+T6oflBAdYBdfol+8D/EAGv+gj/7AE1Ai/9n/3DAOUBw/17/6sBygBV/4r/xwA/AgIA4f+2AvMCqvrZ/ygCLQIX/g8BqAIZAg0AO/5XA7oDe//M/6//4gJv+30CHwQjBKH/pALrBDkE6QExAT/+ugPq/eQDN/xiA977IwTy+moCePppAjb+VgVh/x0H+vzw/fL/VgRO+3v8/PyxARj7GfsN/NL+pv23/Qn9rvkI/fP5uPx/+ND85f0X+UX3Hf/c/w742fjF95r7Wfbo+EL6/ABz9WH+xf0t/uUFEgaECLcHFgnkB7/4b/m/+CX5+PeC+6r3ivmt+bX7WPmV+7/6uPmx+pr5xvrz+tP6D/uA+Y/5Mfqt/L762Ph7+nT3/vpX/Qf5j/k6/Mb7Yft0+eL7z/uK+3r7SfsY/Qb7G/xa/Jn6Yfx4+g785/rx/EX85/t8/B/8z/wf/cn8NPxb+x79uvse/X778Pzf/Nb87vyE/Pj9GPzO/Hz9O/y//Y784/1K/WH9a/yt/X79ev2Z/UT8k/1j/P39Kf0d/tH8G/64/L79SP43/