diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js
index 4021d33a..54ce8b20 100644
--- a/dist/assemblyscript.js
+++ b/dist/assemblyscript.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("binaryen")):"function"==typeof define&&define.amd?define(["binaryen"],t):"object"==typeof exports?exports.assemblyscript=t(require("binaryen")):e.assemblyscript=t(e.binaryen)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=28)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NONE=0]="NONE",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.DECLARE=4]="DECLARE",e[e.CONST=8]="CONST",e[e.LET=16]="LET",e[e.STATIC=32]="STATIC",e[e.READONLY=64]="READONLY",e[e.ABSTRACT=128]="ABSTRACT",e[e.PUBLIC=256]="PUBLIC",e[e.PRIVATE=512]="PRIVATE",e[e.PROTECTED=1024]="PROTECTED",e[e.GET=2048]="GET",e[e.SET=4096]="SET",e[e.AMBIENT=8192]="AMBIENT",e[e.GENERIC=16384]="GENERIC",e[e.GENERIC_CONTEXT=32768]="GENERIC_CONTEXT",e[e.INSTANCE=65536]="INSTANCE",e[e.CONSTRUCTOR=131072]="CONSTRUCTOR",e[e.ARROW=262144]="ARROW",e[e.MODULE_EXPORT=524288]="MODULE_EXPORT",e[e.MODULE_IMPORT=1048576]="MODULE_IMPORT",e[e.BUILTIN=2097152]="BUILTIN",e[e.COMPILED=4194304]="COMPILED",e[e.INLINED=8388608]="INLINED",e[e.SCOPED=16777216]="SCOPED",e[e.TRAMPOLINE=33554432]="TRAMPOLINE",e[e.VIRTUAL=67108864]="VIRTUAL",e[e.MAIN=134217728]="MAIN"}(t.CommonFlags||(t.CommonFlags={})),t.PATH_DELIMITER="/",t.PARENT_SUBST="..",t.GETTER_PREFIX="get:",t.SETTER_PREFIX="set:",t.INSTANCE_DELIMITER="#",t.STATIC_DELIMITER=".",t.INNER_DELIMITER="~",t.LIBRARY_SUBST="~lib",t.LIBRARY_PREFIX=t.LIBRARY_SUBST+t.PATH_DELIMITER,t.FILESPACE_PREFIX="file:"},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(21)),n(r(20)),n(r(19)),n(r(18))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(9),a=r(1),s=r(9);function o(e){switch(e){case n.INFO:return"INFO";case n.WARNING:return"WARNING";case n.ERROR:return"ERROR";default:return assert(!1),""}}function c(e){switch(e){case n.INFO:return t.COLOR_BLUE;case n.WARNING:return t.COLOR_YELLOW;case n.ERROR:return t.COLOR_RED;default:return assert(!1),""}}t.DiagnosticCode=s.DiagnosticCode,t.diagnosticCodeToString=s.diagnosticCodeToString,function(e){e[e.INFO=0]="INFO",e[e.WARNING=1]="WARNING",e[e.ERROR=2]="ERROR"}(n=t.DiagnosticCategory||(t.DiagnosticCategory={})),t.diagnosticCategoryToString=o,t.COLOR_BLUE="",t.COLOR_YELLOW="",t.COLOR_RED="",t.COLOR_RESET="",t.diagnosticCategoryToColor=c;var p=function(){function e(e,t,r){this.range=null,this.code=e,this.category=t,this.message=r}return e.create=function(t,r,n,a,s){void 0===n&&(n=null),void 0===a&&(a=null),void 0===s&&(s=null);var o=i.diagnosticCodeToString(t);return null!=n&&(o=o.replace("{0}",n)),null!=a&&(o=o.replace("{1}",a)),null!=s&&(o=o.replace("{2}",s)),new e(t,r,o)},e.createInfo=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.INFO,r,i)},e.createWarning=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.WARNING,r,i)},e.createError=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.ERROR,r,i)},e.prototype.withRange=function(e){return this.range=e,this},e.prototype.toString=function(){return this.range?o(this.category)+" "+this.code.toString(10)+': "'+this.message+'" in '+this.range.source.normalizedPath+":"+this.range.line.toString(10)+":"+this.range.column.toString(10):o(this.category)+" "+this.code.toString(10)+": "+this.message},e}();function l(e,r){void 0===r&&(r=!1);for(var n=e.source.text,i=n.length,s=e.start,o=e.end;s>0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o<i&&!a.isLineBreak(n.charCodeAt(o));)o++;for(var c=["\n ",n.substring(s,o),"\n "];s<e.start;)c.push(" "),s++;if(r&&c.push(t.COLOR_RED),e.start==e.end)c.push("^");else for(;s++<e.end;)c.push("~");return r&&c.push(t.COLOR_RESET),c.join("")}t.DiagnosticMessage=p,t.formatDiagnosticMessage=function(e,r,n){void 0===r&&(r=!1),void 0===n&&(n=!1);var i=[];if(r&&i.push(c(e.category)),i.push(o(e.category)),r&&i.push(t.COLOR_RESET),i.push(e.code<1e3?" AS":" TS"),i.push(e.code.toString(10)),i.push(": "),i.push(e.message),e.range){var a=e.range;n&&(i.push("\n"),i.push(l(e.range,r))),i.push("\n"),i.push(" in "),i.push(a.source.normalizedPath),i.push("("),i.push(a.line.toString(10)),i.push(","),i.push(a.column.toString(10)),i.push(")")}return i.join("")},t.formatDiagnosticContext=l;var u=function(){function e(e){void 0===e&&(e=null),this.diagnostics=e||new Array}return e.prototype.emitDiagnostic=function(e,t,r,n,i,a){void 0===n&&(n=null),void 0===i&&(i=null),void 0===a&&(a=null);var s=p.create(e,t,n,i,a).withRange(r);this.diagnostics.push(s)},e.prototype.info=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.INFO,t,r,i,a)},e.prototype.warning=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.WARNING,t,r,i,a)},e.prototype.error=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.ERROR,t,r,i,a)},e}();t.DiagnosticEmitter=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i,a=r(10);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(n=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallImport=_BinaryenCallImportId()]="CallImport",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake"}(i=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.PageSize=_BinaryenPageSize()]="PageSize",e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory",e[e.HasFeature=_BinaryenHasFeature()]="HasFeature"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={}));var s=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=s;var o=function(){function e(){this.cachedTemporaryName=0,this.hasTemporaryFunction=!1,this.cachedPrecomputeName=0,this.cachedPrecomputeNames=0}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.cachedByValue=allocate_memory(16),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.cachedByValue=allocate_memory(24),n}finally{free_memory(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=h(e),i=l(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{free_memory(i),free_memory(n)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=l(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{free_memory(r)}},e.prototype.removeFunctionType=function(e){var t=h(e);try{_BinaryenRemoveFunctionType(this.ref,t)}finally{free_memory(t)}},e.prototype.createI32=function(e){var t=this.cachedByValue;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.cachedByValue;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=h(t),i=u(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{free_memory(i),free_memory(n)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=h(e);try{return _BinaryenGetGlobal(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=h(e);try{return _BinaryenSetGlobal(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=n.None);var i=h(e),a=u(t);try{return _BinaryenBlock(this.ref,i,a,t.length,r)}finally{free_memory(a),free_memory(i)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=h(e);try{return _BinaryenBreak(this.ref,n,t,r)}finally{free_memory(n)}},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=h(e);try{return _BinaryenLoop(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s<i;++s)a[s]=h(e[s]);var o=l(a),c=h(t);try{return _BinaryenSwitch(this.ref,o,i,c,r,n)}finally{free_memory(c),free_memory(o);for(s=i-1;s>=0;--s)free_memory(a[s])}},e.prototype.createCall=function(e,t,r){var n=h(e),i=u(t);try{return _BinaryenCall(this.ref,n,i,t&&t.length||0,r)}finally{free_memory(i),free_memory(n)}},e.prototype.createCallImport=function(e,t,r){var n=h(e),i=u(t);try{return _BinaryenCallImport(this.ref,n,i,t&&t.length||0,r)}finally{free_memory(i),free_memory(n)}},e.prototype.createCallIndirect=function(e,t,r){var n=u(t),i=h(r);try{return _BinaryenCallIndirect(this.ref,e,n,t&&t.length||0,i)}finally{free_memory(i),free_memory(n)}},e.prototype.createUnreachable=function(){return _BinaryenUnreachable(this.ref)},e.prototype.addGlobal=function(e,t,r,n){var i=h(e);try{return _BinaryenAddGlobal(this.ref,i,t,r?1:0,n)}finally{free_memory(i)}},e.prototype.addFunction=function(e,t,r,n){var i=h(e),a=l(r);try{return _BinaryenAddFunction(this.ref,i,t,a,r?r.length:0,n)}finally{free_memory(a),free_memory(i)}},e.prototype.removeFunction=function(e){var t=h(e);try{_BinaryenRemoveFunction(this.ref,t)}finally{free_memory(t)}},e.prototype.addTemporaryFunction=function(e,t,r){this.hasTemporaryFunction=assert(!this.hasTemporaryFunction);var n=this.cachedTemporaryName;n||(this.cachedTemporaryName=n=h(""));var i=l(t);try{var a=_BinaryenAddFunctionType(this.ref,n,e,i,t?t.length:0);return _BinaryenAddFunction(this.ref,n,a,0,0,r)}finally{free_memory(i)}},e.prototype.removeTemporaryFunction=function(){this.hasTemporaryFunction=!assert(this.hasTemporaryFunction);var e=assert(this.cachedTemporaryName);_BinaryenRemoveFunction(this.ref,e),_BinaryenRemoveFunctionType(this.ref,e)},e.prototype.addFunctionExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddFunctionExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addTableExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddTableExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addMemoryExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddMemoryExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addGlobalExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddGlobalExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.removeExport=function(e){var t=h(e);try{_BinaryenRemoveExport(this.ref,t)}finally{free_memory(t)}},e.prototype.addFunctionImport=function(e,t,r,n){var i=h(e),a=h(t),s=h(r);try{return _BinaryenAddFunctionImport(this.ref,i,a,s,n)}finally{free_memory(s),free_memory(a),free_memory(i)}},e.prototype.addTableImport=function(e,t,r){var n=h(e),i=h(t),a=h(r);try{return _BinaryenAddTableImport(this.ref,n,i,a)}finally{free_memory(a),free_memory(i),free_memory(n)}},e.prototype.addMemoryImport=function(e,t,r){var n=h(e),i=h(t),a=h(r);try{return _BinaryenAddMemoryImport(this.ref,n,i,a)}finally{free_memory(a),free_memory(i),free_memory(n)}},e.prototype.addGlobalImport=function(e,t,r,n){var i=h(e),a=h(t),s=h(r);try{return _BinaryenAddGlobalImport(this.ref,i,a,s,n)}finally{free_memory(s),free_memory(a),free_memory(i)}},e.prototype.removeImport=function(e){var t=h(e);try{_BinaryenRemoveImport(this.ref,t)}finally{free_memory(t)}},e.prototype.setMemory=function(e,t,r,n,i){void 0===i&&(i=null);for(var s=h(i),o=r.length,c=new Array(o),u=new Array(o),d=new Array(o),_=0;_<o;++_){var m=r[_].buffer,y=r[_].offset;c[_]=p(m),u[_]=n==a.Target.WASM64?this.createI64(i64_low(y),i64_high(y)):this.createI32(i64_low(y)),d[_]=m.length}var g=l(c),T=l(u),E=l(d);try{_BinaryenSetMemory(this.ref,e,t,s,g,T,E,o)}finally{free_memory(E),free_memory(T),free_memory(g);for(_=o-1;_>=0;--_)free_memory(c[_]);free_memory(s)}},e.prototype.setFunctionTable=function(e){var t=u(e);try{_BinaryenSetFunctionTable(this.ref,t,e.length)}finally{free_memory(t)}},e.prototype.setStart=function(e){_BinaryenSetStart(this.ref,e)},e.prototype.setOptimizeLevel=function(e){void 0===e&&(e=2),_BinaryenSetOptimizeLevel(e)},e.prototype.setShrinkLevel=function(e){void 0===e&&(e=1),_BinaryenSetShrinkLevel(e)},e.prototype.setDebugInfo=function(e){void 0===e&&(e=!1),_BinaryenSetDebugInfo(e)},e.prototype.optimize=function(e){void 0===e&&(e=0),e?_BinaryenFunctionOptimize(e,this.ref):_BinaryenModuleOptimize(this.ref)},e.prototype.runPasses=function(e,t){void 0===t&&(t=0);for(var r=e.length,n=new Array(r),i=0;i<r;++i)n[i]=h(e[i]);var a=l(n);try{t?_BinaryenFunctionRunPasses(t,this.ref,a,r):_BinaryenModuleRunPasses(this.ref,a,r)}finally{free_memory(a);for(i=r;i>=0;--i)free_memory(n[i])}},e.prototype.precomputeFunction=function(e){var t=this.cachedPrecomputeNames;if(!t){var r=h("precompute");this.cachedPrecomputeName=r,this.cachedPrecomputeNames=t=l([r])}_BinaryenFunctionRunPasses(e,this.ref,t,1)},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.cachedByValue,r=h(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=d(t);var a=d(t+4);i=d(t+8);var s=new m;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n<t;++n)r[n]=load(e+n);return r}(n,a),s.sourceMap=_(i),s}finally{r&&free_memory(r),n&&free_memory(n),i&&free_memory(i)}},e.prototype.toText=function(){throw new Error("not implemented")},e.prototype.toAsmjs=function(){throw new Error("not implemented")},e.prototype.dispose=function(){assert(this.ref),free_memory(this.cachedByValue),free_memory(this.cachedTemporaryName),free_memory(this.cachedPrecomputeName),free_memory(this.cachedPrecomputeNames),_BinaryenModuleDispose(this.ref),this.ref=0},e.prototype.createRelooper=function(){return c.create(this)},e.prototype.cloneExpression=function(e,t,r){if(void 0===t&&(t=!1),void 0===r&&(r=i32.MAX_VALUE),r<0)return 0;var a,s;switch(r-=1,_BinaryenExpressionGetId(e)){case i.Const:switch(_BinaryenExpressionGetType(e)){case n.I32:return this.createI32(_BinaryenConstGetValueI32(e));case n.I64:return this.createI64(_BinaryenConstGetValueI64Low(e),_BinaryenConstGetValueI64High(e));case n.F32:return this.createF32(_BinaryenConstGetValueF32(e));case n.F64:return this.createF64(_BinaryenConstGetValueF64(e));default:throw new Error("concrete type expected")}case i.GetLocal:return _BinaryenGetLocal(this.ref,_BinaryenGetLocalGetIndex(e),_BinaryenExpressionGetType(e));case i.GetGlobal:var o=_BinaryenGetGlobalGetName(e);if(!o)break;return _BinaryenGetGlobal(this.ref,o,_BinaryenExpressionGetType(e));case i.Load:if(!(a=this.cloneExpression(_BinaryenLoadGetPtr(e),t,r)))break;return _BinaryenLoadIsAtomic(e)?_BinaryenAtomicLoad(this.ref,_BinaryenLoadGetBytes(e),_BinaryenLoadGetOffset(e),_BinaryenExpressionGetType(e),a):_BinaryenLoad(this.ref,_BinaryenLoadGetBytes(e),_BinaryenLoadIsSigned(e)?1:0,_BinaryenLoadGetOffset(e),_BinaryenLoadGetAlign(e),_BinaryenExpressionGetType(e),a);case i.Unary:if(!(a=this.cloneExpression(_BinaryenUnaryGetValue(e),t,r)))break;return _BinaryenUnary(this.ref,_BinaryenUnaryGetOp(e),a);case i.Binary:if(!(a=this.cloneExpression(_BinaryenBinaryGetLeft(e),t,r)))break;if(!(s=this.cloneExpression(_BinaryenBinaryGetRight(e),t,r)))break;return _BinaryenBinary(this.ref,_BinaryenBinaryGetOp(e),a,s)}return 0},e.prototype.addDebugInfoFile=function(e){var t=h(e);try{return _BinaryenModuleAddDebugInfoFileName(this.ref,t)}finally{free_memory(t)}},e.prototype.getDebugInfoFile=function(e){return _(_BinaryenModuleGetDebugInfoFileName(this.ref,e))},e.prototype.setDebugLocation=function(e,t,r,n,i){_BinaryenFunctionSetDebugLocation(e,t,r,n,i)},e.MAX_MEMORY_WASM32=65535,e.MAX_MEMORY_WASM64=65535,e}();t.Module=o,t.getExpressionId=function(e){return _BinaryenExpressionGetId(e)},t.getExpressionType=function(e){return _BinaryenExpressionGetType(e)},t.getConstValueI32=function(e){return _BinaryenConstGetValueI32(e)},t.getConstValueI64Low=function(e){return _BinaryenConstGetValueI64Low(e)},t.getConstValueI64High=function(e){return _BinaryenConstGetValueI64High(e)},t.getConstValueF32=function(e){return _BinaryenConstGetValueF32(e)},t.getConstValueF64=function(e){return _BinaryenConstGetValueF64(e)},t.getGetLocalIndex=function(e){return _BinaryenGetLocalGetIndex(e)},t.getSetLocalIndex=function(e){return _BinaryenSetLocalGetIndex(e)},t.getSetLocalValue=function(e){return _BinaryenSetLocalGetValue(e)},t.isTeeLocal=function(e){return _BinaryenSetLocalIsTee(e)},t.getBinaryOp=function(e){return _BinaryenBinaryGetOp(e)},t.getBinaryLeft=function(e){return _BinaryenBinaryGetLeft(e)},t.getBinaryRight=function(e){return _BinaryenBinaryGetRight(e)},t.getUnaryOp=function(e){return _BinaryenUnaryGetOp(e)},t.getUnaryValue=function(e){return _BinaryenUnaryGetValue(e)},t.getLoadBytes=function(e){return _BinaryenLoadGetBytes(e)},t.getLoadOffset=function(e){return _BinaryenLoadGetOffset(e)},t.getLoadPtr=function(e){return _BinaryenLoadGetPtr(e)},t.isLoadSigned=function(e){return _BinaryenLoadIsSigned(e)},t.getStoreBytes=function(e){return _BinaryenStoreGetBytes(e)},t.getStoreOffset=function(e){return _BinaryenStoreGetOffset(e)},t.getStorePtr=function(e){return _BinaryenStoreGetPtr(e)},t.getStoreValue=function(e){return _BinaryenStoreGetValue(e)},t.getBlockName=function(e){return _(_BinaryenBlockGetName(e))},t.getBlockChildCount=function(e){return _BinaryenBlockGetNumChildren(e)},t.getBlockChild=function(e,t){return _BinaryenBlockGetChild(e,t)},t.getIfCondition=function(e){return _BinaryenIfGetCondition(e)},t.getIfTrue=function(e){return _BinaryenIfGetIfTrue(e)},t.getIfFalse=function(e){return _BinaryenIfGetIfFalse(e)},t.getLoopName=function(e){return _(_BinaryenLoopGetName(e))},t.getLoopBody=function(e){return _BinaryenLoopGetBody(e)},t.getBreakName=function(e){return _(_BinaryenBreakGetName(e))},t.getBreakCondition=function(e){return _BinaryenBreakGetCondition(e)},t.getSelectThen=function(e){return _BinaryenSelectGetIfTrue(e)},t.getSelectElse=function(e){return _BinaryenSelectGetIfFalse(e)},t.getSelectCondition=function(e){return _BinaryenSelectGetCondition(e)},t.getDropValue=function(e){return _BinaryenDropGetValue(e)},t.getReturnValue=function(e){return _BinaryenReturnGetValue(e)},t.getCallTarget=function(e){return _(_BinaryenCallGetTarget(e))},t.getHostOp=function(e){return _BinaryenHostGetOp(e)},t.getHostOperandCount=function(e){return _BinaryenHostGetNumOperands(e)},t.getHostOperand=function(e,t){return _BinaryenHostGetOperand(e,t)},t.getHostName=function(e){return _(_BinaryenHostGetNameOperand(e))},t.getFunctionBody=function(e){return _BinaryenFunctionGetBody(e)},t.getFunctionName=function(e){return _(_BinaryenFunctionGetName(e))},t.getFunctionParamCount=function(e){return _BinaryenFunctionGetNumParams(e)},t.getFunctionParamType=function(e,t){return _BinaryenFunctionGetParam(e,t)},t.getFunctionResultType=function(e){return _BinaryenFunctionGetResult(e)};var c=function(){function e(){}return e.create=function(t){var r=new e;return r.module=t,r.ref=_RelooperCreate(),r},e.prototype.addBlock=function(e){return _RelooperAddBlock(this.ref,e)},e.prototype.addBranch=function(e,t,r,n){void 0===r&&(r=0),void 0===n&&(n=0),_RelooperAddBranch(e,t,r,n)},e.prototype.addBlockWithSwitch=function(e,t){return _RelooperAddBlockWithSwitch(this.ref,e,t)},e.prototype.addBranchForSwitch=function(e,t,r,n){void 0===n&&(n=0);var i=l(r);try{_RelooperAddBranchForSwitch(e,t,i,r.length,n)}finally{free_memory(i)}},e.prototype.renderAndDispose=function(e,t){return _RelooperRenderAndDispose(this.ref,e,t,this.module.ref)},e}();function p(e){if(!e)return 0;for(var t=e.length,r=allocate_memory(t),n=r,i=0;i<t;++i)store(n++,e[i]);return r}function l(e){if(!e)return 0;for(var t=allocate_memory(e.length<<2),r=t,n=0,i=e.length;n<i;++n){var a=e[n];store(r,255&a),store(r+1,a>>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function u(e){return l(e)}function h(e){if(null==e)return 0;for(var t=allocate_memory(function(e){for(var t=0,r=0,n=e.length;r<n;++r){var i=e.charCodeAt(r);i>=55296&&i<=57343&&r+1<n&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++r)),i<=127?++t:t+=i<=2047?2:i<=65535?3:i<=2097151?4:i<=67108863?5:6}return t}(e)+1),r=t,n=0,i=e.length;n<i;++n){var a=e.charCodeAt(n);a>=55296&&a<=57343&&n+1<i&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++n)),a<=127?store(r++,a):a<=2047?(store(r++,192|a>>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),t}function d(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function _(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.Relooper=c,t.readString=_;var m=function(){return function(){}}();t.BinaryModule=m},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=r(0),a=r(8);t.Token=a.Token,t.Range=a.Range;var s,o=r(1);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPEPARAMETER=2]="TYPEPARAMETER",e[e.PARAMETER=3]="PARAMETER",e[e.SIGNATURE=4]="SIGNATURE",e[e.IDENTIFIER=5]="IDENTIFIER",e[e.ASSERTION=6]="ASSERTION",e[e.BINARY=7]="BINARY",e[e.CALL=8]="CALL",e[e.CLASS=9]="CLASS",e[e.COMMA=10]="COMMA",e[e.ELEMENTACCESS=11]="ELEMENTACCESS",e[e.FALSE=12]="FALSE",e[e.FUNCTION=13]="FUNCTION",e[e.INSTANCEOF=14]="INSTANCEOF",e[e.LITERAL=15]="LITERAL",e[e.NEW=16]="NEW",e[e.NULL=17]="NULL",e[e.PARENTHESIZED=18]="PARENTHESIZED",e[e.PROPERTYACCESS=19]="PROPERTYACCESS",e[e.TERNARY=20]="TERNARY",e[e.SUPER=21]="SUPER",e[e.THIS=22]="THIS",e[e.TRUE=23]="TRUE",e[e.CONSTRUCTOR=24]="CONSTRUCTOR",e[e.UNARYPOSTFIX=25]="UNARYPOSTFIX",e[e.UNARYPREFIX=26]="UNARYPREFIX",e[e.BLOCK=27]="BLOCK",e[e.BREAK=28]="BREAK",e[e.CONTINUE=29]="CONTINUE",e[e.DO=30]="DO",e[e.EMPTY=31]="EMPTY",e[e.EXPORT=32]="EXPORT",e[e.EXPORTIMPORT=33]="EXPORTIMPORT",e[e.EXPRESSION=34]="EXPRESSION",e[e.FOR=35]="FOR",e[e.IF=36]="IF",e[e.IMPORT=37]="IMPORT",e[e.RETURN=38]="RETURN",e[e.SWITCH=39]="SWITCH",e[e.THROW=40]="THROW",e[e.TRY=41]="TRY",e[e.VARIABLE=42]="VARIABLE",e[e.VOID=43]="VOID",e[e.WHILE=44]="WHILE",e[e.CLASSDECLARATION=45]="CLASSDECLARATION",e[e.ENUMDECLARATION=46]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=47]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=48]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=49]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=50]="IMPORTDECLARATION",e[e.INTERFACEDECLARATION=51]="INTERFACEDECLARATION",e[e.METHODDECLARATION=52]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=53]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=54]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=55]="VARIABLEDECLARATION",e[e.DECORATOR=56]="DECORATOR",e[e.EXPORTMEMBER=57]="EXPORTMEMBER",e[e.SWITCHCASE=58]="SWITCHCASE",e[e.COMMENT=59]="COMMENT"}(s=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case s.LITERAL:case s.NULL:case s.TRUE:case s.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case s.IDENTIFIER:case s.CALL:case s.ELEMENTACCESS:case s.PROPERTYACCESS:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case s.IDENTIFIER:case s.PROPERTYACCESS:return!0}return!1};var c=function(){function e(){this.parent=null,this.flags=i.CommonFlags.NONE}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.createType=function(e,t,r,n){var i=new l;return i.range=n,i.name=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createIdentifierExpression("",t),null,!1,t)},e.createTypeParameter=function(e,t,r){var n=new u;return n.range=r,n.name=e,e.parent=n,n.extendsType=t,t&&(t.parent=n),n},e.createParameter=function(e,t,r,n,i){var a=new h;return a.range=i,a.name=e,e.parent=a,a.type=t,t&&(t.parent=a),a.initializer=r,r&&(r.parent=a),a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new _;return a.range=i,a.parameters=e,xe(e,a),a.returnType=t,t.parent=a,a.explicitThisType=r,r&&(r.parent=a),a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new y;return n.range=r,n.name=e,e.parent=n,n.arguments=t,t&&xe(t,n),n.decoratorKind=m(e),n},e.createComment=function(e,t,r){var n=new g;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t){var r=new f;return r.range=t,r.text=e,r},e.createEmptyIdentifierExpression=function(e){var t=new f;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new v;return r.range=t,r.elementExpressions=e,function(e,t){for(var r=0,n=e.length;r<n;++r){var i=e[r];i&&(i.parent=t)}}(e,r),r},e.createAssertionExpression=function(e,t,r,n){var i=new A;return i.range=n,i.assertionKind=e,i.expression=t,t.parent=i,i.toType=r,r.parent=i,i},e.createBinaryExpression=function(e,t,r,n){var i=new C;return i.range=n,i.operator=e,i.left=t,t.parent=i,i.right=r,r.parent=i,i},e.createCallExpression=function(e,t,r,n){var i=new N;return i.range=n,i.expression=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.arguments=r,xe(r,i),i},e.createClassExpression=function(e){var t=new S;return t.range=e.range,t.declaration=e,t},e.createCommaExpression=function(e,t){var r=new O;return r.range=t,r.expressions=e,xe(e,r),r},e.createConstructorExpression=function(e){var t=new L;return t.range=e,t},e.createElementAccessExpression=function(e,t,r){var n=new b;return n.range=r,n.expression=e,e.parent=n,n.elementExpression=t,t.parent=n,n},e.createFalseExpression=function(e){var t=new H;return t.range=e,t},e.createFloatLiteralExpression=function(e,t){var r=new k;return r.range=t,r.value=e,r},e.createFunctionExpression=function(e){var t=new R;return t.flags=e.flags&i.CommonFlags.ARROW,t.range=e.range,t.declaration=e,t},e.createInstanceOfExpression=function(e,t,r){var n=new x;return n.range=r,n.expression=e,e.parent=n,n.isType=t,t.parent=n,n},e.createIntegerLiteralExpression=function(e,t){var r=new F;return r.range=t,r.value=e,r},e.createNewExpression=function(e,t,r,n){var i=new B;return i.range=n,i.expression=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.arguments=r,xe(r,i),i},e.createNullExpression=function(e){var t=new D;return t.range=e,t},e.createParenthesizedExpression=function(e,t){var r=new U;return r.range=t,r.expression=e,e.parent=r,r},e.createPropertyAccessExpression=function(e,t,r){var n=new P;return n.range=r,n.expression=e,e.parent=n,n.property=t,t.parent=n,n},e.createRegexpLiteralExpression=function(e,t,r){var n=new w;return n.range=r,n.pattern=e,n.patternFlags=t,n},e.createTernaryExpression=function(e,t,r,n){var i=new M;return i.range=n,i.condition=e,e.parent=i,i.ifThen=t,t.parent=i,i.ifElse=r,r.parent=i,i},e.createStringLiteralExpression=function(e,t){var r=new G;return r.range=t,r.value=e,r},e.createSuperExpression=function(e){var t=new K;return t.range=e,t},e.createThisExpression=function(e){var t=new z;return t.range=e,t},e.createTrueExpression=function(e){var t=new V;return t.range=e,t},e.createUnaryPostfixExpression=function(e,t,r){var n=new W;return n.range=r,n.operator=e,n.operand=t,t.parent=n,n},e.createUnaryPrefixExpression=function(e,t,r){var n=new Y;return n.range=r,n.operator=e,n.operand=t,t.parent=n,n},e.createBlockStatement=function(e,t){var r=new J;return r.range=t,r.statements=e,xe(e,r),r},e.createBreakStatement=function(e,t){var r=new ee;return r.range=t,r.label=e,e&&(e.parent=r),r},e.createClassDeclaration=function(e,t,r,n,i,a,s,o){var c=new te;return c.range=o,c.flags=s,c.name=e,e.parent=c,c.typeParameters=t,xe(t,c),c.extendsType=r,r&&(r.parent=c),c.implementsTypes=n,n&&xe(n,c),c.members=i,xe(i,c),c.decorators=a,a&&xe(a,c),c},e.createContinueStatement=function(e,t){var r=new re;return r.range=t,r.label=e,e&&(e.parent=r),r},e.createDoStatement=function(e,t,r){var n=new ne;return n.range=r,n.statement=e,e.parent=n,n.condition=t,t.parent=n,n},e.createEmptyStatement=function(e){var t=new ie;return t.range=e,t},e.createEnumDeclaration=function(e,t,r,n,i){var a=new ae;return a.range=i,a.flags=n,a.name=e,e.parent=a,a.values=t,xe(t,a),a.decorators=r,r&&xe(r,a),a},e.createEnumValueDeclaration=function(e,t,r,n){var i=new se;return i.range=n,i.flags=r,i.name=e,e.parent=i,i.value=t,t&&(t.parent=i),i},e.createExportStatement=function(e,t,r,n){var i=new pe;if(i.range=n,i.flags=r,i.members=e,e&&xe(e,i),i.path=t,t){var a=o.normalizePath(t.value);t.value.startsWith(".")?i.normalizedPath=o.resolvePath(a,n.source.normalizedPath):i.normalizedPath=a,i.internalPath=Re(i.normalizedPath)}else i.normalizedPath=null,i.internalPath=null;return i},e.createExportImportStatement=function(e,t,r){var n=new oe;return n.range=r,n.name=e,e.parent=n,n.externalName=t,t.parent=n,n},e.createExportMember=function(e,t,r){var n=new ce;return n.range=r,n.name=e,e.parent=n,t?t.parent=n:t=e,n.externalName=t,n},e.createExpressionStatement=function(e){var t=new le;return t.range=e.range,t.expression=e,e.parent=t,t},e.createIfStatement=function(e,t,r,n){var i=new _e;return i.range=n,i.condition=e,e.parent=i,i.ifTrue=t,t.parent=i,i.ifFalse=r,r&&(r.parent=i),i},e.createImportStatement=function(e,t,r){var n=new ye;n.range=r,n.declarations=e,e&&xe(e,n),n.namespaceName=null,n.path=t;var a=o.normalizePath(t.value);return t.value.startsWith(".")?n.normalizedPath=o.resolvePath(a,r.source.normalizedPath):(a.startsWith(i.LIBRARY_PREFIX)||(a=i.LIBRARY_PREFIX+a),n.normalizedPath=a),n.internalPath=Re(n.normalizedPath),n},e.createImportStatementWithWildcard=function(e,t,r){var n=new ye;return n.range=r,n.declarations=null,n.namespaceName=e,n.path=t,n.normalizedPath=o.resolvePath(o.normalizePath(t.value),r.source.normalizedPath),n.internalPath=Re(n.normalizedPath),n},e.createImportDeclaration=function(e,t,r){var n=new me;return n.range=r,n.externalName=e,e.parent=n,t?t.parent=n:t=e,n.name=t,n},e.createInterfaceDeclaration=function(e,t,r,n,i,a,s){var o=new ge;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.extendsType=r,r&&(r.parent=o),o.members=n,xe(n,o),o.decorators=i,i&&xe(i,o),o},e.createFieldDeclaration=function(e,t,r,n,i,a){var s=new ue;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.type=t,t&&(t.parent=s),s.initializer=r,r&&(r.parent=s),s.decorators=n,n&&xe(n,s),s},e.createForStatement=function(e,t,r,n,i){var a=new he;return a.range=i,a.initializer=e,e&&(e.parent=a),a.condition=t,t&&(t.parent=a),a.incrementor=r,r&&(r.parent=a),a.statement=n,n.parent=a,a},e.createFunctionDeclaration=function(e,t,r,n,i,a,s){var o=new de;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.signature=r,r.parent=o,o.body=n,n&&(n.parent=o),o.decorators=i,i&&xe(i,o),o},e.createMethodDeclaration=function(e,t,r,n,i,a,s){var o=new Te;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.signature=r,r.parent=o,o.body=n,n&&(n.parent=o),o.decorators=i,i&&xe(i,o),o},e.createNamespaceDeclaration=function(e,t,r,n,i){var a=new Ee;return a.range=i,a.flags=n,a.name=e,e.parent=a,a.members=t,xe(t,a),a.decorators=r,r&&xe(r,a),a},e.createReturnStatement=function(e,t){var r=new fe;return r.range=t,r.value=e,e&&(e.parent=r),r},e.createSwitchStatement=function(e,t,r){var n=new ve;return n.range=r,n.condition=e,e.parent=n,n.cases=t,xe(t,n),n},e.createSwitchCase=function(e,t,r){var n=new Ie;return n.range=r,n.label=e,e&&(e.parent=n),n.statements=t,xe(t,n),n},e.createThrowStatement=function(e,t){var r=new Ae;return r.range=t,r.value=e,e.parent=r,r},e.createTryStatement=function(e,t,r,n,i){var a=new Ce;return a.range=i,a.statements=e,xe(e,a),a.catchVariable=t,t&&(t.parent=a),a.catchStatements=r,r&&xe(r,a),a.finallyStatements=n,n&&xe(n,a),a},e.createTypeDeclaration=function(e,t,r,n,i,a){var s=new Ne;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.typeParameters=t,t&&xe(t,s),s.type=r,r.parent=s,s.decorators=n,n&&xe(n,s),s},e.createVariableStatement=function(e,t,r,n){var i=new Oe;return i.range=n,i.flags=r,i.declarations=e,xe(e,i),i.decorators=t,t&&xe(t,i),i},e.createVariableDeclaration=function(e,t,r,n,i,a){var s=new Se;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.type=t,t&&(t.parent=s),s.initializer=r,r&&(r.parent=s),s.decorators=n,s},e.createVoidStatement=function(e,t){var r=new Le;return r.range=t,r.expression=e,r},e.createWhileStatement=function(e,t,r){var n=new be;return n.range=r,n.condition=e,e.parent=n,n.statement=t,t.parent=n,n},e}();t.Node=c;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.CommonTypeNode=p;var l=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPE,t}return n(t,e),t}(p);t.TypeNode=l;var u=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEPARAMETER,t}return n(t,e),t}(c);t.TypeParameterNode=u,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.OPTIONAL=1]="OPTIONAL",e[e.REST=2]="REST"}(t.ParameterKind||(t.ParameterKind={}));var h=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARAMETER,t.implicitFieldDeclaration=null,t}return n(t,e),t}(c);t.ParameterNode=h;var d,_=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SIGNATURE,t}return n(t,e),t}(p);function m(e){if(e.kind==s.IDENTIFIER){var t=e.text;switch(assert(t.length),t.charCodeAt(0)){case 101:if("external"==t)return d.EXTERNAL;break;case 103:if("global"==t)return d.GLOBAL;break;case 105:if("inline"==t)return d.INLINE;break;case 111:if("operator"==t)return d.OPERATOR;break;case 115:if("sealed"==t)return d.SEALED;break;case 117:if("unmanaged"==t)return d.UNMANAGED}}else if(e.kind==s.PROPERTYACCESS&&e.expression.kind==s.IDENTIFIER){t=e.expression.text;assert(t.length);var r=e.property.text;if(assert(r.length),"operator"==t)switch(r.charCodeAt(0)){case 98:if("binary"==r)return d.OPERATOR_BINARY;break;case 112:switch(r){case"prefix":return d.OPERATOR_PREFIX;case"postfix":return d.OPERATOR_POSTFIX}}}return d.CUSTOM}t.SignatureNode=_,function(e){e[e.CUSTOM=0]="CUSTOM",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR=2]="OPERATOR",e[e.OPERATOR_BINARY=3]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=5]="OPERATOR_POSTFIX",e[e.UNMANAGED=6]="UNMANAGED",e[e.SEALED=7]="SEALED",e[e.INLINE=8]="INLINE",e[e.EXTERNAL=9]="EXTERNAL"}(d=t.DecoratorKind||(t.DecoratorKind={})),t.decoratorNameToKind=m;var y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DECORATOR,t}return n(t,e),t}(c);t.DecoratorNode=y,function(e){e[e.LINE=0]="LINE",e[e.TRIPLE=1]="TRIPLE",e[e.BLOCK=2]="BLOCK"}(t.CommentKind||(t.CommentKind={}));var g=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMENT,t}return n(t,e),t}(c);t.CommentNode=g;var T=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.Expression=T;var E,f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IDENTIFIER,t}return n(t,e),t}(T);t.IdentifierExpression=f,function(e){e[e.FLOAT=0]="FLOAT",e[e.INTEGER=1]="INTEGER",e[e.STRING=2]="STRING",e[e.REGEXP=3]="REGEXP",e[e.ARRAY=4]="ARRAY",e[e.OBJECT=5]="OBJECT"}(E=t.LiteralKind||(t.LiteralKind={}));var I=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.LITERAL,t}return n(t,e),t}(T);t.LiteralExpression=I;var v=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=E.ARRAY,t}return n(t,e),t}(I);t.ArrayLiteralExpression=v,function(e){e[e.PREFIX=0]="PREFIX",e[e.AS=1]="AS"}(t.AssertionKind||(t.AssertionKind={}));var A=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ASSERTION,t}return n(t,e),t}(T);t.AssertionExpression=A;var C=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BINARY,t}return n(t,e),t}(T);t.BinaryExpression=C;var N=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CALL,t}return n(t,e),t}(T);t.CallExpression=N;var S=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASS,t}return n(t,e),t}(T);t.ClassExpression=S;var O=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMA,t}return n(t,e),t}(T);t.CommaExpression=O;var L=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONSTRUCTOR,t.text="constructor",t}return n(t,e),t}(f);t.ConstructorExpression=L;var b=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ELEMENTACCESS,t}return n(t,e),t}(T);t.ElementAccessExpression=b;var k=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=E.FLOAT,t}return n(t,e),t}(I);t.FloatLiteralExpression=k;var R=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTION,t}return n(t,e),t}(T);t.FunctionExpression=R;var x=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INSTANCEOF,t}return n(t,e),t}(T);t.InstanceOfExpression=x;var F=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=E.INTEGER,t}return n(t,e),t}(I);t.IntegerLiteralExpression=F;var B=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NEW,t}return n(t,e),t}(N);t.NewExpression=B;var D=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NULL,t.text="null",t}return n(t,e),t}(f);t.NullExpression=D;var U=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARENTHESIZED,t}return n(t,e),t}(T);t.ParenthesizedExpression=U;var P=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PROPERTYACCESS,t}return n(t,e),t}(T);t.PropertyAccessExpression=P;var w=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=E.REGEXP,t}return n(t,e),t}(I);t.RegexpLiteralExpression=w;var M=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TERNARY,t}return n(t,e),t}(T);t.TernaryExpression=M;var G=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=E.STRING,t}return n(t,e),t}(I);t.StringLiteralExpression=G;var K=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SUPER,t.text="super",t}return n(t,e),t}(f);t.SuperExpression=K;var z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THIS,t.text="this",t}return n(t,e),t}(f);t.ThisExpression=z;var V=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRUE,t.text="true",t}return n(t,e),t}(f);t.TrueExpression=V;var H=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FALSE,t.text="false",t}return n(t,e),t}(f);t.FalseExpression=H;var X=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(T);t.UnaryExpression=X;var W=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPOSTFIX,t}return n(t,e),t}(X);t.UnaryPostfixExpression=W;var Y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPREFIX,t}return n(t,e),t}(X);t.UnaryPrefixExpression=Y,t.isLastStatement=function(e){var t=assert(e.parent);if(t.kind==s.BLOCK){var r=t.statements;if(r[r.length-1]===e)switch(assert(t.parent).kind){case s.FUNCTIONDECLARATION:case s.METHODDECLARATION:return!0}}return!1};var Q,q=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.Statement=q,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ENTRY=1]="ENTRY",e[e.LIBRARY=2]="LIBRARY"}(Q=t.SourceKind||(t.SourceKind={}));var j=function(e){function t(t,r,n){var o=e.call(this)||this;o.kind=s.SOURCE,o.parent=null,o.tokenizer=null,o.debugInfoIndex=-1,o.exportPaths=null,o.sourceKind=n,o.normalizedPath=t;var c=Re(o.normalizedPath);o.internalPath=c;var p=c.lastIndexOf(i.PATH_DELIMITER);return o.simplePath=p>=0?c.substring(p+1):c,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==Q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==Q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=j;var Z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=ke(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=ke(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(q);t.DeclarationStatement=Z;var $=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(Z);t.VariableLikeDeclarationStatement=$;var J=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(q);t.BlockStatement=J;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(q);t.BreakStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(Z);t.ClassDeclaration=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(q);t.ContinueStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(q);t.DoStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(q);t.EmptyStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(Z);t.EnumDeclaration=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(Z);t.EnumValueDeclaration=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=ce;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(q);t.ExportStatement=pe;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(q);t.ExpressionStatement=le;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}($);t.FieldDeclaration=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(q);t.ForStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(Z);t.FunctionDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(q);t.IfStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(Z);t.ImportDeclaration=me;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(q);t.ImportStatement=ye;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(te);t.InterfaceDeclaration=ge;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(de);t.MethodDeclaration=Te;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(Z);t.NamespaceDeclaration=Ee;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(q);t.ReturnStatement=fe;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(q);t.SwitchStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(q);t.ThrowStatement=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(q);t.TryStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(Z);t.TypeDeclaration=Ne;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}($);t.VariableDeclaration=Se;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(q);t.VariableStatement=Oe;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(q);t.VoidStatement=Le;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(q);function ke(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?ke(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?ke(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Re(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function xe(e,t){for(var r=0,n=e.length;r<n;++r)e[r].parent=t}t.WhileStatement=be,t.findDecorator=function(e,t){if(t)for(var r=0,n=t.length;r<n;++r){var i=t[r];if(i.decoratorKind==e)return i}return null},t.mangleInternalName=ke,t.mangleInternalPath=Re},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},a=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var s,o=r(0),c=r(2),p=r(7),l=r(4),u=r(3),h=function(){return function(){}}(),d=function(){return function(){}}(),_=function(){return function(){}}();function m(e,t){switch(assert(t.length),e){case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return s.INDEXED_GET;if("[]="==t)return s.INDEXED_SET;break;case 123:if("{}"==t)return s.UNCHECKED_INDEXED_GET;if("{}="==t)return s.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return s.ADD;break;case 45:if("-"==t)return s.SUB;break;case 42:if("*"==t)return s.MUL;if("**"==t)return s.POW;break;case 47:if("/"==t)return s.DIV;break;case 37:if("%"==t)return s.REM;break;case 38:if("&"==t)return s.BITWISE_AND;break;case 124:if("|"==t)return s.BITWISE_OR;break;case 94:if("^"==t)return s.BITWISE_XOR;break;case 61:if("=="==t)return s.EQ;break;case 33:if("!="==t)return s.NE;break;case 62:if(">"==t)return s.GT;if(">="==t)return s.GE;if(">>"==t)return s.BITWISE_SHR;if(">>>"==t)return s.BITWISE_SHR_U;break;case 60:if("<"==t)return s.LT;if("<="==t)return s.LE;if("<<"==t)return s.BITWISE_SHL}break;case l.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return s.PLUS;if("++"==t)return s.PREFIX_INC;break;case 45:if("-"==t)return s.MINUS;if("--"==t)return s.PREFIX_DEC;break;case 33:if("!"==t)return s.NOT;break;case 126:if("~"==t)return s.BITWISE_NOT}break;case l.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return s.POSTFIX_INC;break;case 45:if("--"==t)return s.POSTFIX_DEC}}return s.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(s=t.OperatorKind||(t.OperatorKind={}));var y,g,T=new Map,E=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=T,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.resolvedThisExpression=null,r.resolvedElementExpression=null,r.sources=[],r}return n(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r<n;++r){var i=t[r];if(i.normalizedPath==e)return i}return null},t.prototype.lookupSourceByPath=function(e){var t;return this.getSource(e+".ts")||this.getSource(e+"/index.ts")||this.getSource((t=o.LIBRARY_PREFIX+e)+".ts")||this.getSource(t+"/index.ts")},t.prototype.initialize=function(e){var t,r,n,s;this.options=e,this.typesLookup=new Map([["i8",p.Type.i8],["i16",p.Type.i16],["i32",p.Type.i32],["i64",p.Type.i64],["isize",e.isizeType],["u8",p.Type.u8],["u16",p.Type.u16],["u32",p.Type.u32],["u64",p.Type.u64],["usize",e.usizeType],["bool",p.Type.bool],["f32",p.Type.f32],["f64",p.Type.f64],["void",p.Type.void],["number",p.Type.f64],["boolean",p.Type.bool]]),this.setConstantInteger("ASC_TARGET",p.Type.i32,i64_new(e.isWasm64?2:1)),this.setConstantInteger("ASC_NO_TREESHAKING",p.Type.bool,i64_new(e.noTreeShaking?1:0,0)),this.setConstantInteger("ASC_NO_ASSERT",p.Type.bool,i64_new(e.noAssert?1:0,0)),this.setConstantInteger("ASC_MEMORY_BASE",p.Type.i32,i64_new(e.memoryBase,0)),this.setConstantInteger("ASC_OPTIMIZE_LEVEL",p.Type.i32,i64_new(e.optimizeLevelHint,0)),this.setConstantInteger("ASC_SHRINK_LEVEL",p.Type.i32,i64_new(e.shrinkLevelHint,0)),this.setConstantInteger("ASC_FEATURE_MUTABLE_GLOBAL",p.Type.bool,i64_new(e.hasFeature(2)?1:0,0)),this.setConstantInteger("ASC_FEATURE_SIGN_EXTENSION",p.Type.bool,i64_new(e.hasFeature(1)?1:0,0));for(var u=new Array,h=new Map,d=new Array,_=new Array,m=0,g=this.sources.length;m<g;++m){var T=this.sources[m],E=new v(this,T);this.elementsLookup.set(E.internalName,E),this.currentFilespace=E;for(var f=T.statements,I=0,A=f.length;I<A;++I){var C=f[I];switch(C.kind){case l.NodeKind.CLASSDECLARATION:this.initializeClass(C,d,_);break;case l.NodeKind.ENUMDECLARATION:this.initializeEnum(C);break;case l.NodeKind.EXPORT:this.initializeExports(C,h);break;case l.NodeKind.FUNCTIONDECLARATION:this.initializeFunction(C);break;case l.NodeKind.IMPORT:this.initializeImports(C,h,u);break;case l.NodeKind.INTERFACEDECLARATION:this.initializeInterface(C);break;case l.NodeKind.NAMESPACEDECLARATION:this.initializeNamespace(C,d,_);break;case l.NodeKind.TYPEDECLARATION:this.initializeTypeAlias(C);break;case l.NodeKind.VARIABLE:this.initializeVariables(C)}}}for(m=0;m<u.length;){var N=u[m];if(Y=N.declaration)(x=this.tryResolveImport(N.externalName,h))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(x=this.tryResolveImport(N.externalNameAlt,h))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(this.error(c.DiagnosticCode.Module_0_has_no_exported_member_1,Y.range,Y.parent.path.value,Y.externalName.text),++m);else(x=this.elementsLookup.get(N.externalName))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(x=this.elementsLookup.get(N.externalNameAlt))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(assert(!1),++m)}try{for(var S=i(h),O=S.next();!O.done;O=S.next()){var L=a(O.value,2),b=L[0],k=L[1],R=k,x=void 0;do{if(!R.isReExport){(x=this.elementsLookup.get(R.externalName))||(x=this.elementsLookup.get(R.member.name.text))?this.setExportAndCheckLibrary(b,x,R.member.externalName):this.error(c.DiagnosticCode.Cannot_find_name_0,k.member.range,k.member.name.text);break}if(x=this.fileLevelExports.get(R.externalName)){this.setExportAndCheckLibrary(b,x,R.member.externalName);break}(R=h.get(R.externalName))||this.error(c.DiagnosticCode.Module_0_has_no_exported_member_1,k.member.externalName.range,k.member.parent.path.value,k.member.externalName.text)}while(R)}}catch(e){t={error:e}}finally{try{O&&!O.done&&(r=S.return)&&r.call(S)}finally{if(t)throw t.error}}for(m=0,g=d.length;m<g;++m){var F=d[m],B=F.declaration,D=assert(B.extendsType),U=this.resolveIdentifier(D.name,null);if(U)if(U.kind==y.CLASS_PROTOTYPE){var P=U;F.basePrototype=P}else this.error(c.DiagnosticCode.A_class_may_only_extend_another_class,D.range)}var w=e.globalAliases;if(w)try{for(var M=i(w),G=M.next();!G.done;G=M.next()){var K=a(G.value,2),z=K[0],V=K[1];if(V.length){if(!(x=this.elementsLookup.get(V)))throw new Error("element not found: "+V);this.elementsLookup.set(z,x)}}}catch(e){n={error:e}}finally{try{G&&!G.done&&(s=M.return)&&s.call(M)}finally{if(n)throw n.error}}var H=this.elementsLookup.get("Array");H&&(assert(H.kind==y.CLASS_PROTOTYPE),this.arrayPrototype=H);var X=this.elementsLookup.get("String");if(X){assert(X.kind==y.CLASS_PROTOTYPE);var W=X.resolve(null);if(W)if(this.typesLookup.has("string")){var Y=X.declaration;this.error(c.DiagnosticCode.Duplicate_identifier_0,Y.name.range,Y.programLevelInternalName)}else this.stringInstance=W,this.typesLookup.set("string",W.type)}x=assert(this.elementsLookup.get("start"));(assert(x.kind==y.FUNCTION_PROTOTYPE),this.startFunction=x,this.moduleLevelExports.has("main"))&&((x=this.moduleLevelExports.get("main")).kind!=y.FUNCTION_PROTOTYPE||x.isAny(o.CommonFlags.GENERIC|o.CommonFlags.AMBIENT)||(x.set(o.CommonFlags.MAIN),this.mainFunction=x))},t.prototype.setConstantInteger=function(e,t,r){assert(t.is(4)),this.elementsLookup.set(e,new O(this,e,e,t,null,g.NONE).withConstantIntegerValue(r))},t.prototype.setConstantFloat=function(e,t,r){assert(t.is(8)),this.elementsLookup.set(e,new O(this,e,e,t,null,g.NONE).withConstantFloatValue(r))},t.prototype.tryResolveImport=function(e,t){for(var r,n=this.fileLevelExports;;){if(r=n.get(e))return r;var i=t.get(e);if(!i)break;if(!i.isReExport)return this.elementsLookup.get(i.externalName);e=i.externalName}return null},t.prototype.filterDecorators=function(e,t){for(var r=g.NONE,n=0,i=e.length;n<i;++n){var a=e[n],s=f(l.decoratorNameToKind(a.name));s&&(t&s?r&s?this.error(c.DiagnosticCode.Duplicate_decorator,a.range,a.name.range.toString()):r|=s:this.error(c.DiagnosticCode.Decorator_0_is_not_valid_here,a.range,a.name.range.toString()))}return r},t.prototype.checkGlobalOptions=function(e,t){var r=t.parent;if(e.hasDecorator(g.GLOBAL)||t.range.source.is(o.CommonFlags.BUILTIN)||t.range.source.isLibrary&&e.is(o.CommonFlags.EXPORT)&&(assert(r).kind==l.NodeKind.SOURCE||r.kind==l.NodeKind.VARIABLE&&assert(r.parent).kind==l.NodeKind.SOURCE)){var n=t.programLevelInternalName;this.elementsLookup.has(n)?this.error(c.DiagnosticCode.Duplicate_identifier_0,t.name.range,e.internalName):(this.elementsLookup.set(n,e),e.is(o.CommonFlags.BUILTIN)&&(e.internalName=n))}},t.prototype.initializeClass=function(e,t,r,n){void 0===n&&(n=null);var i=e.fileLevelInternalName;if(this.elementsLookup.has(i))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i);else{var a=e.decorators,s=e.name.text,p=new U(this,s,i,e,a?this.filterDecorators(a,g.GLOBAL|g.SEALED|g.UNMANAGED):g.NONE);p.parent=n,this.elementsLookup.set(i,p);var u=e.implementsTypes;if(u){var h=u.length;if(p.hasDecorator(g.UNMANAGED))h&&this.error(c.DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,l.Range.join(e.name.range,u[h-1].range));else if(h){for(var d=0;d<h;++d)this.warning(c.DiagnosticCode.Operation_not_supported,u[d].range);r.push(p)}}if(e.extendsType&&t.push(p),n){if(n.members){if(n.members.has(s))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i)}else n.members=new Map;n.members.set(s,p),n.is(o.CommonFlags.MODULE_EXPORT)&&p.is(o.CommonFlags.EXPORT)&&p.set(o.CommonFlags.MODULE_EXPORT)}else if(p.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(i))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,i);if(this.fileLevelExports.set(i,p),this.currentFilespace.members.set(s,p),p.is(o.CommonFlags.EXPORT)&&e.range.source.isEntry){if(this.moduleLevelExports.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,this.moduleLevelExports.get(s).internalName);p.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(s,p)}}for(var _=e.members,m=(d=0,_.length);d<m;++d){var y=_[d];switch(y.kind){case l.NodeKind.FIELDDECLARATION:this.initializeField(y,p);break;case l.NodeKind.METHODDECLARATION:y.isAny(o.CommonFlags.GET|o.CommonFlags.SET)?this.initializeAccessor(y,p):this.initializeMethod(y,p);break;default:throw new Error("class member expected")}}this.checkGlobalOptions(p,e)}},t.prototype.initializeField=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=e.decorators;if(e.is(o.CommonFlags.STATIC)){if(this.elementsLookup.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n);if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;var a=new O(this,r,n,p.Type.void,e,i?this.filterDecorators(i,g.NONE):g.NONE);a.parent=t,t.members.set(r,a),this.elementsLookup.set(n,a),t.is(o.CommonFlags.MODULE_EXPORT)&&a.set(o.CommonFlags.MODULE_EXPORT)}else{if(t.instanceMembers){if(t.instanceMembers.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;var s=new F(t,r,n,e);i&&this.filterDecorators(i,g.NONE),t.instanceMembers.set(r,s)}},t.prototype.initializeMethod=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=null,a=e.decorators,s=g.NONE;if(a&&(s=this.filterDecorators(a,g.OPERATOR_BINARY|g.OPERATOR_PREFIX|g.OPERATOR_POSTFIX|g.INLINE)),e.is(o.CommonFlags.STATIC)){if(assert(e.name.kind!=l.NodeKind.CONSTRUCTOR),this.elementsLookup.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n);if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;i=new k(this,r,n,e,t,s),t.members.set(r,i),this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else{if(t.instanceMembers){if(t.instanceMembers.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;i=new k(this,r,n,e,t,s),e.name.kind==l.NodeKind.CONSTRUCTOR?t.constructorPrototype?this.error(c.DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,e.name.range):(i.set(o.CommonFlags.CONSTRUCTOR),t.constructorPrototype=i):t.instanceMembers.set(r,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}this.checkOperatorOverloads(e.decorators,i,t)},t.prototype.checkOperatorOverloads=function(e,t,r){if(e)for(var n=0,i=e.length;n<i;++n){var a=e[n];switch(a.decoratorKind){case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:case l.DecoratorKind.OPERATOR_PREFIX:case l.DecoratorKind.OPERATOR_POSTFIX:var o=a.arguments&&a.arguments.length||0;if(1==o){var p=a.arguments[0];if(p.kind==l.NodeKind.LITERAL&&p.literalKind==l.LiteralKind.STRING){var u=m(a.decoratorKind,p.value);if(u==s.INVALID)this.error(c.DiagnosticCode.Operation_not_supported,p.range);else{var h=r.overloadPrototypes;h.has(u)?this.error(c.DiagnosticCode.Duplicate_function_implementation,p.range):(t.operatorKind=u,h.set(u,t))}}else this.error(c.DiagnosticCode.String_literal_expected,p.range)}else this.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,a.range,"1",o.toString(0))}}},t.prototype.initializeAccessor=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=this.elementsLookup.get(n),a=e.is(o.CommonFlags.GET),s=!1;if(i){if(i.kind!=y.PROPERTY||null!=(a?i.getterPrototype:i.setterPrototype))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else i=new D(this,r,n,t),s=!0;var p=e.decorators,l=g.NONE;p&&(l=this.filterDecorators(p,g.INLINE));var u=(a?o.GETTER_PREFIX:o.SETTER_PREFIX)+r;if(e.is(o.CommonFlags.STATIC)){var h=t.internalName+o.STATIC_DELIMITER+u;if(this.elementsLookup.has(h))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,h);var d=new k(this,u,h,e,null,l);if(a?i.getterPrototype=d:i.setterPrototype=d,s){if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,h)}else t.members=new Map;t.members.set(r,i)}else assert(t.members&&t.members.has(r));this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else{var _=t.internalName+o.INSTANCE_DELIMITER+u;if(t.instanceMembers){if(t.instanceMembers.has(u))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;var m=new k(this,u,_,e,t,l);a?i.getterPrototype=m:i.setterPrototype=m,t.instanceMembers.set(u,i),this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&(i.set(o.CommonFlags.MODULE_EXPORT),m.set(o.CommonFlags.MODULE_EXPORT))}},t.prototype.initializeEnum=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.name.text,i=new C(this,n,r,e);if(i.parent=t,this.elementsLookup.set(r,i),t){if(t.members){if(t.members.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.is(o.CommonFlags.EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else if(i.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,i),this.currentFilespace.members.set(n,i),e.range.source.isEntry){if(this.moduleLevelExports.has(n))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,this.moduleLevelExports.get(n).internalName);i.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(n,i)}}for(var a=e.values,s=0,p=a.length;s<p;++s)this.initializeEnumValue(a[s],i);this.checkGlobalOptions(i,e)}},t.prototype.initializeEnumValue=function(e,t){var r=e.name.text,n=e.fileLevelInternalName;if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;var i=new N(t,this,r,n,e);t.members.set(r,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)},t.prototype.initializeExports=function(e,t){var r=e.members;if(r)for(var n=0,i=r.length;n<i;++n)this.initializeExport(r[n],e.internalPath,t);else this.error(c.DiagnosticCode.Operation_not_supported,e.range)},t.prototype.setExportAndCheckLibrary=function(e,t,r){this.fileLevelExports.set(e,t);var n=r.range.source.internalPath,i=o.FILESPACE_PREFIX+n,a=this.elementsLookup.get(i);a||(a=assert(this.elementsLookup.get(i+o.PATH_DELIMITER+"index"))),assert(a.kind==y.FILESPACE);var s=r.text;a.members.set(s,t),r.range.source.isLibrary&&(this.elementsLookup.has(s)?this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,r.range,s):(t.internalName=s,this.elementsLookup.set(s,t)))},t.prototype.initializeExport=function(e,t,r){var n,i,a,s=e.range.source.internalPath+o.PATH_DELIMITER+e.externalName.text;if(this.fileLevelExports.has(s))this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);else if(null==t){if(n=e.range.source.internalPath+o.PATH_DELIMITER+e.name.text,i=this.elementsLookup.get(n))return void this.setExportAndCheckLibrary(s,i,e.externalName);if(r.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);(a=new d).isReExport=!1,a.externalName=n,a.member=e,r.set(s,a)}else{if(n=t+o.PATH_DELIMITER+e.name.text,i=this.elementsLookup.get(n))return void this.setExportAndCheckLibrary(s,i,e.externalName);for(var p=new Set;a=r.get(n);){if(!a.isReExport){if(i=this.elementsLookup.get(a.externalName))return void this.setExportAndCheckLibrary(s,i,e.externalName);break}if(i=this.fileLevelExports.get(a.externalName))return void this.setExportAndCheckLibrary(s,i,e.externalName);if(n=a.externalName,p.has(a))break;p.add(a)}if(r.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);(a=new d).isReExport=!0,a.externalName=n,a.member=e,r.set(s,a)}},t.prototype.initializeFunction=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.name.text,i=e.decorators,a=new k(this,n,r,e,null,i?this.filterDecorators(i,g.GLOBAL|g.INLINE|g.EXTERNAL):g.NONE);if(a.parent=t,this.elementsLookup.set(r,a),t){if(t.members){if(t.members.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(n,a),t.is(o.CommonFlags.MODULE_EXPORT)&&a.is(o.CommonFlags.EXPORT)&&(a.parent=t,a.set(o.CommonFlags.MODULE_EXPORT))}else if(a.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,a),this.currentFilespace.members.set(n,a),e.range.source.isEntry){if(this.moduleLevelExports.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(n).internalName);a.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(n,a)}}this.checkGlobalOptions(a,e)}},t.prototype.initializeImports=function(e,t,r){var n=e.declarations;if(n)for(var i=0,a=n.length;i<a;++i)this.initializeImport(n[i],e.internalPath,t,r);else if(e.namespaceName){var s=e.namespaceName.text,p=e.range.source.internalPath+o.PATH_DELIMITER+s;if(this.elementsLookup.has(p))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.namespaceName.range,p);var l=this.elementsLookup.get(e.internalPath);if(l)return void this.elementsLookup.set(p,l);var u=new h;u.localName=p;var d=o.FILESPACE_PREFIX+e.internalPath;u.externalName=d,u.externalNameAlt=d+o.PATH_DELIMITER+"index",u.declaration=null,r.push(u)}},t.prototype.initializeImport=function(e,t,r,n){var i=e.fileLevelInternalName;if(this.elementsLookup.has(i))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i);else{var a,s=t+o.PATH_DELIMITER+e.externalName.text;if(a=this.fileLevelExports.get(s))this.elementsLookup.set(i,a);else{var p=o.PATH_DELIMITER+"index",l=new h;l.localName=i,t.endsWith(p)?(l.externalName=s,l.externalNameAlt=t.substring(0,t.length-p.length+1)+e.externalName.text):(l.externalName=s,l.externalNameAlt=t+p+o.PATH_DELIMITER+e.externalName.text),l.declaration=e,n.push(l)}}},t.prototype.initializeInterface=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.decorators,i=e.name.text,a=new w(this,i,r,e,n?this.filterDecorators(n,g.GLOBAL):g.NONE);if(a.parent=t,this.elementsLookup.set(r,a),t){if(t.members){if(t.members.has(a.internalName))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(a.internalName,a),t.is(o.CommonFlags.MODULE_EXPORT)&&a.is(o.CommonFlags.EXPORT)&&a.set(o.CommonFlags.MODULE_EXPORT)}else if(a.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,a),this.currentFilespace.members.set(i,a),e.range.source.isEntry){if(this.moduleLevelExports.has(i))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(i).internalName);a.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(i,a)}}for(var s=e.members,p=0,u=s.length;p<u;++p){var h=s[p];switch(h.kind){case l.NodeKind.FIELDDECLARATION:this.initializeField(h,a);break;case l.NodeKind.METHODDECLARATION:h.isAny(o.CommonFlags.GET|o.CommonFlags.SET)?this.initializeAccessor(h,a):this.initializeMethod(h,a);break;default:throw new Error("interface member expected")}}this.checkGlobalOptions(a,e)}},t.prototype.initializeNamespace=function(e,t,r,n){void 0===n&&(n=null);var i=e.fileLevelInternalName,a=e.name.text,s=this.elementsLookup.get(i);if(s||((s=new A(this,a,i,e)).parent=n,this.elementsLookup.set(i,s),this.checkGlobalOptions(s,e)),n){if(n.members){if(n.members.has(a))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i)}else n.members=new Map;n.members.set(a,s),n.is(o.CommonFlags.MODULE_EXPORT)&&s.is(o.CommonFlags.EXPORT)&&s.set(o.CommonFlags.MODULE_EXPORT)}else if(s.is(o.CommonFlags.EXPORT)){var p=this.fileLevelExports.get(i);if(p?(p.is(o.CommonFlags.EXPORT)||this.error(c.DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,e.name.range,s.internalName),s=p):this.fileLevelExports.set(i,s),this.currentFilespace.members.set(a,s),e.range.source.isEntry){if(this.moduleLevelExports.has(a)){if(this.moduleLevelExports.get(a)!==s)return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(a).internalName)}else this.moduleLevelExports.set(a,s);s.set(o.CommonFlags.MODULE_EXPORT)}}for(var u=e.members,h=0,d=u.length;h<d;++h)switch(u[h].kind){case l.NodeKind.CLASSDECLARATION:this.initializeClass(u[h],t,r,s);break;case l.NodeKind.ENUMDECLARATION:this.initializeEnum(u[h],s);break;case l.NodeKind.FUNCTIONDECLARATION:this.initializeFunction(u[h],s);break;case l.NodeKind.INTERFACEDECLARATION:this.initializeInterface(u[h],s);break;case l.NodeKind.NAMESPACEDECLARATION:this.initializeNamespace(u[h],t,r,s);break;case l.NodeKind.TYPEDECLARATION:this.error(c.DiagnosticCode.Operation_not_supported,u[h].range);break;case l.NodeKind.VARIABLE:this.initializeVariables(u[h],s);break;default:throw new Error("namespace member expected")}},t.prototype.initializeTypeAlias=function(e,t){void 0===t&&(t=null);var r=e.name.text;if(this.typesLookup.has(r)||this.typeAliases.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=new _;n.typeParameters=e.typeParameters,n.type=e.type,this.typeAliases.set(r,n)}},t.prototype.initializeVariables=function(e,t){void 0===t&&(t=null);for(var r=e.declarations,n=0,i=r.length;n<i;++n){var a=r[n],s=a.decorators,l=a.fileLevelInternalName;if(this.elementsLookup.has(l))this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l);else{var u=a.name.text,h=new O(this,u,l,p.Type.void,a,s?this.filterDecorators(s,g.GLOBAL|g.EXTERNAL):g.NONE);if(h.parent=t,this.elementsLookup.set(l,h),t){if(t.members){if(t.members.has(u)){this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l);continue}}else t.members=new Map;t.members.set(u,h),t.is(o.CommonFlags.MODULE_EXPORT)&&h.is(o.CommonFlags.EXPORT)&&h.set(o.CommonFlags.MODULE_EXPORT)}else if(h.is(o.CommonFlags.EXPORT)&&(this.fileLevelExports.has(l)?this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l):this.fileLevelExports.set(l,h),this.currentFilespace.members.set(u,h),a.range.source.isEntry)){if(this.moduleLevelExports.has(u)){this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,this.moduleLevelExports.get(u).internalName);continue}h.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(u,h)}this.checkGlobalOptions(h,a)}}},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=!0);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,s=a.length,o=new Array(s),c=new Array(s),u=0,h=!1,d=0;d<s;++d){var _=a[d];switch(_.parameterKind){case l.ParameterKind.DEFAULT:u=d+1;break;case l.ParameterKind.REST:assert(d==s),h=!0}var m=this.resolveType(assert(_.type),t,r);if(!m)return null;o[d]=m,c[d]=_.name.text}var y,g=e.returnType;if(g){if(!(y=this.resolveType(g,t,r)))return null}else y=p.Type.void;var T=new p.Signature(o,y,i);return T.parameterNames=c,T.requiredParameters=u,T.hasRest=h,T},t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=!0),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}var i,a=e,s=a.name.text,u=s,h=a.range.source.internalPath+o.PATH_DELIMITER+s;if((i=this.elementsLookup.get(h))||(i=this.elementsLookup.get(u)))switch(i.kind){case y.ENUM:return p.Type.i32;case y.CLASS_PROTOTYPE:var d=i.resolveUsingTypeArguments(a.typeArguments,t,null);return d?e.isNullable?d.type.asNullable():d.type:null}var _,m=this.typeAliases.get(s);if(m)return this.resolveType(m.type,t,r);if(a.typeArguments){for(var g=a.typeArguments.length,T=new Array(g),E=0;E<g;++E){var f=this.resolveType(a.typeArguments[E],t,r);if(!f)return null;T[E]=f}if(g){var I=p.typesToString(T);I.length&&(h+="<"+I+">",u+="<"+I+">")}else if(t){var v=t.get(u);if(v)return v}}return(_=this.typesLookup.get(h))||(_=this.typesLookup.get(u))?_:(r&&this.error(c.DiagnosticCode.Cannot_find_name_0,a.name.range,u),null)},t.prototype.resolveTypeArguments=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null);var i=e.length,a=t?t.length:0;if(i!=a)return a?this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,l.Range.join(t[0].range,t[a-1].range),i.toString(10),a.toString(10)):n&&this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range.atEnd,i.toString(10),"0"),null;for(var s=new Array(i),o=0;o<i;++o){var p=this.resolveType(t[o],r,!0);if(!p)return null;s[o]=p}return s},t.prototype.resolveIdentifier=function(e,t){var r,n=e.text;if(t){switch(t.kind){case y.FUNCTION:if(r=t.flow.getScopedLocal(n))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,r;t=t.prototype.parent;break;case y.CLASS:t=t.prototype.parent}for(;t;){var i=t.members;if(i&&(r=i.get(n)))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,r;t=t.parent}}return(r=this.elementsLookup.get(e.range.source.internalPath+o.PATH_DELIMITER+n))?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,r):(r=this.elementsLookup.get(n))?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,r):(this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,n),null)},t.prototype.resolvePropertyAccess=function(e,t){var r=e.expression,n=this.resolveExpression(r,t);if(!n)return null;var i=e.property.text;switch(n.kind){case y.GLOBAL:case y.LOCAL:case y.FIELD:if(!(a=n.type.classReference))return this.error(c.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,i,n.type.toString()),null;n=a;break;case y.PROPERTY:var a,o=assert(n.getterPrototype).resolve();if(!o)return null;if(!(a=o.signature.returnType.classReference))return this.error(c.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,i,o.signature.returnType.toString()),null;n=a;break;case y.CLASS:var p=this.resolvedElementExpression;if(p){var l=n.lookupOverload(s.INDEXED_GET);if(!l)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,p.range,n.internalName),null;var u=l.signature.returnType;if(!(n=u.classReference))return this.error(c.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,i,u.toString()),null}}switch(n.kind){case y.CLASS_PROTOTYPE:case y.CLASS:for(;;){var h=void 0;if((d=n.members)&&(h=d.get(i)))return this.resolvedThisExpression=r,this.resolvedElementExpression=null,h;if(n.kind==y.CLASS_PROTOTYPE){if(!n.basePrototype)break;n=n.basePrototype}else{if(n.kind!=y.CLASS)break;if(!n.base)break;n=n.base}}break;default:var d;if(d=n.members)if(h=d.get(i))return this.resolvedThisExpression=r,this.resolvedElementExpression=null,h}return this.error(c.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,i,n.internalName),null},t.prototype.resolveElementAccess=function(e,t){var r=e.expression,n=this.resolveExpression(r,t);if(!n)return null;switch(n.kind){case y.GLOBAL:case y.LOCAL:case y.FIELD:if(n=n.type.classReference)return this.resolvedThisExpression=r,this.resolvedElementExpression=e.elementExpression,n;break;case y.CLASS:var i=n.lookupOverload(s.INDEXED_GET);if(!i)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,n.internalName),null;if(n=i.signature.returnType.classReference)return this.resolvedThisExpression=r,this.resolvedElementExpression=e.elementExpression,n}return this.error(c.DiagnosticCode.Operation_not_supported,r.range),null},t.prototype.resolveExpression=function(e,t){for(;e.kind==l.NodeKind.PARENTHESIZED;)e=e.expression;switch(e.kind){case l.NodeKind.ASSERTION:var r=this.resolveType(e.toType);if(r)if(p=r.classReference)return this.resolvedThisExpression=null,this.resolvedElementExpression=null,p;return null;case l.NodeKind.BINARY:throw new Error("not implemented");case l.NodeKind.THIS:if(t.flow.is(2048))if(n=t.flow.getScopedLocal("this"))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,n;return(i=t.parent)?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,i):(this.error(c.DiagnosticCode._this_cannot_be_referenced_in_current_location,e.range),null);case l.NodeKind.SUPER:var n,i;if(t.flow.is(2048))if(n=t.flow.getScopedLocal("super"))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,n;return(i=t.parent)&&i.kind==y.CLASS&&(i=i.base)?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,i):(this.error(c.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,e.range),null);case l.NodeKind.IDENTIFIER:return this.resolveIdentifier(e,t);case l.NodeKind.LITERAL:switch(e.literalKind){case l.LiteralKind.STRING:return this.resolvedThisExpression=e,this.resolvedElementExpression=null,this.stringInstance}break;case l.NodeKind.PROPERTYACCESS:return this.resolvePropertyAccess(e,t);case l.NodeKind.ELEMENTACCESS:return this.resolveElementAccess(e,t);case l.NodeKind.CALL:var a=e.expression,s=this.resolveExpression(a,t);if(!s)return null;if(s.kind==y.FUNCTION_PROTOTYPE){var o=s.resolveUsingTypeArguments(e.typeArguments,t.flow.contextualTypeArguments,e);if(!o)return null;var p,u=o.signature.returnType;if(p=u.classReference)return p;var h=u.signatureReference;if(h){var d=h.cachedFunctionTarget;return d||(d=new x(this,h),h.cachedFunctionTarget=d),d}return this.error(c.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,a.range,s.internalName),null}}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),null},t}(c.DiagnosticEmitter);function f(e){switch(e){case l.DecoratorKind.GLOBAL:return g.GLOBAL;case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:return g.OPERATOR_BINARY;case l.DecoratorKind.OPERATOR_PREFIX:return g.OPERATOR_PREFIX;case l.DecoratorKind.OPERATOR_POSTFIX:return g.OPERATOR_POSTFIX;case l.DecoratorKind.UNMANAGED:return g.UNMANAGED;case l.DecoratorKind.SEALED:return g.SEALED;case l.DecoratorKind.INLINE:return g.INLINE;case l.DecoratorKind.EXTERNAL:return g.EXTERNAL;default:return g.NONE}}t.Program=E,function(e){e[e.GLOBAL=0]="GLOBAL",e[e.LOCAL=1]="LOCAL",e[e.ENUM=2]="ENUM",e[e.ENUMVALUE=3]="ENUMVALUE",e[e.FUNCTION_PROTOTYPE=4]="FUNCTION_PROTOTYPE",e[e.FUNCTION=5]="FUNCTION",e[e.FUNCTION_TARGET=6]="FUNCTION_TARGET",e[e.CLASS_PROTOTYPE=7]="CLASS_PROTOTYPE",e[e.CLASS=8]="CLASS",e[e.INTERFACE_PROTOTYPE=9]="INTERFACE_PROTOTYPE",e[e.INTERFACE=10]="INTERFACE",e[e.FIELD_PROTOTYPE=11]="FIELD_PROTOTYPE",e[e.FIELD=12]="FIELD",e[e.PROPERTY=13]="PROPERTY",e[e.NAMESPACE=14]="NAMESPACE",e[e.FILESPACE=15]="FILESPACE"}(y=t.ElementKind||(t.ElementKind={})),function(e){e[e.NONE=0]="NONE",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR_BINARY=2]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=8]="OPERATOR_POSTFIX",e[e.UNMANAGED=16]="UNMANAGED",e[e.SEALED=32]="SEALED",e[e.INLINE=64]="INLINE",e[e.EXTERNAL=128]="EXTERNAL"}(g=t.DecoratorFlags||(t.DecoratorFlags={})),t.decoratorKindToFlag=f;var I=function(){function e(e,t,r){this.flags=o.CommonFlags.NONE,this.decoratorFlags=g.NONE,this.members=null,this.parent=null,this.program=e,this.simpleName=t,this.internalName=r}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.hasDecorator=function(e){return(this.decoratorFlags&e)==e},e}();t.Element=I;var v=function(e){function t(t,r){var n=e.call(this,t,r.internalPath,o.FILESPACE_PREFIX+r.internalPath)||this;return n.kind=y.FILESPACE,n.members=new Map,n}return n(t,e),t}(I);t.Filespace=v;var A=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=y.NAMESPACE,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(I);t.Namespace=A;var C=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=y.ENUM,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(I);t.Enum=C;var N=function(e){function t(t,r,n,i,a){var s=e.call(this,r,n,i)||this;return s.kind=y.ENUMVALUE,s.constantValue=0,s.parent=t,s.declaration=a,s}return n(t,e),t}(I);t.EnumValue=N,function(e){e[e.NONE=0]="NONE",e[e.INTEGER=1]="INTEGER",e[e.FLOAT=2]="FLOAT"}(t.ConstantValueKind||(t.ConstantValueKind={}));var S=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n)||this;return s.constantValueKind=0,s.type=i,s.declaration=a,s}return n(t,e),t.prototype.withConstantIntegerValue=function(e){return this.constantValueKind=1,this.constantIntegerValue=e,this.set(o.CommonFlags.CONST|o.CommonFlags.INLINED),this},t.prototype.withConstantFloatValue=function(e){return this.constantValueKind=2,this.constantFloatValue=e,this.set(o.CommonFlags.CONST|o.CommonFlags.INLINED),this},t}(I);t.VariableLikeElement=S;var O=function(e){function t(t,r,n,i,a,s){var c=e.call(this,t,r,n,i,a)||this;return c.kind=y.GLOBAL,c.flags=a?a.flags:o.CommonFlags.NONE,c.decoratorFlags=s,c.type=i,c}return n(t,e),t}(S);t.Global=O;var L=function(){return function(e,t,r){void 0===r&&(r=null),this.name=e,this.type=t,this.initializer=r}}();t.Parameter=L;var b=function(e){function t(t,r,n,i,a){void 0===a&&(a=null);var s=e.call(this,t,r,r,i,a)||this;return s.kind=y.LOCAL,s.scopedGlobal=null,s.index=n,s}return n(t,e),t}(S);t.Local=b;var k=function(e){function t(t,r,n,i,a,o){void 0===a&&(a=null),void 0===o&&(o=g.NONE);var c=e.call(this,t,r,n)||this;return c.kind=y.FUNCTION_PROTOTYPE,c.instances=new Map,c.classTypeArguments=null,c.operatorKind=s.INVALID,c.declaration=i,c.flags=i.flags,c.classPrototype=a,c.decoratorFlags=o,c}return n(t,e),t.prototype.resolve=function(e,t){var r,n;void 0===e&&(e=null),void 0===t&&(t=null);var s=e?p.typesToString(e):"",c=this.instances.get(s);if(c)return c;var u=this.declaration,h=this.is(o.CommonFlags.INSTANCE),d=this.classPrototype,_=t;if(t=new Map,_)try{for(var m=i(_),y=m.next();!y.done;y=m.next()){var g=a(y.value,2),T=g[0],E=g[1];t.set(T,E)}}catch(e){r={error:e}}finally{try{y&&!y.done&&(n=m.return)&&n.call(m)}finally{if(r)throw r.error}}var f=this.classTypeArguments;if(f){assert(this.is(o.CommonFlags.INSTANCE));var I=assert(d).declaration.typeParameters,v=I.length;assert(v==f.length);for(var A=0;A<v;++A)t.set(I[A].name.text,f[A])}else assert(!f);var C,N=u.signature,S=u.typeParameters;if(e&&(C=e.length)){assert(S&&C==S.length);for(A=0;A<C;++A)t.set(S[A].name.text,e[A])}else assert(!S||0==S.length);var O=null,L=null;if(h){if(!(O=assert(d).resolve(f,t)))return null;L=O.type,t.set("this",L)}var b,k=N.parameters,x=k.length,F=new Array(x),B=new Array(x),D=0;for(A=0;A<x;++A){var U=k[A];U.parameterKind==l.ParameterKind.DEFAULT&&(D=A+1);var P=assert(U.type),w=this.program.resolveType(P,t,!0);if(!w)return null;F[A]=w,B[A]=U.name.text}if(this.is(o.CommonFlags.SET))b=p.Type.void;else if(this.is(o.CommonFlags.CONSTRUCTOR))b=assert(O).type;else{P=assert(N.returnType);var M=this.program.resolveType(P,t,!0);if(!M)return null;b=M}var G=new p.Signature(F,b,L);G.parameterNames=B,G.requiredParameters=D;var K=this.internalName;return s.length&&(K+="<"+s+">"),c=new R(this,K,G,O||d,t),this.instances.set(s,c),this.program.instancesLookup.set(K,c),c},t.prototype.resolvePartial=function(e){assert(this.is(o.CommonFlags.INSTANCE));var r=assert(this.classPrototype);if(!e||!e.length)return this;var n=this.simpleName,i=p.typesToString(e),a=new t(this.program,n,r.internalName+"<"+i+">"+o.INSTANCE_DELIMITER+n,this.declaration,r,this.decoratorFlags);return a.flags=this.flags,a.operatorKind=this.operatorKind,a.classTypeArguments=e,a},t.prototype.resolveUsingTypeArguments=function(e,t,r){var n=null;return!this.is(o.CommonFlags.GENERIC)||(assert(null!=e&&0!=e.length),n=this.program.resolveTypeArguments(assert(this.declaration.typeParameters),e,t,r))?this.resolve(n,t):null},t.prototype.resolveBuiltinTypeArguments=function(e,t){assert(this.is(o.CommonFlags.BUILTIN));var r=null;if(e){var n=e.length;r=new Array(n);for(var i=0;i<n;++i){var a=this.program.resolveType(e[i],t,!0);if(!a)return null;r[i]=a}}return r},t.prototype.toString=function(){return this.simpleName},t}(I);t.FunctionPrototype=k;var R=function(e){function t(t,r,n,s,c){var p,l;void 0===s&&(s=null),void 0===c&&(c=null);var u=e.call(this,t.program,t.simpleName,r)||this;if(u.kind=y.FUNCTION,u.localsByName=new Map,u.localsByIndex=[],u.additionalLocals=[],u.breakContext=null,u.debugLocations=[],u.ref=0,u.functionTableIndex=-1,u.trampoline=null,u.outerScope=null,u.nextBreakId=0,u.breakStack=null,u.nextInlineId=0,u.tempI32s=null,u.tempI64s=null,u.tempF32s=null,u.tempF64s=null,u.prototype=t,u.signature=n,u.parent=s,u.flags=t.flags,u.decoratorFlags=t.decoratorFlags,u.contextualTypeArguments=c,!t.is(o.CommonFlags.AMBIENT|o.CommonFlags.BUILTIN)&&!t.is(o.CommonFlags.DECLARE)){var h=0;if(s&&s.kind==y.CLASS){assert(u.is(o.CommonFlags.INSTANCE));var d=new b(t.program,"this",h++,assert(n.thisType));u.localsByName.set("this",d),u.localsByIndex[d.index]=d;var _=s.contextualTypeArguments;if(_){u.contextualTypeArguments||(u.contextualTypeArguments=new Map);try{for(var m=i(_),g=m.next();!g.done;g=m.next()){var T=a(g.value,2),E=T[0],f=T[1];u.contextualTypeArguments.has(E)||u.contextualTypeArguments.set(E,f)}}catch(e){p={error:e}}finally{try{g&&!g.done&&(l=m.return)&&l.call(m)}finally{if(p)throw p.error}}}}else assert(!u.is(o.CommonFlags.INSTANCE));for(var I=n.parameterTypes,v=0,A=I.length;v<A;++v){var C=I[v],N=n.getParameterName(v);d=new b(t.program,N,h++,C);u.localsByName.set(N,d),u.localsByIndex[d.index]=d}}return u.flow=G.create(u),u}return n(t,e),t.prototype.addLocal=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.signature.parameterTypes.length+this.additionalLocals.length;this.is(o.CommonFlags.INSTANCE)&&++n;var i=new b(this.prototype.program,t||"var$"+n.toString(10),n,e,r);if(t){if(this.localsByName.has(t))throw new Error("duplicate local name");this.localsByName.set(t,i)}return this.localsByIndex[i.index]=i,this.additionalLocals.push(e),i},t.prototype.getTempLocal=function(e,t){var r,n;switch(void 0===t&&(t=!1),e.toNativeType()){case u.NativeType.I32:r=this.tempI32s;break;case u.NativeType.I64:r=this.tempI64s;break;case u.NativeType.F32:r=this.tempF32s;break;case u.NativeType.F64:r=this.tempF64s;break;default:throw new Error("concrete type expected")}return r&&r.length?((n=r.pop()).type=e,n.flags=o.CommonFlags.NONE):n=this.addLocal(e),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.freeTempLocal=function(e){if(!e.is(o.CommonFlags.INLINED)){var t;switch(assert(e.index>=0),assert(null!=e.type),e.type.toNativeType()){case u.NativeType.I32:t=this.tempI32s||(this.tempI32s=[]);break;case u.NativeType.I64:t=this.tempI64s||(this.tempI64s=[]);break;case u.NativeType.F32:t=this.tempF32s||(this.tempF32s=[]);break;case u.NativeType.F64:t=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},t.prototype.getAndFreeTempLocal=function(e,t){var r,n;switch(e.toNativeType()){case u.NativeType.I32:r=this.tempI32s||(this.tempI32s=[]);break;case u.NativeType.I64:r=this.tempI64s||(this.tempI64s=[]);break;case u.NativeType.F32:r=this.tempF32s||(this.tempF32s=[]);break;case u.NativeType.F64:r=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=this.addLocal(e),r.push(n)),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.enterBreakContext=function(){var e=this.nextBreakId++;return this.breakStack?this.breakStack.push(e):this.breakStack=[e],this.breakContext=e.toString(10)},t.prototype.leaveBreakContext=function(){assert(null!=this.breakStack);var e=this.breakStack.length;assert(e>0),this.breakStack.pop(),e>1?this.breakContext=this.breakStack[e-2].toString(10):(this.breakContext=null,this.breakStack=null)},t.prototype.finalize=function(e,t){if(this.ref=t,assert(!this.breakStack||!this.breakStack.length),this.breakStack=null,this.breakContext=null,this.tempI32s=this.tempI64s=this.tempF32s=this.tempF64s=null,this.program.options.sourceMap)for(var r=this.debugLocations,n=0,i=r.length;n<i;++n){var a=r[n];e.setDebugLocation(t,a.debugInfoRef,a.source.debugInfoIndex,a.line,a.column)}},t.prototype.toString=function(){return this.prototype.simpleName},t}(I);t.Function=R;var x=function(e){function t(t,r){var n=e.call(this,t,"","")||this;n.kind=y.FUNCTION_TARGET;var i=r.toSignatureString();return n.simpleName=i,n.internalName=i,n.signature=r,n.type=p.Type.u32.asFunction(r),n}return n(t,e),t}(I);t.FunctionTarget=x;var F=function(e){function t(t,r,n,i){var a=e.call(this,t.program,r,n)||this;return a.kind=y.FIELD_PROTOTYPE,a.classPrototype=t,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(I);t.FieldPrototype=F;var B=function(e){function t(t,r,n,i,a){var s=e.call(this,t.program,t.simpleName,r,n,i)||this;return s.kind=y.FIELD,s.memoryOffset=-1,s.prototype=t,s.flags=t.flags,s.type=n,s.parent=a,s}return n(t,e),t}(S);t.Field=B;var D=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=y.PROPERTY,a.getterPrototype=null,a.setterPrototype=null,a.parent=i,a}return n(t,e),t}(I);t.Property=D;var U=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n)||this;return s.kind=y.CLASS_PROTOTYPE,s.instances=new Map,s.instanceMembers=null,s.basePrototype=null,s.constructorPrototype=null,s.overloadPrototypes=new Map,s.declaration=i,s.flags=i.flags,s.decoratorFlags=a,s}return n(t,e),t.prototype.resolve=function(e,t){var r,n,u,h,d,_,m,T;void 0===t&&(t=null);var E=e?p.typesToString(e):"",f=this.instances.get(E);if(f)return f;var I=t;if(t=new Map,I)try{for(var v=i(I),A=v.next();!A.done;A=v.next()){var C=a(A.value,2),N=C[0],S=C[1];t.set(N,S)}}catch(e){r={error:e}}finally{try{A&&!A.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}var O,L,b=this.declaration,k=null;if(b.extendsType){var R=this.program.resolveType(b.extendsType,null);if(!R)return null;if(!(k=R.classReference))return this.program.error(c.DiagnosticCode.A_class_may_only_extend_another_class,b.extendsType.range),null;if(k.hasDecorator(g.SEALED))return this.program.error(c.DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,b.extendsType.range,k.internalName),null;if(k.hasDecorator(g.UNMANAGED)!=this.hasDecorator(g.UNMANAGED))return this.program.error(c.DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,l.Range.join(b.name.range,b.extendsType.range)),null}if(e){if((L=e.length)!=b.typeParameters.length)throw new Error("type argument count mismatch");for(O=0;O<L;++O)t.set(b.typeParameters[O].name.text,e[O])}else if(b.typeParameters.length)throw new Error("type argument count mismatch");var x=this.simpleName,F=this.internalName;E.length&&(x+="<"+E+">",F+="<"+E+">"),(f=new P(this,x,F,e,k)).contextualTypeArguments=t,this.instances.set(E,f),this.program.instancesLookup.set(F,f);var U=0;if(k&&(U=k.currentMemoryOffset,k.members)){f.members||(f.members=new Map);try{for(var w=i(k.members.values()),M=w.next();!M.done;M=w.next()){var G=M.value;f.members.set(G.simpleName,G)}}catch(e){u={error:e}}finally{try{M&&!M.done&&(h=w.return)&&h.call(w)}finally{if(u)throw u.error}}}if(this.constructorPrototype){var K=this.constructorPrototype.resolvePartial(e);K&&(f.constructorInstance=K.resolve())}if(this.instanceMembers)try{for(var z=i(this.instanceMembers.values()),V=z.next();!V.done;V=z.next()){var H=V.value;switch(H.kind){case y.FIELD_PROTOTYPE:f.members||(f.members=new Map);var X=H.declaration;if(!X.type)throw new Error("type expected");var W=this.program.resolveType(X.type,f.contextualTypeArguments);if(!W)break;var Y=new B(H,F+o.INSTANCE_DELIMITER+H.simpleName,W,X,f);switch(W.byteSize){case 1:break;case 2:1&U&&++U;break;case 4:3&U&&(U=1+(3|U));break;case 8:7&U&&(U=1+(7|U));break;default:assert(!1)}Y.memoryOffset=U,U+=W.byteSize,f.members.set(H.simpleName,Y);break;case y.FUNCTION_PROTOTYPE:f.members||(f.members=new Map);var Q=H.resolvePartial(e);Q&&(Q.internalName=F+o.INSTANCE_DELIMITER+Q.simpleName,f.members.set(H.simpleName,Q));break;case y.PROPERTY:f.members||(f.members=new Map);var q=assert(H.getterPrototype),j=H.setterPrototype,Z=new D(this.program,H.simpleName,F+o.INSTANCE_DELIMITER+H.simpleName,this),$=q.resolvePartial(e);if(!$)return null;if($.internalName=F+o.INSTANCE_DELIMITER+$.simpleName,Z.getterPrototype=$,j){var J=j.resolvePartial(e);if(!J)return null;J.internalName=F+o.INSTANCE_DELIMITER+J.simpleName,Z.setterPrototype=J}f.members.set(H.simpleName,Z);break;default:assert(!1)}}}catch(e){d={error:e}}finally{try{V&&!V.done&&(_=z.return)&&_.call(z)}finally{if(d)throw d.error}}try{for(var ee=i(this.overloadPrototypes),te=ee.next();!te.done;te=ee.next()){var re=a(te.value,2),ne=re[0],ie=re[1];assert(ne!=s.INVALID);var ae=void 0;if(ie.is(o.CommonFlags.INSTANCE)){var se=ie.resolvePartial(e);if(!se)continue;ae=se.resolve()}else ae=ie.resolve();if(ae){var oe=f.overloads;oe||(f.overloads=oe=new Map),oe.set(ne,ae)}}}catch(e){m={error:e}}finally{try{te&&!te.done&&(T=ee.return)&&T.call(ee)}finally{if(m)throw m.error}}return f.currentMemoryOffset=U,f},t.prototype.resolveUsingTypeArguments=function(e,t,r){var n=null;if(this.is(o.CommonFlags.GENERIC)){if(assert(null!=e&&0!=e.length),!(n=this.program.resolveTypeArguments(this.declaration.typeParameters,e,t,r)))return null}else assert(null==e||!e.length);return this.resolve(n,t)},t.prototype.toString=function(){return this.simpleName},t}(I);t.ClassPrototype=U;var P=function(e){function t(t,r,n,s,o){var c,p;void 0===s&&(s=null),void 0===o&&(o=null);var l=e.call(this,t.program,r,n)||this;if(l.kind=y.CLASS,l.contextualTypeArguments=null,l.currentMemoryOffset=0,l.constructorInstance=null,l.overloads=null,l.prototype=t,l.flags=t.flags,l.decoratorFlags=t.decoratorFlags,l.typeArguments=s,l.type=t.program.options.usizeType.asClass(l),l.base=o,o){var u=o.contextualTypeArguments;if(u){l.contextualTypeArguments||(l.contextualTypeArguments=new Map);try{for(var h=i(u),d=h.next();!d.done;d=h.next()){var _=a(d.value,2),m=_[0],g=_[1];l.contextualTypeArguments.set(m,g)}}catch(e){c={error:e}}finally{try{d&&!d.done&&(p=h.return)&&p.call(h)}finally{if(c)throw c.error}}}}var T,E,f=l.prototype.declaration;if(f){var I=f.typeParameters;if(s){if((E=s.length)!=I.length)throw new Error("type argument count mismatch");if(E)for(l.contextualTypeArguments||(l.contextualTypeArguments=new Map),T=0;T<E;++T)l.contextualTypeArguments.set(I[T].name.text,s[T])}else if(I.length)throw new Error("type argument count mismatch")}return l}return n(t,e),t.prototype.isAssignableTo=function(e){var t=this;do{if(t==e)return!0}while(t=t.base);return!1},t.prototype.lookupOverload=function(e,t){if(void 0===t&&(t=!1),t)switch(e){case s.INDEXED_GET:if(r=this.lookupOverload(s.UNCHECKED_INDEXED_GET))return r;break;case s.INDEXED_SET:var r;if(r=this.lookupOverload(s.UNCHECKED_INDEXED_SET))return r;break;default:assert(!1)}var n=this;do{var i=n.overloads;if(i){var a=i.get(e);if(a)return a}}while(n=n.base);return null},t.prototype.toString=function(){return this.simpleName},t}(I);t.Class=P;var w=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n,i,a)||this;return s.kind=y.INTERFACE_PROTOTYPE,s}return n(t,e),t}(U);t.InterfacePrototype=w;var M=function(e){function t(t,r,n,i,a){void 0===i&&(i=[]),void 0===a&&(a=null);var s=e.call(this,t,r,n,i,a)||this;return s.kind=y.INTERFACE,s}return n(t,e),t}(P);t.Interface=M,function(e){e[e.NONE=0]="NONE",e[e.RETURNS=1]="RETURNS",e[e.RETURNS_WRAPPED=2]="RETURNS_WRAPPED",e[e.THROWS=4]="THROWS",e[e.BREAKS=8]="BREAKS",e[e.CONTINUES=16]="CONTINUES",e[e.ALLOCATES=32]="ALLOCATES",e[e.CONDITIONALLY_RETURNS=64]="CONDITIONALLY_RETURNS",e[e.CONDITIONALLY_THROWS=128]="CONDITIONALLY_THROWS",e[e.CONDITIONALLY_BREAKS=256]="CONDITIONALLY_BREAKS",e[e.CONDITIONALLY_CONTINUES=512]="CONDITIONALLY_CONTINUES",e[e.CONDITIONALLY_ALLOCATES=1024]="CONDITIONALLY_ALLOCATES",e[e.INLINE_CONTEXT=2048]="INLINE_CONTEXT",e[e.UNCHECKED_CONTEXT=4096]="UNCHECKED_CONTEXT",e[e.ANY_TERMINATING=29]="ANY_TERMINATING",e[e.ANY_CATEGORICAL=63]="ANY_CATEGORICAL",e[e.ANY_CONDITIONAL=1984]="ANY_CONDITIONAL"}(t.FlowFlags||(t.FlowFlags={}));var G=function(){function e(){this.scopedLocals=null}return e.create=function(t){var r=new e;return r.parent=null,r.flags=0,r.currentFunction=t,r.continueLabel=null,r.breakLabel=null,r.returnLabel=null,r.returnType=t.signature.returnType,r.contextualTypeArguments=t.contextualTypeArguments,r.wrappedLocals=i64_new(0),r.wrappedLocalsExt=null,r},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.unset=function(e){this.flags&=~e},e.prototype.fork=function(){var t=new e;return t.parent=this,t.flags=this.flags,t.currentFunction=this.currentFunction,t.continueLabel=this.continueLabel,t.breakLabel=this.breakLabel,t.returnLabel=this.returnLabel,t.returnType=this.returnType,t.contextualTypeArguments=this.contextualTypeArguments,t.wrappedLocals=this.wrappedLocals,t.wrappedLocalsExt=this.wrappedLocalsExt?this.wrappedLocalsExt.slice():null,t},e.prototype.free=function(){var e,t,r=assert(this.parent);if(this.scopedLocals){try{for(var n=i(this.scopedLocals.values()),a=n.next();!a.done;a=n.next()){var s=a.value;s.is(o.CommonFlags.SCOPED)&&this.currentFunction.freeTempLocal(s)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.scopedLocals=null}return r},e.prototype.addScopedLocal=function(e,t,r,n){var i=this.currentFunction.getTempLocal(e,!1);if(this.scopedLocals){var a=this.scopedLocals.get(t);if(a)return n?this.currentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.name.range):assert(!1),a}else this.scopedLocals=new Map;return i.set(o.CommonFlags.SCOPED),this.scopedLocals.set(t,i),e.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedLocalAlias=function(e,t,r){if(this.scopedLocals){var n=this.scopedLocals.get(r);if(n){var i=n.declaration;return i?this.currentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,i.name.range):assert(!1),n}}else this.scopedLocals=new Map;assert(e<this.currentFunction.localsByIndex.length);var a=new b(this.currentFunction.program,r,e,t,null);return this.scopedLocals.set(r,a),a},e.prototype.getScopedLocal=function(e){var t,r=this;do{if(r.scopedLocals&&(t=r.scopedLocals.get(e)))return t}while(r=r.parent);return this.currentFunction.localsByName.get(e)},e.prototype.isLocalWrapped=function(e){var t,r;if(e<64){if(e<0)return!0;t=this.wrappedLocals}else{if(!(r=this.wrappedLocalsExt))return!1;var n=(e-64)/64|0;if(n>=r.length)return!1;t=r[n],e-=64*(n+1)}return i64_ne(i64_and(t,i64_shl(i64_one,i64_new(e))),i64_zero)},e.prototype.setLocalWrapped=function(e,t){var r,n=-1;if(e<64){if(e<0)return;r=this.wrappedLocals}else{var i=this.wrappedLocalsExt;for(n=(e-64)/64|0,i||(this.wrappedLocalsExt=i=new Array(n+1),i.length=0);i.length<=n;)i.push(i64_new(0));r=i[n],e-=64*(n+1)}r=t?i64_or(r,i64_shl(i64_one,i64_new(e))):i64_and(r,i64_not(i64_shl(i64_one,i64_new(e)))),n>=0?this.wrappedLocalsExt[n]=r:this.wrappedLocals=r},e.prototype.inherit=function(e){this.flags|=2047&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(64),e.is(4)&&this.set(128),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(256),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(512),e.is(32)&&this.set(1024)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&63,this.flags|=1984&e.flags,this.flags|=1984&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.length<a;)i.push(i64_new(0));else i=new Array(a);for(var s=0;s<a;++s)i[s]=i64_and(r[s],n[s])}}},e.prototype.canOverflow=function(e,t){if(assert(t!=p.Type.void),!t.is(36))return!1;var r;switch(u.getExpressionId(e)){case u.ExpressionId.GetLocal:var n=this.currentFunction,i=n.localsByIndex[u.getGetLocalIndex(e)];return!n.flow.isLocalWrapped(i.index)||K(i.type,t);case u.ExpressionId.SetLocal:return assert(u.isTeeLocal(e)),this.canOverflow(u.getSetLocalValue(e),t);case u.ExpressionId.GetGlobal:return!1;case u.ExpressionId.Binary:switch(u.getBinaryOp(e)){case u.BinaryOp.EqI32:case u.BinaryOp.EqI64:case u.BinaryOp.EqF32:case u.BinaryOp.EqF64:case u.BinaryOp.NeI32:case u.BinaryOp.NeI64:case u.BinaryOp.NeF32:case u.BinaryOp.NeF64:case u.BinaryOp.LtI32:case u.BinaryOp.LtU32:case u.BinaryOp.LtI64:case u.BinaryOp.LtU64:case u.BinaryOp.LtF32:case u.BinaryOp.LtF64:case u.BinaryOp.LeI32:case u.BinaryOp.LeU32:case u.BinaryOp.LeI64:case u.BinaryOp.LeU64:case u.BinaryOp.LeF32:case u.BinaryOp.LeF64:case u.BinaryOp.GtI32:case u.BinaryOp.GtU32:case u.BinaryOp.GtI64:case u.BinaryOp.GtU64:case u.BinaryOp.GtF32:case u.BinaryOp.GtF64:case u.BinaryOp.GeI32:case u.BinaryOp.GeU32:case u.BinaryOp.GeI64:case u.BinaryOp.GeU64:case u.BinaryOp.GeF32:case u.BinaryOp.GeF64:return!1;case u.BinaryOp.MulI32:return!(u.getExpressionId(r=u.getBinaryLeft(e))==u.ExpressionId.Const&&(0==u.getConstValueI32(r)||1==u.getConstValueI32(r)&&!this.canOverflow(u.getBinaryRight(e),t))||u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&(0==u.getConstValueI32(r)||1==u.getConstValueI32(r)&&!this.canOverflow(u.getBinaryLeft(e),t)));case u.BinaryOp.AndI32:return!(u.getExpressionId(r=u.getBinaryLeft(e))==u.ExpressionId.Const&&u.getConstValueI32(r)<=t.computeSmallIntegerMask(p.Type.i32)||!this.canOverflow(r,t)||u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)<=t.computeSmallIntegerMask(p.Type.i32)||!this.canOverflow(r,t));case u.BinaryOp.ShlI32:var a=32-t.size;return u.getExpressionId(r=u.getBinaryRight(e))!=u.ExpressionId.Const||u.getConstValueI32(r)<a;case u.BinaryOp.ShrI32:a=32-t.size;return this.canOverflow(u.getBinaryLeft(e),t)&&(u.getExpressionId(r=u.getBinaryRight(e))!=u.ExpressionId.Const||u.getConstValueI32(r)<a);case u.BinaryOp.ShrU32:a=32-t.size;return t.is(1)?!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>a):this.canOverflow(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=a);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var s=0;switch(u.getExpressionType(e)){case u.NativeType.I32:s=u.getConstValueI32(e);break;case u.NativeType.I64:s=u.getConstValueI64Low(e);break;case u.NativeType.F32:s=i32(u.getConstValueF32(e));break;case u.NativeType.F64:s=i32(u.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return s<i8.MIN_VALUE||s>i8.MAX_VALUE;case 1:return s<i16.MIN_VALUE||s>i16.MAX_VALUE;case 5:return s<0||s>u8.MAX_VALUE;case 6:return s<0||s>u16.MAX_VALUE;case 10:return 0!=(-2&s)}break;case u.ExpressionId.Load:var o=void 0;switch(u.getLoadBytes(e)){case 1:o=u.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:o=u.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:o=u.isLoadSigned(e)?p.Type.i32:p.Type.u32}return K(o,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var c=assert(u.getBlockChildCount(e)),l=u.getBlockChild(e,c-1);return this.canOverflow(l,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var h=this.currentFunction.program,d=assert(h.instancesLookup.get(assert(u.getCallTarget(e))));assert(d.kind==y.FUNCTION);var _=d.signature.returnType;return!d.flow.is(2)||K(_,t);case u.ExpressionId.Unreachable:return!1}return!0},e.prototype.finalize=function(){assert(null==this.parent),this.continueLabel=null,this.breakLabel=null,this.returnLabel=null,this.contextualTypeArguments=null},e}();function K(e,t){var r=e.byteSize,n=t.byteSize;return!e.is(4)||r>n||e.is(1)!=t.is(1)}t.Flow=G},function(e,t){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.VOID=13]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE"}(t.TypeFlags||(t.TypeFlags={}));var i=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(e,t){var r,n,i,a;if(void 0===t&&(t=!1),this.is(256)){if(e.is(256)&&(!this.is(512)||e.is(512)))if(r=this.classReference){if(n=e.classReference)return r.isAssignableTo(n)}else if((i=this.signatureReference)&&(a=e.signatureReference))return i.isAssignableTo(a)}else if(!e.is(256))if(this.is(4))if(e.is(4)){if(!t||this.is(1)==e.is(1))return this.size<=e.size}else{if(11==e.kind)return this.size<=23;if(12==e.kind)return this.size<=52}else if(this.is(8)&&e.is(8))return this.size<=e.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";default:assert(!1);case 13:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return n.NativeType.I32;case 3:case 8:return n.NativeType.I64;case 4:case 9:return 64==this.size?n.NativeType.I64:n.NativeType.I32;case 11:return n.NativeType.F32;case 12:return n.NativeType.F64;case 13:return n.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.void=new e(13,0,0),e}();t.Type=i,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;n<t;++n)r[n]=e[n].toNativeType();return r},t.typesToString=function(e){var t=e.length;if(!t)return"";for(var r=new Array(t),n=0;n<t;++n)r[n]=e[n].toString();return r.join(",")};var a=function(){function e(e,t,r){void 0===e&&(e=null),void 0===t&&(t=null),void 0===r&&(r=null),this.cachedFunctionTarget=null,this.parameterTypes=e||[],this.parameterNames=null,this.requiredParameters=0,this.returnType=t||i.void,this.thisType=r,this.hasRest=!1,this.type=i.u32.asFunction(this)}return e.prototype.getParameterName=function(e){var t=this.parameterNames;return t&&t.length>e?t[e]:o(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s<a;++s){var o=n[s],c=i[s];if(!o.isAssignableTo(c))return!1}var p=this.returnType,l=e.returnType;return p==l||p.isAssignableTo(l)},e.makeSignatureString=function(e,t,r){void 0===r&&(r=null);var n=[];if(r&&n.push(r.toSignatureString()),e)for(var i=0,a=e.length;i<a;++i)n.push(e[i].toSignatureString());return n.push(t.toSignatureString()),n.join("")},e.prototype.toSignatureString=function(){return e.makeSignatureString(this.parameterTypes,this.returnType,this.thisType)},e.prototype.toString=function(e){void 0===e&&(e=!1);var t=new Array;t.push("(");var r=0,n=this.thisType;n&&e&&(t.push("this: "),t.push(n.toString()),r=1);var i=this.parameterTypes,a=i.length;if(a)for(var s=this.parameterNames,c=s?s.length:0,p=this.requiredParameters,l=this.hasRest?a-1:-1,u=0;u<a;++u,++r)r&&t.push(", "),u==l&&t.push("..."),u<c?t.push(s[u]):t.push(o(u)),u>=p&&u!=l?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=a;var s=null;function o(e){s||(s=[]);for(var t=s.length;t<=e;++t)s.push("arg$"+t.toString(10));return s[e-1]}t.getDefaultParameterName=o},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(2),o=r(4),c=r(1);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function l(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=l,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.start<r.start?t.start:r.start,t.end>r.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=u;var h=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos<n.end&&65279==i.charCodeAt(n.pos)&&++n.pos,n.pos+1<n.end&&35==i.charCodeAt(n.pos)&&33==i.charCodeAt(n.pos+1))for(n.pos+=2;n.pos<n.end&&10!=i.charCodeAt(n.pos);)++n.pos;return n}return n(t,e),t.prototype.next=function(e){return void 0===e&&(e=a.DEFAULT),this.nextToken=-1,this.token=this.unsafeNext(e)},t.prototype.unsafeNext=function(e,t){void 0===e&&(e=a.DEFAULT),void 0===t&&(t=i32.MAX_VALUE);for(var r=this.source.text;this.pos<this.end;){this.tokenPos=this.pos;var n=r.charCodeAt(this.pos);switch(n){case 13:if(!(++this.pos<this.end&&10==r.charCodeAt(this.pos)))break;case 10:case 9:case 11:case 12:case 32:++this.pos;break;case 33:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.EXCLAMATION_EQUALS_EQUALS):i.EXCLAMATION_EQUALS):i.EXCLAMATION;case 34:case 39:case 96:return i.STRINGLITERAL;case 37:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.PERCENT_EQUALS):i.PERCENT;case 38:if(++this.pos,t>1&&this.pos<this.end){if(38==r.charCodeAt(this.pos))return++this.pos,i.AMPERSAND_AMPERSAND;if(61==r.charCodeAt(this.pos))return++this.pos,i.AMPERSAND_EQUALS}return i.AMPERSAND;case 40:return++this.pos,i.OPENPAREN;case 41:return++this.pos,i.CLOSEPAREN;case 42:if(++this.pos,t>1&&this.pos<this.end){if(61==r.charCodeAt(this.pos))return++this.pos,i.ASTERISK_EQUALS;if(42==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.ASTERISK_ASTERISK_EQUALS):i.ASTERISK_ASTERISK}return i.ASTERISK;case 43:if(++this.pos,t>1&&this.pos<this.end){if(43==r.charCodeAt(this.pos))return++this.pos,i.PLUS_PLUS;if(61==r.charCodeAt(this.pos))return++this.pos,i.PLUS_EQUALS}return i.PLUS;case 44:return++this.pos,i.COMMA;case 45:if(++this.pos,t>1&&this.pos<this.end){if(45==r.charCodeAt(this.pos))return++this.pos,i.MINUS_MINUS;if(61==r.charCodeAt(this.pos))return++this.pos,i.MINUS_EQUALS}return i.MINUS;case 46:if(++this.pos,t>1&&this.pos<this.end){if(c.isDecimalDigit(r.charCodeAt(this.pos)))return--this.pos,i.FLOATLITERAL;if(t>2&&this.pos+1<this.end&&46==r.charCodeAt(this.pos)&&46==r.charCodeAt(this.pos+1))return this.pos+=2,i.DOT_DOT_DOT}return i.DOT;case 47:var u=this.pos;if(++this.pos,t>1&&this.pos<this.end){if(47==r.charCodeAt(this.pos)){var h=o.CommentKind.LINE;for(this.pos+1<this.end&&47==r.charCodeAt(this.pos+1)&&(++this.pos,h=o.CommentKind.TRIPLE);++this.pos<this.end;)if(10==r.charCodeAt(this.pos)){++this.pos;break}this.onComment&&this.onComment(h,r.substring(u,this.pos),this.range(u,this.pos));break}if(42==r.charCodeAt(this.pos)){for(var d=!1;++this.pos<this.end;)if(42==(n=r.charCodeAt(this.pos))&&this.pos+1<this.end&&47==r.charCodeAt(this.pos+1)){this.pos+=2,d=!0;break}d?this.onComment&&this.onComment(o.CommentKind.BLOCK,r.substring(u,this.pos),this.range(u,this.pos)):this.error(s.DiagnosticCode._0_expected,this.range(this.pos),"*/");break}if(61==r.charCodeAt(this.pos))return++this.pos,i.SLASH_EQUALS}return i.SLASH;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.testInteger()?i.INTEGERLITERAL:i.FLOATLITERAL;case 58:return++this.pos,i.COLON;case 59:return++this.pos,i.SEMICOLON;case 60:if(++this.pos,t>1&&this.pos<this.end){if(60==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.LESSTHAN_LESSTHAN_EQUALS):i.LESSTHAN_LESSTHAN;if(61==r.charCodeAt(this.pos))return++this.pos,i.LESSTHAN_EQUALS}return i.LESSTHAN;case 61:if(++this.pos,t>1&&this.pos<this.end){if(61==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.EQUALS_EQUALS_EQUALS):i.EQUALS_EQUALS;if(62==r.charCodeAt(this.pos))return++this.pos,i.EQUALS_GREATERTHAN}return i.EQUALS;case 62:if(++this.pos,t>1&&this.pos<this.end){if(62==r.charCodeAt(this.pos)){if(++this.pos,t>2&&this.pos<this.end){if(62==r.charCodeAt(this.pos))return++this.pos,t>3&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS):i.GREATERTHAN_GREATERTHAN_GREATERTHAN;if(61==r.charCodeAt(this.pos))return++this.pos,i.GREATERTHAN_GREATERTHAN_EQUALS}return i.GREATERTHAN_GREATERTHAN}if(61==r.charCodeAt(this.pos))return++this.pos,i.GREATERTHAN_EQUALS}return i.GREATERTHAN;case 63:return++this.pos,i.QUESTION;case 91:return++this.pos,i.OPENBRACKET;case 93:return++this.pos,i.CLOSEBRACKET;case 94:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.CARET_EQUALS):i.CARET;case 123:return++this.pos,i.OPENBRACE;case 124:if(++this.pos,t>1&&this.pos<this.end){if(124==r.charCodeAt(this.pos))return++this.pos,i.BAR_BAR;if(61==r.charCodeAt(this.pos))return++this.pos,i.BAR_EQUALS}return i.BAR;case 125:return++this.pos,i.CLOSEBRACE;case 126:return++this.pos,i.TILDE;case 64:return++this.pos,i.AT;default:if(c.isIdentifierStart(n)){if(c.isKeywordCharacter(n)){for(var _=this.pos;++this.pos<this.end&&c.isIdentifierPart(n=r.charCodeAt(this.pos));)if(!c.isKeywordCharacter(n))return this.pos=_,i.IDENTIFIER;var m=p(r.substring(_,this.pos));if(m!=i.INVALID&&e!==a.ALWAYS&&(e!==a.PREFER||!l(m)))return m;this.pos=_}return i.IDENTIFIER}if(c.isWhiteSpace(n)){++this.pos;break}return this.error(s.DiagnosticCode.Invalid_character,this.range(this.pos,this.pos+1)),++this.pos,i.INVALID}}return i.ENDOFFILE},t.prototype.peek=function(e,t,r){void 0===e&&(e=!1),void 0===t&&(t=a.DEFAULT),void 0===r&&(r=i32.MAX_VALUE);var n=this.source.text;if(this.nextToken<0){var i=this.pos,s=this.token,o=this.tokenPos;if(this.nextToken=this.unsafeNext(t,r),this.nextTokenPos=this.tokenPos,e){this.nextTokenOnNewLine=!1;for(var p=i,l=this.nextTokenPos;p<l;++p)if(c.isLineBreak(n.charCodeAt(p))){this.nextTokenOnNewLine=!0;break}}this.pos=i,this.token=s,this.tokenPos=o}return this.nextToken},t.prototype.skipIdentifier=function(){return this.skip(i.IDENTIFIER,a.PREFER)},t.prototype.skipIdentifierName=function(){return this.skip(i.IDENTIFIER,a.ALWAYS)},t.prototype.skip=function(e,t){void 0===t&&(t=a.DEFAULT);var r=this.pos,n=this.token,s=this.tokenPos,o=i32.MAX_VALUE;switch(e){case i.GREATERTHAN:o=1}return this.token=this.unsafeNext(t,o),this.token==e?(this.nextToken=-1,!0):(this.pos=r,this.token=n,this.tokenPos=s,!1)},t.prototype.mark=function(){var e;return _?(e=_,_=null):e=new d,e.pos=this.pos,e.token=this.token,e.tokenPos=this.tokenPos,e},t.prototype.discard=function(e){_=e},t.prototype.reset=function(e){this.pos=e.pos,this.token=e.token,this.tokenPos=e.tokenPos,this.nextToken=-1},t.prototype.range=function(e,t){return void 0===e&&(e=-1),void 0===t&&(t=-1),e<0?(e=this.tokenPos,t=this.pos):t<0&&(t=e),new u(this.source,e,t)},t.prototype.readIdentifier=function(){for(var e=this.source.text,t=this.pos;++this.pos<this.end&&c.isIdentifierPart(e.charCodeAt(this.pos)););return e.substring(t,this.pos)},t.prototype.readString=function(){for(var e=this.source.text,t=e.charCodeAt(this.pos++),r=this.pos,n="";;){if(this.pos>=this.end){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(c.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos<this.end&&123==e.charCodeAt(this.pos)?(++this.pos,this.readExtendedUnicodeEscape()):this.readUnicodeEscape();case 13:this.pos<this.end&&10==e.charCodeAt(this.pos)&&++this.pos;case 10:case 8232:case 8233:return"";default:return String.fromCharCode(t)}},t.prototype.readRegexpPattern=function(){for(var e=this.source.text,t=this.pos,r=!1;;){if(this.pos>=this.end){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(c.isLineBreak(n)){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos<this.end;){var n=e.charCodeAt(this.pos);if(!c.isIdentifierPart(n))break;switch(++this.pos,n){case 103:r|=1&r?-1:1;break;case 105:r|=2&r?-1:2;break;case 109:r|=4&r?-1:4;break;default:r=-1}}return-1==r&&this.error(s.DiagnosticCode.Invalid_regular_expression_flags,this.range(t,this.pos)),e.substring(t,this.pos)},t.prototype.testInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+1<this.end)switch(e.charCodeAt(this.pos+2)){case 88:case 120:case 66:case 98:case 79:case 111:return!0}for(var t=this.pos;t<this.end;){var r=e.charCodeAt(t);if(46==r||69==r||101==r)return!1;if((r<48||r>57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2<this.end){switch(e.charCodeAt(this.pos+1)){case 88:case 120:return this.pos+=2,this.readHexInteger();case 66:case 98:return this.pos+=2,this.readBinaryInteger();case 79:case 111:return this.pos+=2,this.readOctalInteger()}if(c.isOctalDigit(e.charCodeAt(this.pos+1))){var t=this.pos;++this.pos;var r=this.readOctalInteger();return this.error(s.DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,this.range(t,this.pos)),r}}return this.readDecimalInteger()},t.prototype.readHexInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(16,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else if(o>=65&&o<=70)r=i64_add(i64_mul(r,n),i64_new(10+o-65,0));else if(o>=97&&o<=102)r=i64_add(i64_mul(r,n),i64_new(10+o-97,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=55)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(s.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos<this.end;){var o=this.pos,c=e.charCodeAt(o);if(48==c)r=i64_mul(r,n);else if(49==c)r=i64_add(i64_mul(r,n),i);else{if(95!=c)break;a==o&&this.error(a==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(o)),a=o+1}this.pos=o+1}return this.pos==t?this.error(s.DiagnosticCode.Binary_digit_expected,this.range(t)):a==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(a-1)),r},t.prototype.readFloat=function(){return this.readDecimalFloat()},t.prototype.readDecimalFloat=function(){for(var e=this.pos,t=this.source.text;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos;if(this.pos<this.end&&46==t.charCodeAt(this.pos))for(++this.pos;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos;if(this.pos<this.end){var r=t.charCodeAt(this.pos);if(69==r||101==r)for(++this.pos<this.end&&(45==t.charCodeAt(this.pos)||43==t.charCodeAt(this.pos))&&c.isDecimalDigit(t.charCodeAt(this.pos+1))&&++this.pos;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos}return parseFloat(t.substring(e,this.pos))},t.prototype.readHexFloat=function(){throw new Error("not implemented")},t.prototype.readUnicodeEscape=function(){for(var e=4,t=0,r=this.source.text;this.pos<this.end;){var n=r.charCodeAt(this.pos++);if(n>=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(s.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(s.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(s.DiagnosticEmitter);t.Tokenizer=h;var d=function(){return function(){}}();t.State=d;var _=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1061:return"Enum member must have initializer.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";default:return""}}},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var a,s=r(22),o=r(2),c=r(3),p=r(0),l=r(5),u=r(8),h=r(4),d=r(7),_=r(1);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(a=t.Target||(t.Target={}));var m=function(){function e(){this.target=a.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==a.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==a.WASM64?d.Type.usize64:d.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==a.WASM64?d.Type.isize64:d.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==a.WASM64?c.NativeType.I64:c.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=m,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var y,g,T=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentOuterFunction=null,n.currentEnum=null,n.currentType=d.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=[],n.argcVar=0,n.argcSet=0,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,r||(r=new m),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=c.Module.create(),n}return n(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e=this.options,t=this.module,r=this.program;r.initialize(e);var n=new l.Function(r.startFunction,"start",new d.Signature([],d.Type.void));this.startFunctionInstance=n;var i=new Array;this.startFunctionBody=i,this.currentFunction=n;for(var a=r.sources,s=0,o=a.length;s<o;++s)a[s].isEntry&&this.compileSource(a[s]);if(i.length||null!==r.mainFunction){var p=n.signature,u=t.addFunction(n.internalName,this.ensureFunctionType(p.parameterTypes,p.returnType,p.thisType),d.typesToNativeTypes(n.additionalLocals),t.createBlock(null,i));n.finalize(t,u),r.mainFunction||t.setStart(u)}var h=this.memoryOffset;h=i64_align(h,e.usizeType.byteSize),this.memoryOffset=h,e.isWasm64?t.addGlobal("HEAP_BASE",c.NativeType.I64,!1,t.createI64(i64_low(h),i64_high(h))):t.addGlobal("HEAP_BASE",c.NativeType.I32,!1,t.createI32(i64_low(h)));var _=this.memorySegments.length?i64_low(i64_shr_u(i64_align(h,65536),i64_new(16,0))):0;t.setMemory(_,this.options.isWasm64?c.Module.MAX_MEMORY_WASM64:c.Module.MAX_MEMORY_WASM32,this.memorySegments,e.target,"memory"),e.importMemory&&t.addMemoryImport("0","env","memory");var m=this.functionTable,y=m.length,g=!1;if(y){var T=new Array(y);for(s=0;s<y;++s)T[s]=m[s].ref;t.setFunctionTable(T),t.addTableExport("0","table"),g=!0}return e.importTable&&(t.addTableImport("0","env","table"),g||t.addTableExport("0","table")),t},t.prototype.compileSourceByPath=function(e,t){var r=this.program.lookupSourceByPath(e);r?this.compileSource(r):this.error(o.DiagnosticCode.File_0_not_found,t.range,e)},t.prototype.compileSource=function(e){if(!e.is(p.CommonFlags.COMPILED)){e.set(p.CommonFlags.COMPILED);for(var t=this.options.noTreeShaking,r=e.isEntry,n=this.startFunctionInstance,i=this.startFunctionBody,a=e.statements,s=0,o=a.length;s<o;++s){var c=a[s];switch(c.kind){case h.NodeKind.CLASSDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&!c.isGeneric&&this.compileClassDeclaration(c,[]);break;case h.NodeKind.INTERFACEDECLARATION:break;case h.NodeKind.ENUMDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&this.compileEnumDeclaration(c);break;case h.NodeKind.FUNCTIONDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&!c.isGeneric&&this.compileFunctionDeclaration(c,[]);break;case h.NodeKind.IMPORT:this.compileSourceByPath(c.normalizedPath,c.path);break;case h.NodeKind.NAMESPACEDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&this.compileNamespaceDeclaration(c);break;case h.NodeKind.VARIABLE:var l=this.compileVariableStatement(c);l&&i.push(l);break;case h.NodeKind.EXPORT:null!=c.normalizedPath&&this.compileSourceByPath(c.normalizedPath,c.path),(t||r)&&this.compileExportStatement(c);break;default:var u=this.currentFunction;this.currentFunction=n,i.push(this.compileStatement(c)),this.currentFunction=u}}}},t.prototype.compileGlobalDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==l.ElementKind.GLOBAL),this.compileGlobal(t)?t:null},t.prototype.compileGlobal=function(e){if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var t=this.module,r=e.declaration,n=0;if(e.type==d.Type.void)if(r)if(r.type){var i=this.program.resolveType(r.type);if(!i)return!1;if(i==d.Type.void)return this.error(o.DiagnosticCode.Type_expected,r.type.range),!1;e.type=i}else{if(!r.initializer)return this.error(o.DiagnosticCode.Type_expected,r.name.range.atEnd),!1;if(n=this.compileExpressionRetainType(r.initializer,d.Type.void,1),this.currentType==d.Type.void)return this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,r.initializer.range,this.currentType.toString(),"<auto>"),!1;e.type=this.currentType}else assert(!1);if(e.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.isAny(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?f(e,r,e.parent):(y="env",g=e.simpleName),t.addGlobalImport(e.internalName,y,g,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(o.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var l=!1;e.is(p.CommonFlags.INLINED)?n=this.compileInlineConstant(e,e.type,!0):r&&r.initializer?(n||(n=this.compileExpression(r.initializer,e.type,1,1)),c.getExpressionId(n)!=c.ExpressionId.Const&&(s?(n=this.precomputeExpressionRef(n),c.getExpressionId(n)!=c.ExpressionId.Const&&(this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),l=!0)):l=!0)):n=e.type.toNativeZero(t);var u=e.internalName;if(l)t.addGlobal(u,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(u,n));else if(s){switch(c.getExpressionType(n)){case c.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(c.getConstValueI32(n),0);break;case c.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(c.getConstValueI64Low(n),c.getConstValueI64High(n));break;case c.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=c.getConstValueF32(n);break;case c.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=c.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED),e.is(p.CommonFlags.MODULE_EXPORT)?(t.addGlobal(u,a,!1,n),t.addGlobalExport(u,E(e))):r&&r.isTopLevel&&t.addGlobal(u,a,!1,n)}else t.addGlobal(u,a,!s,n);return!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==l.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null;if(e.members)try{for(var s=i(e.members.values()),u=s.next();!u.done;u=s.next()){var h=u.value;if(h.kind==l.ElementKind.ENUMVALUE){var _=!1,m=h,y=m.declaration;if(m.set(p.CommonFlags.COMPILED),m.is(p.CommonFlags.INLINED))e.declaration.isTopLevelExport&&n.addGlobal(m.internalName,c.NativeType.I32,!1,n.createI32(m.constantValue));else{var g=void 0;y.value?(g=this.compileExpression(y.value,d.Type.i32,1,0),c.getExpressionId(g)!=c.ExpressionId.Const&&(g=this.precomputeExpressionRef(g),c.getExpressionId(g)!=c.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,y.range),_=!0))):null==a?g=n.createI32(0):a.is(p.CommonFlags.INLINED)?g=n.createI32(a.constantValue+1):(g=n.createBinary(c.BinaryOp.AddI32,n.createGetGlobal(a.internalName,c.NativeType.I32),n.createI32(1)),e.is(p.CommonFlags.CONST)&&this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,y.range),_=!0),_?(n.addGlobal(m.internalName,c.NativeType.I32,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(m.internalName,g))):(n.addGlobal(m.internalName,c.NativeType.I32,!1,g),c.getExpressionType(g)==c.NativeType.I32?(m.constantValue=c.getConstValueI32(g),m.set(p.CommonFlags.INLINED)):(assert(!1),m.constantValue=0))}a=m,e.is(p.CommonFlags.MODULE_EXPORT)&&(h.is(p.CommonFlags.INLINED)||this.options.hasFeature(2)?n.addGlobalExport(h.internalName,E(h)):y&&this.warning(o.DiagnosticCode.Cannot_export_a_mutable_global,y.range))}}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t,r){void 0===r&&(r=null);var n=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(n.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(n,t,r,null,n.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=e.resolveUsingTypeArguments(t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s<i;++s,++a)n[a]=e[s].toNativeType();var o=t.toNativeType(),c=this.module,p=c.getFunctionTypeBySignature(o,n);if(!p){var l=d.Signature.makeSignatureString(e,t,r);p=c.addFunctionType(l,o,n)}return p},t.prototype.compileFunction=function(e){if(e.is(p.CommonFlags.COMPILED))return!0;assert(!e.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN)),e.set(p.CommonFlags.COMPILED);var t,r=e.prototype.declaration,n=r.body;n?e.is(p.CommonFlags.AMBIENT)&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,r.name.range):e.is(p.CommonFlags.AMBIENT)||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,r.name.range);var i=e.signature,a=this.ensureFunctionType(i.parameterTypes,i.returnType,i.thisType),s=this.module;if(n){var u=e.is(p.CommonFlags.CONSTRUCTOR),_=e.signature.returnType,m=this.currentFunction;this.currentFunction=e;var T=e.flow,I=void 0;if(n.kind==h.NodeKind.EXPRESSION)assert(!e.isAny(p.CommonFlags.CONSTRUCTOR|p.CommonFlags.GET|p.CommonFlags.SET|p.CommonFlags.MAIN)),assert(e.is(p.CommonFlags.ARROW)),I=this.compileExpression(n.expression,_,1,0),T.set(1),T.canOverflow(I,_)||T.set(2),T.finalize();else{assert(n.kind==h.NodeKind.BLOCK);var v=this.compileStatements(n.statements);if(e.is(p.CommonFlags.MAIN)&&(s.addGlobal("~started",c.NativeType.I32,!0,s.createI32(0)),v.unshift(s.createIf(s.createUnary(c.UnaryOp.EqzI32,s.createGetGlobal("~started",c.NativeType.I32)),s.createBlock(null,[s.createCall("start",null,c.NativeType.None),s.createSetGlobal("~started",s.createI32(1))])))),T.finalize(),u){var A=this.options.nativeSizeType;if(assert(e.is(p.CommonFlags.INSTANCE)),!T.is(1))if(T.is(32))v.push(s.createGetLocal(0,A));else{var C=assert(e.parent);assert(C.kind==l.ElementKind.CLASS),v.push(s.createTeeLocal(0,this.makeConditionalAllocate(C,r.name)))}}else _==d.Type.void||T.is(1)||this.error(o.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,r.signature.returnType.range);I=v.length?1==v.length?v[0]:s.createBlock(null,v,_.toNativeType()):s.createNop()}if(this.currentFunction=m,t=s.addFunction(e.internalName,a,d.typesToNativeTypes(e.additionalLocals),I),e.hasDecorator(l.DecoratorFlags.EXTERNAL)){var N=assert(h.findDecorator(h.DecoratorKind.EXTERNAL,r.decorators));this.error(o.DiagnosticCode.Operation_not_supported,N.range)}}else e.set(p.CommonFlags.MODULE_IMPORT),f(e,r,e.prototype.parent),t=s.addFunctionImport(e.internalName,y,g,a);return e.is(p.CommonFlags.MODULE_EXPORT)&&(i.requiredParameters<i.parameterTypes.length&&(e=this.ensureTrampoline(e),this.ensureArgcSet()),s.addFunctionExport(e.internalName,E(e))),e.finalize(s,t),!0},t.prototype.compileNamespaceDeclaration=function(e){for(var t=e.members,r=this.options.noTreeShaking,n=0,i=t.length;n<i;++n){var a=t[n];switch(a.kind){case h.NodeKind.CLASSDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileClassDeclaration(a,[]);break;case h.NodeKind.INTERFACEDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileInterfaceDeclaration(a,[]);break;case h.NodeKind.ENUMDECLARATION:(r||a.is(p.CommonFlags.EXPORT))&&this.compileEnumDeclaration(a);break;case h.NodeKind.FUNCTIONDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileFunctionDeclaration(a,[]);break;case h.NodeKind.NAMESPACEDECLARATION:(r||a.is(p.CommonFlags.EXPORT))&&this.compileNamespaceDeclaration(a);break;case h.NodeKind.VARIABLE:if(r||a.is(p.CommonFlags.EXPORT)){var s=this.compileVariableStatement(a,!0);s&&this.startFunctionBody.push(s)}break;default:assert(!1)}}},t.prototype.compileNamespace=function(e){var t,r;if(e.members){var n=this.options.noTreeShaking;try{for(var a=i(e.members.values()),s=a.next();!s.done;s=a.next()){var o=s.value;switch(o.kind){case l.ElementKind.CLASS_PROTOTYPE:!n&&!o.is(p.CommonFlags.EXPORT)||o.is(p.CommonFlags.GENERIC)||this.compileClassUsingTypeArguments(o,[]);break;case l.ElementKind.ENUM:this.compileEnum(o);break;case l.ElementKind.FUNCTION_PROTOTYPE:!n&&!o.is(p.CommonFlags.EXPORT)||o.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(o,[],null,null,o.declaration.name);break;case l.ElementKind.GLOBAL:this.compileGlobal(o);break;case l.ElementKind.NAMESPACE:this.compileNamespace(o)}}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}},t.prototype.compileExportStatement=function(e){var t=this.module,r=this.program.fileLevelExports,n=e.members;if(n)for(var i=0,a=n.length;i<a;++i){var s=n[i],c=e.range.source.internalPath+p.PATH_DELIMITER+s.externalName.text,u=r.get(c);if(u)switch(u.kind){case l.ElementKind.CLASS_PROTOTYPE:u.is(p.CommonFlags.GENERIC)||this.compileClassUsingTypeArguments(u,[]);break;case l.ElementKind.ENUM:this.compileEnum(u);break;case l.ElementKind.FUNCTION_PROTOTYPE:if(!u.is(p.CommonFlags.GENERIC)&&e.range.source.isEntry){var h=this.compileFunctionUsingTypeArguments(u,[],null,null,u.declaration.name);if(h){var d=h.prototype.declaration;d&&d.needsExplicitExport(s)&&t.addFunctionExport(h.internalName,s.externalName.text)}}break;case l.ElementKind.GLOBAL:if(this.compileGlobal(u)&&e.range.source.isEntry){var _=u.declaration;_&&_.needsExplicitExport(s)&&(u.is(p.CommonFlags.INLINED)?t.addGlobalExport(u.internalName,s.externalName.text):this.warning(o.DiagnosticCode.Cannot_export_a_mutable_global,s.range))}break;case l.ElementKind.NAMESPACE:this.compileNamespace(u)}}},t.prototype.compileClassDeclaration=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null);var i=assert(this.program.elementsLookup.get(e.fileLevelInternalName));assert(i.kind==l.ElementKind.CLASS_PROTOTYPE),this.compileClassUsingTypeArguments(i,t,r,n)},t.prototype.compileClassUsingTypeArguments=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null);var i=e.resolveUsingTypeArguments(t,r,n);i&&this.compileClass(i)},t.prototype.compileClass=function(e){var t,r,n,a;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var s=e.prototype.members;if(s)try{for(var o=i(s.values()),c=o.next();!c.done;c=o.next()){switch((y=c.value).kind){case l.ElementKind.GLOBAL:this.compileGlobal(y);break;case l.ElementKind.FUNCTION_PROTOTYPE:y.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(y,[],null,null,y.declaration.name);break;case l.ElementKind.PROPERTY:(O=y.getterPrototype)&&this.compileFunctionUsingTypeArguments(O,[],null,null,O.declaration.name),(L=y.setterPrototype)&&this.compileFunctionUsingTypeArguments(L,[],null,null,L.declaration.name)}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var u=e.constructorInstance;u&&this.compileFunction(u);var h=e.members;if(h)try{for(var _=i(h.values()),m=_.next();!m.done;m=_.next()){var y;switch((y=m.value).kind){case l.ElementKind.FUNCTION_PROTOTYPE:y.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(y,[],e.contextualTypeArguments,null,y.declaration.name);break;case l.ElementKind.FIELD:if(y.set(p.CommonFlags.COMPILED),!e.is(p.CommonFlags.MODULE_EXPORT)||y.is(p.CommonFlags.PRIVATE))break;var g=this.module,T=y.simpleName,f=y.type,I=f.toNativeType(),v=y.memoryOffset,A=this.options.usizeType,C=this.options.nativeSizeType,N=E(y,p.GETTER_PREFIX+T);if(g.addFunction(N,this.ensureFunctionType(null,f,A),null,g.createLoad(f.byteSize,f.is(1),g.createGetLocal(0,C),I,v)),g.addFunctionExport(N,N),y.is(p.CommonFlags.READONLY))break;var S=E(y,p.SETTER_PREFIX+T);g.addFunction(S,this.ensureFunctionType([f],d.Type.void,A),null,g.createStore(f.byteSize,g.createGetLocal(0,C),g.createGetLocal(1,I),I,v)),g.addFunctionExport(S,S);break;case l.ElementKind.PROPERTY:var O,L;(O=y.getterPrototype)&&this.compileFunctionUsingTypeArguments(O,[],e.contextualTypeArguments,null,O.declaration.name),(L=y.setterPrototype)&&this.compileFunctionUsingTypeArguments(L,[],e.contextualTypeArguments,null,L.declaration.name)}}}catch(e){n={error:e}}finally{try{m&&!m.done&&(a=_.return)&&a.call(_)}finally{if(n)throw n.error}}return!0},t.prototype.compileInterfaceDeclaration=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null),this.error(o.DiagnosticCode.Operation_not_supported,e.range)},t.prototype.addMemorySegment=function(e,t){void 0===t&&(t=8);var r=i64_align(this.memoryOffset,t),n=c.MemorySegment.create(e,r);return this.memorySegments.push(n),this.memoryOffset=i64_add(r,i64_new(e.length,0)),n},t.prototype.ensureFunctionTableEntry=function(e){if(assert(e.is(p.CommonFlags.COMPILED)),e.functionTableIndex>=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters<e.signature.parameterTypes.length&&(e=this.ensureTrampoline(e)),t.push(e),e.functionTableIndex=r,r},t.prototype.compileStatement=function(e){var t,r=this.module;switch(e.kind){case h.NodeKind.BLOCK:t=this.compileBlockStatement(e);break;case h.NodeKind.BREAK:t=this.compileBreakStatement(e);break;case h.NodeKind.CONTINUE:t=this.compileContinueStatement(e);break;case h.NodeKind.DO:t=this.compileDoStatement(e);break;case h.NodeKind.EMPTY:t=this.compileEmptyStatement(e);break;case h.NodeKind.EXPRESSION:t=this.compileExpressionStatement(e);break;case h.NodeKind.FOR:t=this.compileForStatement(e);break;case h.NodeKind.IF:t=this.compileIfStatement(e);break;case h.NodeKind.RETURN:t=this.compileReturnStatement(e);break;case h.NodeKind.SWITCH:t=this.compileSwitchStatement(e);break;case h.NodeKind.THROW:t=this.compileThrowStatement(e);break;case h.NodeKind.TRY:t=this.compileTryStatement(e);break;case h.NodeKind.VARIABLE:(t=this.compileVariableStatement(e))||(t=r.createNop());break;case h.NodeKind.VOID:t=this.compileVoidStatement(e);break;case h.NodeKind.WHILE:t=this.compileWhileStatement(e);break;case h.NodeKind.TYPEDECLARATION:if(this.currentFunction==this.startFunctionInstance)return r.createNop();default:assert(!1),t=r.createUnreachable()}return this.options.sourceMap&&this.addDebugLocation(t,e.range),t},t.prototype.compileStatements=function(e){var t=e.length,r=new Array(t);r.length=0;for(var n=this.currentFunction.flow,i=0;i<t;++i){var a=this.compileStatement(e[i]);switch(c.getExpressionId(a)){case c.ExpressionId.Block:if(!c.getBlockName(a)){for(var s=0,o=c.getBlockChildCount(a);s<o;++s)r.push(c.getBlockChild(a,s));break}default:r.push(a);case c.ExpressionId.Nop:}if(n.isAny(29))break}return r},t.prototype.compileBlockStatement=function(e){var t=e.statements,r=this.currentFunction.flow,n=r.fork();this.currentFunction.flow=n;var i=this.compileStatements(t),a=0==i.length?this.module.createNop():1==i.length?i[0]:this.module.createBlock(null,i,c.getExpressionType(i[i.length-1]));return this.currentFunction.flow=n.free(),r.inherit(n),a},t.prototype.compileBreakStatement=function(e){var t=this.module;if(e.label)return this.error(o.DiagnosticCode.Operation_not_supported,e.label.range),t.createUnreachable();var r=this.currentFunction.flow,n=r.breakLabel;return null==n?(this.error(o.DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,e.range),t.createUnreachable()):(r.set(8),t.createBreak(n))},t.prototype.compileContinueStatement=function(e){var t=this.module,r=e.label;if(r)return this.error(o.DiagnosticCode.Operation_not_supported,r.range),t.createUnreachable();var n=this.currentFunction.flow,i=n.continueLabel;return null==i?(this.error(o.DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,e.range),t.createUnreachable()):(n.set(16),t.createBreak(i))},t.prototype.compileDoStatement=function(e){var t=this.currentFunction,r=this.module,n=t.enterBreakContext(),i=t.flow,a=i.fork();t.flow=a;var s="break|"+n;a.breakLabel=s;var o="continue|"+n;a.continueLabel=o;var p=this.compileStatement(e.statement),l=this.makeIsTrueish(this.compileExpression(e.condition,d.Type.i32,0,0),this.currentType);t.flow=a.free(),t.leaveBreakContext();var u=a.isAny(29);return a.unset(792),i.inherit(a),r.createBlock(s,[r.createLoop(o,u?p:r.createBlock(null,[p,r.createBreak(o,l)],c.NativeType.None))],u?c.NativeType.Unreachable:c.NativeType.None)},t.prototype.compileEmptyStatement=function(e){return this.module.createNop()},t.prototype.compileExpressionStatement=function(e){var t=this.compileExpression(e.expression,d.Type.void,0,0);return this.currentType!=d.Type.void&&(t=this.module.createDrop(t),this.currentType=d.Type.void),t},t.prototype.compileForStatement=function(e){var t=this.currentFunction,r=t.enterBreakContext(),n=t.flow,i=n.fork();t.flow=i;var a=i.breakLabel="break|"+r;i.breakLabel=a;var s="continue|"+r;i.continueLabel=s;var o="repeat|"+r,p=this.module,l=e.initializer?this.compileStatement(e.initializer):0,u=0,h=!1;if(e.condition){u=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);var _=this.precomputeExpressionRef(u);c.getExpressionId(_)==c.ExpressionId.Const&&(assert(c.getExpressionType(_)==c.NativeType.I32),0!=c.getConstValueI32(_)&&(h=!0)),u=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}else u=p.createI32(1),h=!0;var m=e.incrementor?this.compileExpression(e.incrementor,d.Type.void,1,0):0,y=this.compileStatement(e.statement);t.flow=i.free(),t.leaveBreakContext();var g=i.isAny(528);i.unset(792);var T=h&&i.isAny(29);h?n.inherit(i):n.inheritConditional(i);var E=new Array;l&&E.push(l);var f=new Array;return g?f.push(p.createBlock(s,[p.createBreak(a,p.createUnary(c.UnaryOp.EqzI32,u)),y],c.NativeType.None)):(f.push(p.createBreak(a,p.createUnary(c.UnaryOp.EqzI32,u))),f.push(y)),m&&f.push(m),f.push(p.createBreak(o)),E.push(p.createLoop(o,p.createBlock(null,f,c.NativeType.None))),p.createBlock(a,E,T?c.NativeType.Unreachable:c.NativeType.None)},t.prototype.compileIfStatement=function(e){var t=this.module,r=this.currentFunction,n=e.ifTrue,i=e.ifFalse,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var s=this.precomputeExpressionRef(a);if(c.getExpressionId(s)==c.ExpressionId.Const&&c.getExpressionType(s)==c.NativeType.I32)return c.getConstValueI32(s)?this.compileStatement(n):i?this.compileStatement(i):t.createNop();a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var o=r.flow,l=o.fork();r.flow=l;var u=this.compileStatement(n);r.flow=l.free();var h=0;if(i){var _=o.fork();r.flow=_,h=this.compileStatement(i),r.flow=_.free(),o.inheritMutual(l,_)}else o.inheritConditional(l);return t.createIf(a,u,h)},t.prototype.compileReturnStatement=function(e){var t=this.module,r=this.currentFunction,n=0,i=r.flow;if(i.set(1),e.value){var a=i.returnType;if(a==d.Type.void)return this.compileExpressionRetainType(e.value,a,0),this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.value.range,this.currentType.toString(),a.toString()),this.currentType=d.Type.void,t.createUnreachable();n=this.compileExpression(e.value,a,1,r.is(p.CommonFlags.MODULE_EXPORT)?1:0),i.canOverflow(n,a)||i.set(2)}return h.isLastStatement(e)?n||t.createNop():i.is(2048)?t.createBreak(assert(i.returnLabel),0,n):t.createReturn(n)},t.prototype.compileSwitchStatement=function(e){var t=this.module,r=this.currentFunction,n=e.cases,i=n.length;if(!i)return this.compileExpression(e.condition,d.Type.void,1,0);var a=r.enterBreakContext(),s=r.flow,o=r.getTempLocal(d.Type.u32,!1),p=o.index,l=new Array(1+i);l[0]=t.createSetLocal(p,this.compileExpression(e.condition,d.Type.u32,1,0));for(var u=1,h=-1,_=0;_<i;++_){var m=n[_].label;m?l[u++]=t.createBreak("case"+_.toString(10)+"|"+a,t.createBinary(c.BinaryOp.EqI32,t.createGetLocal(p,c.NativeType.I32),this.compileExpression(m,d.Type.u32,1,0))):h=_}r.freeTempLocal(o),l[u]=t.createBreak((h>=0?"case"+h.toString(10):"break")+"|"+a);var y=t.createBlock("case0|"+a,l,c.NativeType.None),g=!0,T=!0,E=!0,f=!0;for(_=0;_<i;++_){var I=n[_].statements,v=I.length,A=s.fork();r.flow=A;var C="break|"+a;A.breakLabel=C;var N=_==i-1,S=N?C:"case"+(_+1).toString(10)+"|"+a,O=new Array(1+v);O[0]=y;for(var L=1,b=!1,k=0;k<v;++k){var R=this.compileStatement(I[k]);if(c.getExpressionId(R)!=c.ExpressionId.Nop&&(O[L++]=R,A.isAny(29))){b=!0;break}}O.length=L,(b||N)&&(A.is(1)||(g=!1),A.is(2)||(T=!1),A.is(4)||(E=!1),A.is(32)||(f=!1)),A.unset(264),r.flow=A.free(),y=t.createBlock(S,O,c.NativeType.None)}return r.leaveBreakContext(),h>=0&&(g&&s.set(1),T&&s.set(2),E&&s.set(4),f&&s.set(32)),y},t.prototype.compileThrowStatement=function(e){var t=this.currentFunction.flow;return t.set(4),t.set(1),s.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=this.currentFunction,i=e.declarations,a=i.length;if(t||n==this.startFunctionInstance&&e.parent&&e.parent.kind==h.NodeKind.SOURCE){for(var s=0;s<a;++s)this.compileGlobalDeclaration(i[s]);return 0}var u=new Array,_=this.currentFunction.flow;for(s=0;s<a;++s){var m=i[s],y=m.name.text,g=null,T=0;if(m.type){if(!(g=r.resolveType(m.type,_.contextualTypeArguments)))continue;m.initializer&&(T=this.compileExpression(m.initializer,g,1,0))}else{if(!m.initializer){this.error(o.DiagnosticCode.Type_expected,m.name.range.atEnd);continue}if(T=this.compileExpressionRetainType(m.initializer,d.Type.void,0),this.currentType==d.Type.void){this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,m.range,this.currentType.toString(),"<auto>");continue}g=this.currentType}var E=!1;if(m.is(p.CommonFlags.CONST))if(T)if(T=this.precomputeExpressionRef(T),c.getExpressionId(T)==c.ExpressionId.Const){var f=new l.Local(r,y,-1,g);switch(c.getExpressionType(T)){case c.NativeType.I32:f=f.withConstantIntegerValue(i64_new(c.getConstValueI32(T),0));break;case c.NativeType.I64:f=f.withConstantIntegerValue(i64_new(c.getConstValueI64Low(T),c.getConstValueI64High(T)));break;case c.NativeType.F32:f=f.withConstantFloatValue(c.getConstValueF32(T));break;case c.NativeType.F64:f=f.withConstantFloatValue(c.getConstValueF64(T));break;default:return assert(!1),this.module.createUnreachable()}var I=n.flow.scopedLocals;if(I){if(I.has(y))return this.error(o.DiagnosticCode.Duplicate_identifier_0,m.name.range,y),this.module.createUnreachable()}else n.flow.scopedLocals=I=new Map;I.set(y,f),E=!0}else this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,m.range);else this.error(o.DiagnosticCode._const_declarations_must_be_initialized,m.range);if(!E){f=void 0;f=m.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||_.is(2048)?_.addScopedLocal(g,y,!1,m):n.addLocal(g,y,m),T?(u.push(this.compileAssignmentWithValue(m.name,T)),f.type.is(36)&&_.setLocalWrapped(f.index,!_.canOverflow(T,g))):f.type.is(36)&&_.setLocalWrapped(f.index,!0)}}return u.length?1==u.length?u[0]:this.module.createBlock(null,u,c.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,d.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=this.precomputeExpressionRef(r);if(c.getExpressionId(n)==c.ExpressionId.Const&&c.getExpressionType(n)==c.NativeType.I32){if(!c.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var i=this.currentFunction,a=i.enterBreakContext(),s=i.flow,o=s.fork();i.flow=o;var l="break|"+a;o.breakLabel=l;var u="continue|"+a;o.continueLabel=u;var h=this.compileStatement(e.statement),_=o.isAny(29);return i.flow=o.free(),i.leaveBreakContext(),o.unset(792),s.inheritConditional(o),t.createBlock(l,[t.createLoop(u,t.createIf(r,_?h:t.createBlock(null,[h,t.createBreak(u)],c.NativeType.None)))],c.NativeType.None)},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size<t.size?(this.currentType=t).kind:(this.currentType=n).kind){case 0:case 1:var i=n.computeSmallIntegerShift(d.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)<<i>>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(d.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.is(p.CommonFlags.BUILTIN)||t!=d.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=d.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case h.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case h.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case h.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case h.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case h.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case h.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case h.NodeKind.IDENTIFIER:case h.NodeKind.FALSE:case h.NodeKind.NULL:case h.NodeKind.THIS:case h.NodeKind.SUPER:case h.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case h.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case h.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case h.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case h.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case h.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case h.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case h.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case h.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(o.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==d.Type.void?d.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.precomputeExpressionRef(this.compileExpression(e,t,r,n))},t.prototype.precomputeExpressionRef=function(e){var t=this.module,r=this.currentType.toNativeType(),n=t.addTemporaryFunction(r,null,e);t.runPasses(["precompute"],n);var i=c.getFunctionBody(n);return t.removeTemporaryFunction(),i},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 13==t.kind?(assert(13!=r.kind),this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):13==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(o.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(c.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(c.UnaryOp.DemoteF64,e)):r.is(4)?e=11==t.kind?r.is(1)?r.is(64)?s.createUnary(c.UnaryOp.TruncF32ToI64,e):s.createUnary(c.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(c.UnaryOp.TruncF32ToU64,e):s.createUnary(c.UnaryOp.TruncF32ToU32,e):r.is(1)?r.is(64)?s.createUnary(c.UnaryOp.TruncF64ToI64,e):s.createUnary(c.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(c.UnaryOp.TruncF64ToU64,e):s.createUnary(c.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?c.UnaryOp.ConvertI64ToF32:c.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?c.UnaryOp.ConvertI32ToF32:c.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?c.UnaryOp.ConvertI64ToF64:c.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?c.UnaryOp.ConvertI32ToF64:c.UnaryOp.ConvertU32ToF64,e):t.is(64)?r.is(64)||(e=s.createUnary(c.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(r.is(1)?c.UnaryOp.ExtendI32:c.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size<r.size&&(e=this.ensureSmallIntegerWrap(e,t),i=0),this.currentType=r,1==i?this.ensureSmallIntegerWrap(e,r):e)},t.prototype.compileAssertionExpression=function(e,t){var r=this.program.resolveType(e.toType,this.currentFunction.flow.contextualTypeArguments);return r?this.compileExpression(e.expression,r,2,0):this.module.createUnreachable()},t.prototype.compileBinaryExpression=function(e,t){var r,n,i,a,s,p,h=this.module,_=e.left,m=e.right,y=!1,g=e.operator;switch(g){case u.Token.LESSTHAN:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.LT)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.LtI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.LtI64,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LtI64:c.BinaryOp.LtI32,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.LtU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LtU64:c.BinaryOp.LtU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.LtU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.LtF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.LtF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.GREATERTHAN:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.GT)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.GtI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GtI64:c.BinaryOp.GtI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.GtU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GtU64:c.BinaryOp.GtU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.GtU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.GtF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.GtF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.LE)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.LeI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LeI64:c.BinaryOp.LeI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.LeU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LeU64:c.BinaryOp.LeU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.LeU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.LeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.LeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.GE)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.GeI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GeI64:c.BinaryOp.GeI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.GeU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GeU64:c.BinaryOp.GeU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.GeU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.GeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.GeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EQUALS_EQUALS_EQUALS:case u.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,g==u.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.EQ)){p=this.compileBinaryOverload(v,_,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,u.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.EqI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.EqI64:c.BinaryOp.EqI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.EqI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.EqF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.EqF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EXCLAMATION_EQUALS_EQUALS:case u.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,g==u.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.NE)){p=this.compileBinaryOverload(v,_,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,u.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.NeI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.NeI64:c.BinaryOp.NeI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.NeI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.NeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.NeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EQUALS:return this.compileAssignment(_,m,t);case u.Token.PLUS_EQUALS:y=!0;case u.Token.PLUS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.ADD)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.AddI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.AddI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.AddF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.AddF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.MINUS_EQUALS:y=!0;case u.Token.MINUS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.SUB)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.SubI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.SubI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.SubF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.SubF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.ASTERISK_EQUALS:y=!0;case u.Token.ASTERISK:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.MUL)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.MulI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.MulI64:c.BinaryOp.MulI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.MulI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.MulF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.MulF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.ASTERISK_ASTERISK_EQUALS:y=!0;case u.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.POW)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var T=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(m,d.Type.f32,1,0),a=this.currentType,!(T=this.f32PowInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),p=h.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=T=f.resolve()}}else if(r=this.convertExpression(r,this.currentType,d.Type.f64,1,0,_),n=this.currentType,i=this.compileExpression(m,d.Type.f64,1,0),a=this.currentType,!(T=this.f64PowInstance)){if(!(E=this.program.elementsLookup.get("Math"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),p=h.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=T=f.resolve()}p=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):h.createUnreachable();break;case u.Token.SLASH_EQUALS:y=!0;case u.Token.SLASH:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.DIV)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.DivI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.DivI64:c.BinaryOp.DivI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.DivU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.DivU64:c.BinaryOp.DivU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.DivU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.DivF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.DivF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.PERCENT_EQUALS:y=!0;case u.Token.PERCENT:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.REM)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.RemI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.RemI64:c.BinaryOp.RemI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.RemU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.RemU64:c.BinaryOp.RemU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.RemU64,r,i);break;case 11:if(!(T=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),p=h.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=T=f.resolve()}p=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):h.createUnreachable();break;case 12:if(!(T=this.f64ModInstance)){var E,f;if(!(E=this.program.elementsLookup.get("Math"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),p=h.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=T=f.resolve()}p=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):h.createUnreachable();break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.LESSTHAN_LESSTHAN_EQUALS:y=!0;case u.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHL)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.ShlI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.ShlI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShlI64:c.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.GREATERTHAN_GREATERTHAN_EQUALS:y=!0;case u.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.ShrI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.ShrI64,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrI64:c.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.ShrU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.ShrU64,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrU64:c.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:y=!0;case u.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHR_U)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:p=h.createBinary(c.BinaryOp.ShrU32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.ShrU64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrU64:c.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.AMPERSAND_EQUALS:y=!0;case u.Token.AMPERSAND:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_AND)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.AndI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.AndI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.AndI64:c.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.BAR_EQUALS:y=!0;case u.Token.BAR:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_OR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.OrI32,r,i);break;case 2:case 7:p=h.createBinary(c.BinaryOp.OrI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.OrI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.OrI64:c.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.CARET_EQUALS:y=!0;case u.Token.CARET:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_XOR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.XorI32,r,i);break;case 2:case 7:p=h.createBinary(c.BinaryOp.XorI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.XorI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.XorI64:c.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,p=h.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),p=h.createIf(this.makeIsTrueish(r,this.currentType),i,p);else{var A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));p=h.createIf(this.makeIsTrueish(h.createTeeLocal(C.index,r),this.currentType),i,h.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case u.Token.BAR_BAR:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,p=this.module.cloneExpression(r,!0,0))p=this.module.createIf(this.makeIsTrueish(r,this.currentType),p,i);else{A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));p=h.createIf(this.makeIsTrueish(h.createTeeLocal(C.index,r),this.currentType),h.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),p=this.module.createUnreachable()}return y?this.compileAssignmentWithValue(_,p,t!=d.Type.void):p},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(l.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==l.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(l.DecoratorFlags.INLINE))},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program,a=this.currentFunction,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case l.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=d.Type.void);case l.ElementKind.LOCAL:case l.ElementKind.FIELD:n=s.type;break;case l.ElementKind.PROPERTY:var c=s.setterPrototype;if(c){var p=c.resolve();if(!p)return this.module.createUnreachable();assert(1==p.signature.parameterTypes.length),n=p.signature.parameterTypes[0];break}return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case l.ElementKind.CLASS:if(i.resolvedElementExpression){var u=a.flow.is(4096),h=s.lookupOverload(l.OperatorKind.INDEXED_SET,u);if(!h)return s.lookupOverload(l.OperatorKind.INDEXED_GET,u)?this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=d.Type.void);var _=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,_,r!=d.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.program.resolveExpression(e,this.currentFunction);if(!i)return n.createUnreachable();switch(i.kind){case l.ElementKind.LOCAL:var a=i.type;if(assert(a!=d.Type.void),this.currentType=r?a:d.Type.void,i.is(p.CommonFlags.CONST))return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var s=this.currentFunction.flow;return a.is(36)&&s.setLocalWrapped(i.index,!s.canOverflow(t,a)),r?n.createTeeLocal(i.index,t):n.createSetLocal(i.index,t);case l.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=d.Type.void),this.currentType=r?a:d.Type.void,i.is(p.CommonFlags.CONST))return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,a),r){var c=a.toNativeType(),u=i.internalName;return n.createBlock(null,[n.createSetGlobal(u,t),n.createGetGlobal(u,c)],c)}return n.createSetGlobal(i.internalName,t);case l.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var _=assert(this.program.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0);a=i.type;this.currentType=r?a:d.Type.void;c=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(L=this.currentFunction).flow;var y=L.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(y,t),n.createStore(a.byteSize,m,n.createGetLocal(y,c),c,i.memoryOffset),n.createGetLocal(y,c)],c)}return n.createStore(a.byteSize,m,t,c,i.memoryOffset);case l.ElementKind.PROPERTY:var g=i.setterPrototype;if(g){var T=g.resolve();if(!T)return n.createUnreachable();if(!r){if(T.is(p.CommonFlags.INSTANCE)){_=assert(this.program.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0);return this.makeCallDirect(T,[m,t])}return this.makeCallDirect(T,[t])}var E=i.getterPrototype;assert(null!=E);var f=E.resolve();if(!f)return n.createUnreachable();var I=(R=f.signature.returnType).toNativeType();if(T.is(p.CommonFlags.INSTANCE)){_=assert(this.program.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0),y=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(T,[n.createTeeLocal(y,m),t]),this.makeCallDirect(f,[n.createGetLocal(y,I)])],I)}return n.createBlock(null,[this.makeCallDirect(T,[t]),this.makeCallDirect(f)],I)}return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case l.ElementKind.CLASS:var v=this.program.resolvedElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(l.OperatorKind.INDEXED_GET,A);if(!C)return this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(l.OperatorKind.INDEXED_SET,A);if(!N)return this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:d.Type.void,n.createUnreachable();var S=i.type,O=(_=assert(this.program.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0),this.compileExpression(v,d.Type.i32,1,0));if(r){var L,b=(L=this.currentFunction).getTempLocal(S,!1),k=L.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(b),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(b.index,m),n.createTeeLocal(k.index,O),t]),this.makeCallDirect(C,[n.createGetLocal(b.index,b.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,O,t])}}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r,n,i=this.module,a=this.currentFunction,s=this.program.resolveExpression(e.expression,a);if(!s)return i.createUnreachable();switch(s.kind){case l.ElementKind.FUNCTION_PROTOTYPE:var u=s,_=e.typeArguments;if(u.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN))return this.compileCallExpressionBuiltin(u,e,t);var m=null;if(_){if(!u.is(p.CommonFlags.GENERIC))return this.error(o.DiagnosticCode.Type_0_is_not_generic,e.expression.range,u.internalName),i.createUnreachable();m=u.resolveUsingTypeArguments(_,this.currentFunction.flow.contextualTypeArguments,e)}else{if(u.is(p.CommonFlags.GENERIC)){for(var y=new Map,g=assert(u.declaration.typeParameters),T=g.length,E=0;E<T;++E)y.set(g[E].name.text,null);var f=u.declaration.signature.parameters,I=f.length,v=e.arguments,A=v.length,C=new Array(A);for(E=0;E<I;++E){var N=f[E].type,S=N.kind==h.NodeKind.TYPE?N.name.text:null,O=E<A?v[E]:u.declaration.signature.parameters[E].initializer;if(!O)return this.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,e.range,I.toString(10),A.toString(10)),i.createUnreachable();if(null!==S&&y.has(S)){if(R=y.get(S)){C[E]=this.compileExpressionRetainType(O,R,0);var L=void 0;if(!(L=d.Type.commonCompatible(R,this.currentType,!0))&&!(L=d.Type.commonCompatible(R,this.currentType,!1)))return this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,f[E].type.range,this.currentType.toString(),R.toString()),i.createUnreachable();R=L}else C[E]=this.compileExpressionRetainType(O,d.Type.i32,0),R=this.currentType;y.set(S,R)}else{var b=this.program.resolveType(f[E].type,this.currentFunction.flow.contextualTypeArguments,!0);if(!b)return i.createUnreachable();C[E]=this.compileExpression(O,b,1,0)}}var k=new Array(T);for(E=0;E<T;++E){var R=assert(y.get(g[E].name.text));k[E]=R}return(m=u.resolve(k,this.currentFunction.flow.contextualTypeArguments))?this.makeCallDirect(m,C):this.module.createUnreachable()}m=u.resolve(null,this.currentFunction.flow.contextualTypeArguments)}if(!m)return this.module.createUnreachable();var x=0;return m.is(p.CommonFlags.INSTANCE)&&(x=this.compileExpressionRetainType(assert(this.program.resolvedThisExpression),this.options.usizeType,0)),this.compileCallDirect(m,e.arguments,e,x,m.hasDecorator(l.DecoratorFlags.INLINE));case l.ElementKind.LOCAL:if(r=s.type.signatureReference){n=i.createGetLocal(s.index,c.NativeType.I32);break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.GLOBAL:if(r=s.type.signatureReference){n=i.createGetGlobal(s.internalName,s.type.toNativeType());break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.FIELD:if(r=s.type.signatureReference){var F=assert(this.program.resolvedThisExpression);x=this.compileExpressionRetainType(F,this.options.usizeType,0);n=i.createLoad(4,!1,x,c.NativeType.I32,s.memoryOffset);break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.FUNCTION_TARGET:r=s.signature,n=this.compileExpression(e.expression,s.type,1,0);break;case l.ElementKind.PROPERTY:default:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),i.createUnreachable()}return this.compileCallIndirect(r,n,e.arguments,e)},t.prototype.compileCallExpressionBuiltin=function(e,t,r){var n=s.compileCall(this,e,e.resolveBuiltinTypeArguments(t.typeArguments,this.currentFunction.flow.contextualTypeArguments),t.arguments,r,t);return n||(this.error(o.DiagnosticCode.Operation_not_supported,t.range),this.module.createUnreachable())},t.prototype.checkCallSignature=function(e,t,r,n){if(r!=(null!=e.thisType))return this.error(o.DiagnosticCode.Operation_not_supported,n.range),!1;var i=e.hasRest;if(i)return this.error(o.DiagnosticCode.Operation_not_supported,n.range),!1;var a=e.requiredParameters,s=e.parameterTypes.length;return t<a?(this.error(a<s?o.DiagnosticCode.Expected_at_least_0_arguments_but_got_1:o.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,a.toString(),t.toString()),!1):!(t>s&&!i)||(this.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n,i){void 0===n&&(n=0),void 0===i&&(i=!1);var a=t.length,s=e.signature;if(!this.checkCallSignature(s,a,0!=n,r))return this.module.createUnreachable();if(i)return assert(!e.is(p.CommonFlags.TRAMPOLINE)),this.compileCallInlineUnchecked(e,t,r,n);var o=n?a+1:a,c=new Array(o),l=0;n&&(c[0]=n,l=1);for(var u=s.parameterTypes,h=0;h<a;++h,++l)c[l]=this.compileExpression(t[h],u[h],1,0);return assert(l==o),this.makeCallDirect(e,c)},t.prototype.compileCallInlineUnchecked=function(e,t,r,n){var a,s;void 0===n&&(n=0);var u=t.length,_=e.signature,m=this.currentFunction,y=this.module,g=e.prototype.declaration,T=m.flow,E=e.internalName+"|inlined."+(e.nextInlineId++).toString(10),f=e.signature.returnType,I=l.Flow.create(m);I.set(2048),I.returnLabel=E,I.returnType=f,I.contextualTypeArguments=e.contextualTypeArguments;var v=[];if(n){var A=assert(e.parent);if(assert(A.kind==l.ElementKind.CLASS),c.getExpressionId(n)==c.ExpressionId.GetLocal)I.addScopedLocalAlias(c.getGetLocalIndex(n),A.type,"this");else{var C=I.addScopedLocal(A.type,"this",!1);v.push(y.createSetLocal(C.index,n))}}for(var N=_.parameterTypes,S=0;S<u;++S){var O=this.compileExpression(t[S],N[S],1,0);if(c.getExpressionId(O)==c.ExpressionId.GetLocal)I.addScopedLocalAlias(c.getGetLocalIndex(O),N[S],_.getParameterName(S));else{var L=I.addScopedLocal(N[S],_.getParameterName(S),!I.canOverflow(O,N[S]));v.push(y.createSetLocal(L.index,O))}}m.flow=I;var b=_.parameterTypes.length;for(S=u;S<b;++S){var k=this.compileExpression(assert(g.signature.parameters[S].initializer),N[S],1,1);L=I.addScopedLocal(N[S],_.getParameterName(S),!I.canOverflow(k,N[S]));v.push(y.createSetLocal(L.index,k))}var R=assert(g.body);if(R.kind==h.NodeKind.BLOCK)for(var x=R.statements,F=(S=0,x.length);S<F;++S){var B=this.compileStatement(x[S]);if(c.getExpressionId(B)!=c.ExpressionId.Nop&&(v.push(B),I.isAny(29)))break}else v.push(this.compileStatement(R));var D=I.scopedLocals;if(D){try{for(var U=i(D.values()),P=U.next();!P.done;P=U.next()){var w=P.value;w.is(p.CommonFlags.SCOPED)&&m.freeTempLocal(w)}}catch(e){a={error:e}}finally{try{P&&!P.done&&(s=U.return)&&s.call(U)}finally{if(a)throw a.error}}I.scopedLocals=null}return I.finalize(),this.currentFunction.flow=T,this.currentType=f,f==d.Type.void||I.isAny(29)?y.createBlock(E,v,f.toNativeType()):(this.error(o.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,g.signature.returnType.range),y.createUnreachable())},t.prototype.ensureTrampoline=function(e){var t=e.trampoline;if(t)return t;var r=e.signature,n=e.internalName,i=r.parameterTypes,a=e.prototype.declaration.signature.parameters,s=r.returnType,u=r.thisType,h=e.is(p.CommonFlags.INSTANCE),_=r.requiredParameters,m=_,y=i.length,g=y;h&&(++m,++g);var T=assert(g-m),E=new Array(m),f=0,I=this.module;h&&(E[0]=I.createGetLocal(0,this.options.nativeSizeType),f=1);for(var v=0;v<_;++v,++f)E[f]=I.createGetLocal(f,i[v].toNativeType());assert(f==m);var A=new d.Signature(i,s,u),C=n+"|trampoline";A.requiredParameters=y,(t=new l.Function(e.prototype,C,A,e.parent,e.contextualTypeArguments)).set(e.flags|p.CommonFlags.TRAMPOLINE|p.CommonFlags.COMPILED),e.trampoline=t;var N=this.currentFunction;this.currentFunction=t;var S=T+1,O=new Array(S),L="of"+T.toString(10);for(v=0;v<S;++v){var b=v.toString(10)+L;O[v]=b}var k=I.createBlock(O[0],[I.createBlock("oob",[I.createSwitch(O,"oob",_?I.createBinary(c.BinaryOp.SubI32,I.createGetGlobal("~argc",c.NativeType.I32),I.createI32(_)):I.createGetGlobal("~argc",c.NativeType.I32))]),I.createUnreachable()]);for(v=0;v<T;++v,++f){var R=i[_+v],x=a[_+v],F=x.initializer,B=void 0;F?B=I.createSetLocal(f,this.compileExpression(F,R,1,1)):(this.error(o.DiagnosticCode.Optional_parameter_must_have_an_initializer,x.range),B=I.createUnreachable()),k=I.createBlock(O[v+1],[k,B]),E[f]=I.createGetLocal(f,R.toNativeType())}this.currentFunction=N,assert(f==g);var D=I.addFunction(C,this.ensureFunctionType(A.parameterTypes,A.returnType,A.thisType),d.typesToNativeTypes(t.additionalLocals),I.createBlock(null,[k,I.createCall(n,E,s.toNativeType())],s.toNativeType()));return t.finalize(I,D),t},t.prototype.ensureArgcVar=function(){if(!this.argcVar){var e=this.module;this.argcVar=e.addGlobal("~argc",c.NativeType.I32,!0,e.createI32(0))}return"~argc"},t.prototype.ensureArgcSet=function(){if(!this.argcSet){var e=this.module;this.argcSet=e.addFunction("~setargc",this.ensureFunctionType([d.Type.u32],d.Type.void),null,e.createSetGlobal(this.ensureArgcVar(),e.createGetLocal(0,c.NativeType.I32))),e.addFunctionExport("~setargc","_setargc")}return"~setargc"},t.prototype.makeCallDirect=function(e,t){void 0===t&&(t=null);var r=t?t.length:0,n=r,i=e.signature.requiredParameters,a=e.signature.parameterTypes.length,s=a;e.is(p.CommonFlags.INSTANCE)&&(++i,++s,--n),assert(r>=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(p.CommonFlags.MODULE_IMPORT);if(r<s){t||((t=new Array(s)).length=0);for(var u=e.signature.parameterTypes,d=e.prototype.declaration.signature.parameters,_=!0,m=n;m<a;++m){var y=d[m].initializer;if(null===y||!h.nodeIsConstantValue(y.kind)){_=!1;break}}if(_)for(m=n;m<a;++m)t.push(this.compileExpression(d[m].initializer,u[m],1,0));else{for(m=n;m<a;++m)t.push(u[m].toNativeZero(o));if(!l){var g=e;if(e=this.ensureTrampoline(e),!this.compileFunction(e))return o.createUnreachable();e.flow.flags=g.flow.flags,this.program.instancesLookup.set(e.internalName,e);var T=c.toNativeType();return this.currentType=c,o.createBlock(null,[o.createSetGlobal(this.ensureArgcVar(),o.createI32(n)),o.createCall(e.internalName,t,T)],T)}}}return this.currentType=c,l?o.createCallImport(e.internalName,t,c.toNativeType()):o.createCall(e.internalName,t,c.toNativeType())},t.prototype.compileCallIndirect=function(e,t,r,n,i){void 0===i&&(i=0);var a=r.length;if(!this.checkCallSignature(e,a,0!=i,n))return this.module.createUnreachable();var s=i?a+1:a,o=new Array(s),c=0;i&&(o[0]=i,c=1);for(var p=e.parameterTypes,l=0;l<a;++l,++c)o[c]=this.compileExpression(r[l],p[l],1,0);return assert(c==s),this.makeCallIndirect(e,t,o)},t.prototype.makeCallIndirect=function(e,t,r){void 0===r&&(r=null);var n=r?r.length:0,i=n,a=e.requiredParameters,s=e.parameterTypes.length,o=s;e.thisType&&(++a,++o,--i),assert(n>=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n<o){r||((r=new Array(o)).length=0);for(var p=e.parameterTypes,l=i;l<s;++l)r.push(p[l].toNativeZero(c))}var u=e.returnType;return this.currentType=u,c.createBlock(null,[c.createSetGlobal(this.ensureArgcVar(),c.createI32(i)),c.createCallIndirect(t,r,e.toSignatureString())],u.toNativeType())},t.prototype.compileCommaExpression=function(e,t){for(var r=e.expressions,n=r.length,i=new Array(n--),a=0;a<n;++a)i[a]=this.compileExpression(r[a],d.Type.void,2,0);return i[n]=this.compileExpression(r[n],t,1,0),this.module.createBlock(null,i,this.currentType.toNativeType())},t.prototype.compileElementAccessExpression=function(e,t){var r=this.program.resolveElementAccess(e,this.currentFunction);if(!r)return this.module.createUnreachable();switch(r.kind){case l.ElementKind.CLASS:var n=this.currentFunction.flow.is(4096),i=r.lookupOverload(l.OperatorKind.INDEXED_GET,n);if(!i)return this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.expression.range,r.internalName),this.module.createUnreachable();var a=this.compileExpression(e.expression,r.type,1,0);return this.compileCallDirect(i,[e.elementExpression],e,a)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileFunctionExpression=function(e,t){var r=e.declaration,n=r.name,i=(n.text.length?n.text:"anonymous")+"|"+this.functionTable.length.toString(10),a=this.currentFunction,s=new l.FunctionPrototype(this.program,i,a.internalName+p.INNER_DELIMITER+i,r,null,l.DecoratorFlags.NONE),o=a.flow,c=this.compileFunctionUsingTypeArguments(s,[],o.contextualTypeArguments,o,r);if(!c)return this.module.createUnreachable();this.currentType=c.signature.type;var u=this.ensureFunctionTableEntry(c);return u<0?this.module.createUnreachable():this.module.createI32(u)},t.prototype.compileIdentifierExpression=function(e,t,r){var n=this.module,i=this.currentFunction;switch(e.kind){case h.NodeKind.NULL:var a=this.options;return t.classReference||(this.currentType=a.usizeType),a.isWasm64?n.createI64(0):n.createI32(0);case h.NodeKind.TRUE:return this.currentType=d.Type.bool,n.createI32(1);case h.NodeKind.FALSE:return this.currentType=d.Type.bool,n.createI32(0);case h.NodeKind.THIS:if((_=i.flow).is(2048))if(m=_.getScopedLocal("this"))return this.currentType=m.type,n.createGetLocal(m.index,m.type.toNativeType());if(i.is(p.CommonFlags.INSTANCE)){var s=assert(i.parent);assert(s.kind==l.ElementKind.CLASS);var u=s.type;return i.is(p.CommonFlags.CONSTRUCTOR)&&!_.is(32)?(_.set(32),this.currentType=u,n.createTeeLocal(0,this.makeConditionalAllocate(s,e))):(this.currentType=u,n.createGetLocal(0,u.toNativeType()))}return this.error(o.DiagnosticCode._this_cannot_be_referenced_in_current_location,e.range),this.currentType=this.options.usizeType,n.createUnreachable();case h.NodeKind.SUPER:var _,m;if((_=i.flow).is(2048))if(m=_.getScopedLocal("this"))if(y=assert(m.type.classReference).base)return this.currentType=y.type,n.createGetLocal(m.index,y.type.toNativeType());if(i.is(p.CommonFlags.INSTANCE)){var y;s=assert(i.parent);if(assert(s.kind==l.ElementKind.CLASS),y=s.base){var g=y.type;return this.currentType=g,n.createGetLocal(0,g.toNativeType())}}return this.error(o.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,e.range),this.currentType=this.options.usizeType,n.createUnreachable()}var T=this.program.resolveIdentifier(e,this.currentEnum||i);if(!T)return n.createUnreachable();switch(T.kind){case l.ElementKind.LOCAL:if(T.is(p.CommonFlags.INLINED))return this.compileInlineConstant(T,t,r);var E=T.type,f=T.index;return assert(f>=0),this.currentType=E,this.module.createGetLocal(f,E.toNativeType());case l.ElementKind.GLOBAL:if(!this.compileGlobal(T))return this.module.createUnreachable();var I=T.type;return assert(I!=d.Type.void),T.is(p.CommonFlags.INLINED)?this.compileInlineConstant(T,t,r):(this.currentType=I,this.module.createGetGlobal(T.internalName,I.toNativeType()));case l.ElementKind.ENUMVALUE:return T.is(p.CommonFlags.COMPILED)?(this.currentType=d.Type.i32,T.is(p.CommonFlags.INLINED)?this.module.createI32(T.constantValue):this.module.createGetGlobal(T.internalName,c.NativeType.I32)):(this.error(o.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=d.Type.i32,this.module.createUnreachable());case l.ElementKind.FUNCTION_PROTOTYPE:var v=T.resolve(null,i.flow.contextualTypeArguments);if(!v||!this.compileFunction(v))return n.createUnreachable();var A=this.ensureFunctionTableEntry(v);return this.currentType=v.signature.type,this.module.createI32(A)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.program.resolveType(e.isType);return this.currentType=d.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?c.BinaryOp.NeI64:c.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case h.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,e):(this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case h.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==d.Type.f32?n.createF32(a):(this.currentType=d.Type.f64,n.createF64(a));case h.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=d.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=d.Type.u32,n.createI32(i64_low(s))):(this.currentType=d.Type.i64,n.createI64(i64_low(s),i64_high(s)));case h.LiteralKind.STRING:return assert(!r),this.compileStaticString(e.value)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.compileStaticString=function(e){var t=this.module,r=this.options,n=this.stringSegments,i=n.get(e);if(!i){var a=e.length,s=new Uint8Array(4+2*a);s[0]=255&a,s[1]=a>>>8&255,s[2]=a>>>16&255,s[3]=a>>>24&255;for(var o=0;o<a;++o)s[4+2*o]=255&e.charCodeAt(o),s[5+2*o]=e.charCodeAt(o)>>>8&255;i=this.addMemorySegment(s,r.usizeType.byteSize),n.set(e,i)}var c=i.offset,p=this.program.typesLookup.get("string");return this.currentType=p||r.usizeType,r.isWasm64?t.createI64(i64_low(c),i64_high(c)):(assert(i64_is_i32(c)),t.createI32(i64_low(c)))},t.prototype.compileArrayLiteral=function(e,t,r){var n=!0,i=this.module,a=assert(this.program.arrayPrototype);if(!a||a.kind!=l.ElementKind.CLASS_PROTOTYPE)return i.createUnreachable();var s=a.resolve([e]);if(!s)return i.createUnreachable();var p=s.type,u=t.length;if(u){var h=e.toNativeType(),d=void 0,m=void 0;switch(h){case c.NativeType.I32:d=changetype(new Int32Array(u)),m=4*u;break;case c.NativeType.I64:d=changetype(new Array(u)),m=8*u;break;case c.NativeType.F32:d=changetype(new Float32Array(u)),m=4*u;break;case c.NativeType.F64:d=changetype(new Float64Array(u)),m=8*u;break;default:return assert(!1),i.createUnreachable()}for(var y=new Array(u),g=void 0,T=0;T<u;++T)if(y[T]=t[T]?this.compileExpression(t[T],e,1,0):e.toNativeZero(i),n)if(g=this.precomputeExpressionRef(y[T]),c.getExpressionId(g)==c.ExpressionId.Const)switch(assert(c.getExpressionType(g)==h),h){case c.NativeType.I32:changetype(d)[T]=c.getConstValueI32(g);break;case c.NativeType.I64:changetype(d)[T]=i64_new(c.getConstValueI64Low(g),c.getConstValueI64High(g));break;case c.NativeType.F32:changetype(d)[T]=c.getConstValueF32(g);break;case c.NativeType.F64:changetype(d)[T]=c.getConstValueF64(g);break;default:assert(!1)}else n=!1;var E=this.options.usizeType.byteSize;if(n){var f=E+4,I=1<<32-clz(m+8-1),v=new Uint8Array(f+I),A=this.addMemorySegment(v),C=0;switch(8==E?(_.writeI64(i64_add(A.offset,i64_new(f)),v,C),C+=8):(assert(0==i64_high(A.offset)),_.writeI32(i64_low(A.offset)+f,v,C),C+=4),_.writeI32(u,v,C),C+=4,assert(C==f),_.writeI32(m,v,C),C+=8,h){case c.NativeType.I32:for(T=0;T<u;++T)_.writeI32(changetype(d)[T],v,C),C+=4;break;case c.NativeType.I64:for(T=0;T<u;++T)_.writeI64(changetype(d)[T],v,C),C+=8;break;case c.NativeType.F32:for(T=0;T<u;++T)_.writeF32(changetype(d)[T],v,C),C+=4;break;case c.NativeType.F64:for(T=0;T<u;++T)_.writeF64(changetype(d)[T],v,C),C+=8;break;default:return assert(!1),i.createUnreachable()}return assert(C<=f+I),this.currentType=p,8==E?i.createI64(i64_low(A.offset),i64_high(A.offset)):i.createI32(i64_low(A.offset))}this.currentType=p;var N=s.lookupOverload(l.OperatorKind.INDEXED_SET,!0);if(!N)return this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,r.range,s.internalName),i.createUnreachable();var S=p.toNativeType(),O=this.currentFunction,L=O.getTempLocal(p,!1),b=new Array(2+u),k=0;b[k++]=i.createSetLocal(L.index,this.makeCallDirect(assert(s.constructorInstance),[i.createI32(0),i.createI32(u)]));for(T=0;T<u;++T)b[k++]=this.makeCallDirect(N,[i.createGetLocal(L.index,S),i.createI32(T),y[T]]);return assert(k+1==b.length),b[k]=i.createGetLocal(L.index,S),O.freeTempLocal(L),this.currentType=p,i.createBlock(null,b,S)}return this.currentType=p,this.makeCallDirect(assert(s.constructorInstance),[i.createI32(0),i.createI32(0)])},t.prototype.compileNewExpression=function(e,t){var r=this.module,n=this.options,i=this.currentFunction,a=this.program.resolveExpression(e.expression,i);if(!a)return r.createUnreachable();if(a.kind!=l.ElementKind.CLASS_PROTOTYPE)return this.error(o.DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,e.expression.range),this.module.createUnreachable();var s,c,u=a,h=null,d=e.typeArguments;if(!(h=!d&&null!==(s=t.classReference)&&s.is(p.CommonFlags.GENERIC)?u.resolve(s.typeArguments,i.flow.contextualTypeArguments):u.resolveUsingTypeArguments(d,i.flow.contextualTypeArguments,e)))return r.createUnreachable();for(var _=h,m=h.constructorInstance;!m&&(_=h.base);)m=_.constructorInstance;return c=m?this.compileCallDirect(m,e.arguments,e,n.usizeType.toNativeZero(r)):this.makeAllocate(h,e),this.currentType=h.type,c},t.prototype.compileParenthesizedExpression=function(e,t){return this.compileExpression(e.expression,t,0,0)},t.prototype.compilePropertyAccessExpression=function(e,t,r){var n=this.program,i=this.module,a=n.resolvePropertyAccess(e,this.currentFunction);if(!a)return i.createUnreachable();switch(a.kind){case l.ElementKind.GLOBAL:if(!this.compileGlobal(a))return i.createUnreachable();var s=a.type;return assert(s!=d.Type.void),a.is(p.CommonFlags.INLINED)?this.compileInlineConstant(a,t,r):(this.currentType=s,i.createGetGlobal(a.internalName,s.toNativeType()));case l.ElementKind.ENUMVALUE:var u=a.parent;return assert(null!==u&&u.kind==l.ElementKind.ENUM),this.compileEnum(u)?(this.currentType=d.Type.i32,a.is(p.CommonFlags.INLINED)?i.createI32(a.constantValue):i.createGetGlobal(a.internalName,c.NativeType.I32)):this.module.createUnreachable();case l.ElementKind.FIELD:var h=assert(n.resolvedThisExpression);assert(a.memoryOffset>=0);var _=this.compileExpressionRetainType(h,this.options.usizeType,0);return this.currentType=a.type,i.createLoad(a.type.byteSize,a.type.is(5),_,a.type.toNativeType(),a.memoryOffset);case l.ElementKind.PROPERTY:var m=a.getterPrototype;if(m){var y=m.resolve(null);if(!y)return i.createUnreachable();var g=y.signature;if(!this.checkCallSignature(g,0,y.is(p.CommonFlags.INSTANCE),e))return i.createUnreachable();var T=0!=(y.decoratorFlags&l.DecoratorFlags.INLINE);if(y.is(p.CommonFlags.INSTANCE)){u=assert(y.parent);assert(u.kind==l.ElementKind.CLASS);h=assert(n.resolvedThisExpression),_=this.compileExpressionRetainType(h,this.options.usizeType,0);return this.currentType=g.returnType,this.compileCallDirect(y,[],e,_,T)}return this.currentType=g.returnType,this.compileCallDirect(y,[],e,0,T)}return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.range,a.simpleName,a.parent.toString()),i.createUnreachable()}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),i.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFunction,a=i.flow,s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var l=this.precomputeExpressionRef(s);if(c.getExpressionId(l)==c.ExpressionId.Const&&c.getExpressionType(l)==c.NativeType.I32)return c.getConstValueI32(l)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),_=this.currentType;u.free();var m=a.fork();i.flow=m;var y=this.compileExpressionRetainType(n,t,0),g=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var T=d.Type.commonCompatible(_,g,!1);return T?(h=this.convertExpression(h,_,T,1,0,r),y=this.convertExpression(y,g,T,1,0,n),this.currentType=T,this.module.createIf(s,h,y)):(this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,_.toString(),g.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFunction,i=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0);if(c.getExpressionId(i)==c.ExpressionId.Unreachable)return i;var a,s,p,l=this.currentType;switch(e.operator){case u.Token.PLUS_PLUS:if(this.currentType.is(256))return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable();switch(l.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=c.BinaryOp.AddI32,s=c.NativeType.I32,p=r.createI32(1);break;case 9:case 4:a=(h=this.options).isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,s=h.nativeSizeType,p=l.toNativeOne(r);break;case 3:case 8:a=c.BinaryOp.AddI64,s=c.NativeType.I64,p=r.createI64(1);break;case 11:a=c.BinaryOp.AddF32,s=c.NativeType.F32,p=r.createF32(1);break;case 12:a=c.BinaryOp.AddF64,s=c.NativeType.F64,p=r.createF64(1);break;default:return assert(!1),r.createUnreachable()}break;case u.Token.MINUS_MINUS:if(this.currentType.is(256))return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable();switch(l.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=c.BinaryOp.SubI32,s=c.NativeType.I32,p=r.createI32(1);break;case 9:case 4:var h;a=(h=this.options).isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,s=h.nativeSizeType,p=l.toNativeOne(r);break;case 3:case 8:a=c.BinaryOp.SubI64,s=c.NativeType.I64,p=r.createI64(1);break;case 11:a=c.BinaryOp.SubF32,s=c.NativeType.F32,p=r.createF32(1);break;case 12:a=c.BinaryOp.SubF64,s=c.NativeType.F64,p=r.createF64(1);break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(t==d.Type.void)return this.compileAssignmentWithValue(e.operand,r.createBinary(a,i,p),!1);var _=n.getTempLocal(l,!1),m=this.compileAssignmentWithValue(e.operand,r.createBinary(a,this.module.createGetLocal(_.index,s),p),!1);this.currentType=assert(_).type,n.freeTempLocal(_);var y=_.index;return r.createBlock(null,[r.createSetLocal(y,i),m,r.createGetLocal(y,s)],s)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case u.Token.PLUS:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case u.Token.MINUS:if(e.operand.kind==h.NodeKind.LITERAL&&(e.operand.literalKind==h.LiteralKind.INTEGER||e.operand.literalKind==h.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(c.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(c.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(c.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(c.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(c.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(c.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(c.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=d.Type.bool;break;case u.Token.TILDE:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t.is(8)?d.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.XorI64:c.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.TYPEOF:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=d.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFunction.flow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(c.UnaryOp.ExtendI8ToI32,e):r.createBinary(c.BinaryOp.ShrI32,r.createBinary(c.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(c.UnaryOp.ExtendI16ToI32,e):r.createBinary(c.BinaryOp.ShrI32,r.createBinary(c.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(1)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(c.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(c.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,e);case 11:return r.createBinary(c.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(c.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(c.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(c.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(c.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(c.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,o=this.currentFunction,c=this.options.nativeSizeType,u=o.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(u.index,s.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==l.ElementKind.FIELD){var y=m,g=y.type,T=g.toNativeType(),E=y.prototype.declaration;if(assert(!y.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(g.byteSize,a.createGetLocal(u.index,c),this.compileExpression(E.initializer,g,1,0),T,y.memoryOffset));else{var f=y.prototype.declaration.parameterIndex;h.push(a.createStore(g.byteSize,a.createGetLocal(u.index,c),f>=0?a.createGetLocal(1+f,T):g.toNativeZero(a),T,y.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(u.index,c)),o.freeTempLocal(u),this.currentType=e.type,a.createBlock(null,h,c)},t.prototype.makeConditionalAllocate=function(e,t){var r=this.module,n=this.options.nativeSizeType;return this.currentType=e.type,r.createIf(n==c.NativeType.I64?r.createBinary(c.BinaryOp.NeI64,r.createGetLocal(0,c.NativeType.I64),r.createI64(0)):r.createGetLocal(0,c.NativeType.I32),r.createGetLocal(0,n),r.createTeeLocal(0,this.makeAllocate(e,t)))},t.prototype.addDebugLocation=function(e,t){var r=this.currentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(o.DiagnosticEmitter);function E(e,t){switch(void 0===t&&(t=e.simpleName),e.kind){case l.ElementKind.FUNCTION:return(r=e.parent||e.prototype.parent)?E(r)+(e.is(p.CommonFlags.INSTANCE)?p.INSTANCE_DELIMITER:p.STATIC_DELIMITER)+t:t;case l.ElementKind.FIELD:case l.ElementKind.ENUMVALUE:return E(r=assert(e.parent))+(e.is(p.CommonFlags.INSTANCE)?p.INSTANCE_DELIMITER:p.STATIC_DELIMITER)+t;case l.ElementKind.CLASS:return(r=e.prototype.parent)?E(r)+p.STATIC_DELIMITER+t:t;default:var r;return(r=e.parent)?E(r)+p.STATIC_DELIMITER+t:t}}function f(e,t,r){if(void 0===r&&(r=null),y=r?r.simpleName:t.range.source.simplePath,g=e.simpleName,e.hasDecorator(l.DecoratorFlags.EXTERNAL)){var n=e.program,i=assert(h.findDecorator(h.DecoratorKind.EXTERNAL,t.decorators)),a=i.arguments;if(a&&a.length){var s=a[0];s.kind==h.NodeKind.LITERAL&&s.literalKind==h.LiteralKind.STRING?(g=s.value,a.length>=2&&((s=a[1]).kind==h.NodeKind.LITERAL&&s.literalKind==h.LiteralKind.STRING?(y=g,g=s.value,a.length>2&&n.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,i.range,"2",a.length.toString())):n.error(o.DiagnosticCode.String_literal_expected,s.range))):n.error(o.DiagnosticCode.String_literal_expected,s.range)}else n.error(o.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,i.range,"1","0")}}t.Compiler=T},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=r(0),a=r(5),s=r(8),o=r(2),c=r(1),p=r(4),l=i.LIBRARY_PREFIX+"builtins.ts",u=function(e){function t(){var t=e.call(this)||this;return t.backlog=new Array,t.seenlog=new Set,t.donelog=new Set,t.onComment=null,t.tryParseSignatureIsSignature=!1,t.parseParametersThis=null,t.program=new a.Program(t.diagnostics),t}return n(t,e),t.prototype.parseFile=function(e,t,r){var n=c.normalizePath(t),a=p.mangleInternalPath(n);if(!this.donelog.has(a)){this.donelog.add(a),this.seenlog.add(a);var o=new p.Source(n,e,r?p.SourceKind.ENTRY:t.startsWith(i.LIBRARY_PREFIX)&&t.indexOf(i.PATH_DELIMITER,i.LIBRARY_PREFIX.length)<0?p.SourceKind.LIBRARY:p.SourceKind.DEFAULT),u=this.program;u.sources.push(o),o.normalizedPath==l&&o.set(i.CommonFlags.BUILTIN);var h=new s.Tokenizer(o,u.diagnostics);h.onComment=this.onComment,o.tokenizer=h;for(var d=o.statements;!h.skip(s.Token.ENDOFFILE);){var _=this.parseTopLevelStatement(h);_&&(_.parent=o,d.push(_))}h.finish()}},t.prototype.parseTopLevelStatement=function(e,t){void 0===t&&(t=null);for(var r=i.CommonFlags.NONE,n=-1,a=null;e.skip(s.Token.AT);){n<0&&(n=e.tokenPos);var c=this.parseDecorator(e);c?(a||(a=[]),a.push(c)):this.skipStatement(e)}r|=e.source.flags&i.CommonFlags.BUILTIN;var p=0,l=0;e.skip(s.Token.EXPORT)&&(e.skip(s.Token.DEFAULT)&&this.error(o.DiagnosticCode.Operation_not_supported,e.range()),n<0&&(n=e.tokenPos),r|=i.CommonFlags.EXPORT,p=e.tokenPos,l=e.pos);var u=null!=t&&t.is(i.CommonFlags.AMBIENT);e.skip(s.Token.DECLARE)?(n<0&&(n=e.tokenPos),u&&this.error(o.DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,e.range()),r|=i.CommonFlags.DECLARE|i.CommonFlags.AMBIENT):u&&(r|=i.CommonFlags.AMBIENT);var h=null,d=e.peek();switch(n<0&&(n=e.nextTokenPos),d){case s.Token.CONST:if(e.next(),r|=i.CommonFlags.CONST,e.skip(s.Token.ENUM)){h=this.parseEnum(e,r,a,n);break}h=this.parseVariable(e,r,a,n),a=null;break;case s.Token.LET:r|=i.CommonFlags.LET;case s.Token.VAR:e.next(),h=this.parseVariable(e,r,a,n),a=null;break;case s.Token.ENUM:e.next(),h=this.parseEnum(e,r,a,n),a=null;break;case s.Token.FUNCTION:e.next(),h=this.parseFunction(e,r,a,n),a=null;break;case s.Token.ABSTRACT:var _=e.mark();if(e.next(),!e.skip(s.Token.CLASS)){e.reset(_),h=this.parseStatement(e,!0);break}e.discard(_),r|=i.CommonFlags.ABSTRACT;case s.Token.CLASS:case s.Token.INTERFACE:e.next(),h=this.parseClassOrInterface(e,r,a,n),a=null;break;case s.Token.NAMESPACE:_=e.mark();e.next(),e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER?(e.discard(_),h=this.parseNamespace(e,r,a,n),a=null):(e.reset(_),h=this.parseStatement(e,!0));break;case s.Token.IMPORT:e.next(),h=(r|=i.CommonFlags.IMPORT)&i.CommonFlags.EXPORT?this.parseExportImport(e,n):this.parseImport(e);break;case s.Token.TYPE:_=e.mark();e.next(),e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER?(e.discard(_),h=this.parseTypeDeclaration(e,r,a,n),a=null):(e.reset(_),h=this.parseStatement(e,!0));break;default:r&i.CommonFlags.EXPORT?h=this.parseExport(e,r,n):(l&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(p,l),"export"),t||(h=this.parseStatement(e,!0)))}if(a)for(var m=0,y=a.length;m<y;++m)this.error(o.DiagnosticCode.Decorators_are_not_valid_here,a[m].range);return h},t.prototype.nextFile=function(){var e=this.backlog;return e.length?e.shift():null},t.prototype.finish=function(){if(this.backlog.length)throw new Error("backlog is not empty");return this.backlog=[],this.seenlog.clear(),this.donelog.clear(),this.program},t.prototype.parseType=function(e,t,r){void 0===t&&(t=!0),void 0===r&&(r=!1);var n,i=e.next(),a=e.tokenPos;if(i==s.Token.OPENPAREN){var c=e.skip(s.Token.OPENPAREN),l=this.tryParseSignature(e);if(l){if(c){if(!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null;if(!e.skip(s.Token.BAR))return this.error(o.DiagnosticCode._0_expected,e.range(),"|"),null;e.skip(s.Token.NULL)||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),l.isNullable=!0}return l}if(c||this.tryParseSignatureIsSignature)return this.error(o.DiagnosticCode.Unexpected_token,e.range()),null;if(!t)return this.error(o.DiagnosticCode.Unexpected_token,e.range()),null;var u=this.parseType(e,!1,r);if(!u)return null;if(!e.skip(s.Token.CLOSEPAREN))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"}"),null;(n=u).range.start=a,n.range.end=e.pos}else if(i==s.Token.VOID)n=p.Node.createType(p.Node.createIdentifierExpression("void",e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.THIS)n=p.Node.createType(p.Node.createThisExpression(e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.TRUE||i==s.Token.FALSE)n=p.Node.createType(p.Node.createIdentifierExpression("bool",e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.STRINGLITERAL)e.readString(),n=p.Node.createType(p.Node.createIdentifierExpression("string",e.range()),[],!1,e.range(a,e.pos));else{if(i!=s.Token.IDENTIFIER)return r||this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),d=new Array,_=!1;if(e.skip(s.Token.LESSTHAN)){do{var m=this.parseType(e,!0,r);if(!m)return null;d.push(m)}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.GREATERTHAN))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),">"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=p.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var y=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var g=e.range(y,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",g),[n],_,e.range(a,e.pos)),_)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),l==p.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new p.ParameterNode;_.parameterKind=l,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(s.Token.COMMA));var o=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t,c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var l=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));return p.Node.createVariableDeclaration(n,c,l,r,a,s.Range.join(n.range,e.range()))},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,i.CommonFlags.NONE);if(!l)return null;if(c.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(a,c,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,s.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=s.Token.SEMICOLON&&e.nextToken!=s.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array;!e.skip(s.Token.GREATERTHAN);){var r=this.parseTypeParameter(e);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.GREATERTHAN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){var n=this.parseType(e);if(!n)return null;if(n.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,n.range),null;r=n}return p.Node.createTypeParameter(t,r,s.Range.join(t.range,e.range()))}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==p.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(l),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(l)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=p.Node.createParameter(u,h,d,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,l=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=p.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=p.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),y=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(y=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(a,l,m,y,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var l=null;if(e.skip(s.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=p.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return p.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,y=new Array;if(a?(assert(!d),m=p.Node.createInterfaceDeclaration(l,c,u,y,r,t,e.range(n,e.pos))):m=p.Node.createClassDeclaration(l,c,u,d,y,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,m);if(!g)return null;g.parent=m,y.push(g)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=p.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return p.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){for(var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,a=new Array;e.skip(s.Token.AT);){var c=this.parseDecorator(e);if(!c)break;n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,c.range),a.push(c)}var l=t.flags&i.CommonFlags.AMBIENT;n&&(l|=i.CommonFlags.VIRTUAL),e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=i.CommonFlags.PUBLIC):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=i.CommonFlags.PRIVATE):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=i.CommonFlags.PROTECTED);var u=0,h=0,d=0,_=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=i.CommonFlags.STATIC,u=e.tokenPos,h=e.pos):(l|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=i.CommonFlags.ABSTRACT,d=e.tokenPos,_=e.pos),t.flags&i.CommonFlags.GENERIC&&(l|=i.CommonFlags.GENERIC_CONTEXT));var m=0,y=0;e.skip(s.Token.READONLY)&&(l|=i.CommonFlags.READONLY,m=e.tokenPos,y=e.pos);var g=e.mark(),T=!1,E=!1,f=!1,I=0,v=0;if(n||(e.skip(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(g):(l|=i.CommonFlags.GET,E=!0,I=e.tokenPos,v=e.pos,l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(g):(l|=i.CommonFlags.SET|i.CommonFlags.SET,f=!0,I=e.tokenPos,v=e.pos,l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(T=!0,(l|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"static"),l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"abstract"),l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly"))),!T&&!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var A=T?p.Node.createConstructorExpression(e.range()):p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),C=null;if(e.skip(s.Token.LESSTHAN)){var N=e.tokenPos;if(!(C=this.parseTypeParameters(e)))return null;T?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(N,e.pos)):E||f?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(N,e.pos)):l|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var S=e.tokenPos,O=this.parseParameters(e,T);if(!O)return null;var L=this.parseParametersThis;if(T)for(var b=0,k=O.length;b<k;++b){var R=O[b];if(R.isAny(i.CommonFlags.PUBLIC|i.CommonFlags.PROTECTED|i.CommonFlags.PRIVATE|i.CommonFlags.READONLY)){var x=p.Node.createFieldDeclaration(R.name,R.type,null,null,R.flags|i.CommonFlags.INSTANCE,R.range);x.parameterIndex=b,x.parent=t,R.implicitFieldDeclaration=x,t.members.push(x)}}else E?O.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,A.range):f&&(1!=O.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,A.range),O.length&&O[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,A.range));var F=null;if(e.skip(s.Token.COLON)){if(A.kind==p.NodeKind.CONSTRUCTOR?this.error(o.DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,e.range()):f&&this.error(o.DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,e.range()),!(F=this.parseType(e,A.kind==p.NodeKind.CONSTRUCTOR||f)))return null}else F=p.Node.createOmittedType(e.range(e.pos)),f||A.kind==p.NodeKind.CONSTRUCTOR||this.error(o.DiagnosticCode.Type_expected,F.range);var B=p.Node.createSignature(O,F,L,!1,e.range(S,e.pos)),D=null;if(e.skip(s.Token.OPENBRACE)){if(l&i.CommonFlags.AMBIENT?this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()):l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,e.range(),A.text),!(D=this.parseBlockStatement(e,!1)))return null}else l&i.CommonFlags.AMBIENT||n||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range());var U=p.Node.createMethodDeclaration(A,C,B,D,a,l,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),U}if(T)this.error(o.DiagnosticCode.Constructor_implementation_is_missing,A.range);else{if(!E&&!f){l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"abstract"),l&i.CommonFlags.GET&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(0,0),"get"),l&i.CommonFlags.SET&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(I,v),"set");var P=null;if(e.skip(s.Token.COLON)){if(!(P=this.parseType(e)))return null}else this.error(o.DiagnosticCode.Type_expected,e.range());var w=null;if(e.skip(s.Token.EQUALS)&&!(w=this.parseExpression(e)))return null;var M=p.Node.createFieldDeclaration(A,P,w,a,l,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),M}this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,A.range)}return null},t.prototype.parseNamespace=function(e,t,r,n){if(e.skipIdentifier()){var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.OPENBRACE)){for(var a=new Array,c=p.Node.createNamespaceDeclaration(i,a,r,t,e.range(n,e.pos));!e.skip(s.Token.CLOSEBRACE);){var l=this.parseTopLevelStatement(e,c);if(!l)return null;l.parent=c,a.push(l)}return e.skip(s.Token.SEMICOLON),c}this.error(o.DiagnosticCode._0_expected,e.range(),"{")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseExport=function(e,t,r){var n=null;if(e.skip(s.Token.OPENBRACE)){for(var i=new Array;!e.skip(s.Token.CLOSEBRACE);){var a=this.parseExportMember(e);if(!a)return null;if(i.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}if(e.skip(s.Token.FROM)){if(!e.skip(s.Token.STRINGLITERAL))return this.error(o.DiagnosticCode.String_literal_expected,e.range()),null;n=p.Node.createStringLiteralExpression(e.readString(),e.range())}return null===(l=(c=p.Node.createExportStatement(i,n,t,e.range(r,e.pos))).internalPath)||this.seenlog.has(l)||(this.backlog.push(l),this.seenlog.add(l)),e.skip(s.Token.SEMICOLON),c}if(e.skip(s.Token.ASTERISK))if(e.skip(s.Token.FROM)){if(e.skip(s.Token.STRINGLITERAL)){n=p.Node.createStringLiteralExpression(e.readString(),e.range());var c=p.Node.createExportStatement(null,n,t,e.range(r,e.pos)),l=assert(c.internalPath),u=e.source;return u.exportPaths||(u.exportPaths=new Set),u.exportPaths.add(l),this.seenlog.has(l)||(this.backlog.push(l),this.seenlog.add(l)),e.skip(s.Token.SEMICOLON),c}this.error(o.DiagnosticCode.String_literal_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"from");else this.error(o.DiagnosticCode._0_expected,e.range(),"{");return null},t.prototype.parseExportMember=function(e){if(e.skipIdentifier()){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.AS)){if(!e.skipIdentifierName())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}return p.Node.createExportMember(t,r,r?s.Range.join(t.range,r.range):t.range)}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseImport=function(e){var t=e.tokenPos,r=null,n=null,i=!1;if(e.skip(s.Token.OPENBRACE))for(r=new Array;!e.skip(s.Token.CLOSEBRACE);){var a=this.parseImportDeclaration(e);if(!a)return null;if(r.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}else if(e.skip(s.Token.ASTERISK)){if(!e.skip(s.Token.AS))return this.error(o.DiagnosticCode._0_expected,e.range(),"as"),null;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}else i=!0;if(i||e.skip(s.Token.FROM)){if(e.skip(s.Token.STRINGLITERAL)){var c=p.Node.createStringLiteralExpression(e.readString(),e.range()),l=void 0;n?(assert(!r),l=p.Node.createImportStatementWithWildcard(n,c,e.range(t,e.pos))):l=p.Node.createImportStatement(r,c,e.range(t,e.pos));var u=l.internalPath;return this.seenlog.has(u)||(this.backlog.push(u),this.seenlog.add(u)),e.skip(s.Token.SEMICOLON),l}this.error(o.DiagnosticCode.String_literal_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"from");return null},t.prototype.parseImportDeclaration=function(e){if(e.skipIdentifierName()){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.AS)){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}return p.Node.createImportDeclaration(t,r,r?s.Range.join(t.range,r.range):t.range)}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseExportImport=function(e,t){if(e.skipIdentifier()){var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.EQUALS)){if(e.skipIdentifier()){var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=p.Node.createExportImportStatement(n,r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode.Identifier_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"=")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseStatement=function(e,t){void 0===t&&(t=!1);var r=e.mark(),n=null;switch(e.next()){case s.Token.BREAK:n=this.parseBreak(e);break;case s.Token.CONST:n=this.parseVariable(e,i.CommonFlags.CONST,null,e.tokenPos);break;case s.Token.CONTINUE:n=this.parseContinue(e);break;case s.Token.DO:n=this.parseDoStatement(e);break;case s.Token.FOR:n=this.parseForStatement(e);break;case s.Token.IF:n=this.parseIfStatement(e);break;case s.Token.LET:n=this.parseVariable(e,i.CommonFlags.LET,null,e.tokenPos);break;case s.Token.VAR:n=this.parseVariable(e,i.CommonFlags.NONE,null,e.tokenPos);break;case s.Token.OPENBRACE:n=this.parseBlockStatement(e,t);break;case s.Token.RETURN:t&&this.error(o.DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,e.range()),n=this.parseReturn(e);break;case s.Token.SEMICOLON:return p.Node.createEmptyStatement(e.range(e.tokenPos));case s.Token.SWITCH:n=this.parseSwitchStatement(e);break;case s.Token.THROW:n=this.parseThrowStatement(e);break;case s.Token.TRY:n=this.parseTryStatement(e);break;case s.Token.VOID:n=this.parseVoidStatement(e);break;case s.Token.WHILE:n=this.parseWhileStatement(e);break;case s.Token.TYPE:if(e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER){n=this.parseTypeDeclaration(e,i.CommonFlags.NONE,null,e.tokenPos);break}default:e.reset(r),n=this.parseExpressionStatement(e)}return n?e.discard(r):(e.reset(r),this.skipStatement(e)),n},t.prototype.parseBlockStatement=function(e,t){for(var r=e.tokenPos,n=new Array;!e.skip(s.Token.CLOSEBRACE);){var i=e.mark(),a=this.parseStatement(e,t);a?(e.discard(i),n.push(a)):(e.reset(i),this.skipStatement(e))}var o=p.Node.createBlockStatement(n,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseBreak=function(e){var t=null;e.peek(!0)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine||(e.next(s.IdentifierHandling.PREFER),t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()));var r=p.Node.createBreakStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseContinue=function(e){var t=null;e.peek(!0)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine||(e.next(s.IdentifierHandling.PREFER),t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()));var r=p.Node.createContinueStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseDoStatement=function(e){var t=e.tokenPos,r=this.parseStatement(e);if(!r)return null;if(e.skip(s.Token.WHILE))if(e.skip(s.Token.OPENPAREN)){var n=this.parseExpression(e);if(!n)return null;if(e.skip(s.Token.CLOSEPAREN)){var i=p.Node.createDoStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");else this.error(o.DiagnosticCode._0_expected,e.range(),"while");return null},t.prototype.parseExpressionStatement=function(e){var t=this.parseExpression(e);if(!t)return null;var r=p.Node.createExpressionStatement(t);return e.skip(s.Token.SEMICOLON),r},t.prototype.parseForStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=null;if(e.skip(s.Token.CONST))r=this.parseVariable(e,i.CommonFlags.CONST,null,e.tokenPos);else if(e.skip(s.Token.LET))r=this.parseVariable(e,i.CommonFlags.LET,null,e.tokenPos);else if(e.skip(s.Token.VAR))r=this.parseVariable(e,i.CommonFlags.NONE,null,e.tokenPos);else if(!e.skip(s.Token.SEMICOLON)&&!(r=this.parseExpressionStatement(e)))return null;if(e.token==s.Token.SEMICOLON){var n=null;if(!e.skip(s.Token.SEMICOLON)&&!(n=this.parseExpressionStatement(e)))return null;if(e.token==s.Token.SEMICOLON){var a=null;if(!e.skip(s.Token.CLOSEPAREN)){if(!(a=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}var c=this.parseStatement(e);return c?p.Node.createForStatement(r,n?n.expression:null,a,c,e.range(t,e.pos)):null}this.error(o.DiagnosticCode._0_expected,e.range(),";")}else this.error(o.DiagnosticCode._0_expected,e.range(),";")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseIfStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){var n=this.parseStatement(e);if(!n)return null;var i=null;return e.skip(s.Token.ELSE)&&!(i=this.parseStatement(e))?null:p.Node.createIfStatement(r,n,i,e.range(t,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseSwitchStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){if(e.skip(s.Token.OPENBRACE)){for(var n=new Array;!e.skip(s.Token.CLOSEBRACE);){var i=this.parseSwitchCase(e);if(!i)return null;n.push(i)}var a=p.Node.createSwitchStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),a}this.error(o.DiagnosticCode._0_expected,e.range(),"{")}else this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseSwitchCase=function(e){var t,r,n=e.tokenPos;if(e.skip(s.Token.CASE)){var i=this.parseExpression(e);if(!i)return null;if(e.skip(s.Token.COLON)){for(t=new Array;e.peek()!=s.Token.CASE&&e.nextToken!=s.Token.DEFAULT&&e.nextToken!=s.Token.CLOSEBRACE;){if(!(r=this.parseStatement(e)))return null;t.push(r)}return p.Node.createSwitchCase(i,t,e.range(n,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),":")}else if(e.skip(s.Token.DEFAULT)){if(e.skip(s.Token.COLON)){for(t=new Array;e.peek()!=s.Token.CASE&&e.nextToken!=s.Token.DEFAULT&&e.nextToken!=s.Token.CLOSEBRACE;){if(!(r=this.parseStatement(e)))return null;t.push(r)}return p.Node.createSwitchCase(null,t,e.range(n,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),":")}else this.error(o.DiagnosticCode._case_or_default_expected,e.range());return null},t.prototype.parseThrowStatement=function(e){var t=e.tokenPos,r=this.parseExpression(e);if(!r)return null;var n=p.Node.createThrowStatement(r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),n},t.prototype.parseTryStatement=function(e){var t,r=e.tokenPos;if(e.skip(s.Token.OPENBRACE)){for(var n=new Array;!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;n.push(t)}var i=null,a=null,c=null;if(e.skip(s.Token.CATCH)){if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),"("),null;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;if(i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null;if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(a=[];!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;a.push(t)}}if(e.skip(s.Token.FINALLY)){if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(c=[];!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;c.push(t)}}if(!a&&!c)return this.error(o.DiagnosticCode._0_expected,e.range(),"catch"),null;var l=p.Node.createTryStatement(n,i,a,c,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),l}return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null},t.prototype.parseTypeDeclaration=function(e,t,r,n){if(e.skipIdentifier()){var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=null;if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(e.skip(s.Token.EQUALS)){var l=this.parseType(e);if(!l)return null;var u=p.Node.createTypeDeclaration(a,c,l,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u}this.error(o.DiagnosticCode._0_expected,e.range(),"=")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVoidStatement=function(e){var t=e.tokenPos,r=this.parseExpression(e,21);if(!r)return null;var n=p.Node.createVoidStatement(r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),n},t.prototype.parseWhileStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){var n=this.parseStatement(e);if(!n)return null;var i=p.Node.createWhileStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseExpressionStart=function(e){var t=e.next(s.IdentifierHandling.PREFER),r=e.tokenPos,n=function(e){switch(e){case s.Token.DOT_DOT_DOT:return 2;case s.Token.YIELD:return 3;case s.Token.EXCLAMATION:case s.Token.TILDE:case s.Token.PLUS:case s.Token.MINUS:case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:case s.Token.TYPEOF:case s.Token.VOID:case s.Token.DELETE:return 17;case s.Token.NEW:return 20}return 0}(t);if(0!=n){var i=void 0;return t==s.Token.NEW?(i=this.parseExpression(e,19))?i.kind==p.NodeKind.CALL?p.Node.createNewExpression(i.expression,i.typeArguments,i.arguments,e.range(r,e.pos)):(this.error(o.DiagnosticCode.Operation_not_supported,e.range()),null):null:(i=this.parseExpression(e,n))?(t!=s.Token.PLUS_PLUS&&t!=s.Token.MINUS_MINUS||i.kind!=p.NodeKind.IDENTIFIER&&i.kind!=p.NodeKind.ELEMENTACCESS&&i.kind!=p.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,i.range),p.Node.createUnaryPrefixExpression(t,i,e.range(r,e.pos))):null}var a=null;switch(t){case s.Token.NULL:return p.Node.createNullExpression(e.range());case s.Token.TRUE:return p.Node.createTrueExpression(e.range());case s.Token.FALSE:return p.Node.createFalseExpression(e.range());case s.Token.OPENPAREN:if(e.skip(s.Token.CLOSEPAREN))return this.parseFunctionExpressionCommon(e,p.Node.createEmptyIdentifierExpression(e.range(r)),[],!0);var c=e.mark(),l=!0;do{switch(e.next(s.IdentifierHandling.PREFER)){case s.Token.DOT_DOT_DOT:return e.reset(c),this.parseFunctionExpression(e);case s.Token.IDENTIFIER:switch(e.readIdentifier(),e.next()){case s.Token.CLOSEPAREN:if(!e.skip(s.Token.EQUALS_GREATERTHAN)){l=!1;break}case s.Token.COLON:return e.reset(c),this.parseFunctionExpression(e);case s.Token.QUESTION:case s.Token.COMMA:break;default:l=!1}break;default:l=!1}}while(l);return e.reset(c),(a=this.parseExpression(e))?e.skip(s.Token.CLOSEPAREN)?p.Node.createParenthesizedExpression(a,e.range(r,e.pos)):(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null):null;case s.Token.OPENBRACKET:for(var u=new Array;!e.skip(s.Token.CLOSEBRACKET);){if(e.peek()==s.Token.COMMA)a=null;else if(!(a=this.parseExpression(e,2)))return null;if(u.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACKET))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null}}return p.Node.createArrayLiteralExpression(u,e.range(r,e.pos));case s.Token.LESSTHAN:var h=this.parseType(e);return h?e.skip(s.Token.GREATERTHAN)?(a=this.parseExpression(e,19))?p.Node.createAssertionExpression(p.AssertionKind.PREFIX,a,h,e.range(r,e.pos)):null:(this.error(o.DiagnosticCode._0_expected,e.range(),">"),null):null;case s.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return p.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var d=e.readRegexpPattern();return e.skip(s.Token.SLASH)?p.Node.createRegexpLiteralExpression(d,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.DiagnosticCode._0_expected,e.range(),"/"),null);case s.Token.FUNCTION:return this.parseFunctionExpression(e);case s.Token.CLASS:return this.parseClassExpression(e);default:return this.error(o.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(s.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===s.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(s.Token.COMMA));return e.skip(s.Token.GREATERTHAN)&&e.skip(s.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(s.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;var n,i=r.range.start;if(p.nodeIsCallable(r.kind))for(var a=null;e.skip(s.Token.OPENPAREN)||p.nodeIsGenericCallable(r.kind)&&null!==(a=this.tryParseTypeArgumentsBeforeArguments(e));){var c=this.parseArguments(e);if(!c)return null;r=p.Node.createCallExpression(r,a,c,e.range(i,e.pos))}for(var l,u=null;(l=h(n=e.peek()))>=t;)switch(e.next(),n){case s.Token.AS:var _=this.parseType(e);if(!_)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,_,e.range(i,e.pos));break;case s.Token.INSTANCEOF:var m=this.parseType(e);if(!m)return null;r=p.Node.createInstanceOfExpression(r,m,e.range(i,e.pos));break;case s.Token.OPENBRACKET:if(!(u=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,u,e.range(i,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(i,e.pos));break;case s.Token.QUESTION:var y=this.parseExpression(e);if(!y)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var g=this.parseExpression(e,t>1?2:1);if(!g)return null;r=p.Node.createTernaryExpression(r,y,g,e.range(i,e.pos));break;case s.Token.COMMA:var T=[r];do{if(!(r=this.parseExpression(e,2)))return null;T.push(r)}while(e.skip(s.Token.COMMA));r=p.Node.createCommaExpression(T,e.range(i,e.pos));break;default:if(!(u=this.parseExpression(e,d(n)?l:l+1)))return null;if(n==s.Token.DOT)if(u.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,u,e.range(i,e.pos));else{if(u.kind!=p.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,u.range),null;var E=u;if(E.expression.kind!=p.NodeKind.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,E.expression.range),null;E.expression=p.Node.createPropertyAccessExpression(r,E.expression,e.range(i,e.pos)),r=E}else r=p.Node.createBinaryExpression(n,r,u,e.range(i,e.pos))}return r},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==s.Token.ENDOFFILE||t==s.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case s.Token.ENDOFFILE:this.error(o.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case s.Token.OPENBRACE:++t;break;case s.Token.CLOSEBRACE:--t||(r=!1);break;case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(o.DiagnosticEmitter);function h(e){switch(e){case s.Token.COMMA:return 1;case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:return 4;case s.Token.QUESTION:return 5;case s.Token.BAR_BAR:return 6;case s.Token.AMPERSAND_AMPERSAND:return 7;case s.Token.BAR:return 8;case s.Token.CARET:return 9;case s.Token.AMPERSAND:return 10;case s.Token.EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS:case s.Token.EQUALS_EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case s.Token.AS:case s.Token.IN:case s.Token.INSTANCEOF:case s.Token.LESSTHAN:case s.Token.GREATERTHAN:case s.Token.LESSTHAN_EQUALS:case s.Token.GREATERTHAN_EQUALS:return 12;case s.Token.LESSTHAN_LESSTHAN:case s.Token.GREATERTHAN_GREATERTHAN:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case s.Token.PLUS:case s.Token.MINUS:return 14;case s.Token.ASTERISK:case s.Token.SLASH:case s.Token.PERCENT:return 15;case s.Token.ASTERISK_ASTERISK:return 16;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:return 18;case s.Token.DOT:case s.Token.NEW:case s.Token.OPENBRACKET:return 20}return 0}function d(e){switch(e){case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:case s.Token.QUESTION:case s.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},a=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var s=r(0),o=r(5),c=r(1),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=i(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var a=n.value;this.visitElement(a)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0<s.length;)this.visitElement(s[0])},e.prototype.visitElement=function(e){if((!e.is(s.CommonFlags.PRIVATE)||this.includePrivate)&&!this.seen.has(e))switch(this.seen.add(e),e.kind){case o.ElementKind.GLOBAL:e.is(s.CommonFlags.COMPILED)&&this.visitGlobal(e);break;case o.ElementKind.ENUM:e.is(s.CommonFlags.COMPILED)&&this.visitEnum(e);break;case o.ElementKind.FUNCTION_PROTOTYPE:this.visitFunctionInstances(e);break;case o.ElementKind.CLASS_PROTOTYPE:this.visitClassInstances(e);break;case o.ElementKind.FIELD:e.is(s.CommonFlags.COMPILED)&&this.visitField(e);break;case o.ElementKind.PROPERTY:var t=e,r=t.getterPrototype;r&&this.visitFunctionInstances(r);var n=t.setterPrototype;n&&this.visitFunctionInstances(n);break;case o.ElementKind.NAMESPACE:(function e(t){var r,n,a,c,p,l;var u=t.members;if(u)try{for(var h=i(u.values()),d=h.next();!d.done;d=h.next()){var _=d.value;switch(_.kind){case o.ElementKind.FUNCTION_PROTOTYPE:try{for(var m=i(_.instances.values()),y=m.next();!y.done;y=m.next()){var g=y.value;if(g.is(s.CommonFlags.COMPILED))return!0}}catch(e){a={error:e}}finally{try{y&&!y.done&&(c=m.return)&&c.call(m)}finally{if(a)throw a.error}}break;case o.ElementKind.CLASS_PROTOTYPE:try{for(var T=i(_.instances.values()),E=T.next();!E.done;E=T.next()){var g=E.value;if(g.is(s.CommonFlags.COMPILED))return!0}}catch(e){p={error:e}}finally{try{E&&!E.done&&(l=T.return)&&l.call(T)}finally{if(p)throw p.error}}break;default:if(_.is(s.CommonFlags.COMPILED)||e(_))return!0}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}return!1})(e)&&this.visitNamespace(e);break;default:assert(!1)}},e.prototype.visitFunctionInstances=function(e){var t,r;try{for(var n=i(e.instances.values()),a=n.next();!a.done;a=n.next()){var o=a.value;o.is(s.CommonFlags.COMPILED)&&this.visitFunction(o)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e.prototype.visitClassInstances=function(e){var t,r;try{for(var n=i(e.instances.values()),a=n.next();!a.done;a=n.next()){var o=a.value;o.is(s.CommonFlags.COMPILED)&&this.visitClass(o)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e}(),l=function(e){function t(t,r){void 0===r&&(r=!1);var n=e.call(this,t,r)||this;return n.sb=[],n.indentLevel=0,n}return n(t,e),t.build=function(e){return new t(e).build()},t.prototype.visitGlobal=function(e){var t=this.sb,r=e.is(s.CommonFlags.INLINED);if(c.indent(t,this.indentLevel),r&&t.push("const "),t.push(this.typeToString(e.type)),t.push(" "),t.push(e.simpleName),r)switch(e.constantValueKind){case 1:t.push(" = "),t.push(i64_to_string(e.constantIntegerValue));break;case 2:t.push(" = "),t.push(e.constantFloatValue.toString());break;default:assert(!1)}t.push(";\n")},t.prototype.visitEnum=function(e){var t,r,n,p,l=this.sb;c.indent(l,this.indentLevel++),l.push("interface "),l.push(e.simpleName),l.push(" {\n");var u=e.members;if(u){try{for(var h=i(u),d=h.next();!d.done;d=h.next()){var _=a(d.value,2),m=_[0];if((E=_[1]).kind==o.ElementKind.ENUMVALUE){var y=E.is(s.CommonFlags.INLINED);c.indent(l,this.indentLevel),y?l.push("const "):l.push("readonly "),l.push("unsigned long "),l.push(m),y&&(l.push(" = "),l.push(E.constantValue.toString(10))),l.push(";\n")}}}catch(e){t={error:e}}finally{try{d&&!d.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}try{for(var g=i(u.values()),T=g.next();!T.done;T=g.next()){var E;(E=T.value).kind!=o.ElementKind.ENUMVALUE&&this.visitElement(E)}}catch(e){n={error:e}}finally{try{T&&!T.done&&(p=g.return)&&p.call(g)}finally{if(n)throw n.error}}}c.indent(l,--this.indentLevel),l.push("}\n")},t.prototype.visitFunction=function(e){var t,r,n=this.sb,a=e.signature;c.indent(n,this.indentLevel),n.push(this.typeToString(a.returnType)),n.push(" "),n.push(e.simpleName),n.push("(");for(var s=a.parameterTypes,o=s.length,p=0;p<o;++p)p&&n.push(", "),n.push(this.typeToString(s[p])),n.push(" "),n.push(a.getParameterName(p));n.push(");\n");var l=e.members;if(l&&l.size){c.indent(n,this.indentLevel),n.push("interface "),n.push(e.simpleName),n.push(" {\n");try{for(var u=i(l.values()),h=u.next();!h.done;h=u.next()){var d=h.value;this.visitElement(d)}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=u.return)&&r.call(u)}finally{if(t)throw t.error}}c.indent(n,--this.indentLevel),n.push("}\n")}},t.prototype.visitClass=function(e){var t=this.sb;c.indent(t,this.indentLevel++),t.push("interface "),t.push(e.simpleName),t.push(" {\n"),c.indent(t,--this.indentLevel),t.push("}\n")},t.prototype.visitInterface=function(e){this.visitClass(e)},t.prototype.visitField=function(e){},t.prototype.visitNamespace=function(e){var t,r,n=this.sb;c.indent(n,this.indentLevel++),n.push("interface "),n.push(e.simpleName),n.push(" {\n");var a=e.members;if(a)try{for(var s=i(a.values()),o=s.next();!o.done;o=s.next()){var p=o.value;this.visitElement(p)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}c.indent(n,--this.indentLevel),n.push("}\n")},t.prototype.typeToString=function(e){switch(e.kind){case 0:return"byte";case 1:return"short";case 2:return"long";case 3:return"long long";case 4:return this.program.options.isWasm64?"long long":"long";case 5:return"octet";case 6:return"unsigned short";case 7:return"unsigned long";case 8:return"unsigned long long";case 9:return this.program.options.isWasm64?"unsigned long long":"unsigned long";case 10:return"boolean";case 11:return"unrestricted float";case 12:return"unrestricted double";case 13:return"void";default:return assert(!1),""}},t.prototype.build=function(){var e=this.sb;return e.push("interface ASModule {\n"),++this.indentLevel,this.walk(),--this.indentLevel,e.push("}\n"),e.join("")},t}(p);t.IDLBuilder=l;var u=function(e){function t(t,r){void 0===r&&(r=!1);var n=e.call(this,t,r)||this;return n.sb=[],n.indentLevel=0,n}return n(t,e),t.build=function(e){return new t(e).build()},t.prototype.visitGlobal=function(e){var t=this.sb,r=e.is(s.CommonFlags.INLINED);c.indent(t,this.indentLevel),e.is(s.CommonFlags.STATIC)?r?t.push("static readonly "):t.push("static "):r?t.push("const "):t.push("var "),t.push(e.simpleName),t.push(": "),t.push(this.typeToString(e.type)),t.push(";\n"),this.visitNamespace(e)},t.prototype.visitEnum=function(e){var t,r,n=this.sb;c.indent(n,this.indentLevel++),n.push("enum "),n.push(e.simpleName),n.push(" {\n");var p=e.members;if(p){var l=p.size;try{for(var u=i(p),h=u.next();!h.done;h=u.next()){var d=a(h.value,2),_=d[0],m=d[1];m.kind==o.ElementKind.ENUMVALUE&&(c.indent(n,this.indentLevel),n.push(_),m.is(s.CommonFlags.INLINED)&&(n.push(" = "),n.push(m.constantValue.toString(10))),n.push(",\n"),--l)}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=u.return)&&r.call(u)}finally{if(t)throw t.error}}l&&this.visitNamespace(e)}c.indent(n,--this.indentLevel),n.push("}\n")},t.prototype.visitFunction=function(e){if(!e.isAny(s.CommonFlags.PRIVATE|s.CommonFlags.SET)){var t=this.sb,r=e.signature;if(c.indent(t,this.indentLevel),e.is(s.CommonFlags.PROTECTED)&&t.push("protected "),e.is(s.CommonFlags.STATIC)&&t.push("static "),e.is(s.CommonFlags.GET))return t.push(e.prototype.declaration.name.text),t.push(": "),t.push(this.typeToString(r.returnType)),void t.push(";\n");e.isAny(s.CommonFlags.STATIC|s.CommonFlags.INSTANCE)||t.push("function "),t.push(e.simpleName),t.push("(");for(var n=r.parameterTypes,i=n.length,a=0;a<i;++a)a&&t.push(", "),t.push(r.getParameterName(a)),t.push(": "),t.push(this.typeToString(n[a]));e.isAny(s.CommonFlags.CONSTRUCTOR|s.CommonFlags.SET)?t.push(")"):(t.push("): "),t.push(this.typeToString(r.returnType))),t.push(";\n"),this.visitNamespace(e)}},t.prototype.visitClass=function(e){var t,r,n,a,p=this.sb,l=e.kind==o.ElementKind.INTERFACE;c.indent(p,this.indentLevel++),l?p.push("interface "):(e.is(s.CommonFlags.ABSTRACT)&&p.push("abstract "),p.push("class ")),p.push(e.simpleName);var u=e.base;u&&u.is(s.CommonFlags.COMPILED|s.CommonFlags.MODULE_EXPORT)&&(p.push(" extends "),p.push(u.simpleName)),p.push(" {\n");var h=e.prototype.members;if(h)try{for(var d=i(h.values()),_=d.next();!_.done;_=d.next()){var m=_.value;this.visitElement(m)}}catch(e){t={error:e}}finally{try{_&&!_.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}var y=e.constructorInstance;if(y&&this.visitFunction(y),h=e.members)try{for(var g=i(h.values()),T=g.next();!T.done;T=g.next()){m=T.value;this.visitElement(m)}}catch(e){n={error:e}}finally{try{T&&!T.done&&(a=g.return)&&a.call(g)}finally{if(n)throw n.error}}c.indent(p,--this.indentLevel),p.push("}\n")},t.prototype.visitInterface=function(e){this.visitClass(e)},t.prototype.visitField=function(e){if(!e.is(s.CommonFlags.PRIVATE)){var t=this.sb;c.indent(t,this.indentLevel),e.is(s.CommonFlags.PROTECTED)&&t.push("protected "),e.is(s.CommonFlags.STATIC)&&t.push("static "),e.is(s.CommonFlags.READONLY)&&t.push("readonly "),t.push(e.simpleName),t.push(": "),t.push(this.typeToString(e.type)),t.push(";\n")}},t.prototype.visitNamespace=function(e){var t,r,n=e.members;if(n&&n.size){var a=this.sb;c.indent(a,this.indentLevel++),a.push("namespace "),a.push(e.simpleName),a.push(" {\n");try{for(var s=i(n.values()),o=s.next();!o.done;o=s.next()){var p=o.value;this.visitElement(p)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}c.indent(a,--this.indentLevel),a.push("}\n")}},t.prototype.typeToString=function(e){switch(e.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"I64";case 4:return this.program.options.isWasm64?"I64":"i32";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"U64";case 9:return this.program.options.isWasm64?"U64":"u32";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"void";default:return assert(!1),""}},t.prototype.build=function(){var e=this.sb;return e.push("declare module ASModule {\n"),e.push("  type i8 = number;\n"),e.push("  type i16 = number;\n"),e.push("  type i32 = number;\n"),e.push("  type u8 = number;\n"),e.push("  type u16 = number;\n"),e.push("  type u32 = number;\n"),e.push("  type f32 = number;\n"),e.push("  type f64 = number;\n"),e.push("  type bool = any;\n"),++this.indentLevel,this.walk(),--this.indentLevel,e.push("}\n"),e.push("export default ASModule;\n"),this.sb.join("")},t}(p);t.TSDBuilder=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i<s;++i)i>0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i<s;++i)this.decompileExpression(n.getBlockChild(e,i));return void this.push("}\n");case n.ExpressionId.If:return void(c==n.NativeType.None?(this.push("if ("),this.decompileExpression(n.getIfCondition(e)),this.push(") "),this.decompileExpression(n.getIfTrue(e)),(t=n.getIfFalse(e))&&(this.push(" else "),this.decompileExpression(t))):(this.decompileExpression(n.getIfCondition(e)),this.push(" ? "),this.decompileExpression(n.getIfTrue(e)),this.push(" : "),this.decompileExpression(n.getIfFalse(e))));case n.ExpressionId.Loop:null!=(r=n.getLoopName(e))&&(this.push(r),this.push(": ")),this.push("do "),this.decompileExpression(n.getLoopBody(e)),this.push("while (0);\n");case n.ExpressionId.Break:return(t=n.getBreakCondition(e))&&(this.push("if ("),this.decompileExpression(t),this.push(") ")),void(null!=(r=n.getBreakName(e))?(this.push("break "),this.push(r),this.push(";\n")):this.push("break;\n"));case n.ExpressionId.Switch:case n.ExpressionId.Call:case n.ExpressionId.CallImport:case n.ExpressionId.CallIndirect:throw new Error("not implemented");case n.ExpressionId.GetLocal:return this.push("$"),void this.push(n.getGetLocalIndex(e).toString(10));case n.ExpressionId.SetLocal:return this.push("$"),this.push(n.getSetLocalIndex(e).toString(10)),this.push(" = "),void this.decompileExpression(n.getSetLocalValue(e));case n.ExpressionId.GetGlobal:case n.ExpressionId.SetGlobal:throw new Error("not implemented");case n.ExpressionId.Load:return this.push("load<"),this.push(a(c)),this.push(">("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push("<i32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push("<i32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push("<i32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push("<i32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret<f32,i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret<f64,i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push("<f32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push("<f64><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push("<f32><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push("<f64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret<i32,f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret<i64,f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("<i32>(<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u32>"),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("<i32>(<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u32>"),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl<i32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr<i32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl<i64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr<i64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("current_memory()");case n.HostOp.GrowMemory:return this.push("grow_memory("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(10),i=r(13),a=r(12),s=r(2);t.formatDiagnostic=s.formatDiagnosticMessage;var o=r(11);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new o.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset<t.diagnostics.length?t.diagnostics[t.diagnosticsOffset++]:null},t.isInfo=function(e){return e.category==s.DiagnosticCategory.INFO},t.isWarning=function(e){return e.category==s.DiagnosticCategory.WARNING},t.isError=function(e){return e.category==s.DiagnosticCategory.ERROR},t.createOptions=function(){return new n.Options},t.setTarget=function(e,t){e.target=t},t.setNoTreeShaking=function(e,t){e.noTreeShaking=t},t.setNoAssert=function(e,t){e.noAssert=t},t.setImportMemory=function(e,t){e.importMemory=t},t.setImportTable=function(e,t){e.importTable=t},t.setSourceMap=function(e,t){e.sourceMap=t},t.setMemoryBase=function(e,t){e.memoryBase=t},t.setGlobalAlias=function(e,t,r){var n=e.globalAliases;n||(e.globalAliases=n=new Map),n.set(t,r)},t.FEATURE_SIGN_EXTENSION=1,t.FEATURE_MUTABLE_GLOBAL=2,t.enableFeature=function(e,t){e.features|=t},t.setOptimizeLevelHints=function(e,t,r){e.optimizeLevelHint=t,e.shrinkLevelHint=r},t.finishParsing=function(e){return e.finish()},t.compileProgram=function(e,t){return void 0===t&&(t=null),new n.Compiler(e,t).compile()},t.decompileModule=function(e){var t=new i.Decompiler;return t.decompile(e),t.finish()},t.buildIDL=function(e){return a.IDLBuilder.build(e)},t.buildTSD=function(e){return a.TSDBuilder.build(e)};var c=r(0);t.LIBRARY_PREFIX=c.LIBRARY_PREFIX},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=p(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=p(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?T:g;if(t){if(e<0)return T;if(e>=_)return A}else{if(e<=-m)return C;if(e+1>=m)return v}return e<0?c(-e,t).neg():p(e%d|0,e/d|0,t)}function p(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=p;var l=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||36<r)throw RangeError("radix");var n;if((n=e.indexOf("-"))>0)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(l(r,8)),a=g,s=0;s<e.length;s+=8){var o=Math.min(8,e.length-s),p=parseInt(e.substring(s,s+o),r);if(o<8){var h=c(l(r,o));a=a.mul(h).add(c(p))}else a=(a=a.mul(i)).add(c(p))}return a.unsigned=t,a}function h(e,t){return"number"==typeof e?c(e,t):"string"==typeof e?u(e,t):p(e.low,e.high,"boolean"==typeof t?t:e.unsigned)}n.fromString=u,n.fromValue=h;var d=4294967296,_=d*d,m=_/2,y=o(1<<24),g=o(0);n.ZERO=g;var T=o(0,!0);n.UZERO=T;var E=o(1);n.ONE=E;var f=o(1,!0);n.UONE=f;var I=o(-1);n.NEG_ONE=I;var v=p(-1,2147483647,!1);n.MAX_VALUE=v;var A=p(-1,-1,!0);n.MAX_UNSIGNED_VALUE=A;var C=p(0,-2147483648,!1);n.MIN_VALUE=C;var N=n.prototype;N.toInt=function(){return this.unsigned?this.low>>>0:this.low},N.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},N.toString=function(e){if((e=e||10)<2||36<e)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(C)){var t=c(e),r=this.div(t),n=r.mul(t).sub(this);return r.toString(e)+n.toInt().toString(e)}return"-"+this.neg().toString(e)}for(var i=c(l(e,6),this.unsigned),a=this,s="";;){var o=a.div(i),p=(a.sub(o.mul(i)).toInt()>>>0).toString(e);if((a=o).isZero())return p+s;for(;p.length<6;)p="0"+p;s=""+p+s}},N.getHighBits=function(){return this.high},N.getHighBitsUnsigned=function(){return this.high>>>0},N.getLowBits=function(){return this.low},N.getLowBitsUnsigned=function(){return this.low>>>0},N.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<<t);t--);return 0!=this.high?t+33:t+1},N.isZero=function(){return 0===this.high&&0===this.low},N.eqz=N.isZero,N.isNegative=function(){return!this.unsigned&&this.high<0},N.isPositive=function(){return this.unsigned||this.high>=0},N.isOdd=function(){return 1==(1&this.low)},N.isEven=function(){return 0==(1&this.low)},N.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},N.eq=N.equals,N.notEquals=function(e){return!this.eq(e)},N.neq=N.notEquals,N.ne=N.notEquals,N.lessThan=function(e){return this.comp(e)<0},N.lt=N.lessThan,N.lessThanOrEqual=function(e){return this.comp(e)<=0},N.lte=N.lessThanOrEqual,N.le=N.lessThanOrEqual,N.greaterThan=function(e){return this.comp(e)>0},N.gt=N.greaterThan,N.greaterThanOrEqual=function(e){return this.comp(e)>=0},N.gte=N.greaterThanOrEqual,N.ge=N.greaterThanOrEqual,N.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},N.comp=N.compare,N.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(E)},N.neg=N.negate,N.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,l=0,u=0,d=0,_=0;return d+=(_+=a+(65535&e.low))>>>16,u+=(d+=n+c)>>>16,l+=(u+=r+o)>>>16,l+=t+s,p((d&=65535)<<16|(_&=65535),(l&=65535)<<16|(u&=65535),this.unsigned)},N.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},N.sub=N.subtract,N.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=h(e)),r)return p(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(C))return e.isOdd()?C:g;if(e.eq(C))return this.isOdd()?C:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(y)&&e.lt(y))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,l=65535&e.high,u=e.low>>>16,d=65535&e.low,_=0,m=0,T=0,E=0;return T+=(E+=s*d)>>>16,m+=(T+=a*d)>>>16,T&=65535,m+=(T+=s*u)>>>16,_+=(m+=n*d)>>>16,m&=65535,_+=(m+=a*u)>>>16,m&=65535,_+=(m+=s*l)>>>16,_+=t*d+n*u+a*l+s*o,p((T&=65535)<<16|(E&=65535),(_&=65535)<<16|(m&=65535),this.unsigned)},N.mul=N.multiply,N.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?p((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?T:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return T;if(e.gt(this.shru(1)))return f;a=T}else{if(this.eq(C))return e.eq(E)||e.eq(I)?C:e.eq(C)?E:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?E:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));else if(e.eq(C))return this.unsigned?T:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:l(2,s-48),u=c(t),d=u.mul(e);d.isNegative()||d.gt(n);)d=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=E),a=a.add(u),n=n.sub(d)}return a},N.div=N.divide,N.modulo=function(e){return i(e)||(e=h(e)),r?p((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},N.mod=N.modulo,N.rem=N.modulo,N.not=function(){return p(~this.low,~this.high,this.unsigned)},N.and=function(e){return i(e)||(e=h(e)),p(this.low&e.low,this.high&e.high,this.unsigned)},N.or=function(e){return i(e)||(e=h(e)),p(this.low|e.low,this.high|e.high,this.unsigned)},N.xor=function(e){return i(e)||(e=h(e)),p(this.low^e.low,this.high^e.high,this.unsigned)},N.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?p(this.low<<e,this.high<<e|this.low>>>32-e,this.unsigned):p(0,this.low<<e-32,this.unsigned)},N.shl=N.shiftLeft,N.shiftRight=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?p(this.low>>>e|this.high<<32-e,this.high>>e,this.unsigned):p(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},N.shr=N.shiftRight,N.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?p(this.low>>>e|t<<32-e,t>>>e,this.unsigned):p(32===e?t:t>>>e-32,0,this.unsigned)},N.shru=N.shiftRightUnsigned,N.shr_u=N.shiftRightUnsigned,N.toSigned=function(){return this.unsigned?p(this.low,this.high,!1):this},N.toUnsigned=function(){return this.unsigned?this:p(this.low,this.high,!0)},N.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},N.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},N.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){(function(e){const t=e.Long||r(15);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(6))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(6))},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="  ",i="    ",a="        ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=47;function i(e){for(var t,r=0,i=e.length;r+1<i&&46==e.charCodeAt(r)&&e.charCodeAt(r+1)==n;)r+=2;for((r>0||i<e.length)&&(e=e.substring(r,i),i-=r,r=0);r+1<i;){if(t=!1,e.charCodeAt(r)==n&&46==e.charCodeAt(r+1)){if((t=r+2==i)||r+2<i&&e.charCodeAt(r+2)==n){e=t?e.substring(0,r):e.substring(0,r)+e.substring(r+2),i-=2;continue}if((t=r+3==i)&&46==e.charCodeAt(r+2)||r+3<i&&46==e.charCodeAt(r+2)&&e.charCodeAt(r+3)==n){for(var a=r;--a>=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e<t[0])return!1;for(var r,n=0,i=t.length;n+1<i;){if(r=n+(i-n)/2,t[r-=r%2]<=e&&e<=t[r+1])return!0;e<t[r]?i=r:n=r+2}return!1}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(2),i=r(4),a=r(7),s=r(3),o=r(5);function c(e,t,r,c,h,d){var m,y,g,T,E=e.module;switch(t.internalName){case"isInteger":var f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(4)&&!f.is(256)?E.createI32(1):E.createI32(0):E.createUnreachable();case"isFloat":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(8)?E.createI32(1):E.createI32(0):E.createUnreachable();case"isSigned":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(1)?E.createI32(1):E.createI32(0):E.createUnreachable();case"isReference":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?(e.currentType=a.Type.bool,f.is(256)?E.createI32(1):E.createI32(0)):E.createUnreachable();case"isString":f=l(e,r,c,d);if(e.currentType=a.Type.bool,!f)return E.createUnreachable();if(L=f.classReference){var I=e.program.stringInstance;if(I&&L.isAssignableTo(I))return E.createI32(1)}return E.createI32(0);case"isArray":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?null!=(L=f.classReference)&&null!=L.lookupOverload(o.OperatorKind.INDEXED_GET)?E.createI32(1):E.createI32(0):E.createUnreachable();case"clz":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:T=E.createUnary(s.UnaryOp.ClzI32,m);break;case 10:case 2:case 7:T=E.createUnary(s.UnaryOp.ClzI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 4:T=E.createUnary(e.options.isWasm64?s.UnaryOp.ClzI64:s.UnaryOp.ClzI32,m);break;case 3:case 8:T=E.createUnary(s.UnaryOp.ClzI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"ctz":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],0,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:T=E.createUnary(s.UnaryOp.CtzI32,m);break;case 10:case 2:case 7:T=E.createUnary(s.UnaryOp.CtzI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 4:T=E.createUnary(e.options.isWasm64?s.UnaryOp.CtzI64:s.UnaryOp.CtzI32,m);break;case 3:case 8:T=E.createUnary(s.UnaryOp.CtzI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"popcnt":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:T=E.createUnary(s.UnaryOp.PopcntI32,m);break;case 10:case 2:case 7:T=E.createUnary(s.UnaryOp.PopcntI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 4:T=E.createUnary(e.options.isWasm64?s.UnaryOp.PopcntI64:s.UnaryOp.PopcntI32,m);break;case 3:case 8:T=E.createUnary(s.UnaryOp.PopcntI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"rotl":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:T=e.ensureSmallIntegerWrap(E.createBinary(s.BinaryOp.RotlI32,m,y),e.currentType);case 2:case 7:T=E.createBinary(s.BinaryOp.RotlI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 4:T=E.createBinary(e.options.isWasm64?s.BinaryOp.RotlI64:s.BinaryOp.RotlI32,m,y);break;case 3:case 8:T=E.createBinary(s.BinaryOp.RotlI64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"rotr":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:T=e.ensureSmallIntegerWrap(E.createBinary(s.BinaryOp.RotrI32,m,y),e.currentType);break;case 2:case 7:T=E.createBinary(s.BinaryOp.RotrI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 4:T=E.createBinary(e.options.isWasm64?s.BinaryOp.RotrI64:s.BinaryOp.RotrI32,m,y);break;case 3:case 8:T=E.createBinary(s.BinaryOp.RotrI64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"abs":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var v=e.currentFunction.getAndFreeTempLocal(a.Type.i32,!1);T=E.createSelect(E.createTeeLocal(v.index,m),E.createBinary(s.BinaryOp.SubI32,E.createI32(0),E.createGetLocal(v.index,s.NativeType.I32)),E.createBinary(s.BinaryOp.GtI32,E.createGetLocal(v.index,s.NativeType.I32),E.createI32(0)));break;case 4:v=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);T=E.createSelect(E.createTeeLocal(v.index,m),E.createBinary(e.options.isWasm64?s.BinaryOp.SubI64:s.BinaryOp.SubI32,e.options.usizeType.toNativeZero(E),E.createGetLocal(v.index,e.options.nativeSizeType)),E.createBinary(e.options.isWasm64?s.BinaryOp.GtI64:s.BinaryOp.GtI32,E.createGetLocal(v.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(E)));break;case 3:v=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);T=E.createSelect(E.createTeeLocal(v.index,m),E.createBinary(s.BinaryOp.SubI64,E.createI64(0,0),E.createGetLocal(v.index,s.NativeType.I64)),E.createBinary(s.BinaryOp.GtI64,E.createGetLocal(v.index,s.NativeType.I64),E.createI64(0,0)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:T=m;break;case 11:T=E.createUnary(s.UnaryOp.AbsF32,m);break;case 12:T=E.createUnary(s.UnaryOp.AbsF64,m);break;case 13:T=E.createUnreachable();break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"max":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.GtI32,E.createGetLocal(C.index,s.NativeType.I32),E.createGetLocal(N.index,s.NativeType.I32)));break;case 5:case 6:case 7:case 10:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.GtU32,E.createGetLocal(C.index,s.NativeType.I32),E.createGetLocal(N.index,s.NativeType.I32)));break;case 3:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.GtI64,E.createGetLocal(C.index,s.NativeType.I64),E.createGetLocal(N.index,s.NativeType.I64)));break;case 8:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.GtU64,E.createGetLocal(C.index,s.NativeType.I64),E.createGetLocal(N.index,s.NativeType.I64)));break;case 4:C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(e.options.isWasm64?s.BinaryOp.GtI64:s.BinaryOp.GtI32,E.createGetLocal(C.index,e.options.nativeSizeType),E.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(e.options.isWasm64?s.BinaryOp.GtU64:s.BinaryOp.GtU32,E.createGetLocal(C.index,e.options.nativeSizeType),E.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:T=E.createBinary(s.BinaryOp.MaxF32,m,y);break;case 12:T=E.createBinary(s.BinaryOp.MaxF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"min":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.LtI32,E.createGetLocal(C.index,s.NativeType.I32),E.createGetLocal(N.index,s.NativeType.I32)));break;case 5:case 6:case 7:case 10:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.LtU32,E.createGetLocal(C.index,s.NativeType.I32),E.createGetLocal(N.index,s.NativeType.I32)));break;case 3:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.LtI64,E.createGetLocal(C.index,s.NativeType.I64),E.createGetLocal(N.index,s.NativeType.I64)));break;case 8:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(s.BinaryOp.LtU64,E.createGetLocal(C.index,s.NativeType.I64),E.createGetLocal(N.index,s.NativeType.I64)));break;case 4:C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(e.options.isWasm64?s.BinaryOp.LtI64:s.BinaryOp.LtI32,E.createGetLocal(C.index,e.options.nativeSizeType),E.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),T=E.createSelect(E.createTeeLocal(C.index,m),E.createTeeLocal(N.index,y),E.createBinary(e.options.isWasm64?s.BinaryOp.LtU64:s.BinaryOp.LtU32,E.createGetLocal(C.index,e.options.nativeSizeType),E.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:T=E.createBinary(s.BinaryOp.MinF32,m,y);break;case 12:T=E.createBinary(s.BinaryOp.MinF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"ceil":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}default:T=m;break;case 11:T=E.createUnary(s.UnaryOp.CeilF32,m);break;case 12:T=E.createUnary(s.UnaryOp.CeilF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"floor":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}default:T=m;break;case 11:T=E.createUnary(s.UnaryOp.FloorF32,m);break;case 12:T=E.createUnary(s.UnaryOp.FloorF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"copysign":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 11:T=E.createBinary(s.BinaryOp.CopysignF32,m,y);break;case 12:T=E.createBinary(s.BinaryOp.CopysignF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"nearest":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}default:T=m;break;case 11:T=E.createUnary(s.UnaryOp.NearestF32,m);break;case 12:T=E.createUnary(s.UnaryOp.NearestF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"reinterpret":if(1!=c.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0")),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable();switch(r[0].kind){case 2:case 7:m=e.compileExpression(c[0],a.Type.f32,1,0),T=E.createUnary(s.UnaryOp.ReinterpretF32,m);break;case 3:case 8:m=e.compileExpression(c[0],a.Type.f64,1,0),T=E.createUnary(s.UnaryOp.ReinterpretF64,m);break;case 9:if(r[0].is(256))return e.error(n.DiagnosticCode.Operation_not_supported,d.range),e.currentType=r[0],E.createUnreachable();case 4:m=e.compileExpression(c[0],e.options.isWasm64?a.Type.f64:a.Type.f32,1,0),T=E.createUnary(e.options.isWasm64?s.UnaryOp.ReinterpretF64:s.UnaryOp.ReinterpretF32,m);break;case 11:m=e.compileExpression(c[0],a.Type.i32,1,0),T=E.createUnary(s.UnaryOp.ReinterpretI32,m);break;case 12:m=e.compileExpression(c[0],a.Type.i64,1,0),T=E.createUnary(s.UnaryOp.ReinterpretI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return e.currentType=r[0],T;case"sqrt":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 11:T=E.createUnary(s.UnaryOp.SqrtF32,m);break;case 12:T=E.createUnary(s.UnaryOp.SqrtF64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"trunc":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable();break}default:T=m;break;case 11:T=E.createUnary(s.UnaryOp.TruncF32,m);break;case 12:T=E.createUnary(s.UnaryOp.TruncF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"load":return c.length<1||c.length>2?(r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),c.length<1?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)):e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable()):r&&1==r.length?(m=e.compileExpression(c[0],e.options.usizeType,1,0),(b=2==c.length?u(e,c[1]):0)<0?E.createUnreachable():(e.currentType=r[0],E.createLoad(r[0].byteSize,r[0].is(5),m,r[0].is(4)&&h.is(4)&&h.size>r[0].size?(e.currentType=h).toNativeType():(e.currentType=r[0]).toNativeType(),b))):(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable());case"store":if(e.currentType=a.Type.void,c.length<2||c.length>3)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),c.length<2?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"2",c.length.toString(10)):e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),E.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable();m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],r[0],r[0].is(4)?0:1,0);f=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size<r[0].size)?(y=e.convertExpression(y,e.currentType,r[0],1,0,c[1]),f=r[0]):f=e.currentType,(b=3==c.length?u(e,c[2]):0)<0?E.createUnreachable():(e.currentType=a.Type.void,E.createStore(r[0].byteSize,m,y,f.toNativeType(),b));case"sizeof":if(e.currentType=e.options.usizeType,0!=c.length)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),E.createUnreachable();r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0");var S=r[0].byteSize;return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,T=E.createI32(S)):T=E.createI64(S,0):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,T=E.createI64(S,0)):T=E.createI32(S),T;case"alignof":if(e.currentType=e.options.usizeType,0!=c.length)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),E.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable();var O=void 0;switch(S=r[0].byteSize){case 1:O=0;break;case 2:O=1;break;case 4:O=2;break;case 8:O=3;break;default:return assert(!1),E.createUnreachable()}return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,T=E.createI32(O)):T=E.createI64(O,0):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,T=E.createI64(O,0)):T=E.createI32(O),T;case"offsetof":if(e.currentType=e.options.usizeType,c.length>1)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable();var L;if(!(L=r[0].classReference))return e.error(n.DiagnosticCode.Operation_not_supported,d.range),E.createUnreachable();var b=void 0;if(c.length){if(c[0].kind!=i.NodeKind.LITERAL||c[0].literalKind!=i.LiteralKind.STRING)return e.error(n.DiagnosticCode.String_literal_expected,c[0].range),E.createUnreachable();var k=c[0].value,R=L.members?L.members.get(k):null;if(!R||R.kind!=o.ElementKind.FIELD)return e.error(n.DiagnosticCode.Type_0_has_no_property_1,c[0].range,L.internalName,k),E.createUnreachable();b=R.memoryOffset}else b=L.currentMemoryOffset;return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,E.createI32(b)):E.createI64(b):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,E.createI64(b)):E.createI32(b);case"select":if(3!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),E.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpressionRetainType(c[0],a.Type.i32,0);f=e.currentType;switch(y=e.compileExpression(c[1],f,1,0),g=e.makeIsTrueish(e.compileExpressionRetainType(c[2],a.Type.bool,0),e.currentType),e.currentType=f,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:T=E.createSelect(m,y,g);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=E.createUnreachable()}return T;case"unreachable":return 0!=c.length&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),E.createUnreachable();case"current_memory":return e.currentType=a.Type.i32,0!=c.length&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),E.createHost(s.HostOp.CurrentMemory);case"grow_memory":return e.currentType=a.Type.i32,1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),m=E.createUnreachable()):m=e.compileExpression(c[0],a.Type.i32,1,0),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),E.createHost(s.HostOp.GrowMemory,null,[m]);case"move_memory":if(r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),3!=c.length)return e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),e.currentType=a.Type.void,E.createUnreachable();throw m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],e.options.usizeType,1,0),g=e.compileExpression(c[2],e.options.usizeType,1,0),e.currentType=a.Type.void,new Error("not implemented");case"set_memory":if(r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),3!=c.length)return e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),e.currentType=a.Type.void,E.createUnreachable();throw m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],a.Type.u32,1,0),g=e.compileExpression(c[2],e.options.usizeType,1,0),e.currentType=a.Type.void,new Error("not implemented");case"changetype":return r&&1==r.length?1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=r[0],E.createUnreachable()):(m=e.compileExpressionRetainType(c[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(n.DiagnosticCode.Operation_not_supported,d.range),E.createUnreachable()):m):(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),E.createUnreachable());case"assert":if(c.length<1||c.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),c.length<1?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)):c.length>2&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),E.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpressionRetainType(c[0],a.Type.bool,1);f=e.currentType;if(e.currentType=f.nonNullableType,e.options.noAssert)return h==a.Type.void?(e.currentType=a.Type.void,E.createNop()):m;var x=_(e,2==c.length?c[1]:null,d);if(e.currentType=f.nonNullableType,h==a.Type.void){switch(e.currentType.kind){default:T=E.createIf(E.createUnary(s.UnaryOp.EqzI32,m),x);break;case 3:case 8:T=E.createIf(E.createUnary(s.UnaryOp.EqzI64,m),x);break;case 4:case 9:T=E.createIf(E.createUnary(e.options.isWasm64?s.UnaryOp.EqzI64:s.UnaryOp.EqzI32,m),x);break;case 11:T=E.createIf(E.createBinary(s.BinaryOp.EqF32,m,E.createF32(0)),x);break;case 12:T=E.createIf(E.createBinary(s.BinaryOp.EqF64,m,E.createF64(0)),x);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=x}e.currentType=a.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:A=e.currentFunction.flow,v=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(m,e.currentType));T=E.createIf(E.createTeeLocal(v.index,m),E.createGetLocal(v.index,s.NativeType.I32),x);break;case 2:case 7:default:v=e.currentFunction.getAndFreeTempLocal(a.Type.i32,!1);T=E.createIf(E.createTeeLocal(v.index,m),E.createGetLocal(v.index,s.NativeType.I32),x);break;case 3:case 8:v=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);T=E.createIf(E.createUnary(s.UnaryOp.EqzI64,E.createTeeLocal(v.index,m)),x,E.createGetLocal(v.index,s.NativeType.I64));break;case 4:case 9:v=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);T=E.createIf(E.createUnary(e.options.isWasm64?s.UnaryOp.EqzI64:s.UnaryOp.EqzI32,E.createTeeLocal(v.index,m)),x,E.createGetLocal(v.index,e.options.nativeSizeType));break;case 11:v=e.currentFunction.getAndFreeTempLocal(a.Type.f32,!1);T=E.createIf(E.createBinary(s.BinaryOp.EqF32,E.createTeeLocal(v.index,m),E.createF32(0)),x,E.createGetLocal(v.index,s.NativeType.F32));break;case 12:v=e.currentFunction.getAndFreeTempLocal(a.Type.f64,!1);T=E.createIf(E.createBinary(s.BinaryOp.EqF64,E.createTeeLocal(v.index,m),E.createF64(0)),x,E.createGetLocal(v.index,s.NativeType.F64));break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),T=x}return T;case"unchecked":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable()):((A=e.currentFunction.flow).set(4096),T=e.compileExpressionRetainType(c[0],h,0),A.unset(4096),T);case"call_indirect":if(c.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),E.createUnreachable();var F=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),E.createUnreachable();F=r[0]}else F=h;if(m=e.compileExpressionRetainType(c[0],a.Type.u32,0),7!=e.currentType.kind)return e.error(n.DiagnosticCode.Operation_not_supported,c[0].range),E.createUnreachable();for(var B=c.length-1,D=new Array(B),U=new Array(B+1),P=F.toNativeType(),w=new Array(B),M=0;M<B;++M){D[M]=e.compileExpressionRetainType(c[1+M],a.Type.i32,0);var G=e.currentType;U[M]=G.toSignatureString(),w[M]=G.toNativeType()}U[B]=F.toSignatureString();var K=U.join(""),z=E.getFunctionTypeBySignature(P,w);return z||(z=E.addFunctionType(K,P,w)),e.currentType=F,E.createCallIndirect(m,D,K);case"i8":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i8,E.createUnreachable()):e.compileExpression(c[0],a.Type.i8,2,0);case"i16":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i16,E.createUnreachable()):e.compileExpression(c[0],a.Type.i16,2,0);case"i32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i32,E.createUnreachable()):e.compileExpression(c[0],a.Type.i32,2,0);case"i64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i64,E.createUnreachable()):e.compileExpression(c[0],a.Type.i64,2,0);case"isize":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=e.options.isWasm64?a.Type.isize64:a.Type.isize32,E.createUnreachable()):e.compileExpression(c[0],e.options.isWasm64?a.Type.isize64:a.Type.isize32,2,0);case"u8":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u8,E.createUnreachable()):e.compileExpression(c[0],a.Type.u8,2,0);case"u16":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u16,E.createUnreachable()):e.compileExpression(c[0],a.Type.u16,2,0);case"u32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u32,E.createUnreachable()):e.compileExpression(c[0],a.Type.u32,2,0);case"u64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u64,E.createUnreachable()):e.compileExpression(c[0],a.Type.u64,2,0);case"usize":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=e.options.usizeType,E.createUnreachable()):e.compileExpression(c[0],e.options.usizeType,2,0);case"bool":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.bool,E.createUnreachable()):e.compileExpression(c[0],a.Type.bool,2,0);case"f32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.f32,E.createUnreachable()):e.compileExpression(c[0],a.Type.f32,2,0);case"f64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.f64,E.createUnreachable()):e.compileExpression(c[0],a.Type.f64,2,0)}var V=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return p("clz",e,a.Type.i32,r,a.Type.i32,i);case"i64.clz":return p("clz",e,a.Type.i64,r,a.Type.i64,i);case"i32.ctz":return p("ctz",e,a.Type.i32,r,a.Type.i32,i);case"i64.ctz":return p("ctz",e,a.Type.i64,r,a.Type.i64,i);case"i32.popcnt":return p("popcnt",e,a.Type.i32,r,a.Type.i32,i);case"i64.popcnt":return p("popcnt",e,a.Type.i64,r,a.Type.i64,i);case"i32.rotl":return p("rotl",e,a.Type.i32,r,a.Type.i32,i);case"i64.rotl":return p("rotl",e,a.Type.i64,r,a.Type.i64,i);case"i32.rotr":return p("rotr",e,a.Type.i32,r,a.Type.i32,i);case"i64.rotr":return p("rotr",e,a.Type.i64,r,a.Type.i64,i);case"f32.abs":return p("abs",e,a.Type.f32,r,a.Type.f32,i);case"f64.abs":return p("abs",e,a.Type.f64,r,a.Type.f64,i);case"f32.max":return p("max",e,a.Type.f32,r,a.Type.f32,i);case"f64.max":return p("max",e,a.Type.f64,r,a.Type.f64,i);case"f32.min":return p("min",e,a.Type.f32,r,a.Type.f32,i);case"f64.min":return p("min",e,a.Type.f64,r,a.Type.f64,i);case"f32.ceil":return p("ceil",e,a.Type.f32,r,a.Type.f32,i);case"f64.ceil":return p("ceil",e,a.Type.f64,r,a.Type.f64,i);case"f32.floor":return p("floor",e,a.Type.f32,r,a.Type.f32,i);case"f64.floor":return p("floor",e,a.Type.f64,r,a.Type.f64,i);case"f32.copysign":return p("copysign",e,a.Type.f32,r,a.Type.f32,i);case"f64.copysign":return p("copysign",e,a.Type.f64,r,a.Type.f64,i);case"f32.nearest":return p("nearest",e,a.Type.f32,r,a.Type.f32,i);case"f64.nearest":return p("nearest",e,a.Type.f64,r,a.Type.f64,i);case"i32.reinterpret_f32":return p("reinterpret",e,a.Type.i32,r,a.Type.f32,i);case"i64.reinterpret_f64":return p("reinterpret",e,a.Type.i64,r,a.Type.f64,i);case"f32.reinterpret_i32":return p("reinterpret",e,a.Type.f32,r,a.Type.i32,i);case"f64.reinterpret_i64":return p("reinterpret",e,a.Type.f64,r,a.Type.i64,i);case"f32.sqrt":return p("sqrt",e,a.Type.f32,r,a.Type.f32,i);case"f64.sqrt":return p("sqrt",e,a.Type.f64,r,a.Type.f64,i);case"f32.trunc":return p("trunc",e,a.Type.f32,r,a.Type.f32,i);case"f64.trunc":return p("trunc",e,a.Type.f64,r,a.Type.f64,i);case"i32.load8_s":return p("load",e,a.Type.i8,r,a.Type.i32,i);case"i32.load8_u":return p("load",e,a.Type.u8,r,a.Type.u32,i);case"i32.load16_s":return p("load",e,a.Type.i16,r,a.Type.i32,i);case"i32.load16_u":return p("load",e,a.Type.u16,r,a.Type.u32,i);case"i32.load":return p("load",e,a.Type.i32,r,a.Type.i32,i);case"i64.load8_s":return p("load",e,a.Type.i8,r,a.Type.i64,i);case"i64.load8_u":return p("load",e,a.Type.u8,r,a.Type.u64,i);case"i64.load16_s":return p("load",e,a.Type.i16,r,a.Type.i64,i);case"i64.load16_u":return p("load",e,a.Type.u16,r,a.Type.u64,i);case"i64.load32_s":return p("load",e,a.Type.i32,r,a.Type.i64,i);case"i64.load32_u":return p("load",e,a.Type.u32,r,a.Type.u64,i);case"i64.load":return p("load",e,a.Type.i64,r,a.Type.i64,i);case"f32.load":return p("load",e,a.Type.f32,r,a.Type.f32,i);case"f64.load":return p("load",e,a.Type.f64,r,a.Type.f64,i);case"i32.store8":return p("store",e,a.Type.i8,r,a.Type.i32,i);case"i32.store16":return p("store",e,a.Type.i16,r,a.Type.i32,i);case"i32.store":return p("store",e,a.Type.i32,r,a.Type.i32,i);case"i64.store8":return p("store",e,a.Type.i8,r,a.Type.i64,i);case"i64.store16":return p("store",e,a.Type.i16,r,a.Type.i64,i);case"i64.store32":return p("store",e,a.Type.i32,r,a.Type.i64,i);case"i64.store":return p("store",e,a.Type.i64,r,a.Type.i64,i);case"f32.store":return p("store",e,a.Type.f32,r,a.Type.f32,i);case"f64.store":return p("store",e,a.Type.f64,r,a.Type.f64,i)}return 0}(e,t,c,0,d);return V?(r&&r.length&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),V):(e.error(n.DiagnosticCode.Operation_not_supported,d.range),E.createUnreachable())}function p(e,t,r,n,i,a){var s=assert(t.program.elementsLookup.get(e));return assert(s.kind==o.ElementKind.FUNCTION_PROTOTYPE),c(t,s,[r],n,i,a)}function l(e,t,r,i){if(0==r.length)return t&&1==t.length?t[0]:(e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],a.Type.i32,0)}else e.compileExpressionRetainType(r[0],a.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t.length.toString(10)),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,i.range,"1",r.length.toString(10)),null}function u(e,t){var r,i;return e.options.isWasm64?(r=e.precomputeExpression(t,a.Type.usize64,1,0),(s.getExpressionId(r)!=s.ExpressionId.Const||s.getExpressionType(r)!=s.NativeType.I64||0!=s.getConstValueI64High(r)||(i=s.getConstValueI64Low(r))<0)&&(e.error(n.DiagnosticCode.Operation_not_supported,t.range),i=-1)):(r=e.precomputeExpression(t,a.Type.usize32,1,0),(s.getExpressionId(r)!=s.ExpressionId.Const||s.getExpressionType(r)!=s.NativeType.I32||(i=s.getConstValueI32(r))<0)&&(e.error(n.DiagnosticCode.Operation_not_supported,t.range),i=-1)),i}t.compileCall=c;var h="allocate_memory";t.compileAllocate=function(e,t,r){var i=e.program;assert(t.program==i);var a=e.module,s=e.options,c=i.elementsLookup.get(h);if(!c)return i.error(n.DiagnosticCode.Cannot_find_name_0,r.range,h),i.info(n.DiagnosticCode.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf,r.range),a.createUnreachable();if(c.kind!=o.ElementKind.FUNCTION_PROTOTYPE)return i.error(n.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,r.range,c.internalName),a.createUnreachable();var p=c.resolve();return p&&e.compileFunction(p)?(e.currentType=t.type,a.createCall(p.internalName,[s.isWasm64?a.createI64(t.currentMemoryOffset):a.createI32(t.currentMemoryOffset)],s.nativeSizeType)):a.createUnreachable()};var d="abort";function _(e,t,r){var n=e.program,i=e.module,c=n.typesLookup.get("string");if(!c)return i.createUnreachable();var p=n.elementsLookup.get(d);if(!p||p.kind!=o.ElementKind.FUNCTION_PROTOTYPE)return i.createUnreachable();var l=p.resolve();if(!l||!e.compileFunction(l))return i.createUnreachable();var u=null!=t?e.compileExpression(t,c,1,0):c.toNativeZero(i),h=e.compileStaticString(r.range.source.normalizedPath);return e.currentType=a.Type.void,i.createBlock(null,[i.createCallImport(l.internalName,[u,h,i.createI32(r.range.line),i.createI32(r.range.column)],s.NativeType.None),i.createUnreachable()])}t.compileAbort=_},function(t,r){t.exports=e},function(e,t,r){(function(e){const t=e.Binaryen||r(23);for(var n in t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.allocate_memory=function(e){return e?t._malloc(e):0},e.free_memory=function(e){e&&t._free(e)},e.move_memory=function(e,r,n){return t._memmove(e,r,n)},e.store=function(e,r){t.HEAPU8[e]=r},e.load=function(e){return t.HEAPU8[e]};const i=r(3).Module;i.prototype.toText=function(){var e=t.print,r="";return t.print=function(e){r+=e+"\n"},_BinaryenModulePrint(this.ref),t.print=e,r},i.prototype.toAsmjs=function(){var e=t.print,r="";return t.print=function(e){r+=e+"\n"},_BinaryenModulePrintAsmjs(this.ref),t.print=e,r}}).call(this,r(6))},function(e,t){e.exports=(e=>{var t=new Uint8Array(0),r=0;e.allocate_memory=function(e){if(!(e>>>=0))return 0;if(r+e>t.length){var n=t;(t=new Uint8Array(Math.max(65536,t.length+e,2*t.length))).set(n)}var i=r;return 7&(r+=e)&&(r=1+(7|r)),i},e.free_memory=function(e){},e.move_memory=function(e,r,n){t.copyWithin(e,r,r+n)},e.store=function(e,r,n){t[e+(0|n)]=r},e.load=function(e,r){return t[e+(0|r)]}})},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;function n(){Error.captureStackTrace?Error.captureStackTrace(this,n):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function i(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}t.ASC_TARGET=0,Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:1,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{MIN_VALUE:{value:Math.fround(-3.40282347e38),writable:!1},MAX_VALUE:{value:Math.fround(3.40282347e38),writable:!1},MIN_POSITIVE_VALUE:{value:Math.fround(1.175494351e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1},EPSILON:{value:Math.fround(1.1920929e-7),writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{MIN_VALUE:{value:-1.7976931348623157e308,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_POSITIVE_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1},EPSILON:{value:2.220446049250313e-16,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},n.prototype=Object.create(Error.prototype),n.prototype.name="UnreachableError",n.prototype.message="unreachable",t.unreachable=function(){throw new n},i.prototype=Object.create(Error.prototype),i.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new i(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,r(25)(t)}).call(this,r(6))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(26),r(24),r(17),r(16)},function(e,t,r){r(27),e.exports=r(14)}])});
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("binaryen")):"function"==typeof define&&define.amd?define(["binaryen"],t):"object"==typeof exports?exports.assemblyscript=t(require("binaryen")):e.assemblyscript=t(e.binaryen)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=29)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NONE=0]="NONE",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.DECLARE=4]="DECLARE",e[e.CONST=8]="CONST",e[e.LET=16]="LET",e[e.STATIC=32]="STATIC",e[e.READONLY=64]="READONLY",e[e.ABSTRACT=128]="ABSTRACT",e[e.PUBLIC=256]="PUBLIC",e[e.PRIVATE=512]="PRIVATE",e[e.PROTECTED=1024]="PROTECTED",e[e.GET=2048]="GET",e[e.SET=4096]="SET",e[e.AMBIENT=8192]="AMBIENT",e[e.GENERIC=16384]="GENERIC",e[e.GENERIC_CONTEXT=32768]="GENERIC_CONTEXT",e[e.INSTANCE=65536]="INSTANCE",e[e.CONSTRUCTOR=131072]="CONSTRUCTOR",e[e.ARROW=262144]="ARROW",e[e.MODULE_EXPORT=524288]="MODULE_EXPORT",e[e.MODULE_IMPORT=1048576]="MODULE_IMPORT",e[e.BUILTIN=2097152]="BUILTIN",e[e.COMPILED=4194304]="COMPILED",e[e.INLINED=8388608]="INLINED",e[e.SCOPED=16777216]="SCOPED",e[e.TRAMPOLINE=33554432]="TRAMPOLINE",e[e.VIRTUAL=67108864]="VIRTUAL",e[e.MAIN=134217728]="MAIN"}(t.CommonFlags||(t.CommonFlags={})),t.PATH_DELIMITER="/",t.PARENT_SUBST="..",t.GETTER_PREFIX="get:",t.SETTER_PREFIX="set:",t.INSTANCE_DELIMITER="#",t.STATIC_DELIMITER=".",t.INNER_DELIMITER="~",t.LIBRARY_SUBST="~lib",t.LIBRARY_PREFIX=t.LIBRARY_SUBST+t.PATH_DELIMITER,t.FILESPACE_PREFIX="file:"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(9),a=r(3),s=r(9);function o(e){switch(e){case n.INFO:return"INFO";case n.WARNING:return"WARNING";case n.ERROR:return"ERROR";default:return assert(!1),""}}function c(e){switch(e){case n.INFO:return t.COLOR_BLUE;case n.WARNING:return t.COLOR_YELLOW;case n.ERROR:return t.COLOR_RED;default:return assert(!1),""}}t.DiagnosticCode=s.DiagnosticCode,t.diagnosticCodeToString=s.diagnosticCodeToString,function(e){e[e.INFO=0]="INFO",e[e.WARNING=1]="WARNING",e[e.ERROR=2]="ERROR"}(n=t.DiagnosticCategory||(t.DiagnosticCategory={})),t.diagnosticCategoryToString=o,t.COLOR_BLUE="",t.COLOR_YELLOW="",t.COLOR_RED="",t.COLOR_RESET="",t.diagnosticCategoryToColor=c;var p=function(){function e(e,t,r){this.range=null,this.code=e,this.category=t,this.message=r}return e.create=function(t,r,n,a,s){void 0===n&&(n=null),void 0===a&&(a=null),void 0===s&&(s=null);var o=i.diagnosticCodeToString(t);return null!=n&&(o=o.replace("{0}",n)),null!=a&&(o=o.replace("{1}",a)),null!=s&&(o=o.replace("{2}",s)),new e(t,r,o)},e.createInfo=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.INFO,r,i)},e.createWarning=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.WARNING,r,i)},e.createError=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.ERROR,r,i)},e.prototype.withRange=function(e){return this.range=e,this},e.prototype.toString=function(){return this.range?o(this.category)+" "+this.code.toString(10)+': "'+this.message+'" in '+this.range.source.normalizedPath+":"+this.range.line.toString(10)+":"+this.range.column.toString(10):o(this.category)+" "+this.code.toString(10)+": "+this.message},e}();function l(e,r){void 0===r&&(r=!1);for(var n=e.source.text,i=n.length,s=e.start,o=e.end;s>0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o<i&&!a.isLineBreak(n.charCodeAt(o));)o++;for(var c=["\n ",n.substring(s,o),"\n "];s<e.start;)c.push(" "),s++;if(r&&c.push(t.COLOR_RED),e.start==e.end)c.push("^");else for(;s++<e.end;)c.push("~");return r&&c.push(t.COLOR_RESET),c.join("")}t.DiagnosticMessage=p,t.formatDiagnosticMessage=function(e,r,n){void 0===r&&(r=!1),void 0===n&&(n=!1);var i=[];if(r&&i.push(c(e.category)),i.push(o(e.category)),r&&i.push(t.COLOR_RESET),i.push(e.code<1e3?" AS":" TS"),i.push(e.code.toString(10)),i.push(": "),i.push(e.message),e.range){var a=e.range;n&&(i.push("\n"),i.push(l(e.range,r))),i.push("\n"),i.push(" in "),i.push(a.source.normalizedPath),i.push("("),i.push(a.line.toString(10)),i.push(","),i.push(a.column.toString(10)),i.push(")")}return i.join("")},t.formatDiagnosticContext=l;var u=function(){function e(e){void 0===e&&(e=null),this.diagnostics=e||new Array}return e.prototype.emitDiagnostic=function(e,t,r,n,i,a){void 0===n&&(n=null),void 0===i&&(i=null),void 0===a&&(a=null);var s=p.create(e,t,n,i,a).withRange(r);this.diagnostics.push(s)},e.prototype.info=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.INFO,t,r,i,a)},e.prototype.warning=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.WARNING,t,r,i,a)},e.prototype.error=function(e,t,r,i,a){void 0===r&&(r=null),void 0===i&&(i=null),void 0===a&&(a=null),this.emitDiagnostic(e,n.ERROR,t,r,i,a)},e}();t.DiagnosticEmitter=u},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=r(0),a=r(8);t.Token=a.Token,t.Range=a.Range;var s,o=r(3);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPEPARAMETER=2]="TYPEPARAMETER",e[e.PARAMETER=3]="PARAMETER",e[e.SIGNATURE=4]="SIGNATURE",e[e.IDENTIFIER=5]="IDENTIFIER",e[e.ASSERTION=6]="ASSERTION",e[e.BINARY=7]="BINARY",e[e.CALL=8]="CALL",e[e.CLASS=9]="CLASS",e[e.COMMA=10]="COMMA",e[e.ELEMENTACCESS=11]="ELEMENTACCESS",e[e.FALSE=12]="FALSE",e[e.FUNCTION=13]="FUNCTION",e[e.INSTANCEOF=14]="INSTANCEOF",e[e.LITERAL=15]="LITERAL",e[e.NEW=16]="NEW",e[e.NULL=17]="NULL",e[e.PARENTHESIZED=18]="PARENTHESIZED",e[e.PROPERTYACCESS=19]="PROPERTYACCESS",e[e.TERNARY=20]="TERNARY",e[e.SUPER=21]="SUPER",e[e.THIS=22]="THIS",e[e.TRUE=23]="TRUE",e[e.CONSTRUCTOR=24]="CONSTRUCTOR",e[e.UNARYPOSTFIX=25]="UNARYPOSTFIX",e[e.UNARYPREFIX=26]="UNARYPREFIX",e[e.BLOCK=27]="BLOCK",e[e.BREAK=28]="BREAK",e[e.CONTINUE=29]="CONTINUE",e[e.DO=30]="DO",e[e.EMPTY=31]="EMPTY",e[e.EXPORT=32]="EXPORT",e[e.EXPORTIMPORT=33]="EXPORTIMPORT",e[e.EXPRESSION=34]="EXPRESSION",e[e.FOR=35]="FOR",e[e.IF=36]="IF",e[e.IMPORT=37]="IMPORT",e[e.RETURN=38]="RETURN",e[e.SWITCH=39]="SWITCH",e[e.THROW=40]="THROW",e[e.TRY=41]="TRY",e[e.VARIABLE=42]="VARIABLE",e[e.VOID=43]="VOID",e[e.WHILE=44]="WHILE",e[e.CLASSDECLARATION=45]="CLASSDECLARATION",e[e.ENUMDECLARATION=46]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=47]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=48]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=49]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=50]="IMPORTDECLARATION",e[e.INTERFACEDECLARATION=51]="INTERFACEDECLARATION",e[e.METHODDECLARATION=52]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=53]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=54]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=55]="VARIABLEDECLARATION",e[e.DECORATOR=56]="DECORATOR",e[e.EXPORTMEMBER=57]="EXPORTMEMBER",e[e.SWITCHCASE=58]="SWITCHCASE",e[e.COMMENT=59]="COMMENT"}(s=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case s.LITERAL:case s.NULL:case s.TRUE:case s.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case s.IDENTIFIER:case s.CALL:case s.ELEMENTACCESS:case s.PROPERTYACCESS:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case s.IDENTIFIER:case s.PROPERTYACCESS:return!0}return!1};var c=function(){function e(){this.parent=null,this.flags=i.CommonFlags.NONE}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.createType=function(e,t,r,n){var i=new l;return i.range=n,i.name=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createIdentifierExpression("",t),null,!1,t)},e.createTypeParameter=function(e,t,r){var n=new u;return n.range=r,n.name=e,e.parent=n,n.extendsType=t,t&&(t.parent=n),n},e.createParameter=function(e,t,r,n,i){var a=new h;return a.range=i,a.name=e,e.parent=a,a.type=t,t&&(t.parent=a),a.initializer=r,r&&(r.parent=a),a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new _;return a.range=i,a.parameters=e,xe(e,a),a.returnType=t,t.parent=a,a.explicitThisType=r,r&&(r.parent=a),a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new y;return n.range=r,n.name=e,e.parent=n,n.arguments=t,t&&xe(t,n),n.decoratorKind=m(e),n},e.createComment=function(e,t,r){var n=new g;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t){var r=new f;return r.range=t,r.text=e,r},e.createEmptyIdentifierExpression=function(e){var t=new f;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new v;return r.range=t,r.elementExpressions=e,function(e,t){for(var r=0,n=e.length;r<n;++r){var i=e[r];i&&(i.parent=t)}}(e,r),r},e.createAssertionExpression=function(e,t,r,n){var i=new A;return i.range=n,i.assertionKind=e,i.expression=t,t.parent=i,i.toType=r,r.parent=i,i},e.createBinaryExpression=function(e,t,r,n){var i=new C;return i.range=n,i.operator=e,i.left=t,t.parent=i,i.right=r,r.parent=i,i},e.createCallExpression=function(e,t,r,n){var i=new N;return i.range=n,i.expression=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.arguments=r,xe(r,i),i},e.createClassExpression=function(e){var t=new O;return t.range=e.range,t.declaration=e,t},e.createCommaExpression=function(e,t){var r=new S;return r.range=t,r.expressions=e,xe(e,r),r},e.createConstructorExpression=function(e){var t=new L;return t.range=e,t},e.createElementAccessExpression=function(e,t,r){var n=new b;return n.range=r,n.expression=e,e.parent=n,n.elementExpression=t,t.parent=n,n},e.createFalseExpression=function(e){var t=new H;return t.range=e,t},e.createFloatLiteralExpression=function(e,t){var r=new k;return r.range=t,r.value=e,r},e.createFunctionExpression=function(e){var t=new R;return t.flags=e.flags&i.CommonFlags.ARROW,t.range=e.range,t.declaration=e,t},e.createInstanceOfExpression=function(e,t,r){var n=new x;return n.range=r,n.expression=e,e.parent=n,n.isType=t,t.parent=n,n},e.createIntegerLiteralExpression=function(e,t){var r=new F;return r.range=t,r.value=e,r},e.createNewExpression=function(e,t,r,n){var i=new D;return i.range=n,i.expression=e,e.parent=i,i.typeArguments=t,t&&xe(t,i),i.arguments=r,xe(r,i),i},e.createNullExpression=function(e){var t=new B;return t.range=e,t},e.createParenthesizedExpression=function(e,t){var r=new U;return r.range=t,r.expression=e,e.parent=r,r},e.createPropertyAccessExpression=function(e,t,r){var n=new P;return n.range=r,n.expression=e,e.parent=n,n.property=t,t.parent=n,n},e.createRegexpLiteralExpression=function(e,t,r){var n=new w;return n.range=r,n.pattern=e,n.patternFlags=t,n},e.createTernaryExpression=function(e,t,r,n){var i=new M;return i.range=n,i.condition=e,e.parent=i,i.ifThen=t,t.parent=i,i.ifElse=r,r.parent=i,i},e.createStringLiteralExpression=function(e,t){var r=new G;return r.range=t,r.value=e,r},e.createSuperExpression=function(e){var t=new K;return t.range=e,t},e.createThisExpression=function(e){var t=new z;return t.range=e,t},e.createTrueExpression=function(e){var t=new V;return t.range=e,t},e.createUnaryPostfixExpression=function(e,t,r){var n=new W;return n.range=r,n.operator=e,n.operand=t,t.parent=n,n},e.createUnaryPrefixExpression=function(e,t,r){var n=new Y;return n.range=r,n.operator=e,n.operand=t,t.parent=n,n},e.createBlockStatement=function(e,t){var r=new J;return r.range=t,r.statements=e,xe(e,r),r},e.createBreakStatement=function(e,t){var r=new ee;return r.range=t,r.label=e,e&&(e.parent=r),r},e.createClassDeclaration=function(e,t,r,n,i,a,s,o){var c=new te;return c.range=o,c.flags=s,c.name=e,e.parent=c,c.typeParameters=t,xe(t,c),c.extendsType=r,r&&(r.parent=c),c.implementsTypes=n,n&&xe(n,c),c.members=i,xe(i,c),c.decorators=a,a&&xe(a,c),c},e.createContinueStatement=function(e,t){var r=new re;return r.range=t,r.label=e,e&&(e.parent=r),r},e.createDoStatement=function(e,t,r){var n=new ne;return n.range=r,n.statement=e,e.parent=n,n.condition=t,t.parent=n,n},e.createEmptyStatement=function(e){var t=new ie;return t.range=e,t},e.createEnumDeclaration=function(e,t,r,n,i){var a=new ae;return a.range=i,a.flags=n,a.name=e,e.parent=a,a.values=t,xe(t,a),a.decorators=r,r&&xe(r,a),a},e.createEnumValueDeclaration=function(e,t,r,n){var i=new se;return i.range=n,i.flags=r,i.name=e,e.parent=i,i.value=t,t&&(t.parent=i),i},e.createExportStatement=function(e,t,r,n){var i=new pe;if(i.range=n,i.flags=r,i.members=e,e&&xe(e,i),i.path=t,t){var a=o.normalizePath(t.value);t.value.startsWith(".")?i.normalizedPath=o.resolvePath(a,n.source.normalizedPath):i.normalizedPath=a,i.internalPath=Re(i.normalizedPath)}else i.normalizedPath=null,i.internalPath=null;return i},e.createExportImportStatement=function(e,t,r){var n=new oe;return n.range=r,n.name=e,e.parent=n,n.externalName=t,t.parent=n,n},e.createExportMember=function(e,t,r){var n=new ce;return n.range=r,n.name=e,e.parent=n,t?t.parent=n:t=e,n.externalName=t,n},e.createExpressionStatement=function(e){var t=new le;return t.range=e.range,t.expression=e,e.parent=t,t},e.createIfStatement=function(e,t,r,n){var i=new _e;return i.range=n,i.condition=e,e.parent=i,i.ifTrue=t,t.parent=i,i.ifFalse=r,r&&(r.parent=i),i},e.createImportStatement=function(e,t,r){var n=new ye;n.range=r,n.declarations=e,e&&xe(e,n),n.namespaceName=null,n.path=t;var a=o.normalizePath(t.value);return t.value.startsWith(".")?n.normalizedPath=o.resolvePath(a,r.source.normalizedPath):(a.startsWith(i.LIBRARY_PREFIX)||(a=i.LIBRARY_PREFIX+a),n.normalizedPath=a),n.internalPath=Re(n.normalizedPath),n},e.createImportStatementWithWildcard=function(e,t,r){var n=new ye;return n.range=r,n.declarations=null,n.namespaceName=e,n.path=t,n.normalizedPath=o.resolvePath(o.normalizePath(t.value),r.source.normalizedPath),n.internalPath=Re(n.normalizedPath),n},e.createImportDeclaration=function(e,t,r){var n=new me;return n.range=r,n.externalName=e,e.parent=n,t?t.parent=n:t=e,n.name=t,n},e.createInterfaceDeclaration=function(e,t,r,n,i,a,s){var o=new ge;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.extendsType=r,r&&(r.parent=o),o.members=n,xe(n,o),o.decorators=i,i&&xe(i,o),o},e.createFieldDeclaration=function(e,t,r,n,i,a){var s=new ue;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.type=t,t&&(t.parent=s),s.initializer=r,r&&(r.parent=s),s.decorators=n,n&&xe(n,s),s},e.createForStatement=function(e,t,r,n,i){var a=new he;return a.range=i,a.initializer=e,e&&(e.parent=a),a.condition=t,t&&(t.parent=a),a.incrementor=r,r&&(r.parent=a),a.statement=n,n.parent=a,a},e.createFunctionDeclaration=function(e,t,r,n,i,a,s){var o=new de;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.signature=r,r.parent=o,o.body=n,n&&(n.parent=o),o.decorators=i,i&&xe(i,o),o},e.createMethodDeclaration=function(e,t,r,n,i,a,s){var o=new Ee;return o.range=s,o.flags=a,o.name=e,e.parent=o,o.typeParameters=t,t&&xe(t,o),o.signature=r,r.parent=o,o.body=n,n&&(n.parent=o),o.decorators=i,i&&xe(i,o),o},e.createNamespaceDeclaration=function(e,t,r,n,i){var a=new Te;return a.range=i,a.flags=n,a.name=e,e.parent=a,a.members=t,xe(t,a),a.decorators=r,r&&xe(r,a),a},e.createReturnStatement=function(e,t){var r=new fe;return r.range=t,r.value=e,e&&(e.parent=r),r},e.createSwitchStatement=function(e,t,r){var n=new ve;return n.range=r,n.condition=e,e.parent=n,n.cases=t,xe(t,n),n},e.createSwitchCase=function(e,t,r){var n=new Ie;return n.range=r,n.label=e,e&&(e.parent=n),n.statements=t,xe(t,n),n},e.createThrowStatement=function(e,t){var r=new Ae;return r.range=t,r.value=e,e.parent=r,r},e.createTryStatement=function(e,t,r,n,i){var a=new Ce;return a.range=i,a.statements=e,xe(e,a),a.catchVariable=t,t&&(t.parent=a),a.catchStatements=r,r&&xe(r,a),a.finallyStatements=n,n&&xe(n,a),a},e.createTypeDeclaration=function(e,t,r,n,i,a){var s=new Ne;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.typeParameters=t,t&&xe(t,s),s.type=r,r.parent=s,s.decorators=n,n&&xe(n,s),s},e.createVariableStatement=function(e,t,r,n){var i=new Se;return i.range=n,i.flags=r,i.declarations=e,xe(e,i),i.decorators=t,t&&xe(t,i),i},e.createVariableDeclaration=function(e,t,r,n,i,a){var s=new Oe;return s.range=a,s.flags=i,s.name=e,e.parent=s,s.type=t,t&&(t.parent=s),s.initializer=r,r&&(r.parent=s),s.decorators=n,s},e.createVoidStatement=function(e,t){var r=new Le;return r.range=t,r.expression=e,r},e.createWhileStatement=function(e,t,r){var n=new be;return n.range=r,n.condition=e,e.parent=n,n.statement=t,t.parent=n,n},e}();t.Node=c;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.CommonTypeNode=p;var l=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPE,t}return n(t,e),t}(p);t.TypeNode=l;var u=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEPARAMETER,t}return n(t,e),t}(c);t.TypeParameterNode=u,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.OPTIONAL=1]="OPTIONAL",e[e.REST=2]="REST"}(t.ParameterKind||(t.ParameterKind={}));var h=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARAMETER,t.implicitFieldDeclaration=null,t}return n(t,e),t}(c);t.ParameterNode=h;var d,_=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SIGNATURE,t}return n(t,e),t}(p);function m(e){if(e.kind==s.IDENTIFIER){var t=e.text;switch(assert(t.length),t.charCodeAt(0)){case 101:if("external"==t)return d.EXTERNAL;break;case 103:if("global"==t)return d.GLOBAL;break;case 105:if("inline"==t)return d.INLINE;break;case 111:if("operator"==t)return d.OPERATOR;break;case 115:if("sealed"==t)return d.SEALED;break;case 117:if("unmanaged"==t)return d.UNMANAGED}}else if(e.kind==s.PROPERTYACCESS&&e.expression.kind==s.IDENTIFIER){t=e.expression.text;assert(t.length);var r=e.property.text;if(assert(r.length),"operator"==t)switch(r.charCodeAt(0)){case 98:if("binary"==r)return d.OPERATOR_BINARY;break;case 112:switch(r){case"prefix":return d.OPERATOR_PREFIX;case"postfix":return d.OPERATOR_POSTFIX}}}return d.CUSTOM}t.SignatureNode=_,function(e){e[e.CUSTOM=0]="CUSTOM",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR=2]="OPERATOR",e[e.OPERATOR_BINARY=3]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=5]="OPERATOR_POSTFIX",e[e.UNMANAGED=6]="UNMANAGED",e[e.SEALED=7]="SEALED",e[e.INLINE=8]="INLINE",e[e.EXTERNAL=9]="EXTERNAL"}(d=t.DecoratorKind||(t.DecoratorKind={})),t.decoratorNameToKind=m;var y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DECORATOR,t}return n(t,e),t}(c);t.DecoratorNode=y,function(e){e[e.LINE=0]="LINE",e[e.TRIPLE=1]="TRIPLE",e[e.BLOCK=2]="BLOCK"}(t.CommentKind||(t.CommentKind={}));var g=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMENT,t}return n(t,e),t}(c);t.CommentNode=g;var E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.Expression=E;var T,f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IDENTIFIER,t}return n(t,e),t}(E);t.IdentifierExpression=f,function(e){e[e.FLOAT=0]="FLOAT",e[e.INTEGER=1]="INTEGER",e[e.STRING=2]="STRING",e[e.REGEXP=3]="REGEXP",e[e.ARRAY=4]="ARRAY",e[e.OBJECT=5]="OBJECT"}(T=t.LiteralKind||(t.LiteralKind={}));var I=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.LITERAL,t}return n(t,e),t}(E);t.LiteralExpression=I;var v=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=T.ARRAY,t}return n(t,e),t}(I);t.ArrayLiteralExpression=v,function(e){e[e.PREFIX=0]="PREFIX",e[e.AS=1]="AS"}(t.AssertionKind||(t.AssertionKind={}));var A=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ASSERTION,t}return n(t,e),t}(E);t.AssertionExpression=A;var C=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BINARY,t}return n(t,e),t}(E);t.BinaryExpression=C;var N=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CALL,t}return n(t,e),t}(E);t.CallExpression=N;var O=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASS,t}return n(t,e),t}(E);t.ClassExpression=O;var S=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMA,t}return n(t,e),t}(E);t.CommaExpression=S;var L=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONSTRUCTOR,t.text="constructor",t}return n(t,e),t}(f);t.ConstructorExpression=L;var b=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ELEMENTACCESS,t}return n(t,e),t}(E);t.ElementAccessExpression=b;var k=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=T.FLOAT,t}return n(t,e),t}(I);t.FloatLiteralExpression=k;var R=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTION,t}return n(t,e),t}(E);t.FunctionExpression=R;var x=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INSTANCEOF,t}return n(t,e),t}(E);t.InstanceOfExpression=x;var F=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=T.INTEGER,t}return n(t,e),t}(I);t.IntegerLiteralExpression=F;var D=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NEW,t}return n(t,e),t}(N);t.NewExpression=D;var B=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NULL,t.text="null",t}return n(t,e),t}(f);t.NullExpression=B;var U=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARENTHESIZED,t}return n(t,e),t}(E);t.ParenthesizedExpression=U;var P=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PROPERTYACCESS,t}return n(t,e),t}(E);t.PropertyAccessExpression=P;var w=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=T.REGEXP,t}return n(t,e),t}(I);t.RegexpLiteralExpression=w;var M=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TERNARY,t}return n(t,e),t}(E);t.TernaryExpression=M;var G=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=T.STRING,t}return n(t,e),t}(I);t.StringLiteralExpression=G;var K=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SUPER,t.text="super",t}return n(t,e),t}(f);t.SuperExpression=K;var z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THIS,t.text="this",t}return n(t,e),t}(f);t.ThisExpression=z;var V=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRUE,t.text="true",t}return n(t,e),t}(f);t.TrueExpression=V;var H=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FALSE,t.text="false",t}return n(t,e),t}(f);t.FalseExpression=H;var X=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(E);t.UnaryExpression=X;var W=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPOSTFIX,t}return n(t,e),t}(X);t.UnaryPostfixExpression=W;var Y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPREFIX,t}return n(t,e),t}(X);t.UnaryPrefixExpression=Y,t.isLastStatement=function(e){var t=assert(e.parent);if(t.kind==s.BLOCK){var r=t.statements;if(r[r.length-1]===e)switch(assert(t.parent).kind){case s.FUNCTIONDECLARATION:case s.METHODDECLARATION:return!0}}return!1};var Q,q=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(c);t.Statement=q,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ENTRY=1]="ENTRY",e[e.LIBRARY=2]="LIBRARY"}(Q=t.SourceKind||(t.SourceKind={}));var j=function(e){function t(t,r,n){var o=e.call(this)||this;o.kind=s.SOURCE,o.parent=null,o.tokenizer=null,o.debugInfoIndex=-1,o.exportPaths=null,o.sourceKind=n,o.normalizedPath=t;var c=Re(o.normalizedPath);o.internalPath=c;var p=c.lastIndexOf(i.PATH_DELIMITER);return o.simplePath=p>=0?c.substring(p+1):c,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==Q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==Q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=j;var Z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=ke(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=ke(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(q);t.DeclarationStatement=Z;var $=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(Z);t.VariableLikeDeclarationStatement=$;var J=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(q);t.BlockStatement=J;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(q);t.BreakStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(Z);t.ClassDeclaration=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(q);t.ContinueStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(q);t.DoStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(q);t.EmptyStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(Z);t.EnumDeclaration=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(Z);t.EnumValueDeclaration=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=ce;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(q);t.ExportStatement=pe;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(q);t.ExpressionStatement=le;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}($);t.FieldDeclaration=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(q);t.ForStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(Z);t.FunctionDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(q);t.IfStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(Z);t.ImportDeclaration=me;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(q);t.ImportStatement=ye;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(te);t.InterfaceDeclaration=ge;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(de);t.MethodDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(Z);t.NamespaceDeclaration=Te;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(q);t.ReturnStatement=fe;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(q);t.SwitchStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(q);t.ThrowStatement=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(q);t.TryStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(Z);t.TypeDeclaration=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}($);t.VariableDeclaration=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(q);t.VariableStatement=Se;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(q);t.VoidStatement=Le;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(q);function ke(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?ke(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?ke(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Re(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function xe(e,t){for(var r=0,n=e.length;r<n;++r)e[r].parent=t}t.WhileStatement=be,t.findDecorator=function(e,t){if(t)for(var r=0,n=t.length;r<n;++r){var i=t[r];if(i.decoratorKind==e)return i}return null},t.mangleInternalName=ke,t.mangleInternalPath=Re},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(22)),n(r(21)),n(r(20)),n(r(19))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i,a=r(10);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(n=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallImport=_BinaryenCallImportId()]="CallImport",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake"}(i=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.PageSize=_BinaryenPageSize()]="PageSize",e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory",e[e.HasFeature=_BinaryenHasFeature()]="HasFeature"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={}));var s=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=s;var o=function(){function e(){this.cachedTemporaryName=0,this.hasTemporaryFunction=!1,this.cachedPrecomputeName=0,this.cachedPrecomputeNames=0}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.cachedByValue=allocate_memory(16),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.cachedByValue=allocate_memory(24),n}finally{free_memory(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=h(e),i=l(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{free_memory(i),free_memory(n)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=l(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{free_memory(r)}},e.prototype.removeFunctionType=function(e){var t=h(e);try{_BinaryenRemoveFunctionType(this.ref,t)}finally{free_memory(t)}},e.prototype.createI32=function(e){var t=this.cachedByValue;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.cachedByValue;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=h(t),i=u(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{free_memory(i),free_memory(n)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=h(e);try{return _BinaryenGetGlobal(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=h(e);try{return _BinaryenSetGlobal(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=n.None);var i=h(e),a=u(t);try{return _BinaryenBlock(this.ref,i,a,t.length,r)}finally{free_memory(a),free_memory(i)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=h(e);try{return _BinaryenBreak(this.ref,n,t,r)}finally{free_memory(n)}},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=h(e);try{return _BinaryenLoop(this.ref,r,t)}finally{free_memory(r)}},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s<i;++s)a[s]=h(e[s]);var o=l(a),c=h(t);try{return _BinaryenSwitch(this.ref,o,i,c,r,n)}finally{free_memory(c),free_memory(o);for(s=i-1;s>=0;--s)free_memory(a[s])}},e.prototype.createCall=function(e,t,r){var n=h(e),i=u(t);try{return _BinaryenCall(this.ref,n,i,t&&t.length||0,r)}finally{free_memory(i),free_memory(n)}},e.prototype.createCallImport=function(e,t,r){var n=h(e),i=u(t);try{return _BinaryenCallImport(this.ref,n,i,t&&t.length||0,r)}finally{free_memory(i),free_memory(n)}},e.prototype.createCallIndirect=function(e,t,r){var n=u(t),i=h(r);try{return _BinaryenCallIndirect(this.ref,e,n,t&&t.length||0,i)}finally{free_memory(i),free_memory(n)}},e.prototype.createUnreachable=function(){return _BinaryenUnreachable(this.ref)},e.prototype.addGlobal=function(e,t,r,n){var i=h(e);try{return _BinaryenAddGlobal(this.ref,i,t,r?1:0,n)}finally{free_memory(i)}},e.prototype.addFunction=function(e,t,r,n){var i=h(e),a=l(r);try{return _BinaryenAddFunction(this.ref,i,t,a,r?r.length:0,n)}finally{free_memory(a),free_memory(i)}},e.prototype.removeFunction=function(e){var t=h(e);try{_BinaryenRemoveFunction(this.ref,t)}finally{free_memory(t)}},e.prototype.addTemporaryFunction=function(e,t,r){this.hasTemporaryFunction=assert(!this.hasTemporaryFunction);var n=this.cachedTemporaryName;n||(this.cachedTemporaryName=n=h(""));var i=l(t);try{var a=_BinaryenAddFunctionType(this.ref,n,e,i,t?t.length:0);return _BinaryenAddFunction(this.ref,n,a,0,0,r)}finally{free_memory(i)}},e.prototype.removeTemporaryFunction=function(){this.hasTemporaryFunction=!assert(this.hasTemporaryFunction);var e=assert(this.cachedTemporaryName);_BinaryenRemoveFunction(this.ref,e),_BinaryenRemoveFunctionType(this.ref,e)},e.prototype.addFunctionExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddFunctionExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addTableExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddTableExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addMemoryExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddMemoryExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.addGlobalExport=function(e,t){var r=h(e),n=h(t);try{return _BinaryenAddGlobalExport(this.ref,r,n)}finally{free_memory(n),free_memory(r)}},e.prototype.removeExport=function(e){var t=h(e);try{_BinaryenRemoveExport(this.ref,t)}finally{free_memory(t)}},e.prototype.addFunctionImport=function(e,t,r,n){var i=h(e),a=h(t),s=h(r);try{return _BinaryenAddFunctionImport(this.ref,i,a,s,n)}finally{free_memory(s),free_memory(a),free_memory(i)}},e.prototype.addTableImport=function(e,t,r){var n=h(e),i=h(t),a=h(r);try{return _BinaryenAddTableImport(this.ref,n,i,a)}finally{free_memory(a),free_memory(i),free_memory(n)}},e.prototype.addMemoryImport=function(e,t,r){var n=h(e),i=h(t),a=h(r);try{return _BinaryenAddMemoryImport(this.ref,n,i,a)}finally{free_memory(a),free_memory(i),free_memory(n)}},e.prototype.addGlobalImport=function(e,t,r,n){var i=h(e),a=h(t),s=h(r);try{return _BinaryenAddGlobalImport(this.ref,i,a,s,n)}finally{free_memory(s),free_memory(a),free_memory(i)}},e.prototype.removeImport=function(e){var t=h(e);try{_BinaryenRemoveImport(this.ref,t)}finally{free_memory(t)}},e.prototype.setMemory=function(e,t,r,n,i){void 0===i&&(i=null);for(var s=h(i),o=r.length,c=new Array(o),u=new Array(o),d=new Array(o),_=0;_<o;++_){var m=r[_].buffer,y=r[_].offset;c[_]=p(m),u[_]=n==a.Target.WASM64?this.createI64(i64_low(y),i64_high(y)):this.createI32(i64_low(y)),d[_]=m.length}var g=l(c),E=l(u),T=l(d);try{_BinaryenSetMemory(this.ref,e,t,s,g,E,T,o)}finally{free_memory(T),free_memory(E),free_memory(g);for(_=o-1;_>=0;--_)free_memory(c[_]);free_memory(s)}},e.prototype.setFunctionTable=function(e){var t=u(e);try{_BinaryenSetFunctionTable(this.ref,t,e.length)}finally{free_memory(t)}},e.prototype.setStart=function(e){_BinaryenSetStart(this.ref,e)},e.prototype.setOptimizeLevel=function(e){void 0===e&&(e=2),_BinaryenSetOptimizeLevel(e)},e.prototype.setShrinkLevel=function(e){void 0===e&&(e=1),_BinaryenSetShrinkLevel(e)},e.prototype.setDebugInfo=function(e){void 0===e&&(e=!1),_BinaryenSetDebugInfo(e)},e.prototype.optimize=function(e){void 0===e&&(e=0),e?_BinaryenFunctionOptimize(e,this.ref):_BinaryenModuleOptimize(this.ref)},e.prototype.runPasses=function(e,t){void 0===t&&(t=0);for(var r=e.length,n=new Array(r),i=0;i<r;++i)n[i]=h(e[i]);var a=l(n);try{t?_BinaryenFunctionRunPasses(t,this.ref,a,r):_BinaryenModuleRunPasses(this.ref,a,r)}finally{free_memory(a);for(i=r;i>=0;--i)free_memory(n[i])}},e.prototype.precomputeFunction=function(e){var t=this.cachedPrecomputeNames;if(!t){var r=h("precompute");this.cachedPrecomputeName=r,this.cachedPrecomputeNames=t=l([r])}_BinaryenFunctionRunPasses(e,this.ref,t,1)},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.cachedByValue,r=h(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=d(t);var a=d(t+4);i=d(t+8);var s=new m;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n<t;++n)r[n]=load(e+n);return r}(n,a),s.sourceMap=_(i),s}finally{r&&free_memory(r),n&&free_memory(n),i&&free_memory(i)}},e.prototype.toText=function(){throw new Error("not implemented")},e.prototype.toAsmjs=function(){throw new Error("not implemented")},e.prototype.dispose=function(){assert(this.ref),free_memory(this.cachedByValue),free_memory(this.cachedTemporaryName),free_memory(this.cachedPrecomputeName),free_memory(this.cachedPrecomputeNames),_BinaryenModuleDispose(this.ref),this.ref=0},e.prototype.createRelooper=function(){return c.create(this)},e.prototype.cloneExpression=function(e,t,r){if(void 0===t&&(t=!1),void 0===r&&(r=i32.MAX_VALUE),r<0)return 0;var a,s;switch(r-=1,_BinaryenExpressionGetId(e)){case i.Const:switch(_BinaryenExpressionGetType(e)){case n.I32:return this.createI32(_BinaryenConstGetValueI32(e));case n.I64:return this.createI64(_BinaryenConstGetValueI64Low(e),_BinaryenConstGetValueI64High(e));case n.F32:return this.createF32(_BinaryenConstGetValueF32(e));case n.F64:return this.createF64(_BinaryenConstGetValueF64(e));default:throw new Error("concrete type expected")}case i.GetLocal:return _BinaryenGetLocal(this.ref,_BinaryenGetLocalGetIndex(e),_BinaryenExpressionGetType(e));case i.GetGlobal:var o=_BinaryenGetGlobalGetName(e);if(!o)break;return _BinaryenGetGlobal(this.ref,o,_BinaryenExpressionGetType(e));case i.Load:if(!(a=this.cloneExpression(_BinaryenLoadGetPtr(e),t,r)))break;return _BinaryenLoadIsAtomic(e)?_BinaryenAtomicLoad(this.ref,_BinaryenLoadGetBytes(e),_BinaryenLoadGetOffset(e),_BinaryenExpressionGetType(e),a):_BinaryenLoad(this.ref,_BinaryenLoadGetBytes(e),_BinaryenLoadIsSigned(e)?1:0,_BinaryenLoadGetOffset(e),_BinaryenLoadGetAlign(e),_BinaryenExpressionGetType(e),a);case i.Unary:if(!(a=this.cloneExpression(_BinaryenUnaryGetValue(e),t,r)))break;return _BinaryenUnary(this.ref,_BinaryenUnaryGetOp(e),a);case i.Binary:if(!(a=this.cloneExpression(_BinaryenBinaryGetLeft(e),t,r)))break;if(!(s=this.cloneExpression(_BinaryenBinaryGetRight(e),t,r)))break;return _BinaryenBinary(this.ref,_BinaryenBinaryGetOp(e),a,s)}return 0},e.prototype.addDebugInfoFile=function(e){var t=h(e);try{return _BinaryenModuleAddDebugInfoFileName(this.ref,t)}finally{free_memory(t)}},e.prototype.getDebugInfoFile=function(e){return _(_BinaryenModuleGetDebugInfoFileName(this.ref,e))},e.prototype.setDebugLocation=function(e,t,r,n,i){_BinaryenFunctionSetDebugLocation(e,t,r,n,i)},e.MAX_MEMORY_WASM32=65535,e.MAX_MEMORY_WASM64=65535,e}();t.Module=o,t.getExpressionId=function(e){return _BinaryenExpressionGetId(e)},t.getExpressionType=function(e){return _BinaryenExpressionGetType(e)},t.getConstValueI32=function(e){return _BinaryenConstGetValueI32(e)},t.getConstValueI64Low=function(e){return _BinaryenConstGetValueI64Low(e)},t.getConstValueI64High=function(e){return _BinaryenConstGetValueI64High(e)},t.getConstValueF32=function(e){return _BinaryenConstGetValueF32(e)},t.getConstValueF64=function(e){return _BinaryenConstGetValueF64(e)},t.getGetLocalIndex=function(e){return _BinaryenGetLocalGetIndex(e)},t.getSetLocalIndex=function(e){return _BinaryenSetLocalGetIndex(e)},t.getSetLocalValue=function(e){return _BinaryenSetLocalGetValue(e)},t.isTeeLocal=function(e){return _BinaryenSetLocalIsTee(e)},t.getBinaryOp=function(e){return _BinaryenBinaryGetOp(e)},t.getBinaryLeft=function(e){return _BinaryenBinaryGetLeft(e)},t.getBinaryRight=function(e){return _BinaryenBinaryGetRight(e)},t.getUnaryOp=function(e){return _BinaryenUnaryGetOp(e)},t.getUnaryValue=function(e){return _BinaryenUnaryGetValue(e)},t.getLoadBytes=function(e){return _BinaryenLoadGetBytes(e)},t.getLoadOffset=function(e){return _BinaryenLoadGetOffset(e)},t.getLoadPtr=function(e){return _BinaryenLoadGetPtr(e)},t.isLoadSigned=function(e){return _BinaryenLoadIsSigned(e)},t.getStoreBytes=function(e){return _BinaryenStoreGetBytes(e)},t.getStoreOffset=function(e){return _BinaryenStoreGetOffset(e)},t.getStorePtr=function(e){return _BinaryenStoreGetPtr(e)},t.getStoreValue=function(e){return _BinaryenStoreGetValue(e)},t.getBlockName=function(e){return _(_BinaryenBlockGetName(e))},t.getBlockChildCount=function(e){return _BinaryenBlockGetNumChildren(e)},t.getBlockChild=function(e,t){return _BinaryenBlockGetChild(e,t)},t.getIfCondition=function(e){return _BinaryenIfGetCondition(e)},t.getIfTrue=function(e){return _BinaryenIfGetIfTrue(e)},t.getIfFalse=function(e){return _BinaryenIfGetIfFalse(e)},t.getLoopName=function(e){return _(_BinaryenLoopGetName(e))},t.getLoopBody=function(e){return _BinaryenLoopGetBody(e)},t.getBreakName=function(e){return _(_BinaryenBreakGetName(e))},t.getBreakCondition=function(e){return _BinaryenBreakGetCondition(e)},t.getSelectThen=function(e){return _BinaryenSelectGetIfTrue(e)},t.getSelectElse=function(e){return _BinaryenSelectGetIfFalse(e)},t.getSelectCondition=function(e){return _BinaryenSelectGetCondition(e)},t.getDropValue=function(e){return _BinaryenDropGetValue(e)},t.getReturnValue=function(e){return _BinaryenReturnGetValue(e)},t.getCallTarget=function(e){return _(_BinaryenCallGetTarget(e))},t.getHostOp=function(e){return _BinaryenHostGetOp(e)},t.getHostOperandCount=function(e){return _BinaryenHostGetNumOperands(e)},t.getHostOperand=function(e,t){return _BinaryenHostGetOperand(e,t)},t.getHostName=function(e){return _(_BinaryenHostGetNameOperand(e))},t.getFunctionBody=function(e){return _BinaryenFunctionGetBody(e)},t.getFunctionName=function(e){return _(_BinaryenFunctionGetName(e))},t.getFunctionParamCount=function(e){return _BinaryenFunctionGetNumParams(e)},t.getFunctionParamType=function(e,t){return _BinaryenFunctionGetParam(e,t)},t.getFunctionResultType=function(e){return _BinaryenFunctionGetResult(e)};var c=function(){function e(){}return e.create=function(t){var r=new e;return r.module=t,r.ref=_RelooperCreate(),r},e.prototype.addBlock=function(e){return _RelooperAddBlock(this.ref,e)},e.prototype.addBranch=function(e,t,r,n){void 0===r&&(r=0),void 0===n&&(n=0),_RelooperAddBranch(e,t,r,n)},e.prototype.addBlockWithSwitch=function(e,t){return _RelooperAddBlockWithSwitch(this.ref,e,t)},e.prototype.addBranchForSwitch=function(e,t,r,n){void 0===n&&(n=0);var i=l(r);try{_RelooperAddBranchForSwitch(e,t,i,r.length,n)}finally{free_memory(i)}},e.prototype.renderAndDispose=function(e,t){return _RelooperRenderAndDispose(this.ref,e,t,this.module.ref)},e}();function p(e){if(!e)return 0;for(var t=e.length,r=allocate_memory(t),n=r,i=0;i<t;++i)store(n++,e[i]);return r}function l(e){if(!e)return 0;for(var t=allocate_memory(e.length<<2),r=t,n=0,i=e.length;n<i;++n){var a=e[n];store(r,255&a),store(r+1,a>>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function u(e){return l(e)}function h(e){if(null==e)return 0;for(var t=allocate_memory(function(e){for(var t=0,r=0,n=e.length;r<n;++r){var i=e.charCodeAt(r);i>=55296&&i<=57343&&r+1<n&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++r)),i<=127?++t:t+=i<=2047?2:i<=65535?3:i<=2097151?4:i<=67108863?5:6}return t}(e)+1),r=t,n=0,i=e.length;n<i;++n){var a=e.charCodeAt(n);a>=55296&&a<=57343&&n+1<i&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++n)),a<=127?store(r++,a):a<=2047?(store(r++,192|a>>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),t}function d(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function _(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.Relooper=c,t.readString=_;var m=function(){return function(){}}();t.BinaryModule=m},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},a=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var s,o=r(0),c=r(1),p=r(6),l=r(2),u=r(4),h=r(18),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function y(e,t){switch(assert(t.length),e){case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return s.INDEXED_GET;if("[]="==t)return s.INDEXED_SET;break;case 123:if("{}"==t)return s.UNCHECKED_INDEXED_GET;if("{}="==t)return s.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return s.ADD;break;case 45:if("-"==t)return s.SUB;break;case 42:if("*"==t)return s.MUL;if("**"==t)return s.POW;break;case 47:if("/"==t)return s.DIV;break;case 37:if("%"==t)return s.REM;break;case 38:if("&"==t)return s.BITWISE_AND;break;case 124:if("|"==t)return s.BITWISE_OR;break;case 94:if("^"==t)return s.BITWISE_XOR;break;case 61:if("=="==t)return s.EQ;break;case 33:if("!="==t)return s.NE;break;case 62:if(">"==t)return s.GT;if(">="==t)return s.GE;if(">>"==t)return s.BITWISE_SHR;if(">>>"==t)return s.BITWISE_SHR_U;break;case 60:if("<"==t)return s.LT;if("<="==t)return s.LE;if("<<"==t)return s.BITWISE_SHL}break;case l.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return s.PLUS;if("++"==t)return s.PREFIX_INC;break;case 45:if("-"==t)return s.MINUS;if("--"==t)return s.PREFIX_DEC;break;case 33:if("!"==t)return s.NOT;break;case 126:if("~"==t)return s.BITWISE_NOT}break;case l.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return s.POSTFIX_INC;break;case 45:if("--"==t)return s.POSTFIX_DEC}}return s.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(s=t.OperatorKind||(t.OperatorKind={}));var g,E,T=new Map,f=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=T,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.resolver=new h.Resolver(r),r.sources=[],r}return n(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r<n;++r){var i=t[r];if(i.normalizedPath==e)return i}return null},t.prototype.lookupSourceByPath=function(e){var t;return this.getSource(e+".ts")||this.getSource(e+"/index.ts")||this.getSource((t=o.LIBRARY_PREFIX+e)+".ts")||this.getSource(t+"/index.ts")},t.prototype.initialize=function(e){var t,r,n,s;this.options=e,this.typesLookup=new Map([["i8",p.Type.i8],["i16",p.Type.i16],["i32",p.Type.i32],["i64",p.Type.i64],["isize",e.isizeType],["u8",p.Type.u8],["u16",p.Type.u16],["u32",p.Type.u32],["u64",p.Type.u64],["usize",e.usizeType],["bool",p.Type.bool],["f32",p.Type.f32],["f64",p.Type.f64],["void",p.Type.void],["number",p.Type.f64],["boolean",p.Type.bool]]),this.setConstantInteger("ASC_TARGET",p.Type.i32,i64_new(e.isWasm64?2:1)),this.setConstantInteger("ASC_NO_TREESHAKING",p.Type.bool,i64_new(e.noTreeShaking?1:0,0)),this.setConstantInteger("ASC_NO_ASSERT",p.Type.bool,i64_new(e.noAssert?1:0,0)),this.setConstantInteger("ASC_MEMORY_BASE",p.Type.i32,i64_new(e.memoryBase,0)),this.setConstantInteger("ASC_OPTIMIZE_LEVEL",p.Type.i32,i64_new(e.optimizeLevelHint,0)),this.setConstantInteger("ASC_SHRINK_LEVEL",p.Type.i32,i64_new(e.shrinkLevelHint,0)),this.setConstantInteger("ASC_FEATURE_MUTABLE_GLOBAL",p.Type.bool,i64_new(e.hasFeature(2)?1:0,0)),this.setConstantInteger("ASC_FEATURE_SIGN_EXTENSION",p.Type.bool,i64_new(e.hasFeature(1)?1:0,0));for(var u=new Array,h=new Map,d=new Array,_=new Array,m=0,y=this.sources.length;m<y;++m){var E=this.sources[m],T=new A(this,E);this.elementsLookup.set(T.internalName,T),this.currentFilespace=T;for(var f=E.statements,I=0,v=f.length;I<v;++I){var C=f[I];switch(C.kind){case l.NodeKind.CLASSDECLARATION:this.initializeClass(C,d,_);break;case l.NodeKind.ENUMDECLARATION:this.initializeEnum(C);break;case l.NodeKind.EXPORT:this.initializeExports(C,h);break;case l.NodeKind.FUNCTIONDECLARATION:this.initializeFunction(C);break;case l.NodeKind.IMPORT:this.initializeImports(C,h,u);break;case l.NodeKind.INTERFACEDECLARATION:this.initializeInterface(C);break;case l.NodeKind.NAMESPACEDECLARATION:this.initializeNamespace(C,d,_);break;case l.NodeKind.TYPEDECLARATION:this.initializeTypeAlias(C);break;case l.NodeKind.VARIABLE:this.initializeVariables(C)}}}for(m=0;m<u.length;){var N=u[m];if(Q=N.declaration)(x=this.tryLocateImport(N.externalName,h))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(x=this.tryLocateImport(N.externalNameAlt,h))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(this.error(c.DiagnosticCode.Module_0_has_no_exported_member_1,Q.range,Q.parent.path.value,Q.externalName.text),++m);else(x=this.elementsLookup.get(N.externalName))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(x=this.elementsLookup.get(N.externalNameAlt))?(this.elementsLookup.set(N.localName,x),u.splice(m,1)):(assert(!1),++m)}try{for(var O=i(h),S=O.next();!S.done;S=O.next()){var L=a(S.value,2),b=L[0],k=L[1],R=k,x=void 0;do{if(!R.isReExport){(x=this.elementsLookup.get(R.externalName))||(x=this.elementsLookup.get(R.member.name.text))?this.setExportAndCheckLibrary(b,x,R.member.externalName):this.error(c.DiagnosticCode.Cannot_find_name_0,k.member.range,k.member.name.text);break}if(x=this.fileLevelExports.get(R.externalName)){this.setExportAndCheckLibrary(b,x,R.member.externalName);break}(R=h.get(R.externalName))||this.error(c.DiagnosticCode.Module_0_has_no_exported_member_1,k.member.externalName.range,k.member.parent.path.value,k.member.externalName.text)}while(R)}}catch(e){t={error:e}}finally{try{S&&!S.done&&(r=O.return)&&r.call(O)}finally{if(t)throw t.error}}var F=this.resolver;for(m=0,y=d.length;m<y;++m){var D=d[m],B=D.declaration,U=assert(B.extendsType),P=F.resolveIdentifier(U.name,null);if(P)if(P.kind==g.CLASS_PROTOTYPE){var w=P;D.basePrototype=w}else this.error(c.DiagnosticCode.A_class_may_only_extend_another_class,U.range)}var M=e.globalAliases;if(M)try{for(var G=i(M),K=G.next();!K.done;K=G.next()){var z=a(K.value,2),V=z[0],H=z[1];if(H.length){if(!(x=this.elementsLookup.get(H)))throw new Error("element not found: "+H);this.elementsLookup.set(V,x)}}}catch(e){n={error:e}}finally{try{K&&!K.done&&(s=G.return)&&s.call(G)}finally{if(n)throw n.error}}var X=this.elementsLookup.get("Array");X&&(assert(X.kind==g.CLASS_PROTOTYPE),this.arrayPrototype=X);var W=this.elementsLookup.get("String");if(W){assert(W.kind==g.CLASS_PROTOTYPE);var Y=F.resolveClass(W,null);if(Y)if(this.typesLookup.has("string")){var Q=W.declaration;this.error(c.DiagnosticCode.Duplicate_identifier_0,Q.name.range,Q.programLevelInternalName)}else this.stringInstance=Y,this.typesLookup.set("string",Y.type)}x=assert(this.elementsLookup.get("start"));(assert(x.kind==g.FUNCTION_PROTOTYPE),this.startFunction=x,this.moduleLevelExports.has("main"))&&((x=this.moduleLevelExports.get("main")).kind!=g.FUNCTION_PROTOTYPE||x.isAny(o.CommonFlags.GENERIC|o.CommonFlags.AMBIENT)||(x.set(o.CommonFlags.MAIN),this.mainFunction=x))},t.prototype.setConstantInteger=function(e,t,r){assert(t.is(4)),this.elementsLookup.set(e,new L(this,e,e,t,null,E.NONE).withConstantIntegerValue(r))},t.prototype.setConstantFloat=function(e,t,r){assert(t.is(8)),this.elementsLookup.set(e,new L(this,e,e,t,null,E.NONE).withConstantFloatValue(r))},t.prototype.tryLocateImport=function(e,t){for(var r,n=this.fileLevelExports;;){if(r=n.get(e))return r;var i=t.get(e);if(!i)break;if(!i.isReExport)return this.elementsLookup.get(i.externalName);e=i.externalName}return null},t.prototype.checkDecorators=function(e,t){for(var r=E.NONE,n=0,i=e.length;n<i;++n){var a=e[n],s=I(l.decoratorNameToKind(a.name));s&&(t&s?r&s?this.error(c.DiagnosticCode.Duplicate_decorator,a.range,a.name.range.toString()):r|=s:this.error(c.DiagnosticCode.Decorator_0_is_not_valid_here,a.range,a.name.range.toString()))}return r},t.prototype.checkGlobal=function(e,t){var r=t.parent;if(e.hasDecorator(E.GLOBAL)||t.range.source.is(o.CommonFlags.BUILTIN)||t.range.source.isLibrary&&e.is(o.CommonFlags.EXPORT)&&(assert(r).kind==l.NodeKind.SOURCE||r.kind==l.NodeKind.VARIABLE&&assert(r.parent).kind==l.NodeKind.SOURCE)){var n=t.programLevelInternalName;this.elementsLookup.has(n)?this.error(c.DiagnosticCode.Duplicate_identifier_0,t.name.range,e.internalName):(this.elementsLookup.set(n,e),e.is(o.CommonFlags.BUILTIN)&&(e.internalName=n))}},t.prototype.initializeClass=function(e,t,r,n){void 0===n&&(n=null);var i=e.fileLevelInternalName;if(this.elementsLookup.has(i))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i);else{var a=e.decorators,s=e.name.text,p=new P(this,s,i,e,a?this.checkDecorators(a,E.GLOBAL|E.SEALED|E.UNMANAGED):E.NONE);p.parent=n,this.elementsLookup.set(i,p);var u=e.implementsTypes;if(u){var h=u.length;if(p.hasDecorator(E.UNMANAGED))h&&this.error(c.DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,l.Range.join(e.name.range,u[h-1].range));else if(h){for(var d=0;d<h;++d)this.warning(c.DiagnosticCode.Operation_not_supported,u[d].range);r.push(p)}}if(e.extendsType&&t.push(p),n){if(n.members){if(n.members.has(s))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i)}else n.members=new Map;n.members.set(s,p),n.is(o.CommonFlags.MODULE_EXPORT)&&p.is(o.CommonFlags.EXPORT)&&p.set(o.CommonFlags.MODULE_EXPORT)}else if(p.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(i))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,i);if(this.fileLevelExports.set(i,p),this.currentFilespace.members.set(s,p),p.is(o.CommonFlags.EXPORT)&&e.range.source.isEntry){if(this.moduleLevelExports.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,this.moduleLevelExports.get(s).internalName);p.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(s,p)}}for(var _=e.members,m=(d=0,_.length);d<m;++d){var y=_[d];switch(y.kind){case l.NodeKind.FIELDDECLARATION:this.initializeField(y,p);break;case l.NodeKind.METHODDECLARATION:y.isAny(o.CommonFlags.GET|o.CommonFlags.SET)?this.initializeAccessor(y,p):this.initializeMethod(y,p);break;default:return void assert(!1)}}this.checkGlobal(p,e)}},t.prototype.initializeField=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=e.decorators,a=t.kind==g.INTERFACE_PROTOTYPE;if(e.is(o.CommonFlags.STATIC)){if(a&&assert(!1),this.elementsLookup.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n);if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;var s=new L(this,r,n,p.Type.void,e,i?this.checkDecorators(i,E.NONE):E.NONE);s.parent=t,t.members.set(r,s),this.elementsLookup.set(n,s),t.is(o.CommonFlags.MODULE_EXPORT)&&s.set(o.CommonFlags.MODULE_EXPORT)}else{if(a&&assert(!e.isAny(o.CommonFlags.ABSTRACT|o.CommonFlags.GET|o.CommonFlags.SET)),t.instanceMembers){if(t.instanceMembers.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;var l=new D(t,r,n,e);i&&this.checkDecorators(i,E.NONE),t.instanceMembers.set(r,l)}},t.prototype.initializeMethod=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=null,a=e.decorators,s=E.NONE;if(a&&(s=this.checkDecorators(a,E.OPERATOR_BINARY|E.OPERATOR_PREFIX|E.OPERATOR_POSTFIX|E.INLINE)),e.is(o.CommonFlags.STATIC)){if(assert(e.name.kind!=l.NodeKind.CONSTRUCTOR),this.elementsLookup.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n);if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;i=new R(this,r,n,e,t,s),t.members.set(r,i),this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else{if(t.instanceMembers){if(t.instanceMembers.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;i=new R(this,r,n,e,t,s),e.name.kind==l.NodeKind.CONSTRUCTOR?t.constructorPrototype?this.error(c.DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,e.name.range):(i.set(o.CommonFlags.CONSTRUCTOR),t.constructorPrototype=i):t.instanceMembers.set(r,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}this.checkOperatorOverloads(e.decorators,i,t)},t.prototype.checkOperatorOverloads=function(e,t,r){if(e)for(var n=0,i=e.length;n<i;++n){var a=e[n];switch(a.decoratorKind){case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:case l.DecoratorKind.OPERATOR_PREFIX:case l.DecoratorKind.OPERATOR_POSTFIX:var o=a.arguments&&a.arguments.length||0;if(1==o){var p=a.arguments[0];if(p.kind==l.NodeKind.LITERAL&&p.literalKind==l.LiteralKind.STRING){var u=y(a.decoratorKind,p.value);if(u==s.INVALID)this.error(c.DiagnosticCode.Operation_not_supported,p.range);else{var h=r.overloadPrototypes;h.has(u)?this.error(c.DiagnosticCode.Duplicate_function_implementation,p.range):(t.operatorKind=u,h.set(u,t))}}else this.error(c.DiagnosticCode.String_literal_expected,p.range)}else this.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,a.range,"1",o.toString(0))}}},t.prototype.initializeAccessor=function(e,t){var r=e.name.text,n=e.fileLevelInternalName,i=this.elementsLookup.get(n),a=e.is(o.CommonFlags.GET),s=!1;if(i){if(i.kind!=g.PROPERTY||null!=(a?i.getterPrototype:i.setterPrototype))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else i=new U(this,r,n,t),s=!0;var p=e.decorators,l=E.NONE;p&&(l=this.checkDecorators(p,E.INLINE));var u=(a?o.GETTER_PREFIX:o.SETTER_PREFIX)+r;if(e.is(o.CommonFlags.STATIC)){var h=t.internalName+o.STATIC_DELIMITER+u;if(this.elementsLookup.has(h))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,h);var d=new R(this,u,h,e,null,l);if(a?i.getterPrototype=d:i.setterPrototype=d,s){if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,h)}else t.members=new Map;t.members.set(r,i)}else assert(t.members&&t.members.has(r));this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else{var _=t.internalName+o.INSTANCE_DELIMITER+u;if(t.instanceMembers){if(t.instanceMembers.has(u))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.instanceMembers=new Map;var m=new R(this,u,_,e,t,l);a?i.getterPrototype=m:i.setterPrototype=m,t.instanceMembers.set(u,i),this.elementsLookup.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&(i.set(o.CommonFlags.MODULE_EXPORT),m.set(o.CommonFlags.MODULE_EXPORT))}},t.prototype.initializeEnum=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.name.text,i=new N(this,n,r,e);if(i.parent=t,this.elementsLookup.set(r,i),t){if(t.members){if(t.members.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(n,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.is(o.CommonFlags.EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)}else if(i.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,i),this.currentFilespace.members.set(n,i),e.range.source.isEntry){if(this.moduleLevelExports.has(n))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,this.moduleLevelExports.get(n).internalName);i.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(n,i)}}for(var a=e.values,s=0,p=a.length;s<p;++s)this.initializeEnumValue(a[s],i);this.checkGlobal(i,e)}},t.prototype.initializeEnumValue=function(e,t){var r=e.name.text,n=e.fileLevelInternalName;if(t.members){if(t.members.has(r))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,n)}else t.members=new Map;var i=new O(t,this,r,n,e);t.members.set(r,i),t.is(o.CommonFlags.MODULE_EXPORT)&&i.set(o.CommonFlags.MODULE_EXPORT)},t.prototype.initializeExports=function(e,t){var r=e.members;if(r)for(var n=0,i=r.length;n<i;++n)this.initializeExport(r[n],e.internalPath,t);else this.error(c.DiagnosticCode.Operation_not_supported,e.range)},t.prototype.setExportAndCheckLibrary=function(e,t,r){this.fileLevelExports.set(e,t);var n=r.range.source.internalPath,i=o.FILESPACE_PREFIX+n,a=this.elementsLookup.get(i);a||(a=assert(this.elementsLookup.get(i+o.PATH_DELIMITER+"index"))),assert(a.kind==g.FILESPACE);var s=r.text;a.members.set(s,t),r.range.source.isLibrary&&(this.elementsLookup.has(s)?this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,r.range,s):(t.internalName=s,this.elementsLookup.set(s,t)))},t.prototype.initializeExport=function(e,t,r){var n,i,a,s=e.range.source.internalPath+o.PATH_DELIMITER+e.externalName.text;if(this.fileLevelExports.has(s))this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);else if(null==t){if(n=e.range.source.internalPath+o.PATH_DELIMITER+e.name.text,i=this.elementsLookup.get(n))return void this.setExportAndCheckLibrary(s,i,e.externalName);if(r.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);(a=new _).isReExport=!1,a.externalName=n,a.member=e,r.set(s,a)}else{if(n=t+o.PATH_DELIMITER+e.name.text,i=this.elementsLookup.get(n))return void this.setExportAndCheckLibrary(s,i,e.externalName);for(var p=new Set;a=r.get(n);){if(!a.isReExport){if(i=this.elementsLookup.get(a.externalName))return void this.setExportAndCheckLibrary(s,i,e.externalName);break}if(i=this.fileLevelExports.get(a.externalName))return void this.setExportAndCheckLibrary(s,i,e.externalName);if(n=a.externalName,p.has(a))break;p.add(a)}if(r.has(s))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.externalName.range,s);(a=new _).isReExport=!0,a.externalName=n,a.member=e,r.set(s,a)}},t.prototype.initializeFunction=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.name.text,i=e.decorators,a=new R(this,n,r,e,null,i?this.checkDecorators(i,E.GLOBAL|E.INLINE|E.EXTERNAL):E.NONE);if(a.parent=t,this.elementsLookup.set(r,a),t){if(t.members){if(t.members.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(n,a),t.is(o.CommonFlags.MODULE_EXPORT)&&a.is(o.CommonFlags.EXPORT)&&(a.parent=t,a.set(o.CommonFlags.MODULE_EXPORT))}else if(a.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,a),this.currentFilespace.members.set(n,a),e.range.source.isEntry){if(this.moduleLevelExports.has(n))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(n).internalName);a.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(n,a)}}this.checkGlobal(a,e)}},t.prototype.initializeImports=function(e,t,r){var n=e.declarations;if(n)for(var i=0,a=n.length;i<a;++i)this.initializeImport(n[i],e.internalPath,t,r);else if(e.namespaceName){var s=e.namespaceName.text,p=e.range.source.internalPath+o.PATH_DELIMITER+s;if(this.elementsLookup.has(p))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.namespaceName.range,p);var l=this.elementsLookup.get(e.internalPath);if(l)return void this.elementsLookup.set(p,l);var u=new d;u.localName=p;var h=o.FILESPACE_PREFIX+e.internalPath;u.externalName=h,u.externalNameAlt=h+o.PATH_DELIMITER+"index",u.declaration=null,r.push(u)}},t.prototype.initializeImport=function(e,t,r,n){var i=e.fileLevelInternalName;if(this.elementsLookup.has(i))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i);else{var a,s=t+o.PATH_DELIMITER+e.externalName.text;if(a=this.fileLevelExports.get(s))this.elementsLookup.set(i,a);else{var p=o.PATH_DELIMITER+"index",l=new d;l.localName=i,t.endsWith(p)?(l.externalName=s,l.externalNameAlt=t.substring(0,t.length-p.length+1)+e.externalName.text):(l.externalName=s,l.externalNameAlt=t+p+o.PATH_DELIMITER+e.externalName.text),l.declaration=e,n.push(l)}}},t.prototype.initializeInterface=function(e,t){void 0===t&&(t=null);var r=e.fileLevelInternalName;if(this.elementsLookup.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=e.decorators,i=e.name.text,a=new M(this,i,r,e,n?this.checkDecorators(n,E.GLOBAL):E.NONE);if(a.parent=t,this.elementsLookup.set(r,a),t){if(t.members){if(t.members.has(a.internalName))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r)}else t.members=new Map;t.members.set(a.internalName,a),t.is(o.CommonFlags.MODULE_EXPORT)&&a.is(o.CommonFlags.EXPORT)&&a.set(o.CommonFlags.MODULE_EXPORT)}else if(a.is(o.CommonFlags.EXPORT)){if(this.fileLevelExports.has(r))return void this.error(c.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,e.name.range,r);if(this.fileLevelExports.set(r,a),this.currentFilespace.members.set(i,a),e.range.source.isEntry){if(this.moduleLevelExports.has(i))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(i).internalName);a.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(i,a)}}for(var s=e.members,p=0,u=s.length;p<u;++p){var h=s[p];switch(h.kind){case l.NodeKind.FIELDDECLARATION:this.initializeField(h,a);break;case l.NodeKind.METHODDECLARATION:h.isAny(o.CommonFlags.GET|o.CommonFlags.SET)?this.initializeAccessor(h,a):this.initializeMethod(h,a);break;default:throw new Error("interface member expected")}}this.checkGlobal(a,e)}},t.prototype.initializeNamespace=function(e,t,r,n){void 0===n&&(n=null);var i=e.fileLevelInternalName,a=e.name.text,s=this.elementsLookup.get(i);if(s||((s=new C(this,a,i,e)).parent=n,this.elementsLookup.set(i,s),this.checkGlobal(s,e)),n){if(n.members){if(n.members.has(a))return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,i)}else n.members=new Map;n.members.set(a,s),n.is(o.CommonFlags.MODULE_EXPORT)&&s.is(o.CommonFlags.EXPORT)&&s.set(o.CommonFlags.MODULE_EXPORT)}else if(s.is(o.CommonFlags.EXPORT)){var p=this.fileLevelExports.get(i);if(p?(p.is(o.CommonFlags.EXPORT)||this.error(c.DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,e.name.range,s.internalName),s=p):this.fileLevelExports.set(i,s),this.currentFilespace.members.set(a,s),e.range.source.isEntry){if(this.moduleLevelExports.has(a)){if(this.moduleLevelExports.get(a)!==s)return void this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,this.moduleLevelExports.get(a).internalName)}else this.moduleLevelExports.set(a,s);s.set(o.CommonFlags.MODULE_EXPORT)}}for(var u=e.members,h=0,d=u.length;h<d;++h)switch(u[h].kind){case l.NodeKind.CLASSDECLARATION:this.initializeClass(u[h],t,r,s);break;case l.NodeKind.ENUMDECLARATION:this.initializeEnum(u[h],s);break;case l.NodeKind.FUNCTIONDECLARATION:this.initializeFunction(u[h],s);break;case l.NodeKind.INTERFACEDECLARATION:this.initializeInterface(u[h],s);break;case l.NodeKind.NAMESPACEDECLARATION:this.initializeNamespace(u[h],t,r,s);break;case l.NodeKind.TYPEDECLARATION:this.error(c.DiagnosticCode.Operation_not_supported,u[h].range);break;case l.NodeKind.VARIABLE:this.initializeVariables(u[h],s);break;default:throw new Error("namespace member expected")}},t.prototype.initializeTypeAlias=function(e,t){void 0===t&&(t=null);var r=e.name.text;if(this.typesLookup.has(r)||this.typeAliases.has(r))this.error(c.DiagnosticCode.Duplicate_identifier_0,e.name.range,r);else{var n=new m;n.typeParameters=e.typeParameters,n.type=e.type,this.typeAliases.set(r,n)}},t.prototype.initializeVariables=function(e,t){void 0===t&&(t=null);for(var r=e.declarations,n=0,i=r.length;n<i;++n){var a=r[n],s=a.decorators,l=a.fileLevelInternalName;if(this.elementsLookup.has(l))this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l);else{var u=a.name.text,h=new L(this,u,l,p.Type.void,a,s?this.checkDecorators(s,E.GLOBAL|E.EXTERNAL):E.NONE);if(h.parent=t,this.elementsLookup.set(l,h),t){if(t.members){if(t.members.has(u)){this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l);continue}}else t.members=new Map;t.members.set(u,h),t.is(o.CommonFlags.MODULE_EXPORT)&&h.is(o.CommonFlags.EXPORT)&&h.set(o.CommonFlags.MODULE_EXPORT)}else if(h.is(o.CommonFlags.EXPORT)&&(this.fileLevelExports.has(l)?this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,l):this.fileLevelExports.set(l,h),this.currentFilespace.members.set(u,h),a.range.source.isEntry)){if(this.moduleLevelExports.has(u)){this.error(c.DiagnosticCode.Duplicate_identifier_0,a.name.range,this.moduleLevelExports.get(u).internalName);continue}h.set(o.CommonFlags.MODULE_EXPORT),this.moduleLevelExports.set(u,h)}this.checkGlobal(h,a)}}},t}(c.DiagnosticEmitter);function I(e){switch(e){case l.DecoratorKind.GLOBAL:return E.GLOBAL;case l.DecoratorKind.OPERATOR:case l.DecoratorKind.OPERATOR_BINARY:return E.OPERATOR_BINARY;case l.DecoratorKind.OPERATOR_PREFIX:return E.OPERATOR_PREFIX;case l.DecoratorKind.OPERATOR_POSTFIX:return E.OPERATOR_POSTFIX;case l.DecoratorKind.UNMANAGED:return E.UNMANAGED;case l.DecoratorKind.SEALED:return E.SEALED;case l.DecoratorKind.INLINE:return E.INLINE;case l.DecoratorKind.EXTERNAL:return E.EXTERNAL;default:return E.NONE}}t.Program=f,function(e){e[e.GLOBAL=0]="GLOBAL",e[e.LOCAL=1]="LOCAL",e[e.ENUM=2]="ENUM",e[e.ENUMVALUE=3]="ENUMVALUE",e[e.FUNCTION_PROTOTYPE=4]="FUNCTION_PROTOTYPE",e[e.FUNCTION=5]="FUNCTION",e[e.FUNCTION_TARGET=6]="FUNCTION_TARGET",e[e.CLASS_PROTOTYPE=7]="CLASS_PROTOTYPE",e[e.CLASS=8]="CLASS",e[e.INTERFACE_PROTOTYPE=9]="INTERFACE_PROTOTYPE",e[e.INTERFACE=10]="INTERFACE",e[e.FIELD_PROTOTYPE=11]="FIELD_PROTOTYPE",e[e.FIELD=12]="FIELD",e[e.PROPERTY=13]="PROPERTY",e[e.NAMESPACE=14]="NAMESPACE",e[e.FILESPACE=15]="FILESPACE"}(g=t.ElementKind||(t.ElementKind={})),function(e){e[e.NONE=0]="NONE",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR_BINARY=2]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=8]="OPERATOR_POSTFIX",e[e.UNMANAGED=16]="UNMANAGED",e[e.SEALED=32]="SEALED",e[e.INLINE=64]="INLINE",e[e.EXTERNAL=128]="EXTERNAL"}(E=t.DecoratorFlags||(t.DecoratorFlags={})),t.decoratorKindToFlag=I;var v=function(){function e(e,t,r){this.flags=o.CommonFlags.NONE,this.decoratorFlags=E.NONE,this.members=null,this.parent=null,this.program=e,this.simpleName=t,this.internalName=r}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.hasDecorator=function(e){return(this.decoratorFlags&e)==e},e}();t.Element=v;var A=function(e){function t(t,r){var n=e.call(this,t,r.internalPath,o.FILESPACE_PREFIX+r.internalPath)||this;return n.kind=g.FILESPACE,n.members=new Map,n}return n(t,e),t}(v);t.Filespace=A;var C=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=g.NAMESPACE,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(v);t.Namespace=C;var N=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=g.ENUM,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(v);t.Enum=N;var O=function(e){function t(t,r,n,i,a){var s=e.call(this,r,n,i)||this;return s.kind=g.ENUMVALUE,s.constantValue=0,s.parent=t,s.declaration=a,s}return n(t,e),t}(v);t.EnumValue=O,function(e){e[e.NONE=0]="NONE",e[e.INTEGER=1]="INTEGER",e[e.FLOAT=2]="FLOAT"}(t.ConstantValueKind||(t.ConstantValueKind={}));var S=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n)||this;return s.constantValueKind=0,s.type=i,s.declaration=a,s}return n(t,e),t.prototype.withConstantIntegerValue=function(e){return this.constantValueKind=1,this.constantIntegerValue=e,this.set(o.CommonFlags.CONST|o.CommonFlags.INLINED),this},t.prototype.withConstantFloatValue=function(e){return this.constantValueKind=2,this.constantFloatValue=e,this.set(o.CommonFlags.CONST|o.CommonFlags.INLINED),this},t}(v);t.VariableLikeElement=S;var L=function(e){function t(t,r,n,i,a,s){var c=e.call(this,t,r,n,i,a)||this;return c.kind=g.GLOBAL,c.flags=a?a.flags:o.CommonFlags.NONE,c.decoratorFlags=s,c.type=i,c}return n(t,e),t}(S);t.Global=L;var b=function(){return function(e,t,r){void 0===r&&(r=null),this.name=e,this.type=t,this.initializer=r}}();t.Parameter=b;var k=function(e){function t(t,r,n,i,a){void 0===a&&(a=null);var s=e.call(this,t,r,r,i,a)||this;return s.kind=g.LOCAL,s.scopedGlobal=null,s.index=n,s}return n(t,e),t}(S);t.Local=k;var R=function(e){function t(t,r,n,i,a,o){void 0===a&&(a=null),void 0===o&&(o=E.NONE);var c=e.call(this,t,r,n)||this;return c.kind=g.FUNCTION_PROTOTYPE,c.instances=new Map,c.classTypeArguments=null,c.operatorKind=s.INVALID,c.declaration=i,c.flags=i.flags,c.classPrototype=a,c.decoratorFlags=o,c}return n(t,e),t.prototype.toString=function(){return this.simpleName},t}(v);t.FunctionPrototype=R;var x=function(e){function t(t,r,n,s,c){var p,l;void 0===s&&(s=null),void 0===c&&(c=null);var u=e.call(this,t.program,t.simpleName,r)||this;if(u.kind=g.FUNCTION,u.localsByName=new Map,u.localsByIndex=[],u.additionalLocals=[],u.breakContext=null,u.debugLocations=[],u.ref=0,u.functionTableIndex=-1,u.trampoline=null,u.outerScope=null,u.nextBreakId=0,u.breakStack=null,u.nextInlineId=0,u.tempI32s=null,u.tempI64s=null,u.tempF32s=null,u.tempF64s=null,u.prototype=t,u.signature=n,u.parent=s,u.flags=t.flags,u.decoratorFlags=t.decoratorFlags,u.contextualTypeArguments=c,!t.is(o.CommonFlags.AMBIENT|o.CommonFlags.BUILTIN)&&!t.is(o.CommonFlags.DECLARE)){var h=0;if(s&&s.kind==g.CLASS){assert(u.is(o.CommonFlags.INSTANCE));var d=new k(t.program,"this",h++,assert(n.thisType));u.localsByName.set("this",d),u.localsByIndex[d.index]=d;var _=s.contextualTypeArguments;if(_){u.contextualTypeArguments||(u.contextualTypeArguments=new Map);try{for(var m=i(_),y=m.next();!y.done;y=m.next()){var E=a(y.value,2),T=E[0],f=E[1];u.contextualTypeArguments.has(T)||u.contextualTypeArguments.set(T,f)}}catch(e){p={error:e}}finally{try{y&&!y.done&&(l=m.return)&&l.call(m)}finally{if(p)throw p.error}}}}else assert(!u.is(o.CommonFlags.INSTANCE));for(var I=n.parameterTypes,v=0,A=I.length;v<A;++v){var C=I[v],N=n.getParameterName(v);d=new k(t.program,N,h++,C);u.localsByName.set(N,d),u.localsByIndex[d.index]=d}}return u.flow=K.create(u),u}return n(t,e),t.prototype.addLocal=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.signature.parameterTypes.length+this.additionalLocals.length;this.is(o.CommonFlags.INSTANCE)&&++n;var i=new k(this.prototype.program,t||"var$"+n.toString(10),n,e,r);if(t){if(this.localsByName.has(t))throw new Error("duplicate local name");this.localsByName.set(t,i)}return this.localsByIndex[i.index]=i,this.additionalLocals.push(e),i},t.prototype.getTempLocal=function(e,t){var r,n;switch(void 0===t&&(t=!1),e.toNativeType()){case u.NativeType.I32:r=this.tempI32s;break;case u.NativeType.I64:r=this.tempI64s;break;case u.NativeType.F32:r=this.tempF32s;break;case u.NativeType.F64:r=this.tempF64s;break;default:throw new Error("concrete type expected")}return r&&r.length?((n=r.pop()).type=e,n.flags=o.CommonFlags.NONE):n=this.addLocal(e),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.freeTempLocal=function(e){if(!e.is(o.CommonFlags.INLINED)){var t;switch(assert(e.index>=0),assert(null!=e.type),e.type.toNativeType()){case u.NativeType.I32:t=this.tempI32s||(this.tempI32s=[]);break;case u.NativeType.I64:t=this.tempI64s||(this.tempI64s=[]);break;case u.NativeType.F32:t=this.tempF32s||(this.tempF32s=[]);break;case u.NativeType.F64:t=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},t.prototype.getAndFreeTempLocal=function(e,t){var r,n;switch(e.toNativeType()){case u.NativeType.I32:r=this.tempI32s||(this.tempI32s=[]);break;case u.NativeType.I64:r=this.tempI64s||(this.tempI64s=[]);break;case u.NativeType.F32:r=this.tempF32s||(this.tempF32s=[]);break;case u.NativeType.F64:r=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=this.addLocal(e),r.push(n)),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.enterBreakContext=function(){var e=this.nextBreakId++;return this.breakStack?this.breakStack.push(e):this.breakStack=[e],this.breakContext=e.toString(10)},t.prototype.leaveBreakContext=function(){assert(null!=this.breakStack);var e=this.breakStack.length;assert(e>0),this.breakStack.pop(),e>1?this.breakContext=this.breakStack[e-2].toString(10):(this.breakContext=null,this.breakStack=null)},t.prototype.finalize=function(e,t){if(this.ref=t,assert(!this.breakStack||!this.breakStack.length),this.breakStack=null,this.breakContext=null,this.tempI32s=this.tempI64s=this.tempF32s=this.tempF64s=null,this.program.options.sourceMap)for(var r=this.debugLocations,n=0,i=r.length;n<i;++n){var a=r[n];e.setDebugLocation(t,a.debugInfoRef,a.source.debugInfoIndex,a.line,a.column)}},t.prototype.toString=function(){return this.prototype.simpleName},t}(v);t.Function=x;var F=function(e){function t(t,r){var n=e.call(this,t,"","")||this;n.kind=g.FUNCTION_TARGET;var i=r.toSignatureString();return n.simpleName=i,n.internalName=i,n.signature=r,n.type=p.Type.u32.asFunction(r),n}return n(t,e),t}(v);t.FunctionTarget=F;var D=function(e){function t(t,r,n,i){var a=e.call(this,t.program,r,n)||this;return a.kind=g.FIELD_PROTOTYPE,a.classPrototype=t,a.declaration=i,a.flags=i.flags,a}return n(t,e),t}(v);t.FieldPrototype=D;var B=function(e){function t(t,r,n,i,a){var s=e.call(this,t.program,t.simpleName,r,n,i)||this;return s.kind=g.FIELD,s.memoryOffset=-1,s.prototype=t,s.flags=t.flags,s.type=n,s.parent=a,s}return n(t,e),t}(S);t.Field=B;var U=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a.kind=g.PROPERTY,a.getterPrototype=null,a.setterPrototype=null,a.parent=i,a}return n(t,e),t}(v);t.Property=U;var P=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n)||this;return s.kind=g.CLASS_PROTOTYPE,s.instances=new Map,s.instanceMembers=null,s.basePrototype=null,s.constructorPrototype=null,s.overloadPrototypes=new Map,s.declaration=i,s.flags=i.flags,s.decoratorFlags=a,s}return n(t,e),t.prototype.toString=function(){return this.simpleName},t}(v);t.ClassPrototype=P;var w=function(e){function t(t,r,n,s,o){var c,p;void 0===s&&(s=null),void 0===o&&(o=null);var l=e.call(this,t.program,r,n)||this;if(l.kind=g.CLASS,l.contextualTypeArguments=null,l.currentMemoryOffset=0,l.constructorInstance=null,l.overloads=null,l.prototype=t,l.flags=t.flags,l.decoratorFlags=t.decoratorFlags,l.typeArguments=s,l.type=t.program.options.usizeType.asClass(l),l.base=o,o){var u=o.contextualTypeArguments;if(u){l.contextualTypeArguments||(l.contextualTypeArguments=new Map);try{for(var h=i(u),d=h.next();!d.done;d=h.next()){var _=a(d.value,2),m=_[0],y=_[1];l.contextualTypeArguments.set(m,y)}}catch(e){c={error:e}}finally{try{d&&!d.done&&(p=h.return)&&p.call(h)}finally{if(c)throw c.error}}}}var E,T,f=l.prototype.declaration;if(f){var I=f.typeParameters;if(s){if((T=s.length)!=I.length)throw new Error("type argument count mismatch");if(T)for(l.contextualTypeArguments||(l.contextualTypeArguments=new Map),E=0;E<T;++E)l.contextualTypeArguments.set(I[E].name.text,s[E])}else if(I.length)throw new Error("type argument count mismatch")}return l}return n(t,e),t.prototype.isAssignableTo=function(e){var t=this;do{if(t==e)return!0}while(t=t.base);return!1},t.prototype.lookupOverload=function(e,t){if(void 0===t&&(t=!1),t)switch(e){case s.INDEXED_GET:if(r=this.lookupOverload(s.UNCHECKED_INDEXED_GET))return r;break;case s.INDEXED_SET:var r;if(r=this.lookupOverload(s.UNCHECKED_INDEXED_SET))return r;break;default:assert(!1)}var n=this;do{var i=n.overloads;if(i){var a=i.get(e);if(a)return a}}while(n=n.base);return null},t.prototype.toString=function(){return this.simpleName},t}(v);t.Class=w;var M=function(e){function t(t,r,n,i,a){var s=e.call(this,t,r,n,i,a)||this;return s.kind=g.INTERFACE_PROTOTYPE,s}return n(t,e),t}(P);t.InterfacePrototype=M;var G=function(e){function t(t,r,n,i,a){void 0===i&&(i=[]),void 0===a&&(a=null);var s=e.call(this,t,r,n,i,a)||this;return s.kind=g.INTERFACE,s}return n(t,e),t}(w);t.Interface=G,function(e){e[e.NONE=0]="NONE",e[e.RETURNS=1]="RETURNS",e[e.RETURNS_WRAPPED=2]="RETURNS_WRAPPED",e[e.THROWS=4]="THROWS",e[e.BREAKS=8]="BREAKS",e[e.CONTINUES=16]="CONTINUES",e[e.ALLOCATES=32]="ALLOCATES",e[e.CONDITIONALLY_RETURNS=64]="CONDITIONALLY_RETURNS",e[e.CONDITIONALLY_THROWS=128]="CONDITIONALLY_THROWS",e[e.CONDITIONALLY_BREAKS=256]="CONDITIONALLY_BREAKS",e[e.CONDITIONALLY_CONTINUES=512]="CONDITIONALLY_CONTINUES",e[e.CONDITIONALLY_ALLOCATES=1024]="CONDITIONALLY_ALLOCATES",e[e.INLINE_CONTEXT=2048]="INLINE_CONTEXT",e[e.UNCHECKED_CONTEXT=4096]="UNCHECKED_CONTEXT",e[e.ANY_TERMINATING=29]="ANY_TERMINATING",e[e.ANY_CATEGORICAL=63]="ANY_CATEGORICAL",e[e.ANY_CONDITIONAL=1984]="ANY_CONDITIONAL"}(t.FlowFlags||(t.FlowFlags={}));var K=function(){function e(){this.scopedLocals=null}return e.create=function(t){var r=new e;return r.parent=null,r.flags=0,r.currentFunction=t,r.continueLabel=null,r.breakLabel=null,r.returnLabel=null,r.returnType=t.signature.returnType,r.contextualTypeArguments=t.contextualTypeArguments,r.wrappedLocals=i64_new(0),r.wrappedLocalsExt=null,r},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.unset=function(e){this.flags&=~e},e.prototype.fork=function(){var t=new e;return t.parent=this,t.flags=this.flags,t.currentFunction=this.currentFunction,t.continueLabel=this.continueLabel,t.breakLabel=this.breakLabel,t.returnLabel=this.returnLabel,t.returnType=this.returnType,t.contextualTypeArguments=this.contextualTypeArguments,t.wrappedLocals=this.wrappedLocals,t.wrappedLocalsExt=this.wrappedLocalsExt?this.wrappedLocalsExt.slice():null,t},e.prototype.free=function(){var e,t,r=assert(this.parent);if(this.scopedLocals){try{for(var n=i(this.scopedLocals.values()),a=n.next();!a.done;a=n.next()){var s=a.value;s.is(o.CommonFlags.SCOPED)&&this.currentFunction.freeTempLocal(s)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.scopedLocals=null}return r},e.prototype.addScopedLocal=function(e,t,r,n){var i=this.currentFunction.getTempLocal(e,!1);if(this.scopedLocals){var a=this.scopedLocals.get(t);if(a)return n?this.currentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.name.range):assert(!1),a}else this.scopedLocals=new Map;return i.set(o.CommonFlags.SCOPED),this.scopedLocals.set(t,i),e.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedLocalAlias=function(e,t,r){if(this.scopedLocals){var n=this.scopedLocals.get(r);if(n){var i=n.declaration;return i?this.currentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,i.name.range):assert(!1),n}}else this.scopedLocals=new Map;assert(e<this.currentFunction.localsByIndex.length);var a=new k(this.currentFunction.program,r,e,t,null);return this.scopedLocals.set(r,a),a},e.prototype.getScopedLocal=function(e){var t,r=this;do{if(r.scopedLocals&&(t=r.scopedLocals.get(e)))return t}while(r=r.parent);return this.currentFunction.localsByName.get(e)},e.prototype.isLocalWrapped=function(e){var t,r;if(e<64){if(e<0)return!0;t=this.wrappedLocals}else{if(!(r=this.wrappedLocalsExt))return!1;var n=(e-64)/64|0;if(n>=r.length)return!1;t=r[n],e-=64*(n+1)}return i64_ne(i64_and(t,i64_shl(i64_one,i64_new(e))),i64_zero)},e.prototype.setLocalWrapped=function(e,t){var r,n=-1;if(e<64){if(e<0)return;r=this.wrappedLocals}else{var i=this.wrappedLocalsExt;for(n=(e-64)/64|0,i||(this.wrappedLocalsExt=i=new Array(n+1),i.length=0);i.length<=n;)i.push(i64_new(0));r=i[n],e-=64*(n+1)}r=t?i64_or(r,i64_shl(i64_one,i64_new(e))):i64_and(r,i64_not(i64_shl(i64_one,i64_new(e)))),n>=0?this.wrappedLocalsExt[n]=r:this.wrappedLocals=r},e.prototype.inherit=function(e){this.flags|=2047&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(64),e.is(4)&&this.set(128),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(256),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(512),e.is(32)&&this.set(1024)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&63,this.flags|=1984&e.flags,this.flags|=1984&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.length<a;)i.push(i64_new(0));else i=new Array(a);for(var s=0;s<a;++s)i[s]=i64_and(r[s],n[s])}}},e.prototype.canOverflow=function(e,t){if(assert(t!=p.Type.void),!t.is(36))return!1;var r;switch(u.getExpressionId(e)){case u.ExpressionId.GetLocal:var n=this.currentFunction,i=n.localsByIndex[u.getGetLocalIndex(e)];return!n.flow.isLocalWrapped(i.index)||z(i.type,t);case u.ExpressionId.SetLocal:return assert(u.isTeeLocal(e)),this.canOverflow(u.getSetLocalValue(e),t);case u.ExpressionId.GetGlobal:return!1;case u.ExpressionId.Binary:switch(u.getBinaryOp(e)){case u.BinaryOp.EqI32:case u.BinaryOp.EqI64:case u.BinaryOp.EqF32:case u.BinaryOp.EqF64:case u.BinaryOp.NeI32:case u.BinaryOp.NeI64:case u.BinaryOp.NeF32:case u.BinaryOp.NeF64:case u.BinaryOp.LtI32:case u.BinaryOp.LtU32:case u.BinaryOp.LtI64:case u.BinaryOp.LtU64:case u.BinaryOp.LtF32:case u.BinaryOp.LtF64:case u.BinaryOp.LeI32:case u.BinaryOp.LeU32:case u.BinaryOp.LeI64:case u.BinaryOp.LeU64:case u.BinaryOp.LeF32:case u.BinaryOp.LeF64:case u.BinaryOp.GtI32:case u.BinaryOp.GtU32:case u.BinaryOp.GtI64:case u.BinaryOp.GtU64:case u.BinaryOp.GtF32:case u.BinaryOp.GtF64:case u.BinaryOp.GeI32:case u.BinaryOp.GeU32:case u.BinaryOp.GeI64:case u.BinaryOp.GeU64:case u.BinaryOp.GeF32:case u.BinaryOp.GeF64:return!1;case u.BinaryOp.MulI32:return!(u.getExpressionId(r=u.getBinaryLeft(e))==u.ExpressionId.Const&&(0==u.getConstValueI32(r)||1==u.getConstValueI32(r)&&!this.canOverflow(u.getBinaryRight(e),t))||u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&(0==u.getConstValueI32(r)||1==u.getConstValueI32(r)&&!this.canOverflow(u.getBinaryLeft(e),t)));case u.BinaryOp.AndI32:return!(u.getExpressionId(r=u.getBinaryLeft(e))==u.ExpressionId.Const&&u.getConstValueI32(r)<=t.computeSmallIntegerMask(p.Type.i32)||!this.canOverflow(r,t)||u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)<=t.computeSmallIntegerMask(p.Type.i32)||!this.canOverflow(r,t));case u.BinaryOp.ShlI32:var a=32-t.size;return u.getExpressionId(r=u.getBinaryRight(e))!=u.ExpressionId.Const||u.getConstValueI32(r)<a;case u.BinaryOp.ShrI32:a=32-t.size;return this.canOverflow(u.getBinaryLeft(e),t)&&(u.getExpressionId(r=u.getBinaryRight(e))!=u.ExpressionId.Const||u.getConstValueI32(r)<a);case u.BinaryOp.ShrU32:a=32-t.size;return t.is(1)?!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>a):this.canOverflow(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=a);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var s=0;switch(u.getExpressionType(e)){case u.NativeType.I32:s=u.getConstValueI32(e);break;case u.NativeType.I64:s=u.getConstValueI64Low(e);break;case u.NativeType.F32:s=i32(u.getConstValueF32(e));break;case u.NativeType.F64:s=i32(u.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return s<i8.MIN_VALUE||s>i8.MAX_VALUE;case 1:return s<i16.MIN_VALUE||s>i16.MAX_VALUE;case 5:return s<0||s>u8.MAX_VALUE;case 6:return s<0||s>u16.MAX_VALUE;case 10:return 0!=(-2&s)}break;case u.ExpressionId.Load:var o=void 0;switch(u.getLoadBytes(e)){case 1:o=u.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:o=u.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:o=u.isLoadSigned(e)?p.Type.i32:p.Type.u32}return z(o,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var c=assert(u.getBlockChildCount(e)),l=u.getBlockChild(e,c-1);return this.canOverflow(l,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var h=this.currentFunction.program,d=assert(h.instancesLookup.get(assert(u.getCallTarget(e))));assert(d.kind==g.FUNCTION);var _=d.signature.returnType;return!d.flow.is(2)||z(_,t);case u.ExpressionId.Unreachable:return!1}return!0},e.prototype.finalize=function(){assert(null==this.parent),this.continueLabel=null,this.breakLabel=null,this.returnLabel=null,this.contextualTypeArguments=null},e}();function z(e,t){var r=e.byteSize,n=t.byteSize;return!e.is(4)||r>n||e.is(1)!=t.is(1)}t.Flow=K},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.VOID=13]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE"}(t.TypeFlags||(t.TypeFlags={}));var i=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(e,t){var r,n,i,a;if(void 0===t&&(t=!1),this.is(256)){if(e.is(256)&&(!this.is(512)||e.is(512)))if(r=this.classReference){if(n=e.classReference)return r.isAssignableTo(n)}else if((i=this.signatureReference)&&(a=e.signatureReference))return i.isAssignableTo(a)}else if(!e.is(256))if(this.is(4))if(e.is(4)){if(!t||this.is(1)==e.is(1))return this.size<=e.size}else{if(11==e.kind)return this.size<=23;if(12==e.kind)return this.size<=52}else if(this.is(8)&&e.is(8))return this.size<=e.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";default:assert(!1);case 13:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return n.NativeType.I32;case 3:case 8:return n.NativeType.I64;case 4:case 9:return 64==this.size?n.NativeType.I64:n.NativeType.I32;case 11:return n.NativeType.F32;case 12:return n.NativeType.F64;case 13:return n.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.void=new e(13,0,0),e}();t.Type=i,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;n<t;++n)r[n]=e[n].toNativeType();return r},t.typesToString=function(e){var t=e.length;if(!t)return"";for(var r=new Array(t),n=0;n<t;++n)r[n]=e[n].toString();return r.join(",")};var a=function(){function e(e,t,r){void 0===e&&(e=null),void 0===t&&(t=null),void 0===r&&(r=null),this.cachedFunctionTarget=null,this.parameterTypes=e||[],this.parameterNames=null,this.requiredParameters=0,this.returnType=t||i.void,this.thisType=r,this.hasRest=!1,this.type=i.u32.asFunction(this)}return e.prototype.getParameterName=function(e){var t=this.parameterNames;return t&&t.length>e?t[e]:o(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s<a;++s){var o=n[s],c=i[s];if(!o.isAssignableTo(c))return!1}var p=this.returnType,l=e.returnType;return p==l||p.isAssignableTo(l)},e.makeSignatureString=function(e,t,r){void 0===r&&(r=null);var n=[];if(r&&n.push(r.toSignatureString()),e)for(var i=0,a=e.length;i<a;++i)n.push(e[i].toSignatureString());return n.push(t.toSignatureString()),n.join("")},e.prototype.toSignatureString=function(){return e.makeSignatureString(this.parameterTypes,this.returnType,this.thisType)},e.prototype.toString=function(e){void 0===e&&(e=!1);var t=new Array;t.push("(");var r=0,n=this.thisType;n&&e&&(t.push("this: "),t.push(n.toString()),r=1);var i=this.parameterTypes,a=i.length;if(a)for(var s=this.parameterNames,c=s?s.length:0,p=this.requiredParameters,l=this.hasRest?a-1:-1,u=0;u<a;++u,++r)r&&t.push(", "),u==l&&t.push("..."),u<c?t.push(s[u]):t.push(o(u)),u>=p&&u!=l?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=a;var s=null;function o(e){s||(s=[]);for(var t=s.length;t<=e;++t)s.push("arg$"+t.toString(10));return s[e-1]}t.getDefaultParameterName=o},function(e,t){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(2),c=r(3);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function l(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=l,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.start<r.start?t.start:r.start,t.end>r.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=u;var h=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos<n.end&&65279==i.charCodeAt(n.pos)&&++n.pos,n.pos+1<n.end&&35==i.charCodeAt(n.pos)&&33==i.charCodeAt(n.pos+1))for(n.pos+=2;n.pos<n.end&&10!=i.charCodeAt(n.pos);)++n.pos;return n}return n(t,e),t.prototype.next=function(e){return void 0===e&&(e=a.DEFAULT),this.nextToken=-1,this.token=this.unsafeNext(e)},t.prototype.unsafeNext=function(e,t){void 0===e&&(e=a.DEFAULT),void 0===t&&(t=i32.MAX_VALUE);for(var r=this.source.text;this.pos<this.end;){this.tokenPos=this.pos;var n=r.charCodeAt(this.pos);switch(n){case 13:if(!(++this.pos<this.end&&10==r.charCodeAt(this.pos)))break;case 10:case 9:case 11:case 12:case 32:++this.pos;break;case 33:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.EXCLAMATION_EQUALS_EQUALS):i.EXCLAMATION_EQUALS):i.EXCLAMATION;case 34:case 39:case 96:return i.STRINGLITERAL;case 37:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.PERCENT_EQUALS):i.PERCENT;case 38:if(++this.pos,t>1&&this.pos<this.end){if(38==r.charCodeAt(this.pos))return++this.pos,i.AMPERSAND_AMPERSAND;if(61==r.charCodeAt(this.pos))return++this.pos,i.AMPERSAND_EQUALS}return i.AMPERSAND;case 40:return++this.pos,i.OPENPAREN;case 41:return++this.pos,i.CLOSEPAREN;case 42:if(++this.pos,t>1&&this.pos<this.end){if(61==r.charCodeAt(this.pos))return++this.pos,i.ASTERISK_EQUALS;if(42==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.ASTERISK_ASTERISK_EQUALS):i.ASTERISK_ASTERISK}return i.ASTERISK;case 43:if(++this.pos,t>1&&this.pos<this.end){if(43==r.charCodeAt(this.pos))return++this.pos,i.PLUS_PLUS;if(61==r.charCodeAt(this.pos))return++this.pos,i.PLUS_EQUALS}return i.PLUS;case 44:return++this.pos,i.COMMA;case 45:if(++this.pos,t>1&&this.pos<this.end){if(45==r.charCodeAt(this.pos))return++this.pos,i.MINUS_MINUS;if(61==r.charCodeAt(this.pos))return++this.pos,i.MINUS_EQUALS}return i.MINUS;case 46:if(++this.pos,t>1&&this.pos<this.end){if(c.isDecimalDigit(r.charCodeAt(this.pos)))return--this.pos,i.FLOATLITERAL;if(t>2&&this.pos+1<this.end&&46==r.charCodeAt(this.pos)&&46==r.charCodeAt(this.pos+1))return this.pos+=2,i.DOT_DOT_DOT}return i.DOT;case 47:var u=this.pos;if(++this.pos,t>1&&this.pos<this.end){if(47==r.charCodeAt(this.pos)){var h=o.CommentKind.LINE;for(this.pos+1<this.end&&47==r.charCodeAt(this.pos+1)&&(++this.pos,h=o.CommentKind.TRIPLE);++this.pos<this.end;)if(10==r.charCodeAt(this.pos)){++this.pos;break}this.onComment&&this.onComment(h,r.substring(u,this.pos),this.range(u,this.pos));break}if(42==r.charCodeAt(this.pos)){for(var d=!1;++this.pos<this.end;)if(42==(n=r.charCodeAt(this.pos))&&this.pos+1<this.end&&47==r.charCodeAt(this.pos+1)){this.pos+=2,d=!0;break}d?this.onComment&&this.onComment(o.CommentKind.BLOCK,r.substring(u,this.pos),this.range(u,this.pos)):this.error(s.DiagnosticCode._0_expected,this.range(this.pos),"*/");break}if(61==r.charCodeAt(this.pos))return++this.pos,i.SLASH_EQUALS}return i.SLASH;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.testInteger()?i.INTEGERLITERAL:i.FLOATLITERAL;case 58:return++this.pos,i.COLON;case 59:return++this.pos,i.SEMICOLON;case 60:if(++this.pos,t>1&&this.pos<this.end){if(60==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.LESSTHAN_LESSTHAN_EQUALS):i.LESSTHAN_LESSTHAN;if(61==r.charCodeAt(this.pos))return++this.pos,i.LESSTHAN_EQUALS}return i.LESSTHAN;case 61:if(++this.pos,t>1&&this.pos<this.end){if(61==r.charCodeAt(this.pos))return++this.pos,t>2&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.EQUALS_EQUALS_EQUALS):i.EQUALS_EQUALS;if(62==r.charCodeAt(this.pos))return++this.pos,i.EQUALS_GREATERTHAN}return i.EQUALS;case 62:if(++this.pos,t>1&&this.pos<this.end){if(62==r.charCodeAt(this.pos)){if(++this.pos,t>2&&this.pos<this.end){if(62==r.charCodeAt(this.pos))return++this.pos,t>3&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS):i.GREATERTHAN_GREATERTHAN_GREATERTHAN;if(61==r.charCodeAt(this.pos))return++this.pos,i.GREATERTHAN_GREATERTHAN_EQUALS}return i.GREATERTHAN_GREATERTHAN}if(61==r.charCodeAt(this.pos))return++this.pos,i.GREATERTHAN_EQUALS}return i.GREATERTHAN;case 63:return++this.pos,i.QUESTION;case 91:return++this.pos,i.OPENBRACKET;case 93:return++this.pos,i.CLOSEBRACKET;case 94:return++this.pos,t>1&&this.pos<this.end&&61==r.charCodeAt(this.pos)?(++this.pos,i.CARET_EQUALS):i.CARET;case 123:return++this.pos,i.OPENBRACE;case 124:if(++this.pos,t>1&&this.pos<this.end){if(124==r.charCodeAt(this.pos))return++this.pos,i.BAR_BAR;if(61==r.charCodeAt(this.pos))return++this.pos,i.BAR_EQUALS}return i.BAR;case 125:return++this.pos,i.CLOSEBRACE;case 126:return++this.pos,i.TILDE;case 64:return++this.pos,i.AT;default:if(c.isIdentifierStart(n)){if(c.isKeywordCharacter(n)){for(var _=this.pos;++this.pos<this.end&&c.isIdentifierPart(n=r.charCodeAt(this.pos));)if(!c.isKeywordCharacter(n))return this.pos=_,i.IDENTIFIER;var m=p(r.substring(_,this.pos));if(m!=i.INVALID&&e!==a.ALWAYS&&(e!==a.PREFER||!l(m)))return m;this.pos=_}return i.IDENTIFIER}if(c.isWhiteSpace(n)){++this.pos;break}return this.error(s.DiagnosticCode.Invalid_character,this.range(this.pos,this.pos+1)),++this.pos,i.INVALID}}return i.ENDOFFILE},t.prototype.peek=function(e,t,r){void 0===e&&(e=!1),void 0===t&&(t=a.DEFAULT),void 0===r&&(r=i32.MAX_VALUE);var n=this.source.text;if(this.nextToken<0){var i=this.pos,s=this.token,o=this.tokenPos;if(this.nextToken=this.unsafeNext(t,r),this.nextTokenPos=this.tokenPos,e){this.nextTokenOnNewLine=!1;for(var p=i,l=this.nextTokenPos;p<l;++p)if(c.isLineBreak(n.charCodeAt(p))){this.nextTokenOnNewLine=!0;break}}this.pos=i,this.token=s,this.tokenPos=o}return this.nextToken},t.prototype.skipIdentifier=function(){return this.skip(i.IDENTIFIER,a.PREFER)},t.prototype.skipIdentifierName=function(){return this.skip(i.IDENTIFIER,a.ALWAYS)},t.prototype.skip=function(e,t){void 0===t&&(t=a.DEFAULT);var r=this.pos,n=this.token,s=this.tokenPos,o=i32.MAX_VALUE;switch(e){case i.GREATERTHAN:o=1}return this.token=this.unsafeNext(t,o),this.token==e?(this.nextToken=-1,!0):(this.pos=r,this.token=n,this.tokenPos=s,!1)},t.prototype.mark=function(){var e;return _?(e=_,_=null):e=new d,e.pos=this.pos,e.token=this.token,e.tokenPos=this.tokenPos,e},t.prototype.discard=function(e){_=e},t.prototype.reset=function(e){this.pos=e.pos,this.token=e.token,this.tokenPos=e.tokenPos,this.nextToken=-1},t.prototype.range=function(e,t){return void 0===e&&(e=-1),void 0===t&&(t=-1),e<0?(e=this.tokenPos,t=this.pos):t<0&&(t=e),new u(this.source,e,t)},t.prototype.readIdentifier=function(){for(var e=this.source.text,t=this.pos;++this.pos<this.end&&c.isIdentifierPart(e.charCodeAt(this.pos)););return e.substring(t,this.pos)},t.prototype.readString=function(){for(var e=this.source.text,t=e.charCodeAt(this.pos++),r=this.pos,n="";;){if(this.pos>=this.end){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(c.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos<this.end&&123==e.charCodeAt(this.pos)?(++this.pos,this.readExtendedUnicodeEscape()):this.readUnicodeEscape();case 13:this.pos<this.end&&10==e.charCodeAt(this.pos)&&++this.pos;case 10:case 8232:case 8233:return"";default:return String.fromCharCode(t)}},t.prototype.readRegexpPattern=function(){for(var e=this.source.text,t=this.pos,r=!1;;){if(this.pos>=this.end){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(c.isLineBreak(n)){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos<this.end;){var n=e.charCodeAt(this.pos);if(!c.isIdentifierPart(n))break;switch(++this.pos,n){case 103:r|=1&r?-1:1;break;case 105:r|=2&r?-1:2;break;case 109:r|=4&r?-1:4;break;default:r=-1}}return-1==r&&this.error(s.DiagnosticCode.Invalid_regular_expression_flags,this.range(t,this.pos)),e.substring(t,this.pos)},t.prototype.testInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+1<this.end)switch(e.charCodeAt(this.pos+2)){case 88:case 120:case 66:case 98:case 79:case 111:return!0}for(var t=this.pos;t<this.end;){var r=e.charCodeAt(t);if(46==r||69==r||101==r)return!1;if((r<48||r>57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2<this.end){switch(e.charCodeAt(this.pos+1)){case 88:case 120:return this.pos+=2,this.readHexInteger();case 66:case 98:return this.pos+=2,this.readBinaryInteger();case 79:case 111:return this.pos+=2,this.readOctalInteger()}if(c.isOctalDigit(e.charCodeAt(this.pos+1))){var t=this.pos;++this.pos;var r=this.readOctalInteger();return this.error(s.DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,this.range(t,this.pos)),r}}return this.readDecimalInteger()},t.prototype.readHexInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(16,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else if(o>=65&&o<=70)r=i64_add(i64_mul(r,n),i64_new(10+o-65,0));else if(o>=97&&o<=102)r=i64_add(i64_mul(r,n),i64_new(10+o-97,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos<this.end;){var a=this.pos,o=e.charCodeAt(a);if(o>=48&&o<=55)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(s.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos<this.end;){var o=this.pos,c=e.charCodeAt(o);if(48==c)r=i64_mul(r,n);else if(49==c)r=i64_add(i64_mul(r,n),i);else{if(95!=c)break;a==o&&this.error(a==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(o)),a=o+1}this.pos=o+1}return this.pos==t?this.error(s.DiagnosticCode.Binary_digit_expected,this.range(t)):a==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(a-1)),r},t.prototype.readFloat=function(){return this.readDecimalFloat()},t.prototype.readDecimalFloat=function(){for(var e=this.pos,t=this.source.text;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos;if(this.pos<this.end&&46==t.charCodeAt(this.pos))for(++this.pos;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos;if(this.pos<this.end){var r=t.charCodeAt(this.pos);if(69==r||101==r)for(++this.pos<this.end&&(45==t.charCodeAt(this.pos)||43==t.charCodeAt(this.pos))&&c.isDecimalDigit(t.charCodeAt(this.pos+1))&&++this.pos;this.pos<this.end&&c.isDecimalDigit(t.charCodeAt(this.pos));)++this.pos}return parseFloat(t.substring(e,this.pos))},t.prototype.readHexFloat=function(){throw new Error("not implemented")},t.prototype.readUnicodeEscape=function(){for(var e=4,t=0,r=this.source.text;this.pos<this.end;){var n=r.charCodeAt(this.pos++);if(n>=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(s.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(s.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(s.DiagnosticEmitter);t.Tokenizer=h;var d=function(){return function(){}}();t.State=d;var _=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1061:return"Enum member must have initializer.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";default:return""}}},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var a,s=r(23),o=r(1),c=r(4),p=r(0),l=r(5),u=r(8),h=r(2),d=r(6),_=r(3);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(a=t.Target||(t.Target={}));var m=function(){function e(){this.target=a.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==a.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==a.WASM64?d.Type.usize64:d.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==a.WASM64?d.Type.isize64:d.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==a.WASM64?c.NativeType.I64:c.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=m,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var y,g,E=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentOuterFunction=null,n.currentEnum=null,n.currentType=d.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=[],n.argcVar=0,n.argcSet=0,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new m),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=c.Module.create(),n}return n(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e=this.options,t=this.module,r=this.program;r.initialize(e);var n=new l.Function(r.startFunction,"start",new d.Signature([],d.Type.void));this.startFunctionInstance=n;var i=new Array;this.startFunctionBody=i,this.currentFunction=n;for(var a=r.sources,s=0,o=a.length;s<o;++s)a[s].isEntry&&this.compileSource(a[s]);if(i.length||null!==r.mainFunction){var p=n.signature,u=t.addFunction(n.internalName,this.ensureFunctionType(p.parameterTypes,p.returnType,p.thisType),d.typesToNativeTypes(n.additionalLocals),t.createBlock(null,i));n.finalize(t,u),r.mainFunction||t.setStart(u)}var h=this.memoryOffset;h=i64_align(h,e.usizeType.byteSize),this.memoryOffset=h,e.isWasm64?t.addGlobal("HEAP_BASE",c.NativeType.I64,!1,t.createI64(i64_low(h),i64_high(h))):t.addGlobal("HEAP_BASE",c.NativeType.I32,!1,t.createI32(i64_low(h)));var _=this.memorySegments.length?i64_low(i64_shr_u(i64_align(h,65536),i64_new(16,0))):0;t.setMemory(_,this.options.isWasm64?c.Module.MAX_MEMORY_WASM64:c.Module.MAX_MEMORY_WASM32,this.memorySegments,e.target,"memory"),e.importMemory&&t.addMemoryImport("0","env","memory");var m=this.functionTable,y=m.length,g=!1;if(y){var E=new Array(y);for(s=0;s<y;++s)E[s]=m[s].ref;t.setFunctionTable(E),t.addTableExport("0","table"),g=!0}return e.importTable&&(t.addTableImport("0","env","table"),g||t.addTableExport("0","table")),t},t.prototype.compileSourceByPath=function(e,t){var r=this.program.lookupSourceByPath(e);r?this.compileSource(r):this.error(o.DiagnosticCode.File_0_not_found,t.range,e)},t.prototype.compileSource=function(e){if(!e.is(p.CommonFlags.COMPILED)){e.set(p.CommonFlags.COMPILED);for(var t=this.options.noTreeShaking,r=e.isEntry,n=this.startFunctionInstance,i=this.startFunctionBody,a=e.statements,s=0,o=a.length;s<o;++s){var c=a[s];switch(c.kind){case h.NodeKind.CLASSDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&!c.isGeneric&&this.compileClassDeclaration(c,[],null);break;case h.NodeKind.INTERFACEDECLARATION:break;case h.NodeKind.ENUMDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&this.compileEnumDeclaration(c);break;case h.NodeKind.FUNCTIONDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&!c.isGeneric&&this.compileFunctionDeclaration(c,[]);break;case h.NodeKind.IMPORT:this.compileSourceByPath(c.normalizedPath,c.path);break;case h.NodeKind.NAMESPACEDECLARATION:(t||r&&c.is(p.CommonFlags.EXPORT))&&this.compileNamespaceDeclaration(c);break;case h.NodeKind.VARIABLE:var l=this.compileVariableStatement(c);l&&i.push(l);break;case h.NodeKind.EXPORT:null!=c.normalizedPath&&this.compileSourceByPath(c.normalizedPath,c.path),(t||r)&&this.compileExportStatement(c);break;default:var u=this.currentFunction;this.currentFunction=n,i.push(this.compileStatement(c)),this.currentFunction=u}}}},t.prototype.compileGlobalDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==l.ElementKind.GLOBAL),this.compileGlobal(t)?t:null},t.prototype.compileGlobal=function(e){if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var t=this.module,r=e.declaration,n=0;if(e.type==d.Type.void)if(r)if(r.type){var i=this.resolver.resolveType(r.type);if(!i)return!1;if(i==d.Type.void)return this.error(o.DiagnosticCode.Type_expected,r.type.range),!1;e.type=i}else{if(!r.initializer)return this.error(o.DiagnosticCode.Type_expected,r.name.range.atEnd),!1;if(n=this.compileExpressionRetainType(r.initializer,d.Type.void,1),this.currentType==d.Type.void)return this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,r.initializer.range,this.currentType.toString(),"<auto>"),!1;e.type=this.currentType}else assert(!1);if(e.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.isAny(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?f(e,r,e.parent):(y="env",g=e.simpleName),t.addGlobalImport(e.internalName,y,g,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(o.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var l=!1;e.is(p.CommonFlags.INLINED)?n=this.compileInlineConstant(e,e.type,!0):r&&r.initializer?(n||(n=this.compileExpression(r.initializer,e.type,1,1)),c.getExpressionId(n)!=c.ExpressionId.Const&&(s?(n=this.precomputeExpressionRef(n),c.getExpressionId(n)!=c.ExpressionId.Const&&(this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),l=!0)):l=!0)):n=e.type.toNativeZero(t);var u=e.internalName;if(l)t.addGlobal(u,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(u,n));else if(s){switch(c.getExpressionType(n)){case c.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(c.getConstValueI32(n),0);break;case c.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(c.getConstValueI64Low(n),c.getConstValueI64High(n));break;case c.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=c.getConstValueF32(n);break;case c.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=c.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED),e.is(p.CommonFlags.MODULE_EXPORT)?(t.addGlobal(u,a,!1,n),t.addGlobalExport(u,T(e))):r&&r.isTopLevel&&t.addGlobal(u,a,!1,n)}else t.addGlobal(u,a,!s,n);return!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==l.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null;if(e.members)try{for(var s=i(e.members.values()),u=s.next();!u.done;u=s.next()){var h=u.value;if(h.kind==l.ElementKind.ENUMVALUE){var _=!1,m=h,y=m.declaration;if(m.set(p.CommonFlags.COMPILED),m.is(p.CommonFlags.INLINED))e.declaration.isTopLevelExport&&n.addGlobal(m.internalName,c.NativeType.I32,!1,n.createI32(m.constantValue));else{var g=void 0;y.value?(g=this.compileExpression(y.value,d.Type.i32,1,0),c.getExpressionId(g)!=c.ExpressionId.Const&&(g=this.precomputeExpressionRef(g),c.getExpressionId(g)!=c.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,y.range),_=!0))):null==a?g=n.createI32(0):a.is(p.CommonFlags.INLINED)?g=n.createI32(a.constantValue+1):(g=n.createBinary(c.BinaryOp.AddI32,n.createGetGlobal(a.internalName,c.NativeType.I32),n.createI32(1)),e.is(p.CommonFlags.CONST)&&this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,y.range),_=!0),_?(n.addGlobal(m.internalName,c.NativeType.I32,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(m.internalName,g))):(n.addGlobal(m.internalName,c.NativeType.I32,!1,g),c.getExpressionType(g)==c.NativeType.I32?(m.constantValue=c.getConstValueI32(g),m.set(p.CommonFlags.INLINED)):(assert(!1),m.constantValue=0))}a=m,e.is(p.CommonFlags.MODULE_EXPORT)&&(h.is(p.CommonFlags.INLINED)||this.options.hasFeature(2)?n.addGlobalExport(h.internalName,T(h)):y&&this.warning(o.DiagnosticCode.Cannot_export_a_mutable_global,y.range))}}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t,r){void 0===r&&(r=null);var n=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(n.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(n,t,r,null,n.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=this.resolver.resolveFunctionInclTypeArguments(e,t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s<i;++s,++a)n[a]=e[s].toNativeType();var o=t.toNativeType(),c=this.module,p=c.getFunctionTypeBySignature(o,n);if(!p){var l=d.Signature.makeSignatureString(e,t,r);p=c.addFunctionType(l,o,n)}return p},t.prototype.compileFunction=function(e){if(e.is(p.CommonFlags.COMPILED))return!0;assert(!e.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN)),e.set(p.CommonFlags.COMPILED);var t,r=e.prototype.declaration,n=r.body;n?e.is(p.CommonFlags.AMBIENT)&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,r.name.range):e.is(p.CommonFlags.AMBIENT)||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,r.name.range);var i=e.signature,a=this.ensureFunctionType(i.parameterTypes,i.returnType,i.thisType),s=this.module;if(n){var u=e.is(p.CommonFlags.CONSTRUCTOR),_=e.signature.returnType,m=this.currentFunction;this.currentFunction=e;var E=e.flow,I=void 0;if(n.kind==h.NodeKind.EXPRESSION)assert(!e.isAny(p.CommonFlags.CONSTRUCTOR|p.CommonFlags.GET|p.CommonFlags.SET|p.CommonFlags.MAIN)),assert(e.is(p.CommonFlags.ARROW)),I=this.compileExpression(n.expression,_,1,0),E.set(1),E.canOverflow(I,_)||E.set(2),E.finalize();else{assert(n.kind==h.NodeKind.BLOCK);var v=this.compileStatements(n.statements);if(e.is(p.CommonFlags.MAIN)&&(s.addGlobal("~started",c.NativeType.I32,!0,s.createI32(0)),v.unshift(s.createIf(s.createUnary(c.UnaryOp.EqzI32,s.createGetGlobal("~started",c.NativeType.I32)),s.createBlock(null,[s.createCall("start",null,c.NativeType.None),s.createSetGlobal("~started",s.createI32(1))])))),E.finalize(),u){var A=this.options.nativeSizeType;if(assert(e.is(p.CommonFlags.INSTANCE)),!E.is(1))if(E.is(32))v.push(s.createGetLocal(0,A));else{var C=assert(e.parent);assert(C.kind==l.ElementKind.CLASS),v.push(s.createTeeLocal(0,this.makeConditionalAllocate(C,r.name)))}}else _==d.Type.void||E.is(1)||this.error(o.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,r.signature.returnType.range);I=v.length?1==v.length?v[0]:s.createBlock(null,v,_.toNativeType()):s.createNop()}if(this.currentFunction=m,t=s.addFunction(e.internalName,a,d.typesToNativeTypes(e.additionalLocals),I),e.hasDecorator(l.DecoratorFlags.EXTERNAL)){var N=assert(h.findDecorator(h.DecoratorKind.EXTERNAL,r.decorators));this.error(o.DiagnosticCode.Operation_not_supported,N.range)}}else e.set(p.CommonFlags.MODULE_IMPORT),f(e,r,e.prototype.parent),t=s.addFunctionImport(e.internalName,y,g,a);return e.is(p.CommonFlags.MODULE_EXPORT)&&(i.requiredParameters<i.parameterTypes.length&&(e=this.ensureTrampoline(e),this.ensureArgcSet()),s.addFunctionExport(e.internalName,T(e))),e.finalize(s,t),!0},t.prototype.compileNamespaceDeclaration=function(e){for(var t=e.members,r=this.options.noTreeShaking,n=0,i=t.length;n<i;++n){var a=t[n];switch(a.kind){case h.NodeKind.CLASSDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileClassDeclaration(a,[]);break;case h.NodeKind.INTERFACEDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileInterfaceDeclaration(a,[]);break;case h.NodeKind.ENUMDECLARATION:(r||a.is(p.CommonFlags.EXPORT))&&this.compileEnumDeclaration(a);break;case h.NodeKind.FUNCTIONDECLARATION:!r&&!a.is(p.CommonFlags.EXPORT)||a.isGeneric||this.compileFunctionDeclaration(a,[]);break;case h.NodeKind.NAMESPACEDECLARATION:(r||a.is(p.CommonFlags.EXPORT))&&this.compileNamespaceDeclaration(a);break;case h.NodeKind.VARIABLE:if(r||a.is(p.CommonFlags.EXPORT)){var s=this.compileVariableStatement(a,!0);s&&this.startFunctionBody.push(s)}break;default:assert(!1)}}},t.prototype.compileNamespace=function(e){var t,r;if(e.members){var n=this.options.noTreeShaking;try{for(var a=i(e.members.values()),s=a.next();!s.done;s=a.next()){var o=s.value;switch(o.kind){case l.ElementKind.CLASS_PROTOTYPE:!n&&!o.is(p.CommonFlags.EXPORT)||o.is(p.CommonFlags.GENERIC)||this.compileClassUsingTypeArguments(o,[]);break;case l.ElementKind.ENUM:this.compileEnum(o);break;case l.ElementKind.FUNCTION_PROTOTYPE:!n&&!o.is(p.CommonFlags.EXPORT)||o.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(o,[],null,null,o.declaration.name);break;case l.ElementKind.GLOBAL:this.compileGlobal(o);break;case l.ElementKind.NAMESPACE:this.compileNamespace(o)}}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}},t.prototype.compileExportStatement=function(e){var t=this.module,r=this.program.fileLevelExports,n=e.members;if(n)for(var i=0,a=n.length;i<a;++i){var s=n[i],c=e.range.source.internalPath+p.PATH_DELIMITER+s.externalName.text,u=r.get(c);if(u)switch(u.kind){case l.ElementKind.CLASS_PROTOTYPE:u.is(p.CommonFlags.GENERIC)||this.compileClassUsingTypeArguments(u,[]);break;case l.ElementKind.ENUM:this.compileEnum(u);break;case l.ElementKind.FUNCTION_PROTOTYPE:if(!u.is(p.CommonFlags.GENERIC)&&e.range.source.isEntry){var h=this.compileFunctionUsingTypeArguments(u,[],null,null,u.declaration.name);if(h){var d=h.prototype.declaration;d&&d.needsExplicitExport(s)&&t.addFunctionExport(h.internalName,s.externalName.text)}}break;case l.ElementKind.GLOBAL:if(this.compileGlobal(u)&&e.range.source.isEntry){var _=u.declaration;_&&_.needsExplicitExport(s)&&(u.is(p.CommonFlags.INLINED)?t.addGlobalExport(u.internalName,s.externalName.text):this.warning(o.DiagnosticCode.Cannot_export_a_mutable_global,s.range))}break;case l.ElementKind.NAMESPACE:this.compileNamespace(u)}}},t.prototype.compileClassDeclaration=function(e,t,r){void 0===r&&(r=null);var n=assert(this.program.elementsLookup.get(e.fileLevelInternalName));assert(n.kind==l.ElementKind.CLASS_PROTOTYPE),this.compileClassUsingTypeArguments(n,t,r,e)},t.prototype.compileClassUsingTypeArguments=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null);var i=this.resolver.resolveClassInclTypeArguments(e,t,r,n||e.declaration);i&&this.compileClass(i)},t.prototype.compileClass=function(e){var t,r,n,a;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var s=e.prototype.members;if(s)try{for(var o=i(s.values()),c=o.next();!c.done;c=o.next()){switch((y=c.value).kind){case l.ElementKind.GLOBAL:this.compileGlobal(y);break;case l.ElementKind.FUNCTION_PROTOTYPE:y.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(y,[],null,null,y.declaration.name);break;case l.ElementKind.PROPERTY:(S=y.getterPrototype)&&this.compileFunctionUsingTypeArguments(S,[],null,null,S.declaration.name),(L=y.setterPrototype)&&this.compileFunctionUsingTypeArguments(L,[],null,null,L.declaration.name)}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var u=e.constructorInstance;u&&this.compileFunction(u);var h=e.members;if(h)try{for(var _=i(h.values()),m=_.next();!m.done;m=_.next()){var y;switch((y=m.value).kind){case l.ElementKind.FUNCTION_PROTOTYPE:y.is(p.CommonFlags.GENERIC)||this.compileFunctionUsingTypeArguments(y,[],e.contextualTypeArguments,null,y.declaration.name);break;case l.ElementKind.FIELD:if(y.set(p.CommonFlags.COMPILED),!e.is(p.CommonFlags.MODULE_EXPORT)||y.is(p.CommonFlags.PRIVATE))break;var g=this.module,E=y.simpleName,f=y.type,I=f.toNativeType(),v=y.memoryOffset,A=this.options.usizeType,C=this.options.nativeSizeType,N=T(y,p.GETTER_PREFIX+E);if(g.addFunction(N,this.ensureFunctionType(null,f,A),null,g.createLoad(f.byteSize,f.is(1),g.createGetLocal(0,C),I,v)),g.addFunctionExport(N,N),y.is(p.CommonFlags.READONLY))break;var O=T(y,p.SETTER_PREFIX+E);g.addFunction(O,this.ensureFunctionType([f],d.Type.void,A),null,g.createStore(f.byteSize,g.createGetLocal(0,C),g.createGetLocal(1,I),I,v)),g.addFunctionExport(O,O);break;case l.ElementKind.PROPERTY:var S,L;(S=y.getterPrototype)&&this.compileFunctionUsingTypeArguments(S,[],e.contextualTypeArguments,null,S.declaration.name),(L=y.setterPrototype)&&this.compileFunctionUsingTypeArguments(L,[],e.contextualTypeArguments,null,L.declaration.name)}}}catch(e){n={error:e}}finally{try{m&&!m.done&&(a=_.return)&&a.call(_)}finally{if(n)throw n.error}}return!0},t.prototype.compileInterfaceDeclaration=function(e,t,r,n){void 0===r&&(r=null),void 0===n&&(n=null),this.error(o.DiagnosticCode.Operation_not_supported,e.range)},t.prototype.addMemorySegment=function(e,t){void 0===t&&(t=8);var r=i64_align(this.memoryOffset,t),n=c.MemorySegment.create(e,r);return this.memorySegments.push(n),this.memoryOffset=i64_add(r,i64_new(e.length,0)),n},t.prototype.ensureFunctionTableEntry=function(e){if(assert(e.is(p.CommonFlags.COMPILED)),e.functionTableIndex>=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters<e.signature.parameterTypes.length&&(e=this.ensureTrampoline(e)),t.push(e),e.functionTableIndex=r,r},t.prototype.compileStatement=function(e){var t,r=this.module;switch(e.kind){case h.NodeKind.BLOCK:t=this.compileBlockStatement(e);break;case h.NodeKind.BREAK:t=this.compileBreakStatement(e);break;case h.NodeKind.CONTINUE:t=this.compileContinueStatement(e);break;case h.NodeKind.DO:t=this.compileDoStatement(e);break;case h.NodeKind.EMPTY:t=this.compileEmptyStatement(e);break;case h.NodeKind.EXPRESSION:t=this.compileExpressionStatement(e);break;case h.NodeKind.FOR:t=this.compileForStatement(e);break;case h.NodeKind.IF:t=this.compileIfStatement(e);break;case h.NodeKind.RETURN:t=this.compileReturnStatement(e);break;case h.NodeKind.SWITCH:t=this.compileSwitchStatement(e);break;case h.NodeKind.THROW:t=this.compileThrowStatement(e);break;case h.NodeKind.TRY:t=this.compileTryStatement(e);break;case h.NodeKind.VARIABLE:(t=this.compileVariableStatement(e))||(t=r.createNop());break;case h.NodeKind.VOID:t=this.compileVoidStatement(e);break;case h.NodeKind.WHILE:t=this.compileWhileStatement(e);break;case h.NodeKind.TYPEDECLARATION:if(this.currentFunction==this.startFunctionInstance)return r.createNop();default:assert(!1),t=r.createUnreachable()}return this.options.sourceMap&&this.addDebugLocation(t,e.range),t},t.prototype.compileStatements=function(e){var t=e.length,r=new Array(t);r.length=0;for(var n=this.currentFunction.flow,i=0;i<t;++i){var a=this.compileStatement(e[i]);switch(c.getExpressionId(a)){case c.ExpressionId.Block:if(!c.getBlockName(a)){for(var s=0,o=c.getBlockChildCount(a);s<o;++s)r.push(c.getBlockChild(a,s));break}default:r.push(a);case c.ExpressionId.Nop:}if(n.isAny(29))break}return r},t.prototype.compileBlockStatement=function(e){var t=e.statements,r=this.currentFunction.flow,n=r.fork();this.currentFunction.flow=n;var i=this.compileStatements(t),a=0==i.length?this.module.createNop():1==i.length?i[0]:this.module.createBlock(null,i,c.getExpressionType(i[i.length-1]));return this.currentFunction.flow=n.free(),r.inherit(n),a},t.prototype.compileBreakStatement=function(e){var t=this.module;if(e.label)return this.error(o.DiagnosticCode.Operation_not_supported,e.label.range),t.createUnreachable();var r=this.currentFunction.flow,n=r.breakLabel;return null==n?(this.error(o.DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,e.range),t.createUnreachable()):(r.set(8),t.createBreak(n))},t.prototype.compileContinueStatement=function(e){var t=this.module,r=e.label;if(r)return this.error(o.DiagnosticCode.Operation_not_supported,r.range),t.createUnreachable();var n=this.currentFunction.flow,i=n.continueLabel;return null==i?(this.error(o.DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,e.range),t.createUnreachable()):(n.set(16),t.createBreak(i))},t.prototype.compileDoStatement=function(e){var t=this.currentFunction,r=this.module,n=t.enterBreakContext(),i=t.flow,a=i.fork();t.flow=a;var s="break|"+n;a.breakLabel=s;var o="continue|"+n;a.continueLabel=o;var p=this.compileStatement(e.statement),l=this.makeIsTrueish(this.compileExpression(e.condition,d.Type.i32,0,0),this.currentType);t.flow=a.free(),t.leaveBreakContext();var u=a.isAny(29);return a.unset(792),i.inherit(a),r.createBlock(s,[r.createLoop(o,u?p:r.createBlock(null,[p,r.createBreak(o,l)],c.NativeType.None))],u?c.NativeType.Unreachable:c.NativeType.None)},t.prototype.compileEmptyStatement=function(e){return this.module.createNop()},t.prototype.compileExpressionStatement=function(e){var t=this.compileExpression(e.expression,d.Type.void,0,0);return this.currentType!=d.Type.void&&(t=this.module.createDrop(t),this.currentType=d.Type.void),t},t.prototype.compileForStatement=function(e){var t=this.currentFunction,r=t.enterBreakContext(),n=t.flow,i=n.fork();t.flow=i;var a=i.breakLabel="break|"+r;i.breakLabel=a;var s="continue|"+r;i.continueLabel=s;var o="repeat|"+r,p=this.module,l=e.initializer?this.compileStatement(e.initializer):0,u=0,h=!1;if(e.condition){u=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);var _=this.precomputeExpressionRef(u);c.getExpressionId(_)==c.ExpressionId.Const&&(assert(c.getExpressionType(_)==c.NativeType.I32),0!=c.getConstValueI32(_)&&(h=!0)),u=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}else u=p.createI32(1),h=!0;var m=e.incrementor?this.compileExpression(e.incrementor,d.Type.void,1,0):0,y=this.compileStatement(e.statement);t.flow=i.free(),t.leaveBreakContext();var g=i.isAny(528);i.unset(792);var E=h&&i.isAny(29);h?n.inherit(i):n.inheritConditional(i);var T=new Array;l&&T.push(l);var f=new Array;return g?f.push(p.createBlock(s,[p.createBreak(a,p.createUnary(c.UnaryOp.EqzI32,u)),y],c.NativeType.None)):(f.push(p.createBreak(a,p.createUnary(c.UnaryOp.EqzI32,u))),f.push(y)),m&&f.push(m),f.push(p.createBreak(o)),T.push(p.createLoop(o,p.createBlock(null,f,c.NativeType.None))),p.createBlock(a,T,E?c.NativeType.Unreachable:c.NativeType.None)},t.prototype.compileIfStatement=function(e){var t=this.module,r=this.currentFunction,n=e.ifTrue,i=e.ifFalse,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var s=this.precomputeExpressionRef(a);if(c.getExpressionId(s)==c.ExpressionId.Const&&c.getExpressionType(s)==c.NativeType.I32)return c.getConstValueI32(s)?this.compileStatement(n):i?this.compileStatement(i):t.createNop();a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var o=r.flow,l=o.fork();r.flow=l;var u=this.compileStatement(n);r.flow=l.free();var h=0;if(i){var _=o.fork();r.flow=_,h=this.compileStatement(i),r.flow=_.free(),o.inheritMutual(l,_)}else o.inheritConditional(l);return t.createIf(a,u,h)},t.prototype.compileReturnStatement=function(e){var t=this.module,r=this.currentFunction,n=0,i=r.flow;if(i.set(1),e.value){var a=i.returnType;if(a==d.Type.void)return this.compileExpressionRetainType(e.value,a,0),this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.value.range,this.currentType.toString(),a.toString()),this.currentType=d.Type.void,t.createUnreachable();n=this.compileExpression(e.value,a,1,r.is(p.CommonFlags.MODULE_EXPORT)?1:0),i.canOverflow(n,a)||i.set(2)}return h.isLastStatement(e)?n||t.createNop():i.is(2048)?t.createBreak(assert(i.returnLabel),0,n):t.createReturn(n)},t.prototype.compileSwitchStatement=function(e){var t=this.module,r=this.currentFunction,n=e.cases,i=n.length;if(!i)return this.compileExpression(e.condition,d.Type.void,1,0);var a=r.enterBreakContext(),s=r.flow,o=r.getTempLocal(d.Type.u32,!1),p=o.index,l=new Array(1+i);l[0]=t.createSetLocal(p,this.compileExpression(e.condition,d.Type.u32,1,0));for(var u=1,h=-1,_=0;_<i;++_){var m=n[_].label;m?l[u++]=t.createBreak("case"+_.toString(10)+"|"+a,t.createBinary(c.BinaryOp.EqI32,t.createGetLocal(p,c.NativeType.I32),this.compileExpression(m,d.Type.u32,1,0))):h=_}r.freeTempLocal(o),l[u]=t.createBreak((h>=0?"case"+h.toString(10):"break")+"|"+a);var y=t.createBlock("case0|"+a,l,c.NativeType.None),g=!0,E=!0,T=!0,f=!0;for(_=0;_<i;++_){var I=n[_].statements,v=I.length,A=s.fork();r.flow=A;var C="break|"+a;A.breakLabel=C;var N=_==i-1,O=N?C:"case"+(_+1).toString(10)+"|"+a,S=new Array(1+v);S[0]=y;for(var L=1,b=!1,k=0;k<v;++k){var R=this.compileStatement(I[k]);if(c.getExpressionId(R)!=c.ExpressionId.Nop&&(S[L++]=R,A.isAny(29))){b=!0;break}}S.length=L,(b||N)&&(A.is(1)||(g=!1),A.is(2)||(E=!1),A.is(4)||(T=!1),A.is(32)||(f=!1)),A.unset(264),r.flow=A.free(),y=t.createBlock(O,S,c.NativeType.None)}return r.leaveBreakContext(),h>=0&&(g&&s.set(1),E&&s.set(2),T&&s.set(4),f&&s.set(32)),y},t.prototype.compileThrowStatement=function(e){var t=this.currentFunction.flow;return t.set(4),t.set(1),s.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=this.currentFunction,i=e.declarations,a=i.length;if(t||n==this.startFunctionInstance&&e.parent&&e.parent.kind==h.NodeKind.SOURCE){for(var s=0;s<a;++s)this.compileGlobalDeclaration(i[s]);return 0}var u=new Array,_=this.currentFunction.flow,m=this.resolver;for(s=0;s<a;++s){var y=i[s],g=y.name.text,E=null,T=0;if(y.type){if(!(E=m.resolveType(y.type,_.contextualTypeArguments)))continue;y.initializer&&(T=this.compileExpression(y.initializer,E,1,0))}else{if(!y.initializer){this.error(o.DiagnosticCode.Type_expected,y.name.range.atEnd);continue}if(T=this.compileExpressionRetainType(y.initializer,d.Type.void,0),this.currentType==d.Type.void){this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,y.range,this.currentType.toString(),"<auto>");continue}E=this.currentType}var f=!1;if(y.is(p.CommonFlags.CONST))if(T)if(T=this.precomputeExpressionRef(T),c.getExpressionId(T)==c.ExpressionId.Const){var I=new l.Local(r,g,-1,E);switch(c.getExpressionType(T)){case c.NativeType.I32:I=I.withConstantIntegerValue(i64_new(c.getConstValueI32(T),0));break;case c.NativeType.I64:I=I.withConstantIntegerValue(i64_new(c.getConstValueI64Low(T),c.getConstValueI64High(T)));break;case c.NativeType.F32:I=I.withConstantFloatValue(c.getConstValueF32(T));break;case c.NativeType.F64:I=I.withConstantFloatValue(c.getConstValueF64(T));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(g))return this.error(o.DiagnosticCode.Duplicate_identifier_0,y.name.range,g),this.module.createUnreachable()}else n.flow.scopedLocals=v=new Map;v.set(g,I),f=!0}else this.warning(o.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,y.range);else this.error(o.DiagnosticCode._const_declarations_must_be_initialized,y.range);if(!f){I=void 0;I=y.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||_.is(2048)?_.addScopedLocal(E,g,!1,y):n.addLocal(E,g,y),T?(u.push(this.compileAssignmentWithValue(y.name,T)),I.type.is(36)&&_.setLocalWrapped(I.index,!_.canOverflow(T,E))):I.type.is(36)&&_.setLocalWrapped(I.index,!0)}}return u.length?1==u.length?u[0]:this.module.createBlock(null,u,c.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,d.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=this.precomputeExpressionRef(r);if(c.getExpressionId(n)==c.ExpressionId.Const&&c.getExpressionType(n)==c.NativeType.I32){if(!c.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var i=this.currentFunction,a=i.enterBreakContext(),s=i.flow,o=s.fork();i.flow=o;var l="break|"+a;o.breakLabel=l;var u="continue|"+a;o.continueLabel=u;var h=this.compileStatement(e.statement),_=o.isAny(29);return i.flow=o.free(),i.leaveBreakContext(),o.unset(792),s.inheritConditional(o),t.createBlock(l,[t.createLoop(u,t.createIf(r,_?h:t.createBlock(null,[h,t.createBreak(u)],c.NativeType.None)))],c.NativeType.None)},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size<t.size?(this.currentType=t).kind:(this.currentType=n).kind){case 0:case 1:var i=n.computeSmallIntegerShift(d.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)<<i>>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(d.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.is(p.CommonFlags.BUILTIN)||t!=d.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=d.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case h.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case h.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case h.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case h.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case h.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case h.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case h.NodeKind.IDENTIFIER:case h.NodeKind.FALSE:case h.NodeKind.NULL:case h.NodeKind.THIS:case h.NodeKind.SUPER:case h.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case h.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case h.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case h.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case h.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case h.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case h.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case h.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case h.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(o.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==d.Type.void?d.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.precomputeExpressionRef(this.compileExpression(e,t,r,n))},t.prototype.precomputeExpressionRef=function(e){var t=this.module,r=this.currentType.toNativeType(),n=t.addTemporaryFunction(r,null,e);t.runPasses(["precompute"],n);var i=c.getFunctionBody(n);return t.removeTemporaryFunction(),i},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 13==t.kind?(assert(13!=r.kind),this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):13==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(o.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(c.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(c.UnaryOp.DemoteF64,e)):r.is(4)?e=11==t.kind?r.is(1)?r.is(64)?s.createUnary(c.UnaryOp.TruncF32ToI64,e):s.createUnary(c.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(c.UnaryOp.TruncF32ToU64,e):s.createUnary(c.UnaryOp.TruncF32ToU32,e):r.is(1)?r.is(64)?s.createUnary(c.UnaryOp.TruncF64ToI64,e):s.createUnary(c.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(c.UnaryOp.TruncF64ToU64,e):s.createUnary(c.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?c.UnaryOp.ConvertI64ToF32:c.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?c.UnaryOp.ConvertI32ToF32:c.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?c.UnaryOp.ConvertI64ToF64:c.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?c.UnaryOp.ConvertI32ToF64:c.UnaryOp.ConvertU32ToF64,e):t.is(64)?r.is(64)||(e=s.createUnary(c.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(r.is(1)?c.UnaryOp.ExtendI32:c.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size<r.size&&(e=this.ensureSmallIntegerWrap(e,t),i=0),this.currentType=r,1==i?this.ensureSmallIntegerWrap(e,r):e)},t.prototype.compileAssertionExpression=function(e,t){var r=this.resolver.resolveType(e.toType,this.currentFunction.flow.contextualTypeArguments);return r?this.compileExpression(e.expression,r,2,0):this.module.createUnreachable()},t.prototype.compileBinaryExpression=function(e,t){var r,n,i,a,s,p,h=this.module,_=e.left,m=e.right,y=!1,g=e.operator;switch(g){case u.Token.LESSTHAN:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.LT)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.LtI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.LtI64,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LtI64:c.BinaryOp.LtI32,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.LtU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LtU64:c.BinaryOp.LtU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.LtU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.LtF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.LtF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.GREATERTHAN:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.GT)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.GtI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GtI64:c.BinaryOp.GtI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.GtU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GtU64:c.BinaryOp.GtU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.GtU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.GtF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.GtF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.LE)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.LeI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LeI64:c.BinaryOp.LeI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.LeU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.LeU64:c.BinaryOp.LeU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.LeU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.LeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.LeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.GE)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!0)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.GeI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GeI64:c.BinaryOp.GeI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.GeU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.GeU64:c.BinaryOp.GeU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.GeU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.GeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.GeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EQUALS_EQUALS_EQUALS:case u.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,g==u.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.EQ)){p=this.compileBinaryOverload(v,_,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,u.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.EqI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.EqI64:c.BinaryOp.EqI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.EqI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.EqF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.EqF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EXCLAMATION_EQUALS_EQUALS:case u.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,g==u.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.NE)){p=this.compileBinaryOverload(v,_,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,u.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,h.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:p=h.createBinary(c.BinaryOp.NeI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.NeI64:c.BinaryOp.NeI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.NeI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.NeF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.NeF64,r,i);break;default:assert(!1),p=h.createUnreachable()}this.currentType=d.Type.bool;break;case u.Token.EQUALS:return this.compileAssignment(_,m,t);case u.Token.PLUS_EQUALS:y=!0;case u.Token.PLUS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.ADD)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.AddI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.AddI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.AddF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.AddF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.MINUS_EQUALS:y=!0;case u.Token.MINUS:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.SUB)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.SubI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.SubI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.SubF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.SubF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.ASTERISK_EQUALS:y=!0;case u.Token.ASTERISK:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.MUL)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.MulI32,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.MulI64:c.BinaryOp.MulI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.MulI64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.MulF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.MulF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.ASTERISK_ASTERISK_EQUALS:y=!0;case u.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.POW)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var E=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(m,d.Type.f32,1,0),a=this.currentType,!(E=this.f32PowInstance)){if(!(T=this.program.elementsLookup.get("Mathf"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),p=h.createUnreachable();break}if(!(f=T.members?T.members.get("pow"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=E=this.resolver.resolveFunction(f,null)}}else if(r=this.convertExpression(r,this.currentType,d.Type.f64,1,0,_),n=this.currentType,i=this.compileExpression(m,d.Type.f64,1,0),a=this.currentType,!(E=this.f64PowInstance)){if(!(T=this.program.elementsLookup.get("Math"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),p=h.createUnreachable();break}if(!(f=T.members?T.members.get("pow"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=E=this.resolver.resolveFunction(f,null)}p=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):h.createUnreachable();break;case u.Token.SLASH_EQUALS:y=!0;case u.Token.SLASH:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.DIV)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.DivI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.DivI64:c.BinaryOp.DivI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.DivU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.DivU64:c.BinaryOp.DivU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.DivU64,r,i);break;case 11:p=h.createBinary(c.BinaryOp.DivF32,r,i);break;case 12:p=h.createBinary(c.BinaryOp.DivF64,r,i);break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.PERCENT_EQUALS:y=!0;case u.Token.PERCENT:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.REM)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,_),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.RemI32,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.RemI64:c.BinaryOp.RemI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.RemU32,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.RemU64:c.BinaryOp.RemU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.RemU64,r,i);break;case 11:if(!(E=this.f32ModInstance)){if(!(T=this.program.elementsLookup.get("Mathf"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),p=h.createUnreachable();break}if(!(f=T.members?T.members.get("mod"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=E=this.resolver.resolveFunction(f,null)}p=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):h.createUnreachable();break;case 12:if(!(E=this.f64ModInstance)){var T,f;if(!(T=this.program.elementsLookup.get("Math"))){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),p=h.createUnreachable();break}if(!(f=T.members?T.members.get("mod"):null)){this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),p=h.createUnreachable();break}assert(f.kind==l.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=E=this.resolver.resolveFunction(f,null)}p=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):h.createUnreachable();break;default:assert(!1),p=h.createUnreachable()}break;case u.Token.LESSTHAN_LESSTHAN_EQUALS:y=!0;case u.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHL)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:p=h.createBinary(c.BinaryOp.ShlI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.ShlI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShlI64:c.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.GREATERTHAN_GREATERTHAN_EQUALS:y=!0;case u.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:p=h.createBinary(c.BinaryOp.ShrI32,r,i);break;case 3:p=h.createBinary(c.BinaryOp.ShrI64,r,i);break;case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrI64:c.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.ShrU32,r,i);break;case 8:p=h.createBinary(c.BinaryOp.ShrU64,r,i);break;case 9:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrU64:c.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:y=!0;case u.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_SHR_U)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:p=h.createBinary(c.BinaryOp.ShrU32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.ShrU64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.ShrU64:c.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.AMPERSAND_EQUALS:y=!0;case u.Token.AMPERSAND:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_AND)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:p=h.createBinary(c.BinaryOp.AndI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.AndI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.AndI64:c.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.BAR_EQUALS:y=!0;case u.Token.BAR:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_OR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.OrI32,r,i);break;case 2:case 7:p=h.createBinary(c.BinaryOp.OrI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.OrI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.OrI64:c.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.CARET_EQUALS:y=!0;case u.Token.CARET:if(r=this.compileExpressionRetainType(_,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(l.OperatorKind.BITWISE_XOR)){p=this.compileBinaryOverload(v,_,r,m,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(y)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=d.Type.commonCompatible(n,a,!1)))return this.error(o.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,h.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,_),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:p=h.createBinary(c.BinaryOp.XorI32,r,i);break;case 2:case 7:p=h.createBinary(c.BinaryOp.XorI32,r,i);break;case 3:case 8:p=h.createBinary(c.BinaryOp.XorI64,r,i);break;case 9:case 4:p=h.createBinary(this.options.isWasm64?c.BinaryOp.XorI64:c.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(o.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,u.operatorTokenToString(e.operator),this.currentType.toString()),h.createUnreachable();default:assert(!1),p=h.createUnreachable()}break;case u.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,p=h.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),p=h.createIf(this.makeIsTrueish(r,this.currentType),i,p);else{var A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));p=h.createIf(this.makeIsTrueish(h.createTeeLocal(C.index,r),this.currentType),i,h.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case u.Token.BAR_BAR:if(r=this.compileExpressionRetainType(_,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,p=this.module.cloneExpression(r,!0,0))p=this.module.createIf(this.makeIsTrueish(r,this.currentType),p,i);else{A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));p=h.createIf(this.makeIsTrueish(h.createTeeLocal(C.index,r),this.currentType),h.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),p=this.module.createUnreachable()}return y?this.compileAssignmentWithValue(_,p,t!=d.Type.void):p},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(l.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==l.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(l.DecoratorFlags.INLINE))},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFunction,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case l.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=d.Type.void);case l.ElementKind.LOCAL:case l.ElementKind.FIELD:n=s.type;break;case l.ElementKind.PROPERTY:var c=s.setterPrototype;if(c){var p=this.resolver.resolveFunction(c,null);if(!p)return this.module.createUnreachable();assert(1==p.signature.parameterTypes.length),n=p.signature.parameterTypes[0];break}return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case l.ElementKind.CLASS:if(i.resolvedElementExpression){var u=a.flow.is(4096),h=s.lookupOverload(l.OperatorKind.INDEXED_SET,u);if(!h)return s.lookupOverload(l.OperatorKind.INDEXED_GET,u)?this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=d.Type.void);var _=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,_,r!=d.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.resolver.resolveExpression(e,this.currentFunction);if(!i)return n.createUnreachable();switch(i.kind){case l.ElementKind.LOCAL:var a=i.type;if(assert(a!=d.Type.void),this.currentType=r?a:d.Type.void,i.is(p.CommonFlags.CONST))return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var s=this.currentFunction.flow;return a.is(36)&&s.setLocalWrapped(i.index,!s.canOverflow(t,a)),r?n.createTeeLocal(i.index,t):n.createSetLocal(i.index,t);case l.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=d.Type.void),this.currentType=r?a:d.Type.void,i.is(p.CommonFlags.CONST))return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,a),r){var c=a.toNativeType(),u=i.internalName;return n.createBlock(null,[n.createSetGlobal(u,t),n.createGetGlobal(u,c)],c)}return n.createSetGlobal(i.internalName,t);case l.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var _=assert(this.resolver.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0);a=i.type;this.currentType=r?a:d.Type.void;c=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(L=this.currentFunction).flow;var y=L.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(y,t),n.createStore(a.byteSize,m,n.createGetLocal(y,c),c,i.memoryOffset),n.createGetLocal(y,c)],c)}return n.createStore(a.byteSize,m,t,c,i.memoryOffset);case l.ElementKind.PROPERTY:var g=i.setterPrototype;if(g){var E=this.resolver.resolveFunction(g,null);if(!E)return n.createUnreachable();if(!r){if(E.is(p.CommonFlags.INSTANCE)){_=assert(this.resolver.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0);return this.makeCallDirect(E,[m,t])}return this.makeCallDirect(E,[t])}var T=i.getterPrototype;assert(null!=T);var f=this.resolver.resolveFunction(T,null);if(!f)return n.createUnreachable();var I=(R=f.signature.returnType).toNativeType();if(E.is(p.CommonFlags.INSTANCE)){_=assert(this.resolver.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0),y=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(E,[n.createTeeLocal(y,m),t]),this.makeCallDirect(f,[n.createGetLocal(y,I)])],I)}return n.createBlock(null,[this.makeCallDirect(E,[t]),this.makeCallDirect(f)],I)}return this.error(o.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case l.ElementKind.CLASS:var v=this.resolver.resolvedElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(l.OperatorKind.INDEXED_GET,A);if(!C)return this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(l.OperatorKind.INDEXED_SET,A);if(!N)return this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:d.Type.void,n.createUnreachable();var O=i.type,S=(_=assert(this.resolver.resolvedThisExpression),m=this.compileExpressionRetainType(_,this.options.usizeType,0),this.compileExpression(v,d.Type.i32,1,0));if(r){var L,b=(L=this.currentFunction).getTempLocal(O,!1),k=L.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(b),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(b.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(b.index,b.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r,n,i=this.module,a=this.currentFunction,s=this.resolver.resolveExpression(e.expression,a);if(!s)return i.createUnreachable();switch(s.kind){case l.ElementKind.FUNCTION_PROTOTYPE:var u=s,_=e.typeArguments;if(u.is(p.CommonFlags.AMBIENT|p.CommonFlags.BUILTIN))return this.compileCallExpressionBuiltin(u,e,t);var m=null;if(_){if(!u.is(p.CommonFlags.GENERIC))return this.error(o.DiagnosticCode.Type_0_is_not_generic,e.expression.range,u.internalName),i.createUnreachable();m=this.resolver.resolveFunctionInclTypeArguments(u,_,this.currentFunction.flow.contextualTypeArguments,e)}else{if(u.is(p.CommonFlags.GENERIC)){for(var y=new Map,g=assert(u.declaration.typeParameters),E=g.length,T=0;T<E;++T)y.set(g[T].name.text,null);var f=u.declaration.signature.parameters,I=f.length,v=e.arguments,A=v.length,C=new Array(A);for(T=0;T<I;++T){var N=f[T].type,O=N.kind==h.NodeKind.TYPE?N.name.text:null,S=T<A?v[T]:u.declaration.signature.parameters[T].initializer;if(!S)return this.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,e.range,I.toString(10),A.toString(10)),i.createUnreachable();if(null!==O&&y.has(O)){if(R=y.get(O)){C[T]=this.compileExpressionRetainType(S,R,0);var L=void 0;if(!(L=d.Type.commonCompatible(R,this.currentType,!0))&&!(L=d.Type.commonCompatible(R,this.currentType,!1)))return this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,f[T].type.range,this.currentType.toString(),R.toString()),i.createUnreachable();R=L}else C[T]=this.compileExpressionRetainType(S,d.Type.i32,0),R=this.currentType;y.set(O,R)}else{var b=this.resolver.resolveType(f[T].type,this.currentFunction.flow.contextualTypeArguments);if(!b)return i.createUnreachable();C[T]=this.compileExpression(S,b,1,0)}}var k=new Array(E);for(T=0;T<E;++T){var R=assert(y.get(g[T].name.text));k[T]=R}return(m=this.resolver.resolveFunction(u,k,this.currentFunction.flow.contextualTypeArguments))?this.makeCallDirect(m,C):this.module.createUnreachable()}m=this.resolver.resolveFunction(u,null,this.currentFunction.flow.contextualTypeArguments)}if(!m)return this.module.createUnreachable();var x=0;return m.is(p.CommonFlags.INSTANCE)&&(x=this.compileExpressionRetainType(assert(this.resolver.resolvedThisExpression),this.options.usizeType,0)),this.compileCallDirect(m,e.arguments,e,x,m.hasDecorator(l.DecoratorFlags.INLINE));case l.ElementKind.LOCAL:if(r=s.type.signatureReference){n=i.createGetLocal(s.index,c.NativeType.I32);break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.GLOBAL:if(r=s.type.signatureReference){n=i.createGetGlobal(s.internalName,s.type.toNativeType());break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.FIELD:if(r=s.type.signatureReference){var F=assert(this.resolver.resolvedThisExpression);x=this.compileExpressionRetainType(F,this.options.usizeType,0);n=i.createLoad(4,!1,x,c.NativeType.I32,s.memoryOffset);break}return this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,e.range,s.type.toString()),i.createUnreachable();case l.ElementKind.FUNCTION_TARGET:r=s.signature,n=this.compileExpression(e.expression,s.type,1,0);break;case l.ElementKind.PROPERTY:default:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),i.createUnreachable()}return this.compileCallIndirect(r,n,e.arguments,e)},t.prototype.compileCallExpressionBuiltin=function(e,t,r){var n=null,i=t.typeArguments;t.typeArguments&&(e.is(p.CommonFlags.GENERIC)||this.error(o.DiagnosticCode.Type_0_is_not_generic,t.range,e.internalName),n=this.resolver.resolveTypeArguments(assert(e.declaration.typeParameters),i,this.currentFunction.flow.contextualTypeArguments,t));var a=s.compileCall(this,e,n,t.arguments,r,t);return a||(this.error(o.DiagnosticCode.Operation_not_supported,t.range),this.module.createUnreachable())},t.prototype.checkCallSignature=function(e,t,r,n){if(r!=(null!=e.thisType))return this.error(o.DiagnosticCode.Operation_not_supported,n.range),!1;var i=e.hasRest;if(i)return this.error(o.DiagnosticCode.Operation_not_supported,n.range),!1;var a=e.requiredParameters,s=e.parameterTypes.length;return t<a?(this.error(a<s?o.DiagnosticCode.Expected_at_least_0_arguments_but_got_1:o.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,a.toString(),t.toString()),!1):!(t>s&&!i)||(this.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n,i){void 0===n&&(n=0),void 0===i&&(i=!1);var a=t.length,s=e.signature;if(!this.checkCallSignature(s,a,0!=n,r))return this.module.createUnreachable();if(i)return assert(!e.is(p.CommonFlags.TRAMPOLINE)),this.compileCallInlineUnchecked(e,t,r,n);var o=n?a+1:a,c=new Array(o),l=0;n&&(c[0]=n,l=1);for(var u=s.parameterTypes,h=0;h<a;++h,++l)c[l]=this.compileExpression(t[h],u[h],1,0);return assert(l==o),this.makeCallDirect(e,c)},t.prototype.compileCallInlineUnchecked=function(e,t,r,n){var a,s;void 0===n&&(n=0);var u=t.length,_=e.signature,m=this.currentFunction,y=this.module,g=e.prototype.declaration,E=m.flow,T=e.internalName+"|inlined."+(e.nextInlineId++).toString(10),f=e.signature.returnType,I=l.Flow.create(m);I.set(2048),I.returnLabel=T,I.returnType=f,I.contextualTypeArguments=e.contextualTypeArguments;var v=[];if(n){var A=assert(e.parent);if(assert(A.kind==l.ElementKind.CLASS),c.getExpressionId(n)==c.ExpressionId.GetLocal)I.addScopedLocalAlias(c.getGetLocalIndex(n),A.type,"this");else{var C=I.addScopedLocal(A.type,"this",!1);v.push(y.createSetLocal(C.index,n))}}for(var N=_.parameterTypes,O=0;O<u;++O){var S=this.compileExpression(t[O],N[O],1,0);if(c.getExpressionId(S)==c.ExpressionId.GetLocal)I.addScopedLocalAlias(c.getGetLocalIndex(S),N[O],_.getParameterName(O));else{var L=I.addScopedLocal(N[O],_.getParameterName(O),!I.canOverflow(S,N[O]));v.push(y.createSetLocal(L.index,S))}}m.flow=I;var b=_.parameterTypes.length;for(O=u;O<b;++O){var k=this.compileExpression(assert(g.signature.parameters[O].initializer),N[O],1,1);L=I.addScopedLocal(N[O],_.getParameterName(O),!I.canOverflow(k,N[O]));v.push(y.createSetLocal(L.index,k))}var R=assert(g.body);if(R.kind==h.NodeKind.BLOCK)for(var x=R.statements,F=(O=0,x.length);O<F;++O){var D=this.compileStatement(x[O]);if(c.getExpressionId(D)!=c.ExpressionId.Nop&&(v.push(D),I.isAny(29)))break}else v.push(this.compileStatement(R));var B=I.scopedLocals;if(B){try{for(var U=i(B.values()),P=U.next();!P.done;P=U.next()){var w=P.value;w.is(p.CommonFlags.SCOPED)&&m.freeTempLocal(w)}}catch(e){a={error:e}}finally{try{P&&!P.done&&(s=U.return)&&s.call(U)}finally{if(a)throw a.error}}I.scopedLocals=null}return I.finalize(),this.currentFunction.flow=E,this.currentType=f,f==d.Type.void||I.isAny(29)?y.createBlock(T,v,f.toNativeType()):(this.error(o.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,g.signature.returnType.range),y.createUnreachable())},t.prototype.ensureTrampoline=function(e){var t=e.trampoline;if(t)return t;var r=e.signature,n=e.internalName,i=r.parameterTypes,a=e.prototype.declaration.signature.parameters,s=r.returnType,u=r.thisType,h=e.is(p.CommonFlags.INSTANCE),_=r.requiredParameters,m=_,y=i.length,g=y;h&&(++m,++g);var E=assert(g-m),T=new Array(m),f=0,I=this.module;h&&(T[0]=I.createGetLocal(0,this.options.nativeSizeType),f=1);for(var v=0;v<_;++v,++f)T[f]=I.createGetLocal(f,i[v].toNativeType());assert(f==m);var A=new d.Signature(i,s,u),C=n+"|trampoline";A.requiredParameters=y,(t=new l.Function(e.prototype,C,A,e.parent,e.contextualTypeArguments)).set(e.flags|p.CommonFlags.TRAMPOLINE|p.CommonFlags.COMPILED),e.trampoline=t;var N=this.currentFunction;this.currentFunction=t;var O=E+1,S=new Array(O),L="of"+E.toString(10);for(v=0;v<O;++v){var b=v.toString(10)+L;S[v]=b}var k=I.createBlock(S[0],[I.createBlock("oob",[I.createSwitch(S,"oob",_?I.createBinary(c.BinaryOp.SubI32,I.createGetGlobal("~argc",c.NativeType.I32),I.createI32(_)):I.createGetGlobal("~argc",c.NativeType.I32))]),I.createUnreachable()]);for(v=0;v<E;++v,++f){var R=i[_+v],x=a[_+v],F=x.initializer,D=void 0;F?D=I.createSetLocal(f,this.compileExpression(F,R,1,1)):(this.error(o.DiagnosticCode.Optional_parameter_must_have_an_initializer,x.range),D=I.createUnreachable()),k=I.createBlock(S[v+1],[k,D]),T[f]=I.createGetLocal(f,R.toNativeType())}this.currentFunction=N,assert(f==g);var B=I.addFunction(C,this.ensureFunctionType(A.parameterTypes,A.returnType,A.thisType),d.typesToNativeTypes(t.additionalLocals),I.createBlock(null,[k,I.createCall(n,T,s.toNativeType())],s.toNativeType()));return t.finalize(I,B),t},t.prototype.ensureArgcVar=function(){if(!this.argcVar){var e=this.module;this.argcVar=e.addGlobal("~argc",c.NativeType.I32,!0,e.createI32(0))}return"~argc"},t.prototype.ensureArgcSet=function(){if(!this.argcSet){var e=this.module;this.argcSet=e.addFunction("~setargc",this.ensureFunctionType([d.Type.u32],d.Type.void),null,e.createSetGlobal(this.ensureArgcVar(),e.createGetLocal(0,c.NativeType.I32))),e.addFunctionExport("~setargc","_setargc")}return"~setargc"},t.prototype.makeCallDirect=function(e,t){void 0===t&&(t=null);var r=t?t.length:0,n=r,i=e.signature.requiredParameters,a=e.signature.parameterTypes.length,s=a;e.is(p.CommonFlags.INSTANCE)&&(++i,++s,--n),assert(r>=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(p.CommonFlags.MODULE_IMPORT);if(r<s){t||((t=new Array(s)).length=0);for(var u=e.signature.parameterTypes,d=e.prototype.declaration.signature.parameters,_=!0,m=n;m<a;++m){var y=d[m].initializer;if(null===y||!h.nodeIsConstantValue(y.kind)){_=!1;break}}if(_)for(m=n;m<a;++m)t.push(this.compileExpression(d[m].initializer,u[m],1,0));else{for(m=n;m<a;++m)t.push(u[m].toNativeZero(o));if(!l){var g=e;if(e=this.ensureTrampoline(e),!this.compileFunction(e))return o.createUnreachable();e.flow.flags=g.flow.flags,this.program.instancesLookup.set(e.internalName,e);var E=c.toNativeType();return this.currentType=c,o.createBlock(null,[o.createSetGlobal(this.ensureArgcVar(),o.createI32(n)),o.createCall(e.internalName,t,E)],E)}}}return this.currentType=c,l?o.createCallImport(e.internalName,t,c.toNativeType()):o.createCall(e.internalName,t,c.toNativeType())},t.prototype.compileCallIndirect=function(e,t,r,n,i){void 0===i&&(i=0);var a=r.length;if(!this.checkCallSignature(e,a,0!=i,n))return this.module.createUnreachable();var s=i?a+1:a,o=new Array(s),c=0;i&&(o[0]=i,c=1);for(var p=e.parameterTypes,l=0;l<a;++l,++c)o[c]=this.compileExpression(r[l],p[l],1,0);return assert(c==s),this.makeCallIndirect(e,t,o)},t.prototype.makeCallIndirect=function(e,t,r){void 0===r&&(r=null);var n=r?r.length:0,i=n,a=e.requiredParameters,s=e.parameterTypes.length,o=s;e.thisType&&(++a,++o,--i),assert(n>=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n<o){r||((r=new Array(o)).length=0);for(var p=e.parameterTypes,l=i;l<s;++l)r.push(p[l].toNativeZero(c))}var u=e.returnType;return this.currentType=u,c.createBlock(null,[c.createSetGlobal(this.ensureArgcVar(),c.createI32(i)),c.createCallIndirect(t,r,e.toSignatureString())],u.toNativeType())},t.prototype.compileCommaExpression=function(e,t){for(var r=e.expressions,n=r.length,i=new Array(n--),a=0;a<n;++a)i[a]=this.compileExpression(r[a],d.Type.void,2,0);return i[n]=this.compileExpression(r[n],t,1,0),this.module.createBlock(null,i,this.currentType.toNativeType())},t.prototype.compileElementAccessExpression=function(e,t){var r=this.resolver.resolveElementAccess(e,this.currentFunction);if(!r)return this.module.createUnreachable();switch(r.kind){case l.ElementKind.CLASS:var n=this.currentFunction.flow.is(4096),i=r.lookupOverload(l.OperatorKind.INDEXED_GET,n);if(!i)return this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.expression.range,r.internalName),this.module.createUnreachable();var a=this.compileExpression(e.expression,r.type,1,0);return this.compileCallDirect(i,[e.elementExpression],e,a)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileFunctionExpression=function(e,t){var r=e.declaration,n=r.name,i=(n.text.length?n.text:"anonymous")+"|"+this.functionTable.length.toString(10),a=this.currentFunction,s=new l.FunctionPrototype(this.program,i,a.internalName+p.INNER_DELIMITER+i,r,null,l.DecoratorFlags.NONE),o=a.flow,c=this.compileFunctionUsingTypeArguments(s,[],o.contextualTypeArguments,o,r);if(!c)return this.module.createUnreachable();this.currentType=c.signature.type;var u=this.ensureFunctionTableEntry(c);return u<0?this.module.createUnreachable():this.module.createI32(u)},t.prototype.compileIdentifierExpression=function(e,t,r){var n=this.module,i=this.currentFunction;switch(e.kind){case h.NodeKind.NULL:var a=this.options;return t.classReference||(this.currentType=a.usizeType),a.isWasm64?n.createI64(0):n.createI32(0);case h.NodeKind.TRUE:return this.currentType=d.Type.bool,n.createI32(1);case h.NodeKind.FALSE:return this.currentType=d.Type.bool,n.createI32(0);case h.NodeKind.THIS:if((_=i.flow).is(2048))if(m=_.getScopedLocal("this"))return this.currentType=m.type,n.createGetLocal(m.index,m.type.toNativeType());if(i.is(p.CommonFlags.INSTANCE)){var s=assert(i.parent);assert(s.kind==l.ElementKind.CLASS);var u=s.type;return i.is(p.CommonFlags.CONSTRUCTOR)&&!_.is(32)?(_.set(32),this.currentType=u,n.createTeeLocal(0,this.makeConditionalAllocate(s,e))):(this.currentType=u,n.createGetLocal(0,u.toNativeType()))}return this.error(o.DiagnosticCode._this_cannot_be_referenced_in_current_location,e.range),this.currentType=this.options.usizeType,n.createUnreachable();case h.NodeKind.SUPER:var _,m;if((_=i.flow).is(2048))if(m=_.getScopedLocal("this"))if(y=assert(m.type.classReference).base)return this.currentType=y.type,n.createGetLocal(m.index,y.type.toNativeType());if(i.is(p.CommonFlags.INSTANCE)){var y;s=assert(i.parent);if(assert(s.kind==l.ElementKind.CLASS),y=s.base){var g=y.type;return this.currentType=g,n.createGetLocal(0,g.toNativeType())}}return this.error(o.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,e.range),this.currentType=this.options.usizeType,n.createUnreachable()}var E=this.resolver.resolveIdentifier(e,this.currentEnum||i);if(!E)return n.createUnreachable();switch(E.kind){case l.ElementKind.LOCAL:if(E.is(p.CommonFlags.INLINED))return this.compileInlineConstant(E,t,r);var T=E.type,f=E.index;return assert(f>=0),this.currentType=T,this.module.createGetLocal(f,T.toNativeType());case l.ElementKind.GLOBAL:if(!this.compileGlobal(E))return this.module.createUnreachable();var I=E.type;return assert(I!=d.Type.void),E.is(p.CommonFlags.INLINED)?this.compileInlineConstant(E,t,r):(this.currentType=I,this.module.createGetGlobal(E.internalName,I.toNativeType()));case l.ElementKind.ENUMVALUE:return E.is(p.CommonFlags.COMPILED)?(this.currentType=d.Type.i32,E.is(p.CommonFlags.INLINED)?this.module.createI32(E.constantValue):this.module.createGetGlobal(E.internalName,c.NativeType.I32)):(this.error(o.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=d.Type.i32,this.module.createUnreachable());case l.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(E,null,i.flow.contextualTypeArguments);if(!v||!this.compileFunction(v))return n.createUnreachable();var A=this.ensureFunctionTableEntry(v);return this.currentType=v.signature.type,this.module.createI32(A)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType);return this.currentType=d.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?c.BinaryOp.NeI64:c.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case h.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,e):(this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case h.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==d.Type.f32?n.createF32(a):(this.currentType=d.Type.f64,n.createF64(a));case h.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=d.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=d.Type.u32,n.createI32(i64_low(s))):(this.currentType=d.Type.i64,n.createI64(i64_low(s),i64_high(s)));case h.LiteralKind.STRING:return assert(!r),this.compileStaticString(e.value)}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.compileStaticString=function(e){var t=this.module,r=this.options,n=this.stringSegments,i=n.get(e);if(!i){var a=e.length,s=new Uint8Array(4+2*a);s[0]=255&a,s[1]=a>>>8&255,s[2]=a>>>16&255,s[3]=a>>>24&255;for(var o=0;o<a;++o)s[4+2*o]=255&e.charCodeAt(o),s[5+2*o]=e.charCodeAt(o)>>>8&255;i=this.addMemorySegment(s,r.usizeType.byteSize),n.set(e,i)}var c=i.offset,p=this.program.typesLookup.get("string");return this.currentType=p||r.usizeType,r.isWasm64?t.createI64(i64_low(c),i64_high(c)):(assert(i64_is_i32(c)),t.createI32(i64_low(c)))},t.prototype.compileArrayLiteral=function(e,t,r){var n=!0,i=this.module,a=assert(this.program.arrayPrototype);if(!a||a.kind!=l.ElementKind.CLASS_PROTOTYPE)return i.createUnreachable();var s=this.resolver.resolveClass(a,[e]);if(!s)return i.createUnreachable();var p=s.type,u=t.length;if(u){var h=e.toNativeType(),d=void 0,m=void 0;switch(h){case c.NativeType.I32:d=changetype(new Int32Array(u)),m=4*u;break;case c.NativeType.I64:d=changetype(new Array(u)),m=8*u;break;case c.NativeType.F32:d=changetype(new Float32Array(u)),m=4*u;break;case c.NativeType.F64:d=changetype(new Float64Array(u)),m=8*u;break;default:return assert(!1),i.createUnreachable()}for(var y=new Array(u),g=void 0,E=0;E<u;++E)if(y[E]=t[E]?this.compileExpression(t[E],e,1,0):e.toNativeZero(i),n)if(g=this.precomputeExpressionRef(y[E]),c.getExpressionId(g)==c.ExpressionId.Const)switch(assert(c.getExpressionType(g)==h),h){case c.NativeType.I32:changetype(d)[E]=c.getConstValueI32(g);break;case c.NativeType.I64:changetype(d)[E]=i64_new(c.getConstValueI64Low(g),c.getConstValueI64High(g));break;case c.NativeType.F32:changetype(d)[E]=c.getConstValueF32(g);break;case c.NativeType.F64:changetype(d)[E]=c.getConstValueF64(g);break;default:assert(!1)}else n=!1;var T=this.options.usizeType.byteSize;if(n){var f=T+4,I=1<<32-clz(m+8-1),v=new Uint8Array(f+I),A=this.addMemorySegment(v),C=0;switch(8==T?(_.writeI64(i64_add(A.offset,i64_new(f)),v,C),C+=8):(assert(0==i64_high(A.offset)),_.writeI32(i64_low(A.offset)+f,v,C),C+=4),_.writeI32(u,v,C),C+=4,assert(C==f),_.writeI32(m,v,C),C+=8,h){case c.NativeType.I32:for(E=0;E<u;++E)_.writeI32(changetype(d)[E],v,C),C+=4;break;case c.NativeType.I64:for(E=0;E<u;++E)_.writeI64(changetype(d)[E],v,C),C+=8;break;case c.NativeType.F32:for(E=0;E<u;++E)_.writeF32(changetype(d)[E],v,C),C+=4;break;case c.NativeType.F64:for(E=0;E<u;++E)_.writeF64(changetype(d)[E],v,C),C+=8;break;default:return assert(!1),i.createUnreachable()}return assert(C<=f+I),this.currentType=p,8==T?i.createI64(i64_low(A.offset),i64_high(A.offset)):i.createI32(i64_low(A.offset))}this.currentType=p;var N=s.lookupOverload(l.OperatorKind.INDEXED_SET,!0);if(!N)return this.error(o.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,r.range,s.internalName),i.createUnreachable();var O=p.toNativeType(),S=this.currentFunction,L=S.getTempLocal(p,!1),b=new Array(2+u),k=0;b[k++]=i.createSetLocal(L.index,this.makeCallDirect(assert(s.constructorInstance),[i.createI32(0),i.createI32(u)]));for(E=0;E<u;++E)b[k++]=this.makeCallDirect(N,[i.createGetLocal(L.index,O),i.createI32(E),y[E]]);return assert(k+1==b.length),b[k]=i.createGetLocal(L.index,O),S.freeTempLocal(L),this.currentType=p,i.createBlock(null,b,O)}return this.currentType=p,this.makeCallDirect(assert(s.constructorInstance),[i.createI32(0),i.createI32(0)])},t.prototype.compileNewExpression=function(e,t){var r=this.module,n=this.options,i=this.currentFunction,a=this.resolver.resolveExpression(e.expression,i);if(!a)return r.createUnreachable();if(a.kind!=l.ElementKind.CLASS_PROTOTYPE)return this.error(o.DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,e.expression.range),this.module.createUnreachable();var s,c,u=a,h=null,d=e.typeArguments;if(!(h=!d&&null!==(s=t.classReference)&&s.is(p.CommonFlags.GENERIC)?this.resolver.resolveClass(u,s.typeArguments,i.flow.contextualTypeArguments):this.resolver.resolveClassInclTypeArguments(u,d,i.flow.contextualTypeArguments,e)))return r.createUnreachable();for(var _=h,m=h.constructorInstance;!m&&(_=h.base);)m=_.constructorInstance;return c=m?this.compileCallDirect(m,e.arguments,e,n.usizeType.toNativeZero(r)):this.makeAllocate(h,e),this.currentType=h.type,c},t.prototype.compileParenthesizedExpression=function(e,t){return this.compileExpression(e.expression,t,0,0)},t.prototype.compilePropertyAccessExpression=function(e,t,r){var n=this.module,i=this.resolver.resolvePropertyAccess(e,this.currentFunction);if(!i)return n.createUnreachable();switch(i.kind){case l.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();var a=i.type;return assert(a!=d.Type.void),i.is(p.CommonFlags.INLINED)?this.compileInlineConstant(i,t,r):(this.currentType=a,n.createGetGlobal(i.internalName,a.toNativeType()));case l.ElementKind.ENUMVALUE:var s=i.parent;return assert(null!==s&&s.kind==l.ElementKind.ENUM),this.compileEnum(s)?(this.currentType=d.Type.i32,i.is(p.CommonFlags.INLINED)?n.createI32(i.constantValue):n.createGetGlobal(i.internalName,c.NativeType.I32)):this.module.createUnreachable();case l.ElementKind.FIELD:var u=assert(this.resolver.resolvedThisExpression);assert(i.memoryOffset>=0);var h=this.compileExpressionRetainType(u,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),h,i.type.toNativeType(),i.memoryOffset);case l.ElementKind.PROPERTY:var _=i.getterPrototype;if(_){var m=this.resolver.resolveFunction(_,null);if(!m)return n.createUnreachable();var y=m.signature;if(!this.checkCallSignature(y,0,m.is(p.CommonFlags.INSTANCE),e))return n.createUnreachable();var g=0!=(m.decoratorFlags&l.DecoratorFlags.INLINE);if(m.is(p.CommonFlags.INSTANCE)){s=assert(m.parent);assert(s.kind==l.ElementKind.CLASS);u=assert(this.resolver.resolvedThisExpression),h=this.compileExpressionRetainType(u,this.options.usizeType,0);return this.currentType=y.returnType,this.compileCallDirect(m,[],e,h,g)}return this.currentType=y.returnType,this.compileCallDirect(m,[],e,0,g)}return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.range,i.simpleName,i.parent.toString()),n.createUnreachable()}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFunction,a=i.flow,s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var l=this.precomputeExpressionRef(s);if(c.getExpressionId(l)==c.ExpressionId.Const&&c.getExpressionType(l)==c.NativeType.I32)return c.getConstValueI32(l)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,d.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),_=this.currentType;u.free();var m=a.fork();i.flow=m;var y=this.compileExpressionRetainType(n,t,0),g=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var E=d.Type.commonCompatible(_,g,!1);return E?(h=this.convertExpression(h,_,E,1,0,r),y=this.convertExpression(y,g,E,1,0,n),this.currentType=E,this.module.createIf(s,h,y)):(this.error(o.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,_.toString(),g.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFunction,i=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0);if(c.getExpressionId(i)==c.ExpressionId.Unreachable)return i;var a,s,p,l=this.currentType;switch(e.operator){case u.Token.PLUS_PLUS:if(this.currentType.is(256))return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable();switch(l.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=c.BinaryOp.AddI32,s=c.NativeType.I32,p=r.createI32(1);break;case 9:case 4:a=(h=this.options).isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,s=h.nativeSizeType,p=l.toNativeOne(r);break;case 3:case 8:a=c.BinaryOp.AddI64,s=c.NativeType.I64,p=r.createI64(1);break;case 11:a=c.BinaryOp.AddF32,s=c.NativeType.F32,p=r.createF32(1);break;case 12:a=c.BinaryOp.AddF64,s=c.NativeType.F64,p=r.createF64(1);break;default:return assert(!1),r.createUnreachable()}break;case u.Token.MINUS_MINUS:if(this.currentType.is(256))return this.error(o.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable();switch(l.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=c.BinaryOp.SubI32,s=c.NativeType.I32,p=r.createI32(1);break;case 9:case 4:var h;a=(h=this.options).isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,s=h.nativeSizeType,p=l.toNativeOne(r);break;case 3:case 8:a=c.BinaryOp.SubI64,s=c.NativeType.I64,p=r.createI64(1);break;case 11:a=c.BinaryOp.SubF32,s=c.NativeType.F32,p=r.createF32(1);break;case 12:a=c.BinaryOp.SubF64,s=c.NativeType.F64,p=r.createF64(1);break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(t==d.Type.void)return this.compileAssignmentWithValue(e.operand,r.createBinary(a,i,p),!1);var _=n.getTempLocal(l,!1),m=this.compileAssignmentWithValue(e.operand,r.createBinary(a,this.module.createGetLocal(_.index,s),p),!1);this.currentType=assert(_).type,n.freeTempLocal(_);var y=_.index;return r.createBlock(null,[r.createSetLocal(y,i),m,r.createGetLocal(y,s)],s)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case u.Token.PLUS:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case u.Token.MINUS:if(e.operand.kind==h.NodeKind.LITERAL&&(e.operand.literalKind==h.LiteralKind.INTEGER||e.operand.literalKind==h.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(c.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(c.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(c.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.AddI64:c.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(c.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(c.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.SubI64:c.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(c.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(c.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=d.Type.bool;break;case u.Token.TILDE:if(r=this.compileExpression(e.operand,t==d.Type.void?d.Type.i32:t.is(8)?d.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(l.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(c.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?c.BinaryOp.XorI64:c.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(c.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case u.Token.TYPEOF:return this.error(o.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=d.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFunction.flow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(c.UnaryOp.ExtendI8ToI32,e):r.createBinary(c.BinaryOp.ShrI32,r.createBinary(c.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(c.UnaryOp.ExtendI16ToI32,e):r.createBinary(c.BinaryOp.ShrI32,r.createBinary(c.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(c.BinaryOp.AndI32,e,r.createI32(1)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(c.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(c.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,e);case 11:return r.createBinary(c.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(c.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(c.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(c.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(c.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(c.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,o=this.currentFunction,c=this.options.nativeSizeType,u=o.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(u.index,s.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==l.ElementKind.FIELD){var y=m,g=y.type,E=g.toNativeType(),T=y.prototype.declaration;if(assert(!y.isAny(p.CommonFlags.CONST)),T.initializer)h.push(a.createStore(g.byteSize,a.createGetLocal(u.index,c),this.compileExpression(T.initializer,g,1,0),E,y.memoryOffset));else{var f=y.prototype.declaration.parameterIndex;h.push(a.createStore(g.byteSize,a.createGetLocal(u.index,c),f>=0?a.createGetLocal(1+f,E):g.toNativeZero(a),E,y.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(u.index,c)),o.freeTempLocal(u),this.currentType=e.type,a.createBlock(null,h,c)},t.prototype.makeConditionalAllocate=function(e,t){var r=this.module,n=this.options.nativeSizeType;return this.currentType=e.type,r.createIf(n==c.NativeType.I64?r.createBinary(c.BinaryOp.NeI64,r.createGetLocal(0,c.NativeType.I64),r.createI64(0)):r.createGetLocal(0,c.NativeType.I32),r.createGetLocal(0,n),r.createTeeLocal(0,this.makeAllocate(e,t)))},t.prototype.addDebugLocation=function(e,t){var r=this.currentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(o.DiagnosticEmitter);function T(e,t){switch(void 0===t&&(t=e.simpleName),e.kind){case l.ElementKind.FUNCTION:return(r=e.parent||e.prototype.parent)?T(r)+(e.is(p.CommonFlags.INSTANCE)?p.INSTANCE_DELIMITER:p.STATIC_DELIMITER)+t:t;case l.ElementKind.FIELD:case l.ElementKind.ENUMVALUE:return T(r=assert(e.parent))+(e.is(p.CommonFlags.INSTANCE)?p.INSTANCE_DELIMITER:p.STATIC_DELIMITER)+t;case l.ElementKind.CLASS:return(r=e.prototype.parent)?T(r)+p.STATIC_DELIMITER+t:t;default:var r;return(r=e.parent)?T(r)+p.STATIC_DELIMITER+t:t}}function f(e,t,r){if(void 0===r&&(r=null),y=r?r.simpleName:t.range.source.simplePath,g=e.simpleName,e.hasDecorator(l.DecoratorFlags.EXTERNAL)){var n=e.program,i=assert(h.findDecorator(h.DecoratorKind.EXTERNAL,t.decorators)),a=i.arguments;if(a&&a.length){var s=a[0];s.kind==h.NodeKind.LITERAL&&s.literalKind==h.LiteralKind.STRING?(g=s.value,a.length>=2&&((s=a[1]).kind==h.NodeKind.LITERAL&&s.literalKind==h.LiteralKind.STRING?(y=g,g=s.value,a.length>2&&n.error(o.DiagnosticCode.Expected_0_arguments_but_got_1,i.range,"2",a.length.toString())):n.error(o.DiagnosticCode.String_literal_expected,s.range))):n.error(o.DiagnosticCode.String_literal_expected,s.range)}else n.error(o.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,i.range,"1","0")}}t.Compiler=E},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=r(0),a=r(5),s=r(8),o=r(1),c=r(3),p=r(2),l=i.LIBRARY_PREFIX+"builtins.ts",u=function(e){function t(){var t=e.call(this)||this;return t.backlog=new Array,t.seenlog=new Set,t.donelog=new Set,t.onComment=null,t.tryParseSignatureIsSignature=!1,t.parseParametersThis=null,t.program=new a.Program(t.diagnostics),t}return n(t,e),t.prototype.parseFile=function(e,t,r){var n=c.normalizePath(t),a=p.mangleInternalPath(n);if(!this.donelog.has(a)){this.donelog.add(a),this.seenlog.add(a);var o=new p.Source(n,e,r?p.SourceKind.ENTRY:t.startsWith(i.LIBRARY_PREFIX)&&t.indexOf(i.PATH_DELIMITER,i.LIBRARY_PREFIX.length)<0?p.SourceKind.LIBRARY:p.SourceKind.DEFAULT),u=this.program;u.sources.push(o),o.normalizedPath==l&&o.set(i.CommonFlags.BUILTIN);var h=new s.Tokenizer(o,u.diagnostics);h.onComment=this.onComment,o.tokenizer=h;for(var d=o.statements;!h.skip(s.Token.ENDOFFILE);){var _=this.parseTopLevelStatement(h);_&&(_.parent=o,d.push(_))}h.finish()}},t.prototype.parseTopLevelStatement=function(e,t){void 0===t&&(t=null);for(var r=i.CommonFlags.NONE,n=-1,a=null;e.skip(s.Token.AT);){n<0&&(n=e.tokenPos);var c=this.parseDecorator(e);c?(a||(a=[]),a.push(c)):this.skipStatement(e)}r|=e.source.flags&i.CommonFlags.BUILTIN;var p=0,l=0;e.skip(s.Token.EXPORT)&&(e.skip(s.Token.DEFAULT)&&this.error(o.DiagnosticCode.Operation_not_supported,e.range()),n<0&&(n=e.tokenPos),r|=i.CommonFlags.EXPORT,p=e.tokenPos,l=e.pos);var u=null!=t&&t.is(i.CommonFlags.AMBIENT);e.skip(s.Token.DECLARE)?(n<0&&(n=e.tokenPos),u&&this.error(o.DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,e.range()),r|=i.CommonFlags.DECLARE|i.CommonFlags.AMBIENT):u&&(r|=i.CommonFlags.AMBIENT);var h=null,d=e.peek();switch(n<0&&(n=e.nextTokenPos),d){case s.Token.CONST:if(e.next(),r|=i.CommonFlags.CONST,e.skip(s.Token.ENUM)){h=this.parseEnum(e,r,a,n);break}h=this.parseVariable(e,r,a,n),a=null;break;case s.Token.LET:r|=i.CommonFlags.LET;case s.Token.VAR:e.next(),h=this.parseVariable(e,r,a,n),a=null;break;case s.Token.ENUM:e.next(),h=this.parseEnum(e,r,a,n),a=null;break;case s.Token.FUNCTION:e.next(),h=this.parseFunction(e,r,a,n),a=null;break;case s.Token.ABSTRACT:var _=e.mark();if(e.next(),!e.skip(s.Token.CLASS)){e.reset(_),h=this.parseStatement(e,!0);break}e.discard(_),r|=i.CommonFlags.ABSTRACT;case s.Token.CLASS:case s.Token.INTERFACE:e.next(),h=this.parseClassOrInterface(e,r,a,n),a=null;break;case s.Token.NAMESPACE:_=e.mark();e.next(),e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER?(e.discard(_),h=this.parseNamespace(e,r,a,n),a=null):(e.reset(_),h=this.parseStatement(e,!0));break;case s.Token.IMPORT:e.next(),h=(r|=i.CommonFlags.IMPORT)&i.CommonFlags.EXPORT?this.parseExportImport(e,n):this.parseImport(e);break;case s.Token.TYPE:_=e.mark();e.next(),e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER?(e.discard(_),h=this.parseTypeDeclaration(e,r,a,n),a=null):(e.reset(_),h=this.parseStatement(e,!0));break;default:r&i.CommonFlags.EXPORT?h=this.parseExport(e,r,n):(l&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(p,l),"export"),t||(h=this.parseStatement(e,!0)))}if(a)for(var m=0,y=a.length;m<y;++m)this.error(o.DiagnosticCode.Decorators_are_not_valid_here,a[m].range);return h},t.prototype.nextFile=function(){var e=this.backlog;return e.length?e.shift():null},t.prototype.finish=function(){if(this.backlog.length)throw new Error("backlog is not empty");return this.backlog=[],this.seenlog.clear(),this.donelog.clear(),this.program},t.prototype.parseType=function(e,t,r){void 0===t&&(t=!0),void 0===r&&(r=!1);var n,i=e.next(),a=e.tokenPos;if(i==s.Token.OPENPAREN){var c=e.skip(s.Token.OPENPAREN),l=this.tryParseSignature(e);if(l){if(c){if(!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null;if(!e.skip(s.Token.BAR))return this.error(o.DiagnosticCode._0_expected,e.range(),"|"),null;e.skip(s.Token.NULL)||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),l.isNullable=!0}return l}if(c||this.tryParseSignatureIsSignature)return this.error(o.DiagnosticCode.Unexpected_token,e.range()),null;if(!t)return this.error(o.DiagnosticCode.Unexpected_token,e.range()),null;var u=this.parseType(e,!1,r);if(!u)return null;if(!e.skip(s.Token.CLOSEPAREN))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"}"),null;(n=u).range.start=a,n.range.end=e.pos}else if(i==s.Token.VOID)n=p.Node.createType(p.Node.createIdentifierExpression("void",e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.THIS)n=p.Node.createType(p.Node.createThisExpression(e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.TRUE||i==s.Token.FALSE)n=p.Node.createType(p.Node.createIdentifierExpression("bool",e.range()),[],!1,e.range(a,e.pos));else if(i==s.Token.STRINGLITERAL)e.readString(),n=p.Node.createType(p.Node.createIdentifierExpression("string",e.range()),[],!1,e.range(a,e.pos));else{if(i!=s.Token.IDENTIFIER)return r||this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),d=new Array,_=!1;if(e.skip(s.Token.LESSTHAN)){do{var m=this.parseType(e,!0,r);if(!m)return null;d.push(m)}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.GREATERTHAN))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),">"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=p.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var y=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var g=e.range(y,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",g),[n],_,e.range(a,e.pos)),_)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),l==p.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new p.ParameterNode;_.parameterKind=l,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(s.Token.COMMA));var o=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t,c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var l=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));return p.Node.createVariableDeclaration(n,c,l,r,a,s.Range.join(n.range,e.range()))},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,i.CommonFlags.NONE);if(!l)return null;if(c.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(a,c,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,s.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=s.Token.SEMICOLON&&e.nextToken!=s.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array;!e.skip(s.Token.GREATERTHAN);){var r=this.parseTypeParameter(e);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.GREATERTHAN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){var n=this.parseType(e);if(!n)return null;if(n.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,n.range),null;r=n}return p.Node.createTypeParameter(t,r,s.Range.join(t.range,e.range()))}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==p.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(l),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(l)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=p.Node.createParameter(u,h,d,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,l=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=p.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=p.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),y=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(y=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(a,l,m,y,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var l=null;if(e.skip(s.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=p.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return p.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,y=new Array;if(a?(assert(!d),m=p.Node.createInterfaceDeclaration(l,c,u,y,r,t,e.range(n,e.pos))):m=p.Node.createClassDeclaration(l,c,u,d,y,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,m);if(!g)return null;g.parent=m,y.push(g)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=p.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return p.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){for(var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,a=new Array;e.skip(s.Token.AT);){var c=this.parseDecorator(e);if(!c)break;n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,c.range),a.push(c)}var l=t.flags&i.CommonFlags.AMBIENT;n&&(l|=i.CommonFlags.VIRTUAL),e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=i.CommonFlags.PUBLIC):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=i.CommonFlags.PRIVATE):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=i.CommonFlags.PROTECTED);var u=0,h=0,d=0,_=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=i.CommonFlags.STATIC,u=e.tokenPos,h=e.pos):(l|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=i.CommonFlags.ABSTRACT,d=e.tokenPos,_=e.pos),t.flags&i.CommonFlags.GENERIC&&(l|=i.CommonFlags.GENERIC_CONTEXT));var m=0,y=0;e.skip(s.Token.READONLY)&&(l|=i.CommonFlags.READONLY,m=e.tokenPos,y=e.pos);var g=e.mark(),E=!1,T=!1,f=!1,I=0,v=0;if(n||(e.skip(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(g):(l|=i.CommonFlags.GET,T=!0,I=e.tokenPos,v=e.pos,l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(g):(l|=i.CommonFlags.SET|i.CommonFlags.SET,f=!0,I=e.tokenPos,v=e.pos,l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(E=!0,(l|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"static"),l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"abstract"),l&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,y),"readonly"))),!E&&!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var A=E?p.Node.createConstructorExpression(e.range()):p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),C=null;if(e.skip(s.Token.LESSTHAN)){var N=e.tokenPos;if(!(C=this.parseTypeParameters(e)))return null;E?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(N,e.pos)):T||f?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(N,e.pos)):l|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var O=e.tokenPos,S=this.parseParameters(e,E);if(!S)return null;var L=this.parseParametersThis;if(E)for(var b=0,k=S.length;b<k;++b){var R=S[b];if(R.isAny(i.CommonFlags.PUBLIC|i.CommonFlags.PROTECTED|i.CommonFlags.PRIVATE|i.CommonFlags.READONLY)){var x=p.Node.createFieldDeclaration(R.name,R.type,null,null,R.flags|i.CommonFlags.INSTANCE,R.range);x.parameterIndex=b,x.parent=t,R.implicitFieldDeclaration=x,t.members.push(x)}}else T?S.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,A.range):f&&(1!=S.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,A.range),S.length&&S[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,A.range));var F=null;if(e.skip(s.Token.COLON)){if(A.kind==p.NodeKind.CONSTRUCTOR?this.error(o.DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,e.range()):f&&this.error(o.DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,e.range()),!(F=this.parseType(e,A.kind==p.NodeKind.CONSTRUCTOR||f)))return null}else F=p.Node.createOmittedType(e.range(e.pos)),f||A.kind==p.NodeKind.CONSTRUCTOR||this.error(o.DiagnosticCode.Type_expected,F.range);var D=p.Node.createSignature(S,F,L,!1,e.range(O,e.pos)),B=null;if(e.skip(s.Token.OPENBRACE)){if(l&i.CommonFlags.AMBIENT?this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()):l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,e.range(),A.text),!(B=this.parseBlockStatement(e,!1)))return null}else l&i.CommonFlags.AMBIENT||n||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range());var U=p.Node.createMethodDeclaration(A,C,D,B,a,l,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),U}if(E)this.error(o.DiagnosticCode.Constructor_implementation_is_missing,A.range);else{if(!T&&!f){l&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"abstract"),l&i.CommonFlags.GET&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(0,0),"get"),l&i.CommonFlags.SET&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(I,v),"set");var P=null;if(e.skip(s.Token.COLON)){if(!(P=this.parseType(e)))return null}else this.error(o.DiagnosticCode.Type_expected,e.range());var w=null;if(e.skip(s.Token.EQUALS)&&!(w=this.parseExpression(e)))return null;var M=p.Node.createFieldDeclaration(A,P,w,a,l,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),M}this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,A.range)}return null},t.prototype.parseNamespace=function(e,t,r,n){if(e.skipIdentifier()){var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.OPENBRACE)){for(var a=new Array,c=p.Node.createNamespaceDeclaration(i,a,r,t,e.range(n,e.pos));!e.skip(s.Token.CLOSEBRACE);){var l=this.parseTopLevelStatement(e,c);if(!l)return null;l.parent=c,a.push(l)}return e.skip(s.Token.SEMICOLON),c}this.error(o.DiagnosticCode._0_expected,e.range(),"{")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseExport=function(e,t,r){var n=null;if(e.skip(s.Token.OPENBRACE)){for(var i=new Array;!e.skip(s.Token.CLOSEBRACE);){var a=this.parseExportMember(e);if(!a)return null;if(i.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}if(e.skip(s.Token.FROM)){if(!e.skip(s.Token.STRINGLITERAL))return this.error(o.DiagnosticCode.String_literal_expected,e.range()),null;n=p.Node.createStringLiteralExpression(e.readString(),e.range())}return null===(l=(c=p.Node.createExportStatement(i,n,t,e.range(r,e.pos))).internalPath)||this.seenlog.has(l)||(this.backlog.push(l),this.seenlog.add(l)),e.skip(s.Token.SEMICOLON),c}if(e.skip(s.Token.ASTERISK))if(e.skip(s.Token.FROM)){if(e.skip(s.Token.STRINGLITERAL)){n=p.Node.createStringLiteralExpression(e.readString(),e.range());var c=p.Node.createExportStatement(null,n,t,e.range(r,e.pos)),l=assert(c.internalPath),u=e.source;return u.exportPaths||(u.exportPaths=new Set),u.exportPaths.add(l),this.seenlog.has(l)||(this.backlog.push(l),this.seenlog.add(l)),e.skip(s.Token.SEMICOLON),c}this.error(o.DiagnosticCode.String_literal_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"from");else this.error(o.DiagnosticCode._0_expected,e.range(),"{");return null},t.prototype.parseExportMember=function(e){if(e.skipIdentifier()){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.AS)){if(!e.skipIdentifierName())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}return p.Node.createExportMember(t,r,r?s.Range.join(t.range,r.range):t.range)}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseImport=function(e){var t=e.tokenPos,r=null,n=null,i=!1;if(e.skip(s.Token.OPENBRACE))for(r=new Array;!e.skip(s.Token.CLOSEBRACE);){var a=this.parseImportDeclaration(e);if(!a)return null;if(r.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}else if(e.skip(s.Token.ASTERISK)){if(!e.skip(s.Token.AS))return this.error(o.DiagnosticCode._0_expected,e.range(),"as"),null;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}else i=!0;if(i||e.skip(s.Token.FROM)){if(e.skip(s.Token.STRINGLITERAL)){var c=p.Node.createStringLiteralExpression(e.readString(),e.range()),l=void 0;n?(assert(!r),l=p.Node.createImportStatementWithWildcard(n,c,e.range(t,e.pos))):l=p.Node.createImportStatement(r,c,e.range(t,e.pos));var u=l.internalPath;return this.seenlog.has(u)||(this.backlog.push(u),this.seenlog.add(u)),e.skip(s.Token.SEMICOLON),l}this.error(o.DiagnosticCode.String_literal_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"from");return null},t.prototype.parseImportDeclaration=function(e){if(e.skipIdentifierName()){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.AS)){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}return p.Node.createImportDeclaration(t,r,r?s.Range.join(t.range,r.range):t.range)}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseExportImport=function(e,t){if(e.skipIdentifier()){var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.EQUALS)){if(e.skipIdentifier()){var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=p.Node.createExportImportStatement(n,r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode.Identifier_expected,e.range())}else this.error(o.DiagnosticCode._0_expected,e.range(),"=")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseStatement=function(e,t){void 0===t&&(t=!1);var r=e.mark(),n=null;switch(e.next()){case s.Token.BREAK:n=this.parseBreak(e);break;case s.Token.CONST:n=this.parseVariable(e,i.CommonFlags.CONST,null,e.tokenPos);break;case s.Token.CONTINUE:n=this.parseContinue(e);break;case s.Token.DO:n=this.parseDoStatement(e);break;case s.Token.FOR:n=this.parseForStatement(e);break;case s.Token.IF:n=this.parseIfStatement(e);break;case s.Token.LET:n=this.parseVariable(e,i.CommonFlags.LET,null,e.tokenPos);break;case s.Token.VAR:n=this.parseVariable(e,i.CommonFlags.NONE,null,e.tokenPos);break;case s.Token.OPENBRACE:n=this.parseBlockStatement(e,t);break;case s.Token.RETURN:t&&this.error(o.DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,e.range()),n=this.parseReturn(e);break;case s.Token.SEMICOLON:return p.Node.createEmptyStatement(e.range(e.tokenPos));case s.Token.SWITCH:n=this.parseSwitchStatement(e);break;case s.Token.THROW:n=this.parseThrowStatement(e);break;case s.Token.TRY:n=this.parseTryStatement(e);break;case s.Token.VOID:n=this.parseVoidStatement(e);break;case s.Token.WHILE:n=this.parseWhileStatement(e);break;case s.Token.TYPE:if(e.peek(!1,s.IdentifierHandling.PREFER)==s.Token.IDENTIFIER){n=this.parseTypeDeclaration(e,i.CommonFlags.NONE,null,e.tokenPos);break}default:e.reset(r),n=this.parseExpressionStatement(e)}return n?e.discard(r):(e.reset(r),this.skipStatement(e)),n},t.prototype.parseBlockStatement=function(e,t){for(var r=e.tokenPos,n=new Array;!e.skip(s.Token.CLOSEBRACE);){var i=e.mark(),a=this.parseStatement(e,t);a?(e.discard(i),n.push(a)):(e.reset(i),this.skipStatement(e))}var o=p.Node.createBlockStatement(n,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseBreak=function(e){var t=null;e.peek(!0)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine||(e.next(s.IdentifierHandling.PREFER),t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()));var r=p.Node.createBreakStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseContinue=function(e){var t=null;e.peek(!0)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine||(e.next(s.IdentifierHandling.PREFER),t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()));var r=p.Node.createContinueStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseDoStatement=function(e){var t=e.tokenPos,r=this.parseStatement(e);if(!r)return null;if(e.skip(s.Token.WHILE))if(e.skip(s.Token.OPENPAREN)){var n=this.parseExpression(e);if(!n)return null;if(e.skip(s.Token.CLOSEPAREN)){var i=p.Node.createDoStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");else this.error(o.DiagnosticCode._0_expected,e.range(),"while");return null},t.prototype.parseExpressionStatement=function(e){var t=this.parseExpression(e);if(!t)return null;var r=p.Node.createExpressionStatement(t);return e.skip(s.Token.SEMICOLON),r},t.prototype.parseForStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=null;if(e.skip(s.Token.CONST))r=this.parseVariable(e,i.CommonFlags.CONST,null,e.tokenPos);else if(e.skip(s.Token.LET))r=this.parseVariable(e,i.CommonFlags.LET,null,e.tokenPos);else if(e.skip(s.Token.VAR))r=this.parseVariable(e,i.CommonFlags.NONE,null,e.tokenPos);else if(!e.skip(s.Token.SEMICOLON)&&!(r=this.parseExpressionStatement(e)))return null;if(e.token==s.Token.SEMICOLON){var n=null;if(!e.skip(s.Token.SEMICOLON)&&!(n=this.parseExpressionStatement(e)))return null;if(e.token==s.Token.SEMICOLON){var a=null;if(!e.skip(s.Token.CLOSEPAREN)){if(!(a=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}var c=this.parseStatement(e);return c?p.Node.createForStatement(r,n?n.expression:null,a,c,e.range(t,e.pos)):null}this.error(o.DiagnosticCode._0_expected,e.range(),";")}else this.error(o.DiagnosticCode._0_expected,e.range(),";")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseIfStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){var n=this.parseStatement(e);if(!n)return null;var i=null;return e.skip(s.Token.ELSE)&&!(i=this.parseStatement(e))?null:p.Node.createIfStatement(r,n,i,e.range(t,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseSwitchStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){if(e.skip(s.Token.OPENBRACE)){for(var n=new Array;!e.skip(s.Token.CLOSEBRACE);){var i=this.parseSwitchCase(e);if(!i)return null;n.push(i)}var a=p.Node.createSwitchStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),a}this.error(o.DiagnosticCode._0_expected,e.range(),"{")}else this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseSwitchCase=function(e){var t,r,n=e.tokenPos;if(e.skip(s.Token.CASE)){var i=this.parseExpression(e);if(!i)return null;if(e.skip(s.Token.COLON)){for(t=new Array;e.peek()!=s.Token.CASE&&e.nextToken!=s.Token.DEFAULT&&e.nextToken!=s.Token.CLOSEBRACE;){if(!(r=this.parseStatement(e)))return null;t.push(r)}return p.Node.createSwitchCase(i,t,e.range(n,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),":")}else if(e.skip(s.Token.DEFAULT)){if(e.skip(s.Token.COLON)){for(t=new Array;e.peek()!=s.Token.CASE&&e.nextToken!=s.Token.DEFAULT&&e.nextToken!=s.Token.CLOSEBRACE;){if(!(r=this.parseStatement(e)))return null;t.push(r)}return p.Node.createSwitchCase(null,t,e.range(n,e.pos))}this.error(o.DiagnosticCode._0_expected,e.range(),":")}else this.error(o.DiagnosticCode._case_or_default_expected,e.range());return null},t.prototype.parseThrowStatement=function(e){var t=e.tokenPos,r=this.parseExpression(e);if(!r)return null;var n=p.Node.createThrowStatement(r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),n},t.prototype.parseTryStatement=function(e){var t,r=e.tokenPos;if(e.skip(s.Token.OPENBRACE)){for(var n=new Array;!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;n.push(t)}var i=null,a=null,c=null;if(e.skip(s.Token.CATCH)){if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),"("),null;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;if(i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),!e.skip(s.Token.CLOSEPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null;if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(a=[];!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;a.push(t)}}if(e.skip(s.Token.FINALLY)){if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(c=[];!e.skip(s.Token.CLOSEBRACE);){if(!(t=this.parseStatement(e)))return null;c.push(t)}}if(!a&&!c)return this.error(o.DiagnosticCode._0_expected,e.range(),"catch"),null;var l=p.Node.createTryStatement(n,i,a,c,e.range(r,e.pos));return e.skip(s.Token.SEMICOLON),l}return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null},t.prototype.parseTypeDeclaration=function(e,t,r,n){if(e.skipIdentifier()){var a=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=null;if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(e.skip(s.Token.EQUALS)){var l=this.parseType(e);if(!l)return null;var u=p.Node.createTypeDeclaration(a,c,l,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u}this.error(o.DiagnosticCode._0_expected,e.range(),"=")}else this.error(o.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVoidStatement=function(e){var t=e.tokenPos,r=this.parseExpression(e,21);if(!r)return null;var n=p.Node.createVoidStatement(r,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),n},t.prototype.parseWhileStatement=function(e){var t=e.tokenPos;if(e.skip(s.Token.OPENPAREN)){var r=this.parseExpression(e);if(!r)return null;if(e.skip(s.Token.CLOSEPAREN)){var n=this.parseStatement(e);if(!n)return null;var i=p.Node.createWhileStatement(r,n,e.range(t,e.pos));return e.skip(s.Token.SEMICOLON),i}this.error(o.DiagnosticCode._0_expected,e.range(),")")}else this.error(o.DiagnosticCode._0_expected,e.range(),"(");return null},t.prototype.parseExpressionStart=function(e){var t=e.next(s.IdentifierHandling.PREFER),r=e.tokenPos,n=function(e){switch(e){case s.Token.DOT_DOT_DOT:return 2;case s.Token.YIELD:return 3;case s.Token.EXCLAMATION:case s.Token.TILDE:case s.Token.PLUS:case s.Token.MINUS:case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:case s.Token.TYPEOF:case s.Token.VOID:case s.Token.DELETE:return 17;case s.Token.NEW:return 20}return 0}(t);if(0!=n){var i=void 0;return t==s.Token.NEW?(i=this.parseExpression(e,19))?i.kind==p.NodeKind.CALL?p.Node.createNewExpression(i.expression,i.typeArguments,i.arguments,e.range(r,e.pos)):(this.error(o.DiagnosticCode.Operation_not_supported,e.range()),null):null:(i=this.parseExpression(e,n))?(t!=s.Token.PLUS_PLUS&&t!=s.Token.MINUS_MINUS||i.kind!=p.NodeKind.IDENTIFIER&&i.kind!=p.NodeKind.ELEMENTACCESS&&i.kind!=p.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,i.range),p.Node.createUnaryPrefixExpression(t,i,e.range(r,e.pos))):null}var a=null;switch(t){case s.Token.NULL:return p.Node.createNullExpression(e.range());case s.Token.TRUE:return p.Node.createTrueExpression(e.range());case s.Token.FALSE:return p.Node.createFalseExpression(e.range());case s.Token.OPENPAREN:if(e.skip(s.Token.CLOSEPAREN))return this.parseFunctionExpressionCommon(e,p.Node.createEmptyIdentifierExpression(e.range(r)),[],!0);var c=e.mark(),l=!0;do{switch(e.next(s.IdentifierHandling.PREFER)){case s.Token.DOT_DOT_DOT:return e.reset(c),this.parseFunctionExpression(e);case s.Token.IDENTIFIER:switch(e.readIdentifier(),e.next()){case s.Token.CLOSEPAREN:if(!e.skip(s.Token.EQUALS_GREATERTHAN)){l=!1;break}case s.Token.COLON:return e.reset(c),this.parseFunctionExpression(e);case s.Token.QUESTION:case s.Token.COMMA:break;default:l=!1}break;default:l=!1}}while(l);return e.reset(c),(a=this.parseExpression(e))?e.skip(s.Token.CLOSEPAREN)?p.Node.createParenthesizedExpression(a,e.range(r,e.pos)):(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null):null;case s.Token.OPENBRACKET:for(var u=new Array;!e.skip(s.Token.CLOSEBRACKET);){if(e.peek()==s.Token.COMMA)a=null;else if(!(a=this.parseExpression(e,2)))return null;if(u.push(a),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACKET))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null}}return p.Node.createArrayLiteralExpression(u,e.range(r,e.pos));case s.Token.LESSTHAN:var h=this.parseType(e);return h?e.skip(s.Token.GREATERTHAN)?(a=this.parseExpression(e,19))?p.Node.createAssertionExpression(p.AssertionKind.PREFIX,a,h,e.range(r,e.pos)):null:(this.error(o.DiagnosticCode._0_expected,e.range(),">"),null):null;case s.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return p.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var d=e.readRegexpPattern();return e.skip(s.Token.SLASH)?p.Node.createRegexpLiteralExpression(d,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.DiagnosticCode._0_expected,e.range(),"/"),null);case s.Token.FUNCTION:return this.parseFunctionExpression(e);case s.Token.CLASS:return this.parseClassExpression(e);default:return this.error(o.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(s.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===s.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(s.Token.COMMA));return e.skip(s.Token.GREATERTHAN)&&e.skip(s.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(s.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;var n,i=r.range.start;if(p.nodeIsCallable(r.kind))for(var a=null;e.skip(s.Token.OPENPAREN)||p.nodeIsGenericCallable(r.kind)&&null!==(a=this.tryParseTypeArgumentsBeforeArguments(e));){var c=this.parseArguments(e);if(!c)return null;r=p.Node.createCallExpression(r,a,c,e.range(i,e.pos))}for(var l,u=null;(l=h(n=e.peek()))>=t;)switch(e.next(),n){case s.Token.AS:var _=this.parseType(e);if(!_)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,_,e.range(i,e.pos));break;case s.Token.INSTANCEOF:var m=this.parseType(e);if(!m)return null;r=p.Node.createInstanceOfExpression(r,m,e.range(i,e.pos));break;case s.Token.OPENBRACKET:if(!(u=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,u,e.range(i,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(i,e.pos));break;case s.Token.QUESTION:var y=this.parseExpression(e);if(!y)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var g=this.parseExpression(e,t>1?2:1);if(!g)return null;r=p.Node.createTernaryExpression(r,y,g,e.range(i,e.pos));break;case s.Token.COMMA:var E=[r];do{if(!(r=this.parseExpression(e,2)))return null;E.push(r)}while(e.skip(s.Token.COMMA));r=p.Node.createCommaExpression(E,e.range(i,e.pos));break;default:if(!(u=this.parseExpression(e,d(n)?l:l+1)))return null;if(n==s.Token.DOT)if(u.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,u,e.range(i,e.pos));else{if(u.kind!=p.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,u.range),null;var T=u;if(T.expression.kind!=p.NodeKind.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,T.expression.range),null;T.expression=p.Node.createPropertyAccessExpression(r,T.expression,e.range(i,e.pos)),r=T}else r=p.Node.createBinaryExpression(n,r,u,e.range(i,e.pos))}return r},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==s.Token.ENDOFFILE||t==s.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case s.Token.ENDOFFILE:this.error(o.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case s.Token.OPENBRACE:++t;break;case s.Token.CLOSEBRACE:--t||(r=!1);break;case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(o.DiagnosticEmitter);function h(e){switch(e){case s.Token.COMMA:return 1;case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:return 4;case s.Token.QUESTION:return 5;case s.Token.BAR_BAR:return 6;case s.Token.AMPERSAND_AMPERSAND:return 7;case s.Token.BAR:return 8;case s.Token.CARET:return 9;case s.Token.AMPERSAND:return 10;case s.Token.EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS:case s.Token.EQUALS_EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case s.Token.AS:case s.Token.IN:case s.Token.INSTANCEOF:case s.Token.LESSTHAN:case s.Token.GREATERTHAN:case s.Token.LESSTHAN_EQUALS:case s.Token.GREATERTHAN_EQUALS:return 12;case s.Token.LESSTHAN_LESSTHAN:case s.Token.GREATERTHAN_GREATERTHAN:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case s.Token.PLUS:case s.Token.MINUS:return 14;case s.Token.ASTERISK:case s.Token.SLASH:case s.Token.PERCENT:return 15;case s.Token.ASTERISK_ASTERISK:return 16;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:return 18;case s.Token.DOT:case s.Token.NEW:case s.Token.OPENBRACKET:return 20}return 0}function d(e){switch(e){case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:case s.Token.QUESTION:case s.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},a=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var s=r(0),o=r(5),c=r(3),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=i(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var a=n.value;this.visitElement(a)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0<s.length;)this.visitElement(s[0])},e.prototype.visitElement=function(e){if((!e.is(s.CommonFlags.PRIVATE)||this.includePrivate)&&!this.seen.has(e))switch(this.seen.add(e),e.kind){case o.ElementKind.GLOBAL:e.is(s.CommonFlags.COMPILED)&&this.visitGlobal(e);break;case o.ElementKind.ENUM:e.is(s.CommonFlags.COMPILED)&&this.visitEnum(e);break;case o.ElementKind.FUNCTION_PROTOTYPE:this.visitFunctionInstances(e);break;case o.ElementKind.CLASS_PROTOTYPE:this.visitClassInstances(e);break;case o.ElementKind.FIELD:e.is(s.CommonFlags.COMPILED)&&this.visitField(e);break;case o.ElementKind.PROPERTY:var t=e,r=t.getterPrototype;r&&this.visitFunctionInstances(r);var n=t.setterPrototype;n&&this.visitFunctionInstances(n);break;case o.ElementKind.NAMESPACE:(function e(t){var r,n,a,c,p,l;var u=t.members;if(u)try{for(var h=i(u.values()),d=h.next();!d.done;d=h.next()){var _=d.value;switch(_.kind){case o.ElementKind.FUNCTION_PROTOTYPE:try{for(var m=i(_.instances.values()),y=m.next();!y.done;y=m.next()){var g=y.value;if(g.is(s.CommonFlags.COMPILED))return!0}}catch(e){a={error:e}}finally{try{y&&!y.done&&(c=m.return)&&c.call(m)}finally{if(a)throw a.error}}break;case o.ElementKind.CLASS_PROTOTYPE:try{for(var E=i(_.instances.values()),T=E.next();!T.done;T=E.next()){var g=T.value;if(g.is(s.CommonFlags.COMPILED))return!0}}catch(e){p={error:e}}finally{try{T&&!T.done&&(l=E.return)&&l.call(E)}finally{if(p)throw p.error}}break;default:if(_.is(s.CommonFlags.COMPILED)||e(_))return!0}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}return!1})(e)&&this.visitNamespace(e);break;default:assert(!1)}},e.prototype.visitFunctionInstances=function(e){var t,r;try{for(var n=i(e.instances.values()),a=n.next();!a.done;a=n.next()){var o=a.value;o.is(s.CommonFlags.COMPILED)&&this.visitFunction(o)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e.prototype.visitClassInstances=function(e){var t,r;try{for(var n=i(e.instances.values()),a=n.next();!a.done;a=n.next()){var o=a.value;o.is(s.CommonFlags.COMPILED)&&this.visitClass(o)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e}(),l=function(e){function t(t,r){void 0===r&&(r=!1);var n=e.call(this,t,r)||this;return n.sb=[],n.indentLevel=0,n}return n(t,e),t.build=function(e){return new t(e).build()},t.prototype.visitGlobal=function(e){var t=this.sb,r=e.is(s.CommonFlags.INLINED);if(c.indent(t,this.indentLevel),r&&t.push("const "),t.push(this.typeToString(e.type)),t.push(" "),t.push(e.simpleName),r)switch(e.constantValueKind){case 1:t.push(" = "),t.push(i64_to_string(e.constantIntegerValue));break;case 2:t.push(" = "),t.push(e.constantFloatValue.toString());break;default:assert(!1)}t.push(";\n")},t.prototype.visitEnum=function(e){var t,r,n,p,l=this.sb;c.indent(l,this.indentLevel++),l.push("interface "),l.push(e.simpleName),l.push(" {\n");var u=e.members;if(u){try{for(var h=i(u),d=h.next();!d.done;d=h.next()){var _=a(d.value,2),m=_[0];if((T=_[1]).kind==o.ElementKind.ENUMVALUE){var y=T.is(s.CommonFlags.INLINED);c.indent(l,this.indentLevel),y?l.push("const "):l.push("readonly "),l.push("unsigned long "),l.push(m),y&&(l.push(" = "),l.push(T.constantValue.toString(10))),l.push(";\n")}}}catch(e){t={error:e}}finally{try{d&&!d.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}try{for(var g=i(u.values()),E=g.next();!E.done;E=g.next()){var T;(T=E.value).kind!=o.ElementKind.ENUMVALUE&&this.visitElement(T)}}catch(e){n={error:e}}finally{try{E&&!E.done&&(p=g.return)&&p.call(g)}finally{if(n)throw n.error}}}c.indent(l,--this.indentLevel),l.push("}\n")},t.prototype.visitFunction=function(e){var t,r,n=this.sb,a=e.signature;c.indent(n,this.indentLevel),n.push(this.typeToString(a.returnType)),n.push(" "),n.push(e.simpleName),n.push("(");for(var s=a.parameterTypes,o=s.length,p=0;p<o;++p)p&&n.push(", "),n.push(this.typeToString(s[p])),n.push(" "),n.push(a.getParameterName(p));n.push(");\n");var l=e.members;if(l&&l.size){c.indent(n,this.indentLevel),n.push("interface "),n.push(e.simpleName),n.push(" {\n");try{for(var u=i(l.values()),h=u.next();!h.done;h=u.next()){var d=h.value;this.visitElement(d)}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=u.return)&&r.call(u)}finally{if(t)throw t.error}}c.indent(n,--this.indentLevel),n.push("}\n")}},t.prototype.visitClass=function(e){var t=this.sb;c.indent(t,this.indentLevel++),t.push("interface "),t.push(e.simpleName),t.push(" {\n"),c.indent(t,--this.indentLevel),t.push("}\n")},t.prototype.visitInterface=function(e){this.visitClass(e)},t.prototype.visitField=function(e){},t.prototype.visitNamespace=function(e){var t,r,n=this.sb;c.indent(n,this.indentLevel++),n.push("interface "),n.push(e.simpleName),n.push(" {\n");var a=e.members;if(a)try{for(var s=i(a.values()),o=s.next();!o.done;o=s.next()){var p=o.value;this.visitElement(p)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}c.indent(n,--this.indentLevel),n.push("}\n")},t.prototype.typeToString=function(e){switch(e.kind){case 0:return"byte";case 1:return"short";case 2:return"long";case 3:return"long long";case 4:return this.program.options.isWasm64?"long long":"long";case 5:return"octet";case 6:return"unsigned short";case 7:return"unsigned long";case 8:return"unsigned long long";case 9:return this.program.options.isWasm64?"unsigned long long":"unsigned long";case 10:return"boolean";case 11:return"unrestricted float";case 12:return"unrestricted double";case 13:return"void";default:return assert(!1),""}},t.prototype.build=function(){var e=this.sb;return e.push("interface ASModule {\n"),++this.indentLevel,this.walk(),--this.indentLevel,e.push("}\n"),e.join("")},t}(p);t.IDLBuilder=l;var u=function(e){function t(t,r){void 0===r&&(r=!1);var n=e.call(this,t,r)||this;return n.sb=[],n.indentLevel=0,n}return n(t,e),t.build=function(e){return new t(e).build()},t.prototype.visitGlobal=function(e){var t=this.sb,r=e.is(s.CommonFlags.INLINED);c.indent(t,this.indentLevel),e.is(s.CommonFlags.STATIC)?r?t.push("static readonly "):t.push("static "):r?t.push("const "):t.push("var "),t.push(e.simpleName),t.push(": "),t.push(this.typeToString(e.type)),t.push(";\n"),this.visitNamespace(e)},t.prototype.visitEnum=function(e){var t,r,n=this.sb;c.indent(n,this.indentLevel++),n.push("enum "),n.push(e.simpleName),n.push(" {\n");var p=e.members;if(p){var l=p.size;try{for(var u=i(p),h=u.next();!h.done;h=u.next()){var d=a(h.value,2),_=d[0],m=d[1];m.kind==o.ElementKind.ENUMVALUE&&(c.indent(n,this.indentLevel),n.push(_),m.is(s.CommonFlags.INLINED)&&(n.push(" = "),n.push(m.constantValue.toString(10))),n.push(",\n"),--l)}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=u.return)&&r.call(u)}finally{if(t)throw t.error}}l&&this.visitNamespace(e)}c.indent(n,--this.indentLevel),n.push("}\n")},t.prototype.visitFunction=function(e){if(!e.isAny(s.CommonFlags.PRIVATE|s.CommonFlags.SET)){var t=this.sb,r=e.signature;if(c.indent(t,this.indentLevel),e.is(s.CommonFlags.PROTECTED)&&t.push("protected "),e.is(s.CommonFlags.STATIC)&&t.push("static "),e.is(s.CommonFlags.GET))return t.push(e.prototype.declaration.name.text),t.push(": "),t.push(this.typeToString(r.returnType)),void t.push(";\n");e.isAny(s.CommonFlags.STATIC|s.CommonFlags.INSTANCE)||t.push("function "),t.push(e.simpleName),t.push("(");for(var n=r.parameterTypes,i=n.length,a=0;a<i;++a)a&&t.push(", "),t.push(r.getParameterName(a)),t.push(": "),t.push(this.typeToString(n[a]));e.isAny(s.CommonFlags.CONSTRUCTOR|s.CommonFlags.SET)?t.push(")"):(t.push("): "),t.push(this.typeToString(r.returnType))),t.push(";\n"),this.visitNamespace(e)}},t.prototype.visitClass=function(e){var t,r,n,a,p=this.sb,l=e.kind==o.ElementKind.INTERFACE;c.indent(p,this.indentLevel++),l?p.push("interface "):(e.is(s.CommonFlags.ABSTRACT)&&p.push("abstract "),p.push("class ")),p.push(e.simpleName);var u=e.base;u&&u.is(s.CommonFlags.COMPILED|s.CommonFlags.MODULE_EXPORT)&&(p.push(" extends "),p.push(u.simpleName)),p.push(" {\n");var h=e.prototype.members;if(h)try{for(var d=i(h.values()),_=d.next();!_.done;_=d.next()){var m=_.value;this.visitElement(m)}}catch(e){t={error:e}}finally{try{_&&!_.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}var y=e.constructorInstance;if(y&&this.visitFunction(y),h=e.members)try{for(var g=i(h.values()),E=g.next();!E.done;E=g.next()){m=E.value;this.visitElement(m)}}catch(e){n={error:e}}finally{try{E&&!E.done&&(a=g.return)&&a.call(g)}finally{if(n)throw n.error}}c.indent(p,--this.indentLevel),p.push("}\n")},t.prototype.visitInterface=function(e){this.visitClass(e)},t.prototype.visitField=function(e){if(!e.is(s.CommonFlags.PRIVATE)){var t=this.sb;c.indent(t,this.indentLevel),e.is(s.CommonFlags.PROTECTED)&&t.push("protected "),e.is(s.CommonFlags.STATIC)&&t.push("static "),e.is(s.CommonFlags.READONLY)&&t.push("readonly "),t.push(e.simpleName),t.push(": "),t.push(this.typeToString(e.type)),t.push(";\n")}},t.prototype.visitNamespace=function(e){var t,r,n=e.members;if(n&&n.size){var a=this.sb;c.indent(a,this.indentLevel++),a.push("namespace "),a.push(e.simpleName),a.push(" {\n");try{for(var s=i(n.values()),o=s.next();!o.done;o=s.next()){var p=o.value;this.visitElement(p)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}c.indent(a,--this.indentLevel),a.push("}\n")}},t.prototype.typeToString=function(e){switch(e.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"I64";case 4:return this.program.options.isWasm64?"I64":"i32";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"U64";case 9:return this.program.options.isWasm64?"U64":"u32";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"void";default:return assert(!1),""}},t.prototype.build=function(){var e=this.sb;return e.push("declare module ASModule {\n"),e.push("  type i8 = number;\n"),e.push("  type i16 = number;\n"),e.push("  type i32 = number;\n"),e.push("  type u8 = number;\n"),e.push("  type u16 = number;\n"),e.push("  type u32 = number;\n"),e.push("  type f32 = number;\n"),e.push("  type f64 = number;\n"),e.push("  type bool = any;\n"),++this.indentLevel,this.walk(),--this.indentLevel,e.push("}\n"),e.push("export default ASModule;\n"),this.sb.join("")},t}(p);t.TSDBuilder=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i<s;++i)i>0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i<s;++i)this.decompileExpression(n.getBlockChild(e,i));return void this.push("}\n");case n.ExpressionId.If:return void(c==n.NativeType.None?(this.push("if ("),this.decompileExpression(n.getIfCondition(e)),this.push(") "),this.decompileExpression(n.getIfTrue(e)),(t=n.getIfFalse(e))&&(this.push(" else "),this.decompileExpression(t))):(this.decompileExpression(n.getIfCondition(e)),this.push(" ? "),this.decompileExpression(n.getIfTrue(e)),this.push(" : "),this.decompileExpression(n.getIfFalse(e))));case n.ExpressionId.Loop:null!=(r=n.getLoopName(e))&&(this.push(r),this.push(": ")),this.push("do "),this.decompileExpression(n.getLoopBody(e)),this.push("while (0);\n");case n.ExpressionId.Break:return(t=n.getBreakCondition(e))&&(this.push("if ("),this.decompileExpression(t),this.push(") ")),void(null!=(r=n.getBreakName(e))?(this.push("break "),this.push(r),this.push(";\n")):this.push("break;\n"));case n.ExpressionId.Switch:case n.ExpressionId.Call:case n.ExpressionId.CallImport:case n.ExpressionId.CallIndirect:throw new Error("not implemented");case n.ExpressionId.GetLocal:return this.push("$"),void this.push(n.getGetLocalIndex(e).toString(10));case n.ExpressionId.SetLocal:return this.push("$"),this.push(n.getSetLocalIndex(e).toString(10)),this.push(" = "),void this.decompileExpression(n.getSetLocalValue(e));case n.ExpressionId.GetGlobal:case n.ExpressionId.SetGlobal:throw new Error("not implemented");case n.ExpressionId.Load:return this.push("load<"),this.push(a(c)),this.push(">("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest<i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt<f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt<i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt<f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push("<i32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push("<i32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push("<i32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push("<i64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push("<i32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push("<i64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret<f32,i32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret<f64,i64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push("<f32><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push("<f64><u32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push("<f32><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push("<f64><u64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push("<f64>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push("<f32>"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret<i32,f32>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret<i64,f64>("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("<i32>(<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u32>"),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("<i32>(<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u32>"),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl<i32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr<i32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push("<u32>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= <u32>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl<i64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr<i64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push("<u64>"),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= <u64>"),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max<f32>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max<f64>("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("current_memory()");case n.HostOp.GrowMemory:return this.push("grow_memory("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(10),i=r(13),a=r(12),s=r(1);t.formatDiagnostic=s.formatDiagnosticMessage;var o=r(11);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new o.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset<t.diagnostics.length?t.diagnostics[t.diagnosticsOffset++]:null},t.isInfo=function(e){return e.category==s.DiagnosticCategory.INFO},t.isWarning=function(e){return e.category==s.DiagnosticCategory.WARNING},t.isError=function(e){return e.category==s.DiagnosticCategory.ERROR},t.createOptions=function(){return new n.Options},t.setTarget=function(e,t){e.target=t},t.setNoTreeShaking=function(e,t){e.noTreeShaking=t},t.setNoAssert=function(e,t){e.noAssert=t},t.setImportMemory=function(e,t){e.importMemory=t},t.setImportTable=function(e,t){e.importTable=t},t.setSourceMap=function(e,t){e.sourceMap=t},t.setMemoryBase=function(e,t){e.memoryBase=t},t.setGlobalAlias=function(e,t,r){var n=e.globalAliases;n||(e.globalAliases=n=new Map),n.set(t,r)},t.FEATURE_SIGN_EXTENSION=1,t.FEATURE_MUTABLE_GLOBAL=2,t.enableFeature=function(e,t){e.features|=t},t.setOptimizeLevelHints=function(e,t,r){e.optimizeLevelHint=t,e.shrinkLevelHint=r},t.finishParsing=function(e){return e.finish()},t.compileProgram=function(e,t){return void 0===t&&(t=null),new n.Compiler(e,t).compile()},t.decompileModule=function(e){var t=new i.Decompiler;return t.decompile(e),t.finish()},t.buildIDL=function(e){return a.IDLBuilder.build(e)},t.buildTSD=function(e){return a.TSDBuilder.build(e)};var c=r(0);t.LIBRARY_PREFIX=c.LIBRARY_PREFIX},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=p(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=p(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?E:g;if(t){if(e<0)return E;if(e>=_)return A}else{if(e<=-m)return C;if(e+1>=m)return v}return e<0?c(-e,t).neg():p(e%d|0,e/d|0,t)}function p(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=p;var l=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||36<r)throw RangeError("radix");var n;if((n=e.indexOf("-"))>0)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(l(r,8)),a=g,s=0;s<e.length;s+=8){var o=Math.min(8,e.length-s),p=parseInt(e.substring(s,s+o),r);if(o<8){var h=c(l(r,o));a=a.mul(h).add(c(p))}else a=(a=a.mul(i)).add(c(p))}return a.unsigned=t,a}function h(e,t){return"number"==typeof e?c(e,t):"string"==typeof e?u(e,t):p(e.low,e.high,"boolean"==typeof t?t:e.unsigned)}n.fromString=u,n.fromValue=h;var d=4294967296,_=d*d,m=_/2,y=o(1<<24),g=o(0);n.ZERO=g;var E=o(0,!0);n.UZERO=E;var T=o(1);n.ONE=T;var f=o(1,!0);n.UONE=f;var I=o(-1);n.NEG_ONE=I;var v=p(-1,2147483647,!1);n.MAX_VALUE=v;var A=p(-1,-1,!0);n.MAX_UNSIGNED_VALUE=A;var C=p(0,-2147483648,!1);n.MIN_VALUE=C;var N=n.prototype;N.toInt=function(){return this.unsigned?this.low>>>0:this.low},N.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},N.toString=function(e){if((e=e||10)<2||36<e)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(C)){var t=c(e),r=this.div(t),n=r.mul(t).sub(this);return r.toString(e)+n.toInt().toString(e)}return"-"+this.neg().toString(e)}for(var i=c(l(e,6),this.unsigned),a=this,s="";;){var o=a.div(i),p=(a.sub(o.mul(i)).toInt()>>>0).toString(e);if((a=o).isZero())return p+s;for(;p.length<6;)p="0"+p;s=""+p+s}},N.getHighBits=function(){return this.high},N.getHighBitsUnsigned=function(){return this.high>>>0},N.getLowBits=function(){return this.low},N.getLowBitsUnsigned=function(){return this.low>>>0},N.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<<t);t--);return 0!=this.high?t+33:t+1},N.isZero=function(){return 0===this.high&&0===this.low},N.eqz=N.isZero,N.isNegative=function(){return!this.unsigned&&this.high<0},N.isPositive=function(){return this.unsigned||this.high>=0},N.isOdd=function(){return 1==(1&this.low)},N.isEven=function(){return 0==(1&this.low)},N.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},N.eq=N.equals,N.notEquals=function(e){return!this.eq(e)},N.neq=N.notEquals,N.ne=N.notEquals,N.lessThan=function(e){return this.comp(e)<0},N.lt=N.lessThan,N.lessThanOrEqual=function(e){return this.comp(e)<=0},N.lte=N.lessThanOrEqual,N.le=N.lessThanOrEqual,N.greaterThan=function(e){return this.comp(e)>0},N.gt=N.greaterThan,N.greaterThanOrEqual=function(e){return this.comp(e)>=0},N.gte=N.greaterThanOrEqual,N.ge=N.greaterThanOrEqual,N.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},N.comp=N.compare,N.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(T)},N.neg=N.negate,N.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,l=0,u=0,d=0,_=0;return d+=(_+=a+(65535&e.low))>>>16,u+=(d+=n+c)>>>16,l+=(u+=r+o)>>>16,l+=t+s,p((d&=65535)<<16|(_&=65535),(l&=65535)<<16|(u&=65535),this.unsigned)},N.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},N.sub=N.subtract,N.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=h(e)),r)return p(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(C))return e.isOdd()?C:g;if(e.eq(C))return this.isOdd()?C:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(y)&&e.lt(y))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,l=65535&e.high,u=e.low>>>16,d=65535&e.low,_=0,m=0,E=0,T=0;return E+=(T+=s*d)>>>16,m+=(E+=a*d)>>>16,E&=65535,m+=(E+=s*u)>>>16,_+=(m+=n*d)>>>16,m&=65535,_+=(m+=a*u)>>>16,m&=65535,_+=(m+=s*l)>>>16,_+=t*d+n*u+a*l+s*o,p((E&=65535)<<16|(T&=65535),(_&=65535)<<16|(m&=65535),this.unsigned)},N.mul=N.multiply,N.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?p((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?E:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return E;if(e.gt(this.shru(1)))return f;a=E}else{if(this.eq(C))return e.eq(T)||e.eq(I)?C:e.eq(C)?T:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?T:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));else if(e.eq(C))return this.unsigned?E:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:l(2,s-48),u=c(t),d=u.mul(e);d.isNegative()||d.gt(n);)d=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=T),a=a.add(u),n=n.sub(d)}return a},N.div=N.divide,N.modulo=function(e){return i(e)||(e=h(e)),r?p((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},N.mod=N.modulo,N.rem=N.modulo,N.not=function(){return p(~this.low,~this.high,this.unsigned)},N.and=function(e){return i(e)||(e=h(e)),p(this.low&e.low,this.high&e.high,this.unsigned)},N.or=function(e){return i(e)||(e=h(e)),p(this.low|e.low,this.high|e.high,this.unsigned)},N.xor=function(e){return i(e)||(e=h(e)),p(this.low^e.low,this.high^e.high,this.unsigned)},N.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?p(this.low<<e,this.high<<e|this.low>>>32-e,this.unsigned):p(0,this.low<<e-32,this.unsigned)},N.shl=N.shiftLeft,N.shiftRight=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?p(this.low>>>e|this.high<<32-e,this.high>>e,this.unsigned):p(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},N.shr=N.shiftRight,N.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?p(this.low>>>e|t<<32-e,t>>>e,this.unsigned):p(32===e?t:t>>>e-32,0,this.unsigned)},N.shru=N.shiftRightUnsigned,N.shr_u=N.shiftRightUnsigned,N.toSigned=function(){return this.unsigned?p(this.low,this.high,!1):this},N.toUnsigned=function(){return this.unsigned?this:p(this.low,this.high,!0)},N.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},N.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},N.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){(function(e){const t=e.Long||r(15);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(7))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(7))},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},a=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var s,o=r(1),c=r(5),p=r(2),l=r(6),u=r(0);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s||(s={}));var h=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.resolvedThisExpression=null,r.resolvedElementExpression=null,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==p.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==p.NodeKind.TYPE);var i=e,a=i.name.text,h=a,d=i.range.source.internalPath+u.PATH_DELIMITER+a,_=this.program.elementsLookup,m=void 0;if((m=_.get(d))||(m=_.get(h)))switch(m.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,m.internalName),null):l.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(m,i.typeArguments,t,e);return y?e.isNullable?y.type.asNullable():y.type:null}var g=this.program.typeAliases.get(a);if(g)return this.resolveType(g.type,t,r);var E=i.typeArguments;if(E){for(var T=E.length,f=new Array(T),I=0;I<T;++I){var v=this.resolveType(E[I],t,r);if(!v)return null;f[I]=v}if(T){var A=l.typesToString(f);A.length&&(d+="<"+A+">",h+="<"+A+">")}else if(t){var C=t.get(h);if(C)return C}}var N=this.program.typesLookup,O=void 0;return(O=N.get(d))||(O=N.get(h))?O:(r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,h),null)},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_<o;++_){var m=a[_];switch(m.parameterKind){case p.ParameterKind.DEFAULT:h=_+1;break;case p.ParameterKind.REST:assert(_==o),d=!0}var y=this.resolveType(assert(m.type),t,r);if(!y)return null;c[_]=y,u[_]=m.name.text}var g,E=e.returnType;if(E){if(!(g=this.resolveType(E,t,r)))return null}else g=l.Type.void;var T=new l.Signature(c,g,i);return T.parameterNames=u,T.requiredParameters=h,T.hasRest=d,T},t.prototype.resolveTypeArguments=function(e,t,r,n,i){void 0===r&&(r=null),void 0===n&&(n=null),void 0===i&&(i=s.REPORT);var a=e.length,c=t?t.length:0;if(a!=c)return c?this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,p.Range.join(t[0].range,t[c-1].range),a.toString(10),c.toString(10)):n&&this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range.atEnd,a.toString(10),"0"),null;for(var l=new Array(a),u=0;u<a;++u){var h=this.resolveType(t[u],r,i);if(!h)return null;l[u]=h}return l},t.prototype.resolveIdentifier=function(e,t,r){void 0===r&&(r=s.REPORT);var n,i=e.text;if(t){switch(t.kind){case c.ElementKind.FUNCTION:if(n=t.flow.getScopedLocal(i))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,n;t=t.prototype.parent;break;case c.ElementKind.CLASS:t=t.prototype.parent}for(;t;){var a=t.members;if(a&&(n=a.get(i)))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,n;t=t.parent}}var p=this.program.elementsLookup;return(n=p.get(e.range.source.internalPath+u.PATH_DELIMITER+i))?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,n):(n=p.get(i))?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,n):(r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,e.range,i),null)},t.prototype.resolvePropertyAccess=function(e,t,r){void 0===r&&(r=s.REPORT);var n=e.expression,i=this.resolveExpression(n,t,r);if(!i)return null;var a=e.property.text;switch(i.kind){case c.ElementKind.GLOBAL:case c.ElementKind.LOCAL:case c.ElementKind.FIELD:if(!(p=i.type.classReference))return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,a,i.type.toString()),null;i=p;break;case c.ElementKind.PROPERTY:var p,l=this.resolveFunction(assert(i.getterPrototype),null,null,r);if(!l)return null;if(!(p=l.signature.returnType.classReference))return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,a,l.signature.returnType.toString()),null;i=p;break;case c.ElementKind.CLASS:var u=this.resolvedElementExpression;if(u){var h=i.lookupOverload(c.OperatorKind.INDEXED_GET);if(!h)return this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,u.range,i.internalName),null;var d=h.signature.returnType;if(!(i=d.classReference))return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,a,d.toString()),null}}switch(i.kind){case c.ElementKind.CLASS_PROTOTYPE:case c.ElementKind.CLASS:for(;;){var _=void 0;if((m=i.members)&&(_=m.get(a)))return this.resolvedThisExpression=n,this.resolvedElementExpression=null,_;if(i.kind==c.ElementKind.CLASS_PROTOTYPE){if(!i.basePrototype)break;i=i.basePrototype}else{if(i.kind!=c.ElementKind.CLASS)break;if(!i.base)break;i=i.base}}break;default:var m;if(m=i.members)if(_=m.get(a))return this.resolvedThisExpression=n,this.resolvedElementExpression=null,_}return this.error(o.DiagnosticCode.Property_0_does_not_exist_on_type_1,e.property.range,a,i.internalName),null},t.prototype.resolveElementAccess=function(e,t,r){void 0===r&&(r=s.REPORT);var n=e.expression,i=this.resolveExpression(n,t,r);if(!i)return null;switch(i.kind){case c.ElementKind.GLOBAL:case c.ElementKind.LOCAL:case c.ElementKind.FIELD:if(i=i.type.classReference)return this.resolvedThisExpression=n,this.resolvedElementExpression=e.elementExpression,i;break;case c.ElementKind.CLASS:var a=i.lookupOverload(c.OperatorKind.INDEXED_GET);if(!a)return r==s.REPORT&&this.error(o.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),null;if(i=a.signature.returnType.classReference)return this.resolvedThisExpression=n,this.resolvedElementExpression=e.elementExpression,i}return r==s.REPORT&&this.error(o.DiagnosticCode.Operation_not_supported,n.range),null},t.prototype.resolveExpression=function(e,t,r){for(void 0===r&&(r=s.REPORT);e.kind==p.NodeKind.PARENTHESIZED;)e=e.expression;switch(e.kind){case p.NodeKind.ASSERTION:var n=this.resolveType(e.toType,t.flow.contextualTypeArguments,r);if(n)if(d=n.classReference)return this.resolvedThisExpression=null,this.resolvedElementExpression=null,d;return null;case p.NodeKind.BINARY:throw new Error("not implemented");case p.NodeKind.THIS:if(t.flow.is(2048))if(i=t.flow.getScopedLocal("this"))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,i;return(a=t.parent)?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,a):(r==s.REPORT&&this.error(o.DiagnosticCode._this_cannot_be_referenced_in_current_location,e.range),null);case p.NodeKind.SUPER:var i,a;if(t.flow.is(2048))if(i=t.flow.getScopedLocal("super"))return this.resolvedThisExpression=null,this.resolvedElementExpression=null,i;return(a=t.parent)&&a.kind==c.ElementKind.CLASS&&(a=a.base)?(this.resolvedThisExpression=null,this.resolvedElementExpression=null,a):(r==s.REPORT&&this.error(o.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,e.range),null);case p.NodeKind.IDENTIFIER:return this.resolveIdentifier(e,t,r);case p.NodeKind.LITERAL:switch(e.literalKind){case p.LiteralKind.STRING:return this.resolvedThisExpression=e,this.resolvedElementExpression=null,this.program.stringInstance}break;case p.NodeKind.PROPERTYACCESS:return this.resolvePropertyAccess(e,t,r);case p.NodeKind.ELEMENTACCESS:return this.resolveElementAccess(e,t,r);case p.NodeKind.CALL:var l=e.expression,u=this.resolveExpression(l,t,r);if(!u)return null;if(u.kind==c.ElementKind.FUNCTION_PROTOTYPE){var h=this.resolveFunctionInclTypeArguments(u,e.typeArguments,t.flow.contextualTypeArguments,e,r);if(!h)return null;var d,_=h.signature.returnType;if(d=_.classReference)return d;var m=_.signatureReference;if(m){var y=m.cachedFunctionTarget;return y||(y=new c.FunctionTarget(this.program,m),m.cachedFunctionTarget=y),y}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,l.range,u.internalName),null}}return r==s.REPORT&&this.error(o.DiagnosticCode.Operation_not_supported,e.range),null},t.prototype.resolveFunction=function(e,t,r,n){var o,h;void 0===r&&(r=null),void 0===n&&(n=s.REPORT);var d=t?l.typesToString(t):"",_=e.instances.get(d);if(_)return _;var m=e.declaration,y=e.is(u.CommonFlags.INSTANCE),g=e.classPrototype,E=r;if(r=new Map,E)try{for(var T=i(E),f=T.next();!f.done;f=T.next()){var I=a(f.value,2),v=I[0],A=I[1];r.set(v,A)}}catch(e){o={error:e}}finally{try{f&&!f.done&&(h=T.return)&&h.call(T)}finally{if(o)throw o.error}}var C=e.classTypeArguments;if(C){assert(e.is(u.CommonFlags.INSTANCE));var N=assert(g).declaration.typeParameters,O=N.length;assert(O==C.length);for(var S=0;S<O;++S)r.set(N[S].name.text,C[S])}else assert(!C);var L,b=m.signature,k=m.typeParameters;if(t&&(L=t.length)){assert(k&&L==k.length);for(S=0;S<L;++S)r.set(k[S].name.text,t[S])}else assert(!k||0==k.length);var R=null,x=null;if(y){if(!(R=this.resolveClass(assert(g),C,r,n)))return null;x=R.type,r.set("this",x)}var F,D=b.parameters,B=D.length,U=new Array(B),P=new Array(B),w=0;for(S=0;S<B;++S){var M=D[S];M.parameterKind==p.ParameterKind.DEFAULT&&(w=S+1);var G=assert(M.type),K=this.resolveType(G,r,n);if(!K)return null;U[S]=K,P[S]=M.name.text}if(e.is(u.CommonFlags.SET))F=l.Type.void;else if(e.is(u.CommonFlags.CONSTRUCTOR))F=assert(R).type;else{G=assert(b.returnType);var z=this.resolveType(G,r,n);if(!z)return null;F=z}var V=new l.Signature(U,F,x);V.parameterNames=P,V.requiredParameters=w;var H=e.internalName;return d.length&&(H+="<"+d+">"),_=new c.Function(e,H,V,R||g,r),e.instances.set(d,_),this.program.instancesLookup.set(H,_),_},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=l.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;return!e.is(u.CommonFlags.GENERIC)||(assert(null!=t&&0!=t.length),a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i))?this.resolveFunction(e,a,r,i):null},t.prototype.resolveClass=function(e,t,r,n){var h,d,_,m,y,g,E,T;void 0===r&&(r=null),void 0===n&&(n=s.REPORT);var f=t?l.typesToString(t):"",I=e.instances.get(f);if(I)return I;var v=r;if(r=new Map,v)try{for(var A=i(v),C=A.next();!C.done;C=A.next()){var N=a(C.value,2),O=N[0],S=N[1];r.set(O,S)}}catch(e){h={error:e}}finally{try{C&&!C.done&&(d=A.return)&&d.call(A)}finally{if(h)throw h.error}}var L=e.declaration;if(t){var b=L.typeParameters,k=b.length,R=t.length;assert(R==k);for(var x=0;x<R;++x)r.set(b[x].name.text,t[x])}else assert(0==L.typeParameters.length);var F=null;if(L.extendsType){var D=this.resolveType(L.extendsType,r,n);if(!D)return null;if(!(F=D.classReference))return n==s.REPORT&&this.program.error(o.DiagnosticCode.A_class_may_only_extend_another_class,L.extendsType.range),null;if(F.hasDecorator(c.DecoratorFlags.SEALED))return n==s.REPORT&&this.program.error(o.DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,L.extendsType.range,F.internalName),null;if(F.hasDecorator(c.DecoratorFlags.UNMANAGED)!=e.hasDecorator(c.DecoratorFlags.UNMANAGED))return n==s.REPORT&&this.program.error(o.DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,p.Range.join(L.name.range,L.extendsType.range)),null}var B=e.simpleName,U=e.internalName;f.length&&(B+="<"+f+">",U+="<"+f+">"),(I=new c.Class(e,B,U,t,F)).contextualTypeArguments=r,e.instances.set(f,I),this.program.instancesLookup.set(U,I);var P=0;if(F){if(F.members){I.members||(I.members=new Map);try{for(var w=i(F.members.values()),M=w.next();!M.done;M=w.next()){var G=M.value;I.members.set(G.simpleName,G)}}catch(e){_={error:e}}finally{try{M&&!M.done&&(m=w.return)&&m.call(w)}finally{if(_)throw _.error}}}P=F.currentMemoryOffset}if(e.constructorPrototype){var K=this.resolveFunctionPartially(e.constructorPrototype,t,n);if(!K)return null;I.constructorInstance=this.resolveFunction(K,null,null,n)}if(e.instanceMembers)try{for(var z=i(e.instanceMembers.values()),V=z.next();!V.done;V=z.next()){var H=V.value;switch(H.kind){case c.ElementKind.FIELD_PROTOTYPE:I.members||(I.members=new Map);var X=H.declaration,W=null;if(X.type)W=this.resolveType(X.type,I.contextualTypeArguments,n);else{if(null!==F&&null!==F.members){var Y=F.members.get(H.simpleName);Y&&!Y.is(u.CommonFlags.PRIVATE)&&(assert(Y.kind==c.ElementKind.FIELD),W=Y.type)}W||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,X.name.range.atEnd)}if(!W)break;var Q=new c.Field(H,U+u.INSTANCE_DELIMITER+H.simpleName,W,X,I);switch(W.byteSize){case 1:break;case 2:1&P&&++P;break;case 4:3&P&&(P=1+(3|P));break;case 8:7&P&&(P=1+(7|P));break;default:assert(!1)}Q.memoryOffset=P,P+=W.byteSize,I.members.set(H.simpleName,Q);break;case c.ElementKind.FUNCTION_PROTOTYPE:I.members||(I.members=new Map);var q=this.resolveFunctionPartially(H,t,n);if(!q)return null;q.internalName=U+u.INSTANCE_DELIMITER+q.simpleName,I.members.set(H.simpleName,q);break;case c.ElementKind.PROPERTY:I.members||(I.members=new Map);var j=assert(H.getterPrototype),Z=H.setterPrototype,$=new c.Property(this.program,H.simpleName,U+u.INSTANCE_DELIMITER+H.simpleName,e),J=this.resolveFunctionPartially(j,t,n);if(!J)return null;if(J.internalName=U+u.INSTANCE_DELIMITER+J.simpleName,$.getterPrototype=J,Z){var ee=this.resolveFunctionPartially(Z,t,n);if(!ee)return null;ee.internalName=U+u.INSTANCE_DELIMITER+ee.simpleName,$.setterPrototype=ee}I.members.set(H.simpleName,$);break;default:assert(!1)}}}catch(e){y={error:e}}finally{try{V&&!V.done&&(g=z.return)&&g.call(z)}finally{if(y)throw y.error}}I.currentMemoryOffset=P;try{for(var te=i(e.overloadPrototypes),re=te.next();!re.done;re=te.next()){var ne=a(re.value,2),ie=ne[0],ae=ne[1];assert(ie!=c.OperatorKind.INVALID);var se=void 0;if(ae.is(u.CommonFlags.INSTANCE)){var oe=this.resolveFunctionPartially(ae,t,n);if(!oe)continue;se=this.resolveFunction(oe,null,null,n)}else se=this.resolveFunction(ae,null,null,n);if(se){var ce=I.overloads;ce||(I.overloads=ce=new Map),ce.set(ie,se)}}}catch(e){E={error:e}}finally{try{re&&!re.done&&(T=te.return)&&T.call(te)}finally{if(E)throw E.error}}return I},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){var c=e.declaration.typeParameters,p=c.length;assert(p>0);var l=null!==t?t.length:0;if(p!=l)return i==s.REPORT&&this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,p.toString(10),l.toString(10)),null;if(!(a=this.resolveTypeArguments(c,t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=h},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="  ",i="    ",a="        ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=47;function i(e){for(var t,r=0,i=e.length;r+1<i&&46==e.charCodeAt(r)&&e.charCodeAt(r+1)==n;)r+=2;for((r>0||i<e.length)&&(e=e.substring(r,i),i-=r,r=0);r+1<i;){if(t=!1,e.charCodeAt(r)==n&&46==e.charCodeAt(r+1)){if((t=r+2==i)||r+2<i&&e.charCodeAt(r+2)==n){e=t?e.substring(0,r):e.substring(0,r)+e.substring(r+2),i-=2;continue}if((t=r+3==i)&&46==e.charCodeAt(r+2)||r+3<i&&46==e.charCodeAt(r+2)&&e.charCodeAt(r+3)==n){for(var a=r;--a>=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e<t[0])return!1;for(var r,n=0,i=t.length;n+1<i;){if(r=n+(i-n)/2,t[r-=r%2]<=e&&e<=t[r+1])return!0;e<t[r]?i=r:n=r+2}return!1}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1),i=r(2),a=r(6),s=r(4),o=r(5);function c(e,t,r,c,h,d){var m,y,g,E,T=e.module;switch(t.internalName){case"isInteger":var f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(4)&&!f.is(256)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isFloat":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(8)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isSigned":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?f.is(1)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isReference":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?(e.currentType=a.Type.bool,f.is(256)?T.createI32(1):T.createI32(0)):T.createUnreachable();case"isString":f=l(e,r,c,d);if(e.currentType=a.Type.bool,!f)return T.createUnreachable();if(L=f.classReference){var I=e.program.stringInstance;if(I&&L.isAssignableTo(I))return T.createI32(1)}return T.createI32(0);case"isArray":f=l(e,r,c,d);return e.currentType=a.Type.bool,f?null!=(L=f.classReference)&&null!=L.lookupOverload(o.OperatorKind.INDEXED_GET)?T.createI32(1):T.createI32(0):T.createUnreachable();case"clz":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(s.UnaryOp.ClzI32,m);break;case 10:case 2:case 7:E=T.createUnary(s.UnaryOp.ClzI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?s.UnaryOp.ClzI64:s.UnaryOp.ClzI32,m);break;case 3:case 8:E=T.createUnary(s.UnaryOp.ClzI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"ctz":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],0,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(s.UnaryOp.CtzI32,m);break;case 10:case 2:case 7:E=T.createUnary(s.UnaryOp.CtzI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?s.UnaryOp.CtzI64:s.UnaryOp.CtzI32,m);break;case 3:case 8:E=T.createUnary(s.UnaryOp.CtzI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"popcnt":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(s.UnaryOp.PopcntI32,m);break;case 10:case 2:case 7:E=T.createUnary(s.UnaryOp.PopcntI32,m);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?s.UnaryOp.PopcntI64:s.UnaryOp.PopcntI32,m);break;case 3:case 8:E=T.createUnary(s.UnaryOp.PopcntI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"rotl":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(T.createBinary(s.BinaryOp.RotlI32,m,y),e.currentType);case 2:case 7:E=T.createBinary(s.BinaryOp.RotlI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 4:E=T.createBinary(e.options.isWasm64?s.BinaryOp.RotlI64:s.BinaryOp.RotlI32,m,y);break;case 3:case 8:E=T.createBinary(s.BinaryOp.RotlI64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"rotr":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.i32,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(T.createBinary(s.BinaryOp.RotrI32,m,y),e.currentType);break;case 2:case 7:E=T.createBinary(s.BinaryOp.RotrI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 4:E=T.createBinary(e.options.isWasm64?s.BinaryOp.RotrI64:s.BinaryOp.RotrI32,m,y);break;case 3:case 8:E=T.createBinary(s.BinaryOp.RotrI64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"abs":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var v=e.currentFunction.getAndFreeTempLocal(a.Type.i32,!1);E=T.createSelect(T.createTeeLocal(v.index,m),T.createBinary(s.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(v.index,s.NativeType.I32)),T.createBinary(s.BinaryOp.GtI32,T.createGetLocal(v.index,s.NativeType.I32),T.createI32(0)));break;case 4:v=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(v.index,m),T.createBinary(e.options.isWasm64?s.BinaryOp.SubI64:s.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(v.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?s.BinaryOp.GtI64:s.BinaryOp.GtI32,T.createGetLocal(v.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:v=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);E=T.createSelect(T.createTeeLocal(v.index,m),T.createBinary(s.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(v.index,s.NativeType.I64)),T.createBinary(s.BinaryOp.GtI64,T.createGetLocal(v.index,s.NativeType.I64),T.createI64(0,0)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=m;break;case 11:E=T.createUnary(s.UnaryOp.AbsF32,m);break;case 12:E=T.createUnary(s.UnaryOp.AbsF64,m);break;case 13:E=T.createUnreachable();break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"max":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.GtI32,T.createGetLocal(C.index,s.NativeType.I32),T.createGetLocal(N.index,s.NativeType.I32)));break;case 5:case 6:case 7:case 10:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.GtU32,T.createGetLocal(C.index,s.NativeType.I32),T.createGetLocal(N.index,s.NativeType.I32)));break;case 3:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.GtI64,T.createGetLocal(C.index,s.NativeType.I64),T.createGetLocal(N.index,s.NativeType.I64)));break;case 8:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.GtU64,T.createGetLocal(C.index,s.NativeType.I64),T.createGetLocal(N.index,s.NativeType.I64)));break;case 4:C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?s.BinaryOp.GtI64:s.BinaryOp.GtI32,T.createGetLocal(C.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?s.BinaryOp.GtU64:s.BinaryOp.GtU32,T.createGetLocal(C.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:E=T.createBinary(s.BinaryOp.MaxF32,m,y);break;case 12:E=T.createBinary(s.BinaryOp.MaxF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"min":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpression(c[0],a.Type.f64,0,1);switch(y=e.compileExpression(c[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.LtI32,T.createGetLocal(C.index,s.NativeType.I32),T.createGetLocal(N.index,s.NativeType.I32)));break;case 5:case 6:case 7:case 10:A=e.currentFunction.flow,C=e.currentFunction.getTempLocal(e.currentType,!A.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.LtU32,T.createGetLocal(C.index,s.NativeType.I32),T.createGetLocal(N.index,s.NativeType.I32)));break;case 3:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.LtI64,T.createGetLocal(C.index,s.NativeType.I64),T.createGetLocal(N.index,s.NativeType.I64)));break;case 8:C=e.currentFunction.getTempLocal(a.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(s.BinaryOp.LtU64,T.createGetLocal(C.index,s.NativeType.I64),T.createGetLocal(N.index,s.NativeType.I64)));break;case 4:C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?s.BinaryOp.LtI64:s.BinaryOp.LtI32,T.createGetLocal(C.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}C=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(C),E=T.createSelect(T.createTeeLocal(C.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?s.BinaryOp.LtU64:s.BinaryOp.LtU32,T.createGetLocal(C.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:E=T.createBinary(s.BinaryOp.MinF32,m,y);break;case 12:E=T.createBinary(s.BinaryOp.MinF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"ceil":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}default:E=m;break;case 11:E=T.createUnary(s.UnaryOp.CeilF32,m);break;case 12:E=T.createUnary(s.UnaryOp.CeilF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"floor":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}default:E=m;break;case 11:E=T.createUnary(s.UnaryOp.FloorF32,m);break;case 12:E=T.createUnary(s.UnaryOp.FloorF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"copysign":if(2!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(y=e.compileExpression(c[1],e.currentType,1,0),e.currentType.kind){case 11:E=T.createBinary(s.BinaryOp.CopysignF32,m,y);break;case 12:E=T.createBinary(s.BinaryOp.CopysignF64,m,y);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"nearest":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}default:E=m;break;case 11:E=T.createUnary(s.UnaryOp.NearestF32,m);break;case 12:E=T.createUnary(s.UnaryOp.NearestF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"reinterpret":if(1!=c.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0")),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();switch(r[0].kind){case 2:case 7:m=e.compileExpression(c[0],a.Type.f32,1,0),E=T.createUnary(s.UnaryOp.ReinterpretF32,m);break;case 3:case 8:m=e.compileExpression(c[0],a.Type.f64,1,0),E=T.createUnary(s.UnaryOp.ReinterpretF64,m);break;case 9:if(r[0].is(256))return e.error(n.DiagnosticCode.Operation_not_supported,d.range),e.currentType=r[0],T.createUnreachable();case 4:m=e.compileExpression(c[0],e.options.isWasm64?a.Type.f64:a.Type.f32,1,0),E=T.createUnary(e.options.isWasm64?s.UnaryOp.ReinterpretF64:s.UnaryOp.ReinterpretF32,m);break;case 11:m=e.compileExpression(c[0],a.Type.i32,1,0),E=T.createUnary(s.UnaryOp.ReinterpretI32,m);break;case 12:m=e.compileExpression(c[0],a.Type.i64,1,0),E=T.createUnary(s.UnaryOp.ReinterpretI64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return e.currentType=r[0],E;case"sqrt":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 11:E=T.createUnary(s.UnaryOp.SqrtF32,m);break;case 12:E=T.createUnary(s.UnaryOp.SqrtF64,m);break;default:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"trunc":if(1!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpression(c[0],a.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable();break}default:E=m;break;case 11:E=T.createUnary(s.UnaryOp.TruncF32,m);break;case 12:E=T.createUnary(s.UnaryOp.TruncF64,m);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"load":return c.length<1||c.length>2?(r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),c.length<1?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)):e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable()):r&&1==r.length?(m=e.compileExpression(c[0],e.options.usizeType,1,0),(b=2==c.length?u(e,c[1]):0)<0?T.createUnreachable():(e.currentType=r[0],T.createLoad(r[0].byteSize,r[0].is(5),m,r[0].is(4)&&h.is(4)&&h.size>r[0].size?(e.currentType=h).toNativeType():(e.currentType=r[0]).toNativeType(),b))):(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"store":if(e.currentType=a.Type.void,c.length<2||c.length>3)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),c.length<2?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"2",c.length.toString(10)):e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],r[0],r[0].is(4)?0:1,0);f=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size<r[0].size)?(y=e.convertExpression(y,e.currentType,r[0],1,0,c[1]),f=r[0]):f=e.currentType,(b=3==c.length?u(e,c[2]):0)<0?T.createUnreachable():(e.currentType=a.Type.void,T.createStore(r[0].byteSize,m,y,f.toNativeType(),b));case"sizeof":if(e.currentType=e.options.usizeType,0!=c.length)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),T.createUnreachable();r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0");var O=r[0].byteSize;return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,E=T.createI32(O)):E=T.createI64(O,0):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,E=T.createI64(O,0)):E=T.createI32(O),E;case"alignof":if(e.currentType=e.options.usizeType,0!=c.length)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();var S=void 0;switch(O=r[0].byteSize){case 1:S=0;break;case 2:S=1;break;case 4:S=2;break;case 8:S=3;break;default:return assert(!1),T.createUnreachable()}return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,E=T.createI32(S)):E=T.createI64(S,0):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,E=T.createI64(S,0)):E=T.createI32(S),E;case"offsetof":if(e.currentType=e.options.usizeType,c.length>1)return r&&1==r.length||e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();var L;if(!(L=r[0].classReference))return e.error(n.DiagnosticCode.Operation_not_supported,d.range),T.createUnreachable();var b=void 0;if(c.length){if(c[0].kind!=i.NodeKind.LITERAL||c[0].literalKind!=i.LiteralKind.STRING)return e.error(n.DiagnosticCode.String_literal_expected,c[0].range),T.createUnreachable();var k=c[0].value,R=L.members?L.members.get(k):null;if(!R||R.kind!=o.ElementKind.FIELD)return e.error(n.DiagnosticCode.Type_0_has_no_property_1,c[0].range,L.internalName,k),T.createUnreachable();b=R.memoryOffset}else b=L.currentMemoryOffset;return e.options.isWasm64?h.is(4)&&h.size<=32?(e.currentType=a.Type.u32,T.createI32(b)):T.createI64(b):h.is(4)&&64==h.size?(e.currentType=a.Type.u64,T.createI64(b)):T.createI32(b);case"select":if(3!=c.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,0)}else m=e.compileExpressionRetainType(c[0],a.Type.i32,0);f=e.currentType;switch(y=e.compileExpression(c[1],f,1,0),g=e.makeIsTrueish(e.compileExpressionRetainType(c[2],a.Type.bool,0),e.currentType),e.currentType=f,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=T.createSelect(m,y,g);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=T.createUnreachable()}return E;case"unreachable":return 0!=c.length&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),T.createUnreachable();case"current_memory":return e.currentType=a.Type.i32,0!=c.length&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),T.createHost(s.HostOp.CurrentMemory);case"grow_memory":return e.currentType=a.Type.i32,1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"0",c.length.toString(10)),m=T.createUnreachable()):m=e.compileExpression(c[0],a.Type.i32,1,0),r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),T.createHost(s.HostOp.GrowMemory,null,[m]);case"move_memory":if(r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),3!=c.length)return e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),e.currentType=a.Type.void,T.createUnreachable();throw m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],e.options.usizeType,1,0),g=e.compileExpression(c[2],e.options.usizeType,1,0),e.currentType=a.Type.void,new Error("not implemented");case"set_memory":if(r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),3!=c.length)return e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"3",c.length.toString(10)),e.currentType=a.Type.void,T.createUnreachable();throw m=e.compileExpression(c[0],e.options.usizeType,1,0),y=e.compileExpression(c[1],a.Type.u32,1,0),g=e.compileExpression(c[2],e.options.usizeType,1,0),e.currentType=a.Type.void,new Error("not implemented");case"changetype":return r&&1==r.length?1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=r[0],T.createUnreachable()):(m=e.compileExpressionRetainType(c[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(n.DiagnosticCode.Operation_not_supported,d.range),T.createUnreachable()):m):(r&&r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"assert":if(c.length<1||c.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),c.length<1?e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)):c.length>2&&e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"2",c.length.toString(10)),T.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(c[0],r[0],1,1)}else m=e.compileExpressionRetainType(c[0],a.Type.bool,1);f=e.currentType;if(e.currentType=f.nonNullableType,e.options.noAssert)return h==a.Type.void?(e.currentType=a.Type.void,T.createNop()):m;var x=_(e,2==c.length?c[1]:null,d);if(e.currentType=f.nonNullableType,h==a.Type.void){switch(e.currentType.kind){default:E=T.createIf(T.createUnary(s.UnaryOp.EqzI32,m),x);break;case 3:case 8:E=T.createIf(T.createUnary(s.UnaryOp.EqzI64,m),x);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?s.UnaryOp.EqzI64:s.UnaryOp.EqzI32,m),x);break;case 11:E=T.createIf(T.createBinary(s.BinaryOp.EqF32,m,T.createF32(0)),x);break;case 12:E=T.createIf(T.createBinary(s.BinaryOp.EqF64,m,T.createF64(0)),x);break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=x}e.currentType=a.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:A=e.currentFunction.flow,v=e.currentFunction.getAndFreeTempLocal(e.currentType,!A.canOverflow(m,e.currentType));E=T.createIf(T.createTeeLocal(v.index,m),T.createGetLocal(v.index,s.NativeType.I32),x);break;case 2:case 7:default:v=e.currentFunction.getAndFreeTempLocal(a.Type.i32,!1);E=T.createIf(T.createTeeLocal(v.index,m),T.createGetLocal(v.index,s.NativeType.I32),x);break;case 3:case 8:v=e.currentFunction.getAndFreeTempLocal(a.Type.i64,!1);E=T.createIf(T.createUnary(s.UnaryOp.EqzI64,T.createTeeLocal(v.index,m)),x,T.createGetLocal(v.index,s.NativeType.I64));break;case 4:case 9:v=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?s.UnaryOp.EqzI64:s.UnaryOp.EqzI32,T.createTeeLocal(v.index,m)),x,T.createGetLocal(v.index,e.options.nativeSizeType));break;case 11:v=e.currentFunction.getAndFreeTempLocal(a.Type.f32,!1);E=T.createIf(T.createBinary(s.BinaryOp.EqF32,T.createTeeLocal(v.index,m),T.createF32(0)),x,T.createGetLocal(v.index,s.NativeType.F32));break;case 12:v=e.currentFunction.getAndFreeTempLocal(a.Type.f64,!1);E=T.createIf(T.createBinary(s.BinaryOp.EqF64,T.createTeeLocal(v.index,m),T.createF64(0)),x,T.createGetLocal(v.index,s.NativeType.F64));break;case 13:e.error(n.DiagnosticCode.Operation_not_supported,d.range),E=x}return E;case"unchecked":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable()):((A=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(c[0],h,0),A.unset(4096),E);case"call_indirect":if(c.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10))),e.error(n.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),T.createUnreachable();var F=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,d.range,"1",r.length.toString(10)),T.createUnreachable();F=r[0]}else F=h;if(m=e.compileExpressionRetainType(c[0],a.Type.u32,0),7!=e.currentType.kind)return e.error(n.DiagnosticCode.Operation_not_supported,c[0].range),T.createUnreachable();for(var D=c.length-1,B=new Array(D),U=new Array(D+1),P=F.toNativeType(),w=new Array(D),M=0;M<D;++M){B[M]=e.compileExpressionRetainType(c[1+M],a.Type.i32,0);var G=e.currentType;U[M]=G.toSignatureString(),w[M]=G.toNativeType()}U[D]=F.toSignatureString();var K=U.join(""),z=T.getFunctionTypeBySignature(P,w);return z||(z=T.addFunctionType(K,P,w)),e.currentType=F,T.createCallIndirect(m,B,K);case"i8":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i8,T.createUnreachable()):e.compileExpression(c[0],a.Type.i8,2,0);case"i16":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i16,T.createUnreachable()):e.compileExpression(c[0],a.Type.i16,2,0);case"i32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i32,T.createUnreachable()):e.compileExpression(c[0],a.Type.i32,2,0);case"i64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.i64,T.createUnreachable()):e.compileExpression(c[0],a.Type.i64,2,0);case"isize":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=e.options.isWasm64?a.Type.isize64:a.Type.isize32,T.createUnreachable()):e.compileExpression(c[0],e.options.isWasm64?a.Type.isize64:a.Type.isize32,2,0);case"u8":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u8,T.createUnreachable()):e.compileExpression(c[0],a.Type.u8,2,0);case"u16":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u16,T.createUnreachable()):e.compileExpression(c[0],a.Type.u16,2,0);case"u32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u32,T.createUnreachable()):e.compileExpression(c[0],a.Type.u32,2,0);case"u64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.u64,T.createUnreachable()):e.compileExpression(c[0],a.Type.u64,2,0);case"usize":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=e.options.usizeType,T.createUnreachable()):e.compileExpression(c[0],e.options.usizeType,2,0);case"bool":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.bool,T.createUnreachable()):e.compileExpression(c[0],a.Type.bool,2,0);case"f32":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.f32,T.createUnreachable()):e.compileExpression(c[0],a.Type.f32,2,0);case"f64":return r&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),1!=c.length?(e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,d.range,"1",c.length.toString(10)),e.currentType=a.Type.f64,T.createUnreachable()):e.compileExpression(c[0],a.Type.f64,2,0)}var V=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return p("clz",e,a.Type.i32,r,a.Type.i32,i);case"i64.clz":return p("clz",e,a.Type.i64,r,a.Type.i64,i);case"i32.ctz":return p("ctz",e,a.Type.i32,r,a.Type.i32,i);case"i64.ctz":return p("ctz",e,a.Type.i64,r,a.Type.i64,i);case"i32.popcnt":return p("popcnt",e,a.Type.i32,r,a.Type.i32,i);case"i64.popcnt":return p("popcnt",e,a.Type.i64,r,a.Type.i64,i);case"i32.rotl":return p("rotl",e,a.Type.i32,r,a.Type.i32,i);case"i64.rotl":return p("rotl",e,a.Type.i64,r,a.Type.i64,i);case"i32.rotr":return p("rotr",e,a.Type.i32,r,a.Type.i32,i);case"i64.rotr":return p("rotr",e,a.Type.i64,r,a.Type.i64,i);case"f32.abs":return p("abs",e,a.Type.f32,r,a.Type.f32,i);case"f64.abs":return p("abs",e,a.Type.f64,r,a.Type.f64,i);case"f32.max":return p("max",e,a.Type.f32,r,a.Type.f32,i);case"f64.max":return p("max",e,a.Type.f64,r,a.Type.f64,i);case"f32.min":return p("min",e,a.Type.f32,r,a.Type.f32,i);case"f64.min":return p("min",e,a.Type.f64,r,a.Type.f64,i);case"f32.ceil":return p("ceil",e,a.Type.f32,r,a.Type.f32,i);case"f64.ceil":return p("ceil",e,a.Type.f64,r,a.Type.f64,i);case"f32.floor":return p("floor",e,a.Type.f32,r,a.Type.f32,i);case"f64.floor":return p("floor",e,a.Type.f64,r,a.Type.f64,i);case"f32.copysign":return p("copysign",e,a.Type.f32,r,a.Type.f32,i);case"f64.copysign":return p("copysign",e,a.Type.f64,r,a.Type.f64,i);case"f32.nearest":return p("nearest",e,a.Type.f32,r,a.Type.f32,i);case"f64.nearest":return p("nearest",e,a.Type.f64,r,a.Type.f64,i);case"i32.reinterpret_f32":return p("reinterpret",e,a.Type.i32,r,a.Type.f32,i);case"i64.reinterpret_f64":return p("reinterpret",e,a.Type.i64,r,a.Type.f64,i);case"f32.reinterpret_i32":return p("reinterpret",e,a.Type.f32,r,a.Type.i32,i);case"f64.reinterpret_i64":return p("reinterpret",e,a.Type.f64,r,a.Type.i64,i);case"f32.sqrt":return p("sqrt",e,a.Type.f32,r,a.Type.f32,i);case"f64.sqrt":return p("sqrt",e,a.Type.f64,r,a.Type.f64,i);case"f32.trunc":return p("trunc",e,a.Type.f32,r,a.Type.f32,i);case"f64.trunc":return p("trunc",e,a.Type.f64,r,a.Type.f64,i);case"i32.load8_s":return p("load",e,a.Type.i8,r,a.Type.i32,i);case"i32.load8_u":return p("load",e,a.Type.u8,r,a.Type.u32,i);case"i32.load16_s":return p("load",e,a.Type.i16,r,a.Type.i32,i);case"i32.load16_u":return p("load",e,a.Type.u16,r,a.Type.u32,i);case"i32.load":return p("load",e,a.Type.i32,r,a.Type.i32,i);case"i64.load8_s":return p("load",e,a.Type.i8,r,a.Type.i64,i);case"i64.load8_u":return p("load",e,a.Type.u8,r,a.Type.u64,i);case"i64.load16_s":return p("load",e,a.Type.i16,r,a.Type.i64,i);case"i64.load16_u":return p("load",e,a.Type.u16,r,a.Type.u64,i);case"i64.load32_s":return p("load",e,a.Type.i32,r,a.Type.i64,i);case"i64.load32_u":return p("load",e,a.Type.u32,r,a.Type.u64,i);case"i64.load":return p("load",e,a.Type.i64,r,a.Type.i64,i);case"f32.load":return p("load",e,a.Type.f32,r,a.Type.f32,i);case"f64.load":return p("load",e,a.Type.f64,r,a.Type.f64,i);case"i32.store8":return p("store",e,a.Type.i8,r,a.Type.i32,i);case"i32.store16":return p("store",e,a.Type.i16,r,a.Type.i32,i);case"i32.store":return p("store",e,a.Type.i32,r,a.Type.i32,i);case"i64.store8":return p("store",e,a.Type.i8,r,a.Type.i64,i);case"i64.store16":return p("store",e,a.Type.i16,r,a.Type.i64,i);case"i64.store32":return p("store",e,a.Type.i32,r,a.Type.i64,i);case"i64.store":return p("store",e,a.Type.i64,r,a.Type.i64,i);case"f32.store":return p("store",e,a.Type.f32,r,a.Type.f32,i);case"f64.store":return p("store",e,a.Type.f64,r,a.Type.f64,i)}return 0}(e,t,c,0,d);return V?(r&&r.length&&e.error(n.DiagnosticCode.Type_0_is_not_generic,d.range,t.internalName),V):(e.error(n.DiagnosticCode.Operation_not_supported,d.range),T.createUnreachable())}function p(e,t,r,n,i,a){var s=assert(t.program.elementsLookup.get(e));return assert(s.kind==o.ElementKind.FUNCTION_PROTOTYPE),c(t,s,[r],n,i,a)}function l(e,t,r,i){if(0==r.length)return t&&1==t.length?t[0]:(e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],a.Type.i32,0)}else e.compileExpressionRetainType(r[0],a.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(n.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",t.length.toString(10)),e.error(n.DiagnosticCode.Expected_0_arguments_but_got_1,i.range,"1",r.length.toString(10)),null}function u(e,t){var r,i;return e.options.isWasm64?(r=e.precomputeExpression(t,a.Type.usize64,1,0),(s.getExpressionId(r)!=s.ExpressionId.Const||s.getExpressionType(r)!=s.NativeType.I64||0!=s.getConstValueI64High(r)||(i=s.getConstValueI64Low(r))<0)&&(e.error(n.DiagnosticCode.Operation_not_supported,t.range),i=-1)):(r=e.precomputeExpression(t,a.Type.usize32,1,0),(s.getExpressionId(r)!=s.ExpressionId.Const||s.getExpressionType(r)!=s.NativeType.I32||(i=s.getConstValueI32(r))<0)&&(e.error(n.DiagnosticCode.Operation_not_supported,t.range),i=-1)),i}t.compileCall=c;var h="allocate_memory";t.compileAllocate=function(e,t,r){var i=e.program;assert(t.program==i);var a=e.module,s=e.options,c=i.elementsLookup.get(h);if(!c)return i.error(n.DiagnosticCode.Cannot_find_name_0,r.range,h),i.info(n.DiagnosticCode.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf,r.range),a.createUnreachable();if(c.kind!=o.ElementKind.FUNCTION_PROTOTYPE)return i.error(n.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,r.range,c.internalName),a.createUnreachable();var p=e.resolver.resolveFunction(c,null);return p&&e.compileFunction(p)?(e.currentType=t.type,a.createCall(p.internalName,[s.isWasm64?a.createI64(t.currentMemoryOffset):a.createI32(t.currentMemoryOffset)],s.nativeSizeType)):a.createUnreachable()};var d="abort";function _(e,t,r){var n=e.program,i=e.module,c=n.typesLookup.get("string");if(!c)return i.createUnreachable();var p=n.elementsLookup.get(d);if(!p||p.kind!=o.ElementKind.FUNCTION_PROTOTYPE)return i.createUnreachable();var l=e.resolver.resolveFunction(p,null);if(!l||!e.compileFunction(l))return i.createUnreachable();var u=null!=t?e.compileExpression(t,c,1,0):c.toNativeZero(i),h=e.compileStaticString(r.range.source.normalizedPath);return e.currentType=a.Type.void,i.createBlock(null,[i.createCallImport(l.internalName,[u,h,i.createI32(r.range.line),i.createI32(r.range.column)],s.NativeType.None),i.createUnreachable()])}t.compileAbort=_},function(t,r){t.exports=e},function(e,t,r){(function(e){const t=e.Binaryen||r(24);for(var n in t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.allocate_memory=function(e){return e?t._malloc(e):0},e.free_memory=function(e){e&&t._free(e)},e.move_memory=function(e,r,n){return t._memmove(e,r,n)},e.store=function(e,r){t.HEAPU8[e]=r},e.load=function(e){return t.HEAPU8[e]};const i=r(4).Module;i.prototype.toText=function(){var e=t.print,r="";return t.print=function(e){r+=e+"\n"},_BinaryenModulePrint(this.ref),t.print=e,r},i.prototype.toAsmjs=function(){var e=t.print,r="";return t.print=function(e){r+=e+"\n"},_BinaryenModulePrintAsmjs(this.ref),t.print=e,r}}).call(this,r(7))},function(e,t){e.exports=(e=>{var t=new Uint8Array(0),r=0;e.allocate_memory=function(e){if(!(e>>>=0))return 0;if(r+e>t.length){var n=t;(t=new Uint8Array(Math.max(65536,t.length+e,2*t.length))).set(n)}var i=r;return 7&(r+=e)&&(r=1+(7|r)),i},e.free_memory=function(e){},e.move_memory=function(e,r,n){t.copyWithin(e,r,r+n)},e.store=function(e,r,n){t[e+(0|n)]=r},e.load=function(e,r){return t[e+(0|r)]}})},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;function n(){Error.captureStackTrace?Error.captureStackTrace(this,n):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function i(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}t.ASC_TARGET=0,Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:1,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{MIN_VALUE:{value:Math.fround(-3.40282347e38),writable:!1},MAX_VALUE:{value:Math.fround(3.40282347e38),writable:!1},MIN_POSITIVE_VALUE:{value:Math.fround(1.175494351e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1},EPSILON:{value:Math.fround(1.1920929e-7),writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{MIN_VALUE:{value:-1.7976931348623157e308,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_POSITIVE_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1},EPSILON:{value:2.220446049250313e-16,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},n.prototype=Object.create(Error.prototype),n.prototype.name="UnreachableError",n.prototype.message="unreachable",t.unreachable=function(){throw new n},i.prototype=Object.create(Error.prototype),i.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new i(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,r(26)(t)}).call(this,r(7))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(27),r(25),r(17),r(16)},function(e,t,r){r(28),e.exports=r(14)}])});
 //# sourceMappingURL=assemblyscript.js.map
\ No newline at end of file
diff --git a/dist/assemblyscript.js.map b/dist/assemblyscript.js.map
index 0feb4092..3460218a 100644
--- a/dist/assemblyscript.js.map
+++ b/dist/assemblyscript.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://assemblyscript/webpack/universalModuleDefinition","webpack://assemblyscript/webpack/bootstrap","webpack://assemblyscript/./src/common.ts","webpack://assemblyscript/./src/util/index.ts","webpack://assemblyscript/./src/diagnostics.ts","webpack://assemblyscript/./src/module.ts","webpack://assemblyscript/./src/ast.ts","webpack://assemblyscript/./src/program.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/types.ts","webpack://assemblyscript/./src/tokenizer.ts","webpack://assemblyscript/./src/diagnosticMessages.generated.ts","webpack://assemblyscript/./src/compiler.ts","webpack://assemblyscript/./src/parser.ts","webpack://assemblyscript/./src/definitions.ts","webpack://assemblyscript/./src/decompiler.ts","webpack://assemblyscript/./src/index.ts","webpack://assemblyscript/./node_modules/long/src/long.js","webpack://assemblyscript/./src/glue/js/i64.js","webpack://assemblyscript/./src/glue/js/float.js","webpack://assemblyscript/./src/util/binary.ts","webpack://assemblyscript/./src/util/text.ts","webpack://assemblyscript/./src/util/path.ts","webpack://assemblyscript/./src/util/charcode.ts","webpack://assemblyscript/./src/builtins.ts","webpack://assemblyscript/external \"binaryen\"","webpack://assemblyscript/./src/glue/js/binaryen.js","webpack://assemblyscript/./std/portable/memory.js","webpack://assemblyscript/./std/portable/index.js","webpack://assemblyscript/./src/glue/js/index.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__23__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","CommonFlags","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","INNER_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","FILESPACE_PREFIX","__export","DiagnosticCategory","diagnosticMessages_generated_1","util_1","diagnosticMessages_generated_2","diagnosticCategoryToString","category","INFO","WARNING","ERROR","assert","diagnosticCategoryToColor","COLOR_BLUE","COLOR_YELLOW","COLOR_RED","DiagnosticCode","diagnosticCodeToString","COLOR_RESET","DiagnosticMessage","code","message","range","arg0","arg1","arg2","replace","createInfo","createWarning","createError","withRange","toString","source","normalizedPath","line","column","formatDiagnosticContext","useColors","text","len","length","start","end","isLineBreak","charCodeAt","sb","substring","push","join","formatDiagnosticMessage","showContext","DiagnosticEmitter","diagnostics","Array","emitDiagnostic","info","warning","error","NativeType","ExpressionId","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeUnreachable","_BinaryenTypeAuto","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallImportId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","_BinaryenExtendS8Int32","_BinaryenExtendS16Int32","_BinaryenExtendS8Int64","_BinaryenExtendS16Int64","_BinaryenExtendS32Int64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenPageSize","_BinaryenCurrentMemory","_BinaryenGrowMemory","_BinaryenHasFeature","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","MemorySegment","buffer","offset","segment","Module","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","ref","_BinaryenModuleCreate","cachedByValue","allocate_memory","createFrom","cArr","allocU8Array","_BinaryenModuleRead","free_memory","changetype","addFunctionType","result","paramTypes","cStr","allocString","allocI32Array","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","removeFunctionType","_BinaryenRemoveFunctionType","createI32","out","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createUnary","op","expr","_BinaryenUnary","createBinary","left","right","_BinaryenBinary","createHost","operands","allocPtrArray","_BinaryenHost","createGetLocal","index","type","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","bytes","signed","ptr","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","label","children","None","_BinaryenBlock","createBreak","condition","_BinaryenBreak","createDrop","expression","_BinaryenDrop","createLoop","body","_BinaryenLoop","createIf","ifTrue","ifFalse","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","numNames","strs","_BinaryenSwitch","createCall","target","returnType","_BinaryenCall","createCallImport","_BinaryenCallImport","createCallIndirect","typeName","_BinaryenCallIndirect","createUnreachable","_BinaryenUnreachable","addGlobal","mutable","initializer","_BinaryenAddGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addTemporaryFunction","tempName","typeRef","removeTemporaryFunction","addFunctionExport","internalName","externalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","removeImport","_BinaryenRemoveImport","setMemory","initial","maximum","segments","exportName","k","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","precomputeFunction","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","readInt","binaryBytes","ret","BinaryModule","output","Uint8Array","load","readBuffer","sourceMap","readString","toText","Error","toAsmjs","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","i32","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","_BinaryenExpressionGetType","I32","_BinaryenConstGetValueI32","I64","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","F32","_BinaryenConstGetValueF32","F64","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","Binary","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","setDebugLocation","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","MAX_MEMORY_WASM32","MAX_MEMORY_WASM64","getExpressionId","getExpressionType","getConstValueI32","getConstValueI64Low","getConstValueI64High","getConstValueF32","getConstValueF64","getGetLocalIndex","getSetLocalIndex","_BinaryenSetLocalGetIndex","getSetLocalValue","_BinaryenSetLocalGetValue","isTeeLocal","_BinaryenSetLocalIsTee","getBinaryOp","getBinaryLeft","getBinaryRight","getUnaryOp","getUnaryValue","getLoadBytes","getLoadOffset","getLoadPtr","isLoadSigned","getStoreBytes","_BinaryenStoreGetBytes","getStoreOffset","_BinaryenStoreGetOffset","getStorePtr","_BinaryenStoreGetPtr","getStoreValue","_BinaryenStoreGetValue","getBlockName","_BinaryenBlockGetName","getBlockChildCount","_BinaryenBlockGetNumChildren","getBlockChild","_BinaryenBlockGetChild","getIfCondition","_BinaryenIfGetCondition","getIfTrue","_BinaryenIfGetIfTrue","getIfFalse","_BinaryenIfGetIfFalse","getLoopName","_BinaryenLoopGetName","getLoopBody","_BinaryenLoopGetBody","getBreakName","_BinaryenBreakGetName","getBreakCondition","_BinaryenBreakGetCondition","getSelectThen","_BinaryenSelectGetIfTrue","getSelectElse","_BinaryenSelectGetIfFalse","getSelectCondition","_BinaryenSelectGetCondition","getDropValue","_BinaryenDropGetValue","getReturnValue","_BinaryenReturnGetValue","getCallTarget","_BinaryenCallGetTarget","getHostOp","_BinaryenHostGetOp","getHostOperandCount","_BinaryenHostGetNumOperands","getHostOperand","_BinaryenHostGetOperand","getHostName","_BinaryenHostGetNameOperand","getFunctionBody","_BinaryenFunctionGetBody","getFunctionName","_BinaryenFunctionGetName","getFunctionParamCount","_BinaryenFunctionGetNumParams","getFunctionParamType","_BinaryenFunctionGetParam","getFunctionResultType","_BinaryenFunctionGetResult","relooper","_RelooperCreate","addBlock","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","u8s","numValues","idx","store","i32s","val","ptrs","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","common_1","tokenizer_1","Token","Range","NodeKind","nodeIsConstantValue","kind","LITERAL","NULL","TRUE","FALSE","nodeIsCallable","IDENTIFIER","CALL","ELEMENTACCESS","PROPERTYACCESS","nodeIsGenericCallable","Node","parent","flags","NONE","is","flag","isAny","set","createType","typeArguments","isNullable","TypeNode","setParent","createOmittedType","createIdentifierExpression","createTypeParameter","extendsType","elem","TypeParameterNode","createParameter","ParameterNode","parameterKind","createSignature","parameters","explicitThisType","sig","SignatureNode","createDecorator","args","stmt","DecoratorNode","arguments","decoratorKind","decoratorNameToKind","createComment","node","CommentNode","commentKind","IdentifierExpression","createEmptyIdentifierExpression","createArrayLiteralExpression","elements","ArrayLiteralExpression","elementExpressions","nodes","setParentIfNotNull","createAssertionExpression","assertionKind","toType","AssertionExpression","createBinaryExpression","operator","BinaryExpression","createCallExpression","typeArgs","CallExpression","createClassExpression","declaration","ClassExpression","createCommaExpression","expressions","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","element","ElementAccessExpression","elementExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createFunctionExpression","FunctionExpression","ARROW","createInstanceOfExpression","isType","InstanceOfExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","ifThen","ifElse","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","operand","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","statements","BlockStatement","createBreakStatement","BreakStatement","createClassDeclaration","identifier","typeParameters","implementsTypes","members","decorators","ClassDeclaration","createContinueStatement","ContinueStatement","createDoStatement","statement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","values","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","path","ExportStatement","normalizePath","startsWith","resolvePath","internalPath","mangleInternalPath","createExportImportStatement","ExportImportStatement","createExportMember","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","IfStatement","createImportStatement","decls","ImportStatement","declarations","namespaceName","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","incrementor","ForStatement","createFunctionDeclaration","signature","FunctionDeclaration","createMethodDeclaration","MethodDeclaration","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","cases","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","alias","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createVoidStatement","VoidStatement","createWhileStatement","WhileStatement","CommonTypeNode","_super","__extends","_this","apply","TYPE","TYPEPARAMETER","ParameterKind","PARAMETER","implicitFieldDeclaration","DecoratorKind","SIGNATURE","nameStr","EXTERNAL","GLOBAL","INLINE","OPERATOR","SEALED","UNMANAGED","propStr","OPERATOR_BINARY","OPERATOR_PREFIX","OPERATOR_POSTFIX","CUSTOM","DECORATOR","CommentKind","COMMENT","Expression","LiteralKind","LiteralExpression","literalKind","ARRAY","AssertionKind","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","PARENTHESIZED","REGEXP","TERNARY","STRING","SUPER","THIS","UnaryExpression","UNARYPOSTFIX","UNARYPREFIX","isLastStatement","BLOCK","FUNCTIONDECLARATION","METHODDECLARATION","SourceKind","Statement","Source","SOURCE","tokenizer","debugInfoIndex","exportPaths","sourceKind","pos","lastIndexOf","simplePath","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","mangleInternalName","VARIABLE","NAMESPACEDECLARATION","EXPORT","isTopLevelExport","CLASSDECLARATION","STATIC","needsExplicitExport","member","VariableLikeDeclarationStatement","BREAK","CONTINUE","DO","EMPTY","ENUMDECLARATION","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","EXPRESSION","FIELDDECLARATION","parameterIndex","FOR","IF","IMPORTDECLARATION","IMPORT","INTERFACEDECLARATION","RETURN","SWITCHCASE","SWITCH","THROW","TRY","TYPEDECLARATION","VARIABLEDECLARATION","VOID","WHILE","asGlobal","endsWith","findDecorator","decorator","OperatorKind","diagnostics_1","types_1","ast_1","module_1","QueuedImport","QueuedExport","TypeAlias","operatorKindFromDecorator","arg","INDEXED_GET","INDEXED_SET","UNCHECKED_INDEXED_GET","UNCHECKED_INDEXED_SET","ADD","SUB","MUL","POW","DIV","REM","BITWISE_AND","BITWISE_OR","BITWISE_XOR","EQ","NE","GT","GE","BITWISE_SHR","BITWISE_SHR_U","LT","LE","BITWISE_SHL","PLUS","PREFIX_INC","MINUS","PREFIX_DEC","NOT","BITWISE_NOT","POSTFIX_INC","POSTFIX_DEC","INVALID","ElementKind","DecoratorFlags","noTypesYet","Map","Program","diagnosticsOffset","elementsLookup","instancesLookup","typesLookup","typeAliases","fileLevelExports","moduleLevelExports","arrayPrototype","stringInstance","mainFunction","resolvedThisExpression","resolvedElementExpression","sources","getSource","lookupSourceByPath","normalizedPathWithoutExtension","tmp","initialize","options","Type","i8","i16","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","setConstantInteger","i64_new","isWasm64","noTreeShaking","noAssert","memoryBase","optimizeLevelHint","shrinkLevelHint","hasFeature","queuedImports","queuedExports","queuedExtends","queuedImplements","filespace","Filespace","currentFilespace","j","initializeClass","initializeEnum","initializeExports","initializeFunction","initializeImports","initializeInterface","initializeNamespace","initializeTypeAlias","initializeVariables","queuedImport","tryResolveImport","localName","splice","externalNameAlt","Module_0_has_no_exported_member_1","queuedExports_1","__values","queuedExports_1_1","next","done","_c","__read","queuedExport","currentExport","isReExport","setExportAndCheckLibrary","Cannot_find_name_0","derivedPrototype","derivedDeclaration","derivedType","baseElement","resolveIdentifier","CLASS_PROTOTYPE","basePrototype","A_class_may_only_extend_another_class","globalAliases","globalAliases_1","globalAliases_1_1","_d","stringPrototype","resolve","has","Duplicate_identifier_0","programLevelInternalName","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","Global","withConstantIntegerValue","setConstantFloat","withConstantFloatValue","queuedNamedExports","filterDecorators","acceptedFlags","presentFlags","decoratorKindToFlag","Duplicate_decorator","Decorator_0_is_not_valid_here","checkGlobalOptions","parentNode","hasDecorator","BUILTIN","isLibrary","namespace","fileLevelInternalName","simpleName","ClassPrototype","numImplementsTypes","Unmanaged_classes_cannot_implement_interfaces","Operation_not_supported","MODULE_EXPORT","Export_declaration_conflicts_with_exported_declaration_of_0","isEntry","memberDeclarations","memberDeclaration","initializeField","GET","SET","initializeAccessor","initializeMethod","classPrototype","staticField","instanceMembers","instanceField","FieldPrototype","decoratorFlags","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperatorOverloads","numArgs","firstArg","overloads","overloadPrototypes","Duplicate_function_implementation","operatorKind","String_literal_expected","Expected_0_arguments_but_got_1","internalPropertyName","propertyElement","isGetter","isNew","PROPERTY","getterPrototype","setterPrototype","Property","baseName","staticName","staticPrototype","instanceName","instancePrototype","Enum","initializeEnumValue","enm","EnumValue","initializeExport","prefix","FILESPACE","referencedName","referencedElement","seen","Set","add","initializeImport","indexPart","InterfacePrototype","parentNamespace","Namespace","existingExport","Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local","global_1","resolveSignature","contextualTypeArguments","reportNotFound","thisType","resolveType","parameterTypeNodes","numParameters","parameterTypes","parameterNames","requiredParameters","hasRest","parameterTypeNode","DEFAULT","REST","parameterType","returnTypeNode","Signature","asNullable","typeNode","ENUM","instance","resolveUsingTypeArguments","paramType","instanceKey","typesToString","placeholderType","resolveTypeArguments","typeArgumentNodes","alternativeReportNode","parameterCount","argumentCount","Expected_0_type_arguments_but_got_1","atEnd","context","flow","getScopedLocal","resolvePropertyAccess","propertyAccess","contextualFunction","targetExpression","resolveExpression","propertyName","LOCAL","FIELD","classReference","Property_0_does_not_exist_on_type_1","indexedGet","lookupOverload","Index_signature_is_missing_in_type_0","base","resolveElementAccess","elementAccess","classType","explicitLocal","_this_cannot_be_referenced_in_current_location","_super_can_only_be_referenced_in_a_derived_class","signatureReference","functionTarget","cachedFunctionTarget","FunctionTarget","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","Element","program","NAMESPACE","ENUMVALUE","constantValue","ConstantValueKind","VariableLikeElement","constantValueKind","constantIntegerValue","CONST","INLINED","constantFloatValue","Parameter","Local","scopedGlobal","instances","classTypeArguments","functionTypeArguments","isInstance","INSTANCE","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","_b","inheritedName","inheritedType","classTypeParameters","numClassTypeParameters","numFunctionTypeArguments","signatureNode","functionTypeParameters","classInstance","signatureParameters","signatureParameterCount","parameterDeclaration","Function","resolvePartial","partialKey","partialPrototype","reportNode","resolvedTypeArguments","resolveBuiltinTypeArguments","resolvedType","localsByName","localsByIndex","additionalLocals","breakContext","debugLocations","functionTableIndex","trampoline","outerScope","nextBreakId","breakStack","nextInlineId","tempI32s","tempI64s","tempF32s","tempF64s","DECLARE","localIndex","local","inheritedTypeArguments_2","inheritedTypeArguments_2_1","parameterName","getParameterName","Flow","addLocal","getTempLocal","wrapped","temps","toNativeType","pop","setLocalWrapped","freeTempLocal","getAndFreeTempLocal","enterBreakContext","id","leaveBreakContext","finalize","debugLocation","debugInfoRef","FUNCTION_TARGET","toSignatureString","asFunction","FIELD_PROTOTYPE","Field","memoryOffset","inheritedTypeArguments_3","inheritedTypeArguments_3_1","_e","baseClass","baseClassType","Class_0_is_sealed_and_cannot_be_extended","Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa","Class","currentMemoryOffset","_f","_g","inheritedMember","partialConstructor","constructorInstance","_h","_j","fieldDeclaration","fieldType","fieldInstance","byteSize","instanceProperty","partialGetterPrototype","partialSetterPrototype","_k","_l","_m","operatorInstance","operatorPartial","asClass","inheritedTypeArguments_4","inheritedTypeArguments_4_1","baseType","isAssignableTo","current","unchecked","uncheckedOverload","overload","INTERFACE_PROTOTYPE","Interface","INTERFACE","FlowFlags","scopedLocals","currentFunction","parentFlow","continueLabel","breakLabel","returnLabel","wrappedLocals","wrappedLocalsExt","unset","fork","branch","slice","free","scopedLocal","SCOPED","addScopedLocal","existingLocal","addScopedLocalAlias","scopedAlias","isLocalWrapped","map","ext","i64_ne","i64_and","i64_shl","i64_one","i64_zero","off","i64_or","i64_not","inherit","other","inheritConditional","inheritMutual","leftExt","rightExt","thisExt","minLength","min","canOverflow","canConversionOverflow","SetLocal","EqI32","EqI64","EqF32","EqF64","NeI32","NeI64","NeF32","NeF64","LtI32","LtU32","LtI64","LtU64","LtF32","LtF64","LeI32","LeU32","LeI64","LeU64","LeF32","LeF64","GtI32","GtU32","GtI64","GtU64","GtF32","GtF64","GeI32","GeU32","GeI64","GeU64","GeF32","GeF64","MulI32","AndI32","computeSmallIntegerMask","ShlI32","shift","size","ShrI32","ShrU32","DivU32","RemI32","RemU32","EqzI32","EqzI64","ClzI32","CtzI32","PopcntI32","MIN_VALUE","fromType","Block","last","If","Select","Call","Unreachable","fromSize","toSize","g","eval","e","window","TypeKind","TypeFlags","cachedNullableType","ceil","nonNullableType","isize64","isize32","usize64","usize32","computeSmallIntegerShift","targetType","signednessIsRelevant","currentClass","targetClass","targetFunction","commonCompatible","signednessIsImportant","kindOnly","toNativeZero","toNativeOne","toNativeNegOne","typesToNativeTypes","types","numTypes","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","IdentifierHandling","tokenFromKeyword","ABSTRACT","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","IS","KEYOF","LET","MODULE","OF","PACKAGE","PRIVATE","PROTECTED","PUBLIC","READONLY","TYPEOF","VAR","WITH","YIELD","tokenIsAlsoIdentifier","token","operatorTokenToString","DOT_DOT_DOT","LESSTHAN","GREATERTHAN","LESSTHAN_EQUALS","GREATERTHAN_EQUALS","EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS_EQUALS_EQUALS","EXCLAMATION_EQUALS_EQUALS","ASTERISK_ASTERISK","ASTERISK","SLASH","PERCENT","PLUS_PLUS","MINUS_MINUS","LESSTHAN_LESSTHAN","GREATERTHAN_GREATERTHAN","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND","BAR","CARET","EXCLAMATION","TILDE","AMPERSAND_AMPERSAND","BAR_BAR","EQUALS","PLUS_EQUALS","MINUS_EQUALS","ASTERISK_EQUALS","ASTERISK_ASTERISK_EQUALS","SLASH_EQUALS","PERCENT_EQUALS","LESSTHAN_LESSTHAN_EQUALS","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","AMPERSAND_EQUALS","BAR_EQUALS","CARET_EQUALS","a","b","Tokenizer","tokenPos","nextToken","nextTokenPos","nextTokenOnNewLine","onComment","identifierHandling","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","isDecimalDigit","FLOATLITERAL","DOT","commentStartPos","LINE","TRIPLE","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordToken","ALWAYS","PREFER","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skipIdentifier","skip","skipIdentifierName","mark","state","reusableState","State","discard","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","sepEnd","i64_add","i64_mul","Numeric_separators_are_not_allowed_here","Multiple_consecutive_numeric_separators_are_not_permitted","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","readDecimalFloat","parseFloat","readHexFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","builtins_1","program_1","Options","WASM32","importMemory","importTable","features","feature","Feature","ConversionKind","WrapMode","mangleImportName_moduleName","mangleImportName_elementName","Compiler","currentOuterFunction","currentEnum","currentType","memorySegments","stringSegments","functionTable","argcVar","argcSet","f32ModInstance","f64ModInstance","f32PowInstance","f64PowInstance","max","compile","startFunctionInstance","startFunctionBody","compileSource","funcRef","ensureFunctionType","i64_align","numPages","i64_shr_u","functionTableSize","functionTableExported","entries","compileSourceByPath","File_0_not_found","COMPILED","isGeneric","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFunction","compileStatement","compileGlobalDeclaration","compileGlobal","global","initExpr","Type_expected","compileExpressionRetainType","Type_0_is_not_assignable_to_type_1","nativeType","isConstant","MODULE_IMPORT","mangleImportName","initializeInStart","compileInlineConstant","compileExpression","precomputeExpressionRef","Compiling_constant_with_non_constant_initializer_as_mutable","mangleExportName","isTopLevel","compileEnum","previousValue","initInStart","valueDeclaration","AddI32","Cannot_export_a_mutable_global","compileFunctionUsingTypeArguments","compileFunction","resultType","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","nativeSizeType","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","ensureTrampoline","ensureArgcSet","compileInterfaceDeclaration","compileNamespace","compileClassUsingTypeArguments","internalExportName","functionInstance","functionDeclaration","globalDeclaration","compileClass","staticMembers","setter","ctorInstance","getterName","setterName","addMemorySegment","alignment","ensureFunctionTableEntry","TRAMPOLINE","compileBlockStatement","compileBreakStatement","compileContinueStatement","compileDoStatement","compileEmptyStatement","compileExpressionStatement","compileForStatement","compileIfStatement","compileReturnStatement","compileSwitchStatement","compileThrowStatement","compileTryStatement","compileVoidStatement","compileWhileStatement","addDebugLocation","numStatements","Nop","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","condExpr","makeIsTrueish","terminated","repeatLabel","alwaysTrue","condPre","incrExpr","bodyExpr","usesContinue","breakBlock","repeatBlock","GENERIC_CONTEXT","condExprPrecomp","ifTrueFlow","ifTrueExpr","ifFalseExpr","ifFalseFlow","numCases","tempLocal","tempLocalIndex","breaks","breakIndex","defaultIndex","currentBlock","alwaysReturns","alwaysReturnsWrapped","alwaysThrows","alwaysAllocates","isLast","nextLabel","count","compileAbort","isKnownGlobal","numDeclarations","initializers","isInlined","_const_declarations_must_be_initialized","compileAssignmentWithValue","contextualType","retainType","mask","conversionKind","wrapMode","compileAssertionExpression","compileBinaryExpression","compileCallExpression","compileCommaExpression","compileElementAccessExpression","compileFunctionExpression","compileIdentifierExpression","compileInstanceOfExpression","compileLiteralExpression","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","compileTernaryExpression","compileUnaryPostfixExpression","compileUnaryPrefixExpression","convertExpression","ensureSmallIntegerWrap","precomputeExpression","Conversion_from_type_0_to_1_requires_an_explicit_cast","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","leftExpr","leftType","rightExpr","rightType","commonType","compound","compileBinaryOverload","Operator_0_cannot_be_applied_to_types_1_and_2","compileAssignment","AddI64","AddF32","AddF64","SubI32","SubI64","SubF32","SubF64","MulI64","MulF32","MulF64","makeCallDirect","DivI32","DivI64","DivU64","DivF32","DivF64","RemI64","RemU64","intType","ShlI64","The_0_operator_cannot_be_applied_to_type_1","ShrI64","ShrU64","AndI64","OrI32","OrI64","XorI32","XorI64","compileUnaryOverload","valueExpr","argumentExpressions","thisArg","compileCallDirect","valueExpression","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","isUnchecked","indexedSet","Index_signature_in_type_0_only_permits_reading","valueWithCorrectType","tee","thisExpression","thisExpr","setterInstance","getterInstance","nativeReturnType","elementExpr","tempLocalTarget","tempLocalElement","indexArg","compileCallExpressionBuiltin","Type_0_is_not_generic","inferredTypes","numTypeParameters","numParameterTypes","numArguments","argumentExprs","argumentExpression","inferredType","concreteType","compileCallIndirect","compileCall","checkCallSignature","hasThis","minimum","Expected_at_least_0_arguments_but_got_1","inline","compileCallInlineUnchecked","numArgumentsInclThis","previousFlow","thisLocal","paramExpr","argumentLocal","bodyStatement","original","originalSignature","originalName","originalParameterTypes","originalParameterDeclarations","commonReturnType","commonThisType","minArguments","minOperands","maxArguments","maxOperands","numOptional","forwardedOperands","operandIndex","trampolineSignature","trampolineName","ofN","Optional_parameter_must_have_an_initializer","ensureArgcVar","numOperands","isCallImport","parameterNodes","allOptionalsAreConstant","makeCallIndirect","numExpressions","exprs","retainConstantType","scopedThis","superType","localType","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileArrayLiteral","floatValue","intValue","i64_sub","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStaticString","stringValue","stringSegment","stringLength","stringBuffer","stringOffset","stringType","elementType","isStatic","arrayInstance","arrayType","elementCount","nativeElementType","byteLength","Int32Array","Float32Array","Float64Array","usizeTypeSize","arraySize","bufferTotalSize","clz","data","writeI64","writeI32","writeF32","writeF64","nativeArrayType","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","currentClassInstance","makeAllocate","ifThenFlow","ifThenExpr","ifThenType","ifElseFlow","ifElseExpr","ifElseType","getValue","nativeOne","setValue","NegF32","NegF64","makeIsFalseish","ExtendI8ToI32","ExtendI16ToI32","compileAllocate","field","nativeFieldType","parentElement","builtinsFile","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","indexOf","tn","parseTopLevelStatement","startPos","parseDecorator","skipStatement","exportStart","exportEnd","contextIsAmbient","A_declare_modifier_cannot_be_used_in_an_already_ambient_context","first","parseEnum","parseVariable","parseFunction","parseStatement","parseClassOrInterface","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","Decorators_are_not_valid_here","nextFile","clear","parseType","acceptParenthesized","suppressErrors","isNullableSignature","tryParseSignature","Unexpected_token","innerType","Identifier_expected","nullable","parameter","bracketStart","bracketRange","isSignature","A_rest_parameter_cannot_be_optional","OPTIONAL","param","parseArguments","parseVariableDeclaration","parentFlags","parentDecorators","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","parseEnumValue","parseReturn","parseTypeParameters","typeParameter","parseTypeParameter","Type_parameter_list_cannot_be_empty","parseParameters","seenRest","seenOptional","reportedRest","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","isRest","isOptional","startRange","accessFlags","A_parameter_property_cannot_be_declared_using_a_rest_parameter","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","signatureStart","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseBlockStatement","parseFunctionExpression","isArrow","parseFunctionExpressionCommon","isInterface","Interface_declaration_cannot_have_implements_clause","parseClassMember","parseClassExpression","VIRTUAL","staticStart","staticEnd","abstractStart","abstractEnd","readonlyStart","readonlyEnd","setEnd","typeParametersStart","Type_parameters_cannot_appear_on_a_constructor_declaration","An_accessor_cannot_have_type_parameters","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","Method_0_cannot_have_an_implementation_because_it_is_marked_abstract","retMethod","Constructor_implementation_is_missing","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseVoidStatement","parseWhileStatement","parseExpressionStatement","elseStatement","case_","parseSwitchCase","_case_or_default_expected","parseExpressionStart","precedence","determinePrecedenceStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","again","PREFIX","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","nextPrecedence","determinePrecedence","commaExprs","isRightAssociative","propertyCall","skipBlock","depth","Precedence","ExportsWalker","includePrivate","todo","walk","visitElement","visitGlobal","visitEnum","visitFunctionInstances","visitClassInstances","visitField","prop","hasCompiledMember","visitNamespace","visitFunction","visitClass","IDLBuilder","indentLevel","build","isConst","indent","typeToString","i64_to_string","members_1","members_1_1","visitInterface","TSDBuilder","numMembers","members_2","members_2_1","ctor","Decompiler","functionId","decompile","decompiler","decompileFunction","nativeTypeToType","decompileExpression","nested","string","Loop","Break","Switch","CallImport","CallIndirect","SetGlobal","Store","AbsF32","CeilF32","FloorF32","TruncF32","NearestF32","SqrtF32","ClzI64","CtzI64","PopcntI64","AbsF64","CeilF64","FloorF64","TruncF64","NearestF64","SqrtF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","RotlI32","RotrI32","RotlI64","RotrI64","CopysignF32","MinF32","MaxF32","CopysignF64","MinF64","MaxF64","Drop","Return","Host","CurrentMemory","GrowMemory","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","Auto","decompiler_1","definitions_1","formatDiagnostic","parser_1","parser","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setImportMemory","setImportTable","setSourceMap","setMemoryBase","setGlobalAlias","FEATURE_SIGN_EXTENSION","FEATURE_MUTABLE_GLOBAL","enableFeature","setOptimizeLevelHints","optimizeLevel","shrinkLevel","finishParsing","compileProgram","decompileModule","buildIDL","buildTSD","Long","wasm","WebAssembly","Instance","low","high","unsigned","isLong","obj","__isLong__","INT_CACHE","UINT_CACHE","fromInt","cachedObj","cache","fromBits","fromNumber","isNaN","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","Math","pow","fromString","radix","RangeError","radixToPower","parseInt","power","mul","fromValue","TWO_PWR_16_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","toInt","toNumber","isZero","isNegative","eq","radixLong","div","rem1","sub","rem","remDiv","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","notEquals","neq","ne","lessThan","comp","lt","lessThanOrEqual","lte","le","greaterThan","gt","greaterThanOrEqual","gte","ge","compare","thisNeg","otherNeg","negate","not","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","b00","divide","divisor","approx","res","div_u","div_s","toUnsigned","shru","shr","shl","floor","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","mod","and","or","xor","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toSigned","toBytes","toBytesLE","toBytesBE","hi","lo","fromBytes","fromBytesLE","fromBytesBE","i64_div","i64_div_u","i64_rem","i64_rem_u","i64_xor","i64_shr","i64_eq","minSafeF32","MIN_SAFE_INTEGER","maxSafeF32","MAX_SAFE_INTEGER","minSafeF64","maxSafeF64","fround","f32_as_i32","i32_as_f32","f64_as_i64","i64_as_f64","readI32","readI64","readF32","readF64","valueI64","indentX1","indentX2","indentX4","separator","ipos","dirname","origin","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","mid","compiler","evaluateConstantType","tempLocal0","tempLocal1","evaluateConstantOffset","alignLog2","fieldName","Type_0_has_no_property_1","abort","operandExprs","signatureParts","nativeParamTypes","operandType","deferASM","deferASMCall","typeArgument","valueType","allocateInternalName","allocatePrototype","An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf","allocateInstance","abortInternalName","abortPrototype","abortInstance","messageArg","filenameArg","binaryen","Binaryen","_malloc","_free","move_memory","dest","src","_memmove","HEAPU8","previousPrint","print","x","_BinaryenModulePrint","_BinaryenModulePrintAsmjs","globalScope","HEAP","HEAP_OFFSET","oldHeap","copyWithin","UnreachableError","captureStackTrace","stack","AssertionError","ASC_TARGET","defineProperties","writable","MIN_POSITIVE_VALUE","EPSILON","clz32","abs","trunc","round","sqrt","y","sign","isTrueish","undefined","fromCodePoint","Number","isInteger","isArray"],"mappings":"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AAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCE,GACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,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","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__23__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 28);\n","/**\r\n * Common constants.\r\n * @module common\r\n *//***/\r\n\r\n/** Indicates traits of a {@link Node} or {@link Element}. */\r\nexport enum CommonFlags {\r\n  /** No flags set. */\r\n  NONE = 0,\r\n\r\n  // Basic modifiers\r\n\r\n  /** Has an `import` modifier. */\r\n  IMPORT = 1 << 0,\r\n  /** Has an `export` modifier. */\r\n  EXPORT = 1 << 1,\r\n  /** Has a `declare` modifier. */\r\n  DECLARE = 1 << 2,\r\n  /** Has a `const` modifier. */\r\n  CONST = 1 << 3,\r\n  /** Has a `let` modifier. */\r\n  LET = 1 << 4,\r\n  /** Has a `static` modifier. */\r\n  STATIC = 1 << 5,\r\n  /** Has a `readonly` modifier. */\r\n  READONLY = 1 << 6,\r\n  /** Has an `abstract` modifier. */\r\n  ABSTRACT = 1 << 7,\r\n  /** Has a `public` modifier. */\r\n  PUBLIC = 1 << 8,\r\n  /** Has a `private` modifier. */\r\n  PRIVATE = 1 << 9,\r\n  /** Has a `protected` modifier. */\r\n  PROTECTED = 1 << 10,\r\n  /** Has a `get` modifier. */\r\n  GET = 1 << 11,\r\n  /** Has a `set` modifier. */\r\n  SET = 1 << 12,\r\n\r\n  // Extended modifiers usually derived from basic modifiers\r\n\r\n  /** Is ambient, that is either declared or nested in a declared element. */\r\n  AMBIENT = 1 << 13,\r\n  /** Is generic. */\r\n  GENERIC = 1 << 14,\r\n  /** Is part of a generic context. */\r\n  GENERIC_CONTEXT = 1 << 15,\r\n  /** Is an instance member. */\r\n  INSTANCE = 1 << 16,\r\n  /** Is a constructor. */\r\n  CONSTRUCTOR = 1 << 17,\r\n  /** Is an arrow function. */\r\n  ARROW = 1 << 18,\r\n  /** Is a module export. */\r\n  MODULE_EXPORT = 1 << 19,\r\n  /** Is a module import. */\r\n  MODULE_IMPORT = 1 << 20,\r\n\r\n  // Compilation states\r\n\r\n  /** Is a builtin. */\r\n  BUILTIN = 1 << 21,\r\n  /** Is compiled. */\r\n  COMPILED = 1 << 22,\r\n  /** Has a constant value and is therefore inlined. */\r\n  INLINED = 1 << 23,\r\n  /** Is scoped. */\r\n  SCOPED = 1 << 24,\r\n  /** Is a trampoline. */\r\n  TRAMPOLINE = 1 << 25,\r\n  /** Is a virtual method. */\r\n  VIRTUAL = 1 << 26,\r\n  /** Is the main function. */\r\n  MAIN = 1 << 27\r\n}\r\n\r\n/** Path delimiter inserted between file system levels. */\r\nexport const PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexport const PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexport const GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexport const SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexport const INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexport const STATIC_DELIMITER = \".\";\r\n/** Delimiter used between a function and its inner elements. */\r\nexport const INNER_DELIMITER = \"~\";\r\n/** Substitution used to indicate a library directory. */\r\nexport const LIBRARY_SUBST = \"~lib\";\r\n/** Library directory prefix. */\r\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\r\n/** Prefix used to indicate a filespace element. */\r\nexport const FILESPACE_PREFIX = \"file:\";\r\n","/**\r\n * Various compiler utilities.\r\n * @module util\r\n * @preferred\r\n *//***/\r\n\r\nexport * from \"./charcode\";\r\nexport * from \"./path\";\r\nexport * from \"./text\";\r\nexport * from \"./binary\";\r\n","/**\r\n * Shared diagnostic handling inherited by the parser and the compiler.\r\n * @module diagnostics\r\n * @preferred\r\n *//***/\r\n\r\nimport {\r\n  Range\r\n} from \"./ast\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nimport {\r\n  isLineBreak\r\n} from \"./util\";\r\n\r\nexport {\r\n  DiagnosticCode,\r\n  diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\n/** Indicates the category of a {@link DiagnosticMessage}. */\r\nexport enum DiagnosticCategory {\r\n  /** Informatory message. */\r\n  INFO,\r\n  /** Warning message. */\r\n  WARNING,\r\n  /** Error message. */\r\n  ERROR\r\n}\r\n\r\n/** Returns the string representation of the specified diagnostic category. */\r\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\r\n  switch (category) {\r\n    case DiagnosticCategory.INFO: return \"INFO\";\r\n    case DiagnosticCategory.WARNING: return \"WARNING\";\r\n    case DiagnosticCategory.ERROR: return \"ERROR\";\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\n/** ANSI escape sequence for blue foreground. */\r\nexport const COLOR_BLUE: string = \"\\u001b[96m\";\r\n/** ANSI escape sequence for yellow foreground. */\r\nexport const COLOR_YELLOW: string = \"\\u001b[93m\";\r\n/** ANSI escape sequence for red foreground. */\r\nexport const COLOR_RED: string = \"\\u001b[91m\";\r\n/** ANSI escape sequence to reset the foreground color. */\r\nexport const COLOR_RESET: string = \"\\u001b[0m\";\r\n\r\n/** Returns the ANSI escape sequence for the specified category. */\r\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\r\n  switch (category) {\r\n    case DiagnosticCategory.INFO: return COLOR_BLUE;\r\n    case DiagnosticCategory.WARNING: return COLOR_YELLOW;\r\n    case DiagnosticCategory.ERROR: return COLOR_RED;\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\n/** Represents a diagnostic message. */\r\nexport class DiagnosticMessage {\r\n\r\n  /** Message code. */\r\n  code: i32;\r\n  /** Message category. */\r\n  category: DiagnosticCategory;\r\n  /** Message text. */\r\n  message: string;\r\n  /** Respective source range, if any. */\r\n  range: Range | null = null;\r\n\r\n  /** Constructs a new diagnostic message. */\r\n  private constructor(code: i32, category: DiagnosticCategory, message: string) {\r\n    this.code = code;\r\n    this.category = category;\r\n    this.message = message;\r\n  }\r\n\r\n  /** Creates a new diagnostic message of the specified category. */\r\n  static create(\r\n    code: DiagnosticCode,\r\n    category: DiagnosticCategory,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): DiagnosticMessage {\r\n    var message = diagnosticCodeToString(code);\r\n    if (arg0 != null) message = message.replace(\"{0}\", arg0);\r\n    if (arg1 != null) message = message.replace(\"{1}\", arg1);\r\n    if (arg2 != null) message = message.replace(\"{2}\", arg2);\r\n    return new DiagnosticMessage(code, category, message);\r\n  }\r\n\r\n  /** Creates a new informatory diagnostic message. */\r\n  static createInfo(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n  }\r\n\r\n  /** Creates a new warning diagnostic message. */\r\n  static createWarning(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n  }\r\n\r\n  /** Creates a new error diagnostic message. */\r\n  static createError(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n  }\r\n\r\n  /** Adds a source range to this message. */\r\n  withRange(range: Range): this {\r\n    this.range = range;\r\n    return this;\r\n  }\r\n\r\n  /** Converts this message to a string. */\r\n  toString(): string {\r\n    if (this.range) {\r\n      return (\r\n        diagnosticCategoryToString(this.category) +\r\n        \" \" +\r\n        this.code.toString(10) +\r\n        \": \\\"\" +\r\n        this.message +\r\n        \"\\\" in \" +\r\n        this.range.source.normalizedPath +\r\n        \":\" +\r\n        this.range.line.toString(10) +\r\n        \":\" +\r\n        this.range.column.toString(10)\r\n      );\r\n    }\r\n    return (\r\n      diagnosticCategoryToString(this.category) +\r\n      \" \" +\r\n      this.code.toString(10) +\r\n      \": \" +\r\n      this.message\r\n    );\r\n  }\r\n}\r\n\r\n/** Formats a diagnostic message, optionally with terminal colors and source context. */\r\nexport function formatDiagnosticMessage(\r\n  message: DiagnosticMessage,\r\n  useColors: bool = false,\r\n  showContext: bool = false\r\n): string {\r\n\r\n  // general information\r\n  var sb: string[] = [];\r\n  if (useColors) sb.push(diagnosticCategoryToColor(message.category));\r\n  sb.push(diagnosticCategoryToString(message.category));\r\n  if (useColors) sb.push(COLOR_RESET);\r\n  sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n  sb.push(message.code.toString(10));\r\n  sb.push(\": \");\r\n  sb.push(message.message);\r\n\r\n  // include range information if available\r\n  if (message.range) {\r\n\r\n    // include context information if requested\r\n    let range = message.range;\r\n    if (showContext) {\r\n      sb.push(\"\\n\");\r\n      sb.push(formatDiagnosticContext(message.range, useColors));\r\n    }\r\n\r\n    sb.push(\"\\n\");\r\n    sb.push(\" in \");\r\n    sb.push(range.source.normalizedPath);\r\n    sb.push(\"(\");\r\n    sb.push(range.line.toString(10));\r\n    sb.push(\",\");\r\n    sb.push(range.column.toString(10));\r\n    sb.push(\")\");\r\n  }\r\n  return sb.join(\"\");\r\n}\r\n\r\n/** Formats the diagnostic context for the specified range, optionally with terminal colors. */\r\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\r\n  var text = range.source.text;\r\n  var len = text.length;\r\n  var start = range.start;\r\n  var end = range.end;\r\n  while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\r\n  while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\r\n  var sb: string[] = [\r\n    \"\\n \",\r\n    text.substring(start, end),\r\n    \"\\n \"\r\n  ];\r\n  while (start < range.start) {\r\n    sb.push(\" \");\r\n    start++;\r\n  }\r\n  if (useColors) sb.push(COLOR_RED);\r\n  if (range.start == range.end) {\r\n    sb.push(\"^\");\r\n  } else {\r\n    while (start++ < range.end) sb.push(\"~\");\r\n  }\r\n  if (useColors) sb.push(COLOR_RESET);\r\n  return sb.join(\"\");\r\n}\r\n\r\n/** Base class of all diagnostic emitters. */\r\nexport abstract class DiagnosticEmitter {\r\n\r\n  /** Diagnostic messages emitted so far. */\r\n  diagnostics: DiagnosticMessage[];\r\n\r\n  /** Initializes this diagnostic emitter. */\r\n  protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n    this.diagnostics = diagnostics ? <DiagnosticMessage[]>diagnostics : new Array();\r\n  }\r\n\r\n  /** Emits a diagnostic message of the specified category. */\r\n  emitDiagnostic(\r\n    code: DiagnosticCode,\r\n    category: DiagnosticCategory,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\r\n    this.diagnostics.push(message);\r\n    // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n    // console.log(<string>new Error(\"stack\").stack);\r\n  }\r\n\r\n  /** Emits an informatory diagnostic message. */\r\n  info(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\r\n  }\r\n\r\n  /** Emits a warning diagnostic message. */\r\n  warning(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\r\n  }\r\n\r\n  /** Emits an error diagnostic message. */\r\n  error(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\r\n  }\r\n}\r\n","/**\r\n * A thin wrapper around Binaryen's C-API.\r\n * @module module\r\n *//***/\r\n\r\nimport {\r\n  Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n  None = _BinaryenTypeNone(),\r\n  I32 = _BinaryenTypeInt32(),\r\n  I64 = _BinaryenTypeInt64(),\r\n  F32 = _BinaryenTypeFloat32(),\r\n  F64 =  _BinaryenTypeFloat64(),\r\n  Unreachable = _BinaryenTypeUnreachable(),\r\n  Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n  Invalid = _BinaryenInvalidId(),\r\n  Block = _BinaryenBlockId(),\r\n  If = _BinaryenIfId(),\r\n  Loop = _BinaryenLoopId(),\r\n  Break = _BinaryenBreakId(),\r\n  Switch = _BinaryenSwitchId(),\r\n  Call = _BinaryenCallId(),\r\n  CallImport = _BinaryenCallImportId(),\r\n  CallIndirect = _BinaryenCallIndirectId(),\r\n  GetLocal = _BinaryenGetLocalId(),\r\n  SetLocal = _BinaryenSetLocalId(),\r\n  GetGlobal = _BinaryenGetGlobalId(),\r\n  SetGlobal = _BinaryenSetGlobalId(),\r\n  Load = _BinaryenLoadId(),\r\n  Store = _BinaryenStoreId(),\r\n  Const = _BinaryenConstId(),\r\n  Unary = _BinaryenUnaryId(),\r\n  Binary = _BinaryenBinaryId(),\r\n  Select = _BinaryenSelectId(),\r\n  Drop = _BinaryenDropId(),\r\n  Return = _BinaryenReturnId(),\r\n  Host = _BinaryenHostId(),\r\n  Nop = _BinaryenNopId(),\r\n  Unreachable = _BinaryenUnreachableId(),\r\n  AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n  AtomicRMW = _BinaryenAtomicRMWId(),\r\n  AtomicWait = _BinaryenAtomicWaitId(),\r\n  AtomicWake = _BinaryenAtomicWakeId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n  ClzI32 = _BinaryenClzInt32(),\r\n  CtzI32 = _BinaryenCtzInt32(),\r\n  PopcntI32 = _BinaryenPopcntInt32(),\r\n  NegF32 = _BinaryenNegFloat32(),\r\n  AbsF32 = _BinaryenAbsFloat32(),\r\n  CeilF32 = _BinaryenCeilFloat32(),\r\n  FloorF32 = _BinaryenFloorFloat32(),\r\n  TruncF32 = _BinaryenTruncFloat32(),\r\n  NearestF32 = _BinaryenNearestFloat32(),\r\n  SqrtF32 = _BinaryenSqrtFloat32(),\r\n  EqzI32 = _BinaryenEqZInt32(),\r\n  ClzI64 = _BinaryenClzInt64(),\r\n  CtzI64 = _BinaryenCtzInt64(),\r\n  PopcntI64 = _BinaryenPopcntInt64(),\r\n  NegF64 = _BinaryenNegFloat64(),\r\n  AbsF64 = _BinaryenAbsFloat64(),\r\n  CeilF64 = _BinaryenCeilFloat64(),\r\n  FloorF64 = _BinaryenFloorFloat64(),\r\n  TruncF64 = _BinaryenTruncFloat64(),\r\n  NearestF64 = _BinaryenNearestFloat64(),\r\n  SqrtF64 = _BinaryenSqrtFloat64(),\r\n  EqzI64 = _BinaryenEqZInt64(),\r\n  ExtendI32 = _BinaryenExtendSInt32(),\r\n  ExtendU32 = _BinaryenExtendUInt32(),\r\n  WrapI64 = _BinaryenWrapInt64(),\r\n  TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n  TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n  TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n  TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n  TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n  TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n  TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n  TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n  ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n  ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n  ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n  ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n  ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n  ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n  ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n  ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n  ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n  ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n  PromoteF32 = _BinaryenPromoteFloat32(),\r\n  DemoteF64 = _BinaryenDemoteFloat64(),\r\n  ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n  ReinterpretI64 = _BinaryenReinterpretInt64(),\r\n\r\n  // see: https://github.com/WebAssembly/sign-extension-ops\r\n  ExtendI8ToI32 = _BinaryenExtendS8Int32(),\r\n  ExtendI16ToI32 = _BinaryenExtendS16Int32(),\r\n  ExtendI8ToI64 = _BinaryenExtendS8Int64(),\r\n  ExtendI16ToI64 = _BinaryenExtendS16Int64(),\r\n  ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n  // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n  // TruncF32ToI32Sat\r\n  // TruncF32ToU32Sat\r\n  // TruncF64ToI32Sat\r\n  // TruncF64ToU32Sat\r\n  // TruncF32ToI64Sat\r\n  // TruncF32ToU64Sat\r\n  // TruncF64ToI64Sat\r\n  // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n  AddI32 = _BinaryenAddInt32(),\r\n  SubI32 = _BinaryenSubInt32(),\r\n  MulI32 = _BinaryenMulInt32(),\r\n  DivI32 = _BinaryenDivSInt32(),\r\n  DivU32 = _BinaryenDivUInt32(),\r\n  RemI32 = _BinaryenRemSInt32(),\r\n  RemU32 = _BinaryenRemUInt32(),\r\n  AndI32 = _BinaryenAndInt32(),\r\n  OrI32 = _BinaryenOrInt32(),\r\n  XorI32 = _BinaryenXorInt32(),\r\n  ShlI32 = _BinaryenShlInt32(),\r\n  ShrU32 = _BinaryenShrUInt32(),\r\n  ShrI32 = _BinaryenShrSInt32(),\r\n  RotlI32 = _BinaryenRotLInt32(),\r\n  RotrI32 = _BinaryenRotRInt32(),\r\n  EqI32 = _BinaryenEqInt32(),\r\n  NeI32 = _BinaryenNeInt32(),\r\n  LtI32 = _BinaryenLtSInt32(),\r\n  LtU32 = _BinaryenLtUInt32(),\r\n  LeI32 = _BinaryenLeSInt32(),\r\n  LeU32 = _BinaryenLeUInt32(),\r\n  GtI32 = _BinaryenGtSInt32(),\r\n  GtU32 = _BinaryenGtUInt32(),\r\n  GeI32 = _BinaryenGeSInt32(),\r\n  GeU32 = _BinaryenGeUInt32(),\r\n  AddI64 = _BinaryenAddInt64(),\r\n  SubI64 = _BinaryenSubInt64(),\r\n  MulI64 = _BinaryenMulInt64(),\r\n  DivI64 = _BinaryenDivSInt64(),\r\n  DivU64 = _BinaryenDivUInt64(),\r\n  RemI64 = _BinaryenRemSInt64(),\r\n  RemU64 = _BinaryenRemUInt64(),\r\n  AndI64 = _BinaryenAndInt64(),\r\n  OrI64 = _BinaryenOrInt64(),\r\n  XorI64 = _BinaryenXorInt64(),\r\n  ShlI64 = _BinaryenShlInt64(),\r\n  ShrU64 = _BinaryenShrUInt64(),\r\n  ShrI64 = _BinaryenShrSInt64(),\r\n  RotlI64 = _BinaryenRotLInt64(),\r\n  RotrI64 = _BinaryenRotRInt64(),\r\n  EqI64 = _BinaryenEqInt64(),\r\n  NeI64 = _BinaryenNeInt64(),\r\n  LtI64 = _BinaryenLtSInt64(),\r\n  LtU64 = _BinaryenLtUInt64(),\r\n  LeI64 = _BinaryenLeSInt64(),\r\n  LeU64 = _BinaryenLeUInt64(),\r\n  GtI64 = _BinaryenGtSInt64(),\r\n  GtU64 = _BinaryenGtUInt64(),\r\n  GeI64 = _BinaryenGeSInt64(),\r\n  GeU64 = _BinaryenGeUInt64(),\r\n  AddF32 = _BinaryenAddFloat32(),\r\n  SubF32 = _BinaryenSubFloat32(),\r\n  MulF32 = _BinaryenMulFloat32(),\r\n  DivF32 = _BinaryenDivFloat32(),\r\n  CopysignF32 = _BinaryenCopySignFloat32(),\r\n  MinF32 = _BinaryenMinFloat32(),\r\n  MaxF32 = _BinaryenMaxFloat32(),\r\n  EqF32 = _BinaryenEqFloat32(),\r\n  NeF32 = _BinaryenNeFloat32(),\r\n  LtF32 = _BinaryenLtFloat32(),\r\n  LeF32 = _BinaryenLeFloat32(),\r\n  GtF32 = _BinaryenGtFloat32(),\r\n  GeF32 = _BinaryenGeFloat32(),\r\n  AddF64 = _BinaryenAddFloat64(),\r\n  SubF64 = _BinaryenSubFloat64(),\r\n  MulF64 = _BinaryenMulFloat64(),\r\n  DivF64 = _BinaryenDivFloat64(),\r\n  CopysignF64 = _BinaryenCopySignFloat64(),\r\n  MinF64 = _BinaryenMinFloat64(),\r\n  MaxF64 = _BinaryenMaxFloat64(),\r\n  EqF64 = _BinaryenEqFloat64(),\r\n  NeF64 = _BinaryenNeFloat64(),\r\n  LtF64 = _BinaryenLtFloat64(),\r\n  LeF64 = _BinaryenLeFloat64(),\r\n  GtF64 = _BinaryenGtFloat64(),\r\n  GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n  PageSize = _BinaryenPageSize(),\r\n  CurrentMemory = _BinaryenCurrentMemory(),\r\n  GrowMemory = _BinaryenGrowMemory(),\r\n  HasFeature = _BinaryenHasFeature(),\r\n\r\n  // see: https://github.com/WebAssembly/bulk-memory-operations\r\n  // MoveMemory\r\n  // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n  Add = _BinaryenAtomicRMWAdd(),\r\n  Sub = _BinaryenAtomicRMWSub(),\r\n  And = _BinaryenAtomicRMWAnd(),\r\n  Or = _BinaryenAtomicRMWOr(),\r\n  Xor = _BinaryenAtomicRMWXor(),\r\n  Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n  buffer: Uint8Array;\r\n  offset: I64;\r\n\r\n  static create(buffer: Uint8Array, offset: I64): MemorySegment {\r\n    var segment = new MemorySegment();\r\n    segment.buffer = buffer;\r\n    segment.offset = offset;\r\n    return segment;\r\n  }\r\n}\r\n\r\nexport class Module {\r\n\r\n  ref: ModuleRef;\r\n\r\n  private cachedByValue: usize;\r\n\r\n  /** Maximum number of pages when targeting WASM32. */\r\n  static readonly MAX_MEMORY_WASM32: Index = 0xffff;\r\n\r\n  /** Maximum number of pages when targeting WASM64. */\r\n  static readonly MAX_MEMORY_WASM64: Index = 0xffff; // TODO\r\n\r\n  static create(): Module {\r\n    var module = new Module();\r\n    module.ref = _BinaryenModuleCreate();\r\n    module.cachedByValue = allocate_memory(16);\r\n    return module;\r\n  }\r\n\r\n  static createFrom(buffer: Uint8Array): Module {\r\n    var cArr = allocU8Array(buffer);\r\n    try {\r\n      let module = new Module();\r\n      module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n      module.cachedByValue = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n      return module;\r\n    } finally {\r\n      free_memory(changetype<usize>(cArr));\r\n    }\r\n  }\r\n\r\n  private constructor() { }\r\n\r\n  // types\r\n\r\n  addFunctionType(\r\n    name: string,\r\n    result: NativeType,\r\n    paramTypes: NativeType[] | null\r\n  ): FunctionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  getFunctionTypeBySignature(\r\n    result: NativeType,\r\n    paramTypes: NativeType[] | null\r\n  ): FunctionTypeRef {\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  removeFunctionType(name: string): void {\r\n    var cStr = allocString(name);\r\n    try {\r\n      _BinaryenRemoveFunctionType(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  // constants\r\n\r\n  createI32(value: i32): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralInt32(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createF32(value: f32): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralFloat32(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createF64(value: f64): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralFloat64(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  // expressions\r\n\r\n  createUnary(\r\n    op: UnaryOp,\r\n    expr: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenUnary(this.ref, op, expr);\r\n  }\r\n\r\n  createBinary(\r\n    op: BinaryOp,\r\n    left: ExpressionRef,\r\n    right: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenBinary(this.ref, op, left, right);\r\n  }\r\n\r\n  createHost(\r\n    op: HostOp,\r\n    name: string | null = null,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (<ExpressionRef[]>operands).length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createGetLocal(\r\n    index: i32,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenGetLocal(this.ref, index, type);\r\n  }\r\n\r\n  createTeeLocal(\r\n    index: i32,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenTeeLocal(this.ref, index, value);\r\n  }\r\n\r\n  createGetGlobal(\r\n    name: string,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenGetGlobal(this.ref, cStr, type);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createLoad(\r\n    bytes: Index,\r\n    signed: bool,\r\n    ptr: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n  }\r\n\r\n  createStore(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n  }\r\n\r\n  createAtomicLoad(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n  }\r\n\r\n  createAtomicStore(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n  }\r\n\r\n  createAtomicRMW(\r\n    op: AtomicRMWOp,\r\n    bytes: Index,\r\n    offset: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n  }\r\n\r\n  createAtomicCmpxchg(\r\n    bytes: Index,\r\n    offset: Index,\r\n    ptr: ExpressionRef,\r\n    expected: ExpressionRef,\r\n    replacement: ExpressionRef,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n  }\r\n\r\n  createAtomicWait(\r\n    ptr: ExpressionRef,\r\n    expected: ExpressionRef,\r\n    timeout: ExpressionRef,\r\n    expectedType: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n  }\r\n\r\n  createAtomicWake(\r\n    ptr: ExpressionRef,\r\n    wakeCount: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n  }\r\n\r\n  // statements\r\n\r\n  createSetLocal(\r\n    index: Index,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenSetLocal(this.ref, index, value);\r\n  }\r\n\r\n  createSetGlobal(\r\n    name: string,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenSetGlobal(this.ref, cStr, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createBlock(\r\n    label: string | null,\r\n    children: ExpressionRef[],\r\n    type: NativeType = NativeType.None\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    var cArr = allocPtrArray(children);\r\n    try {\r\n      return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createBreak(\r\n    label: string | null,\r\n    condition: ExpressionRef = 0,\r\n    value: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    try {\r\n      return _BinaryenBreak(this.ref, cStr, condition, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createDrop(\r\n    expression: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenDrop(this.ref, expression);\r\n  }\r\n\r\n  createLoop(\r\n    label: string | null,\r\n    body: ExpressionRef\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    try {\r\n      return _BinaryenLoop(this.ref, cStr, body);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createIf(\r\n    condition: ExpressionRef,\r\n    ifTrue: ExpressionRef,\r\n    ifFalse: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n  }\r\n\r\n  createNop(): ExpressionRef {\r\n    return _BinaryenNop(this.ref);\r\n  }\r\n\r\n  createReturn(\r\n    expression: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenReturn(this.ref, expression);\r\n  }\r\n\r\n  createSelect(\r\n    ifTrue: ExpressionRef,\r\n    ifFalse: ExpressionRef,\r\n    condition: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n  }\r\n\r\n  createSwitch(\r\n    names: string[],\r\n    defaultName: string | null,\r\n    condition: ExpressionRef,\r\n    value: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numNames = names.length;\r\n    var strs = new Array<usize>(numNames);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      strs[i] = allocString(names[i]);\r\n    }\r\n    var cArr = allocI32Array(strs);\r\n    var cStr = allocString(defaultName);\r\n    try {\r\n      return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n      free_memory(cArr);\r\n      for (let i = numNames - 1; i >= 0; --i) free_memory(strs[i]);\r\n    }\r\n  }\r\n\r\n  createCall(\r\n    target: string,\r\n    operands: ExpressionRef[] | null,\r\n    returnType: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(target);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createCallImport(\r\n    target: string,\r\n    operands: ExpressionRef[] | null,\r\n    returnType: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(target);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createCallIndirect(\r\n    index: ExpressionRef,\r\n    operands: ExpressionRef[] | null,\r\n    typeName: string\r\n  ): ExpressionRef {\r\n    var cArr = allocPtrArray(operands);\r\n    var cStr = allocString(typeName);\r\n    try {\r\n      return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  createUnreachable(): ExpressionRef {\r\n    return _BinaryenUnreachable(this.ref);\r\n  }\r\n\r\n  // meta\r\n\r\n  addGlobal(\r\n    name: string,\r\n    type: NativeType,\r\n    mutable: bool,\r\n    initializer: ExpressionRef\r\n  ): GlobalRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  addFunction(\r\n    name: string,\r\n    type: FunctionTypeRef,\r\n    varTypes: NativeType[] | null,\r\n    body: ExpressionRef\r\n  ): FunctionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocI32Array(varTypes);\r\n    try {\r\n      return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  removeFunction(name: string): void {\r\n    var cStr = allocString(name);\r\n    try {\r\n      _BinaryenRemoveFunction(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  private cachedTemporaryName: usize = 0;\r\n  private hasTemporaryFunction: bool = false;\r\n\r\n  addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\r\n    this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\r\n    var tempName = this.cachedTemporaryName;\r\n    if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\r\n      return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  removeTemporaryFunction(): void {\r\n    this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\r\n    var tempName = assert(this.cachedTemporaryName);\r\n    _BinaryenRemoveFunction(this.ref, tempName);\r\n    _BinaryenRemoveFunctionType(this.ref, tempName);\r\n  }\r\n\r\n  addFunctionExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addTableExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addMemoryExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addGlobalExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  removeExport(externalName: string): void {\r\n    var cStr = allocString(externalName);\r\n    try {\r\n      _BinaryenRemoveExport(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  addFunctionImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string,\r\n    functionType: FunctionTypeRef\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addTableImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addMemoryImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addGlobalImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string,\r\n    globalType: NativeType\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  removeImport(internalName: string): void {\r\n    var cStr = allocString(internalName);\r\n    try {\r\n      _BinaryenRemoveImport(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  setMemory(\r\n    initial: Index,\r\n    maximum: Index,\r\n    segments: MemorySegment[],\r\n    target: Target,\r\n    exportName: string | null = null\r\n  ): void {\r\n    var cStr = allocString(exportName);\r\n    var k = segments.length;\r\n    var segs = new Array<usize>(k);\r\n    var offs = new Array<ExpressionRef>(k);\r\n    var sizs = new Array<Index>(k);\r\n    for (let i = 0; i < k; ++i) {\r\n      let buffer = segments[i].buffer;\r\n      let offset = segments[i].offset;\r\n      segs[i] = allocU8Array(buffer);\r\n      offs[i] = target == Target.WASM64\r\n        ? this.createI64(i64_low(offset), i64_high(offset))\r\n        : this.createI32(i64_low(offset));\r\n      sizs[i] = buffer.length;\r\n    }\r\n    var cArr1 = allocI32Array(segs);\r\n    var cArr2 = allocI32Array(offs);\r\n    var cArr3 = allocI32Array(sizs);\r\n    try {\r\n      _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n    } finally {\r\n      free_memory(cArr3);\r\n      free_memory(cArr2);\r\n      free_memory(cArr1);\r\n      for (let i = k - 1; i >= 0; --i) free_memory(segs[i]);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  setFunctionTable(funcs: FunctionRef[]): void {\r\n    var cArr = allocPtrArray(funcs);\r\n    try {\r\n      _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  setStart(func: FunctionRef): void {\r\n    _BinaryenSetStart(this.ref, func);\r\n  }\r\n\r\n  setOptimizeLevel(level: i32 = 2): void {\r\n    _BinaryenSetOptimizeLevel(level);\r\n  }\r\n\r\n  setShrinkLevel(level: i32 = 1): void {\r\n    _BinaryenSetShrinkLevel(level);\r\n  }\r\n\r\n  setDebugInfo(on: bool = false): void {\r\n    _BinaryenSetDebugInfo(on);\r\n  }\r\n\r\n  optimize(func: FunctionRef = 0): void {\r\n    if (func) {\r\n      _BinaryenFunctionOptimize(func, this.ref);\r\n    } else {\r\n      _BinaryenModuleOptimize(this.ref);\r\n    }\r\n  }\r\n\r\n  runPasses(passes: string[], func: FunctionRef = 0): void {\r\n    var numNames = passes.length;\r\n    var names = new Array<usize>(numNames);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      names[i] = allocString(passes[i]);\r\n    }\r\n    var cArr = allocI32Array(names);\r\n    try {\r\n      if (func) {\r\n        _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\r\n      } else {\r\n        _BinaryenModuleRunPasses(this.ref, cArr, numNames);\r\n      }\r\n    } finally {\r\n      free_memory(cArr);\r\n      for (let i = numNames; i >= 0; --i) {\r\n        free_memory(names[i]);\r\n      }\r\n    }\r\n  }\r\n\r\n  private cachedPrecomputeName: usize = 0;\r\n  private cachedPrecomputeNames: usize = 0;\r\n\r\n  precomputeFunction(func: FunctionRef): void {\r\n    var names = this.cachedPrecomputeNames;\r\n    if (!names) {\r\n      let name = allocString(\"precompute\");\r\n      this.cachedPrecomputeName = name;\r\n      this.cachedPrecomputeNames = names = allocI32Array([ name ]);\r\n    }\r\n    _BinaryenFunctionRunPasses(func, this.ref, names, 1);\r\n  }\r\n\r\n  validate(): bool {\r\n    return _BinaryenModuleValidate(this.ref) == 1;\r\n  }\r\n\r\n  interpret(): void {\r\n    _BinaryenModuleInterpret(this.ref);\r\n  }\r\n\r\n  toBinary(sourceMapUrl: string | null): BinaryModule {\r\n    var out = this.cachedByValue;\r\n    var cStr = allocString(sourceMapUrl);\r\n    var binaryPtr: usize = 0;\r\n    var sourceMapPtr: usize = 0;\r\n    try {\r\n      _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n      binaryPtr = readInt(out);\r\n      let binaryBytes = readInt(out + 4);\r\n      sourceMapPtr = readInt(out + 4 * 2);\r\n      let ret = new BinaryModule();\r\n      ret.output = readBuffer(binaryPtr, binaryBytes);\r\n      ret.sourceMap = readString(sourceMapPtr);\r\n      return ret;\r\n    } finally {\r\n      if (cStr) free_memory(cStr);\r\n      if (binaryPtr) free_memory(binaryPtr);\r\n      if (sourceMapPtr) free_memory(sourceMapPtr);\r\n    }\r\n  }\r\n\r\n  toText(): string {\r\n    throw new Error(\"not implemented\"); // JS glue overrides this\r\n  }\r\n\r\n  toAsmjs(): string {\r\n    throw new Error(\"not implemented\"); // JS glue overrides this\r\n  }\r\n\r\n  dispose(): void {\r\n    assert(this.ref);\r\n    free_memory(this.cachedByValue);\r\n    free_memory(this.cachedTemporaryName);\r\n    free_memory(this.cachedPrecomputeName);\r\n    free_memory(this.cachedPrecomputeNames);\r\n    _BinaryenModuleDispose(this.ref);\r\n    this.ref = 0;\r\n  }\r\n\r\n  createRelooper(): Relooper {\r\n    return Relooper.create(this);\r\n  }\r\n\r\n  cloneExpression(\r\n    expr: ExpressionRef,\r\n    noSideEffects: bool = false,\r\n    maxDepth: i32 = i32.MAX_VALUE\r\n  ): ExpressionRef { // currently supports side effect free expressions only\r\n    if (maxDepth < 0) return 0;\r\n    maxDepth -= 1;\r\n\r\n    var nested1: ExpressionRef,\r\n        nested2: ExpressionRef;\r\n\r\n        switch (_BinaryenExpressionGetId(expr)) {\r\n      case ExpressionId.Const: {\r\n        switch (_BinaryenExpressionGetType(expr)) {\r\n          case NativeType.I32: {\r\n            return this.createI32(_BinaryenConstGetValueI32(expr));\r\n          }\r\n          case NativeType.I64: {\r\n            return this.createI64(\r\n              _BinaryenConstGetValueI64Low(expr),\r\n              _BinaryenConstGetValueI64High(expr)\r\n            );\r\n          }\r\n          case NativeType.F32: {\r\n            return this.createF32(_BinaryenConstGetValueF32(expr));\r\n          }\r\n          case NativeType.F64: {\r\n            return this.createF64(_BinaryenConstGetValueF64(expr));\r\n          }\r\n          default: {\r\n            throw new Error(\"concrete type expected\");\r\n          }\r\n        }\r\n      }\r\n      case ExpressionId.GetLocal: {\r\n        return _BinaryenGetLocal(this.ref,\r\n          _BinaryenGetLocalGetIndex(expr),\r\n          _BinaryenExpressionGetType(expr)\r\n        );\r\n      }\r\n      case ExpressionId.GetGlobal: {\r\n        let globalName = _BinaryenGetGlobalGetName(expr);\r\n        if (!globalName) break;\r\n        return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n      }\r\n      case ExpressionId.Load: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return (\r\n          _BinaryenLoadIsAtomic(expr)\r\n            ? _BinaryenAtomicLoad(this.ref,\r\n                _BinaryenLoadGetBytes(expr),\r\n                _BinaryenLoadGetOffset(expr),\r\n                _BinaryenExpressionGetType(expr),\r\n                nested1\r\n              )\r\n            : _BinaryenLoad(this.ref,\r\n                _BinaryenLoadGetBytes(expr),\r\n                _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n                _BinaryenLoadGetOffset(expr),\r\n                _BinaryenLoadGetAlign(expr),\r\n                _BinaryenExpressionGetType(expr),\r\n                nested1\r\n              )\r\n        );\r\n      }\r\n      case ExpressionId.Unary: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n      }\r\n      case ExpressionId.Binary: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n      }\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  // source map generation\r\n\r\n  addDebugInfoFile(name: string): Index {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  getDebugInfoFile(index: Index): string | null {\r\n    return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n  }\r\n\r\n  setDebugLocation(\r\n    func: FunctionRef,\r\n    expr: ExpressionRef,\r\n    fileIndex: Index,\r\n    lineNumber: Index,\r\n    columnNumber: Index\r\n  ): void {\r\n    _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n  }\r\n}\r\n\r\n// expressions\r\n\r\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\r\n  return _BinaryenExpressionGetId(expr);\r\n}\r\n\r\nexport function getExpressionType(expr: ExpressionRef): NativeType {\r\n  return _BinaryenExpressionGetType(expr);\r\n}\r\n\r\nexport function getConstValueI32(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI32(expr);\r\n}\r\n\r\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI64Low(expr);\r\n}\r\n\r\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI64High(expr);\r\n}\r\n\r\nexport function getConstValueF32(expr: ExpressionRef): f32 {\r\n  return _BinaryenConstGetValueF32(expr);\r\n}\r\n\r\nexport function getConstValueF64(expr: ExpressionRef): f32 {\r\n  return _BinaryenConstGetValueF64(expr);\r\n}\r\n\r\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\r\n  return _BinaryenGetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\r\n  return _BinaryenSetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSetLocalGetValue(expr);\r\n}\r\n\r\nexport function isTeeLocal(expr: ExpressionRef): bool {\r\n  return _BinaryenSetLocalIsTee(expr);\r\n}\r\n\r\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\r\n  return _BinaryenBinaryGetOp(expr);\r\n}\r\n\r\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBinaryGetLeft(expr);\r\n}\r\n\r\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBinaryGetRight(expr);\r\n}\r\n\r\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\r\n  return _BinaryenUnaryGetOp(expr);\r\n}\r\n\r\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenUnaryGetValue(expr);\r\n}\r\n\r\nexport function getLoadBytes(expr: ExpressionRef): u32 {\r\n  return _BinaryenLoadGetBytes(expr);\r\n}\r\n\r\nexport function getLoadOffset(expr: ExpressionRef): u32 {\r\n  return _BinaryenLoadGetOffset(expr);\r\n}\r\n\r\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenLoadGetPtr(expr);\r\n}\r\n\r\nexport function isLoadSigned(expr: ExpressionRef): bool {\r\n  return _BinaryenLoadIsSigned(expr);\r\n}\r\n\r\nexport function getStoreBytes(expr: ExpressionRef): u32 {\r\n  return _BinaryenStoreGetBytes(expr);\r\n}\r\n\r\nexport function getStoreOffset(expr: ExpressionRef): u32 {\r\n  return _BinaryenStoreGetOffset(expr);\r\n}\r\n\r\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenStoreGetPtr(expr);\r\n}\r\n\r\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenStoreGetValue(expr);\r\n}\r\n\r\nexport function getBlockName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenBlockGetName(expr));\r\n}\r\n\r\nexport function getBlockChildCount(expr: ExpressionRef): Index {\r\n  return _BinaryenBlockGetNumChildren(expr);\r\n}\r\n\r\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\r\n  return _BinaryenBlockGetChild(expr, index);\r\n}\r\n\r\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetCondition(expr);\r\n}\r\n\r\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetIfTrue(expr);\r\n}\r\n\r\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetIfFalse(expr);\r\n}\r\n\r\nexport function getLoopName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenLoopGetName(expr));\r\n}\r\n\r\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenLoopGetBody(expr);\r\n}\r\n\r\nexport function getBreakName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenBreakGetName(expr));\r\n}\r\n\r\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBreakGetCondition(expr);\r\n}\r\n\r\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetIfTrue(expr);\r\n}\r\n\r\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetIfFalse(expr);\r\n}\r\n\r\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetCondition(expr);\r\n}\r\n\r\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenDropGetValue(expr);\r\n}\r\n\r\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenReturnGetValue(expr);\r\n}\r\n\r\nexport function getCallTarget(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenCallGetTarget(expr));\r\n}\r\n\r\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenHostGetOp(expr);\r\n}\r\n\r\nexport function getHostOperandCount(expr: ExpressionRef): Index {\r\n  return _BinaryenHostGetNumOperands(expr);\r\n}\r\n\r\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\r\n  return _BinaryenHostGetOperand(expr, index);\r\n}\r\n\r\nexport function getHostName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenHostGetNameOperand(expr));\r\n}\r\n\r\n// functions\r\n\r\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\r\n  return _BinaryenFunctionGetBody(func);\r\n}\r\n\r\nexport function getFunctionName(func: FunctionRef): string | null {\r\n  return readString(_BinaryenFunctionGetName(func));\r\n}\r\n\r\nexport function getFunctionParamCount(func: FunctionRef): Index {\r\n  return _BinaryenFunctionGetNumParams(func);\r\n}\r\n\r\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\r\n  return _BinaryenFunctionGetParam(func, index);\r\n}\r\n\r\nexport function getFunctionResultType(func: FunctionRef): NativeType {\r\n  return _BinaryenFunctionGetResult(func);\r\n}\r\n\r\nexport class Relooper {\r\n\r\n  module: Module;\r\n  ref: RelooperRef;\r\n\r\n  static create(module: Module): Relooper {\r\n    var relooper = new Relooper();\r\n    relooper.module = module;\r\n    relooper.ref = _RelooperCreate();\r\n    return relooper;\r\n  }\r\n\r\n  private constructor() {}\r\n\r\n  addBlock(code: ExpressionRef): RelooperBlockRef {\r\n    return _RelooperAddBlock(this.ref, code);\r\n  }\r\n\r\n  addBranch(from: RelooperBlockRef, to: RelooperBlockRef, condition: ExpressionRef = 0, code: ExpressionRef = 0): void {\r\n    _RelooperAddBranch(from, to, condition, code);\r\n  }\r\n\r\n  addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n    return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n  }\r\n\r\n  addBranchForSwitch(from: RelooperBlockRef, to: RelooperBlockRef, indexes: i32[], code: ExpressionRef = 0): void {\r\n    var cArr = allocI32Array(indexes);\r\n    try {\r\n      _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n    return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n  }\r\n}\r\n\r\n// export function hasSideEffects(expr: ExpressionRef): bool {\r\n//   switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\r\n//     case ExpressionId.GetLocal:\r\n//     case ExpressionId.GetGlobal:\r\n//     case ExpressionId.Const:\r\n//     case ExpressionId.Nop:\r\n//     case ExpressionId.Unreachable: {\r\n//       return false;\r\n//     }\r\n//     case ExpressionId.Block: {\r\n//       for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\r\n//         if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\r\n//       }\r\n//       return false;\r\n//     }\r\n//     case ExpressionId.If: {\r\n//       return hasSideEffects(_BinaryenIfGetCondition(expr))\r\n//           || hasSideEffects(_BinaryenIfGetIfTrue(expr))\r\n//           || hasSideEffects(_BinaryenIfGetIfFalse(expr));\r\n//     }\r\n//     case ExpressionId.Unary: {\r\n//       return hasSideEffects(_BinaryenUnaryGetValue(expr));\r\n//     }\r\n//     case ExpressionId.Binary: {\r\n//       return hasSideEffects(_BinaryenBinaryGetLeft(expr))\r\n//           || hasSideEffects(_BinaryenBinaryGetRight(expr));\r\n//     }\r\n//     case ExpressionId.Drop: {\r\n//       return hasSideEffects(_BinaryenDropGetValue(expr));\r\n//     }\r\n//     case ExpressionId.Select: {\r\n//       return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\r\n//           || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\r\n//           || hasSideEffects(_BinaryenSelectGetCondition(expr));\r\n//     }\r\n//   }\r\n//   return true;\r\n// }\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n  if (!u8s) return 0;\r\n  var numValues = u8s.length;\r\n  var ptr = allocate_memory(numValues);\r\n  var idx = ptr;\r\n  for (let i = 0; i < numValues; ++i) {\r\n    store<u8>(idx++, u8s[i]);\r\n  }\r\n  return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n  if (!i32s) return 0;\r\n  var ptr = allocate_memory(i32s.length << 2);\r\n  var idx = ptr;\r\n  for (let i = 0, k = i32s.length; i < k; ++i) {\r\n    let val = i32s[i];\r\n    // store<i32>(idx, val) is not portable\r\n    store<u8>(idx    , ( val         & 0xff) as u8);\r\n    store<u8>(idx + 1, ((val >>   8) & 0xff) as u8);\r\n    store<u8>(idx + 2, ((val >>  16) & 0xff) as u8);\r\n    store<u8>(idx + 3, ( val >>> 24        ) as u8);\r\n    idx += 4;\r\n  }\r\n  return ptr;\r\n}\r\n\r\nfunction allocPtrArray(ptrs: usize[] | null): usize {\r\n  return allocI32Array(ptrs); // TODO: WASM64 one day\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n  var len = 0;\r\n  for (let i = 0, k = str.length; i < k; ++i) {\r\n    let u = str.charCodeAt(i);\r\n    if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n      u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n    }\r\n    if (u <= 0x7F) {\r\n      ++len;\r\n    } else if (u <= 0x7FF) {\r\n      len += 2;\r\n    } else if (u <= 0xFFFF) {\r\n      len += 3;\r\n    } else if (u <= 0x1FFFFF) {\r\n      len += 4;\r\n    } else if (u <= 0x3FFFFFF) {\r\n      len += 5;\r\n    } else {\r\n      len += 6;\r\n    }\r\n  }\r\n  return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n  if (str == null) return 0;\r\n  var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n  // the following is based on Emscripten's stringToUTF8Array\r\n  var idx = ptr;\r\n  for (let i = 0, k = str.length; i < k; ++i) {\r\n    let u = str.charCodeAt(i);\r\n    if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n      u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n    }\r\n    if (u <= 0x7F) {\r\n      store<u8>(idx++, u as u8);\r\n    } else if (u <= 0x7FF) {\r\n      store<u8>(idx++, (0xC0 |  (u >>> 6)       ) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0xFFFF) {\r\n      store<u8>(idx++, (0xE0 |  (u >>> 12)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0x1FFFFF) {\r\n      store<u8>(idx++, (0xF0 |  (u >>> 18)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0x3FFFFFF) {\r\n      store<u8>(idx++, (0xF8 |  (u >>> 24)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else {\r\n      store<u8>(idx++, (0xFC |  (u >>> 30)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    }\r\n  }\r\n  store<u8>(idx, 0);\r\n  return ptr;\r\n}\r\n\r\nfunction readInt(ptr: usize): i32 {\r\n  return (\r\n     load<u8>(ptr    )        |\r\n    (load<u8>(ptr + 1) <<  8) |\r\n    (load<u8>(ptr + 2) << 16) |\r\n    (load<u8>(ptr + 3) << 24)\r\n  );\r\n}\r\n\r\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\r\n  var ret = new Uint8Array(length);\r\n  for (let i: usize = 0; i < length; ++i) {\r\n    ret[i] = load<u8>(ptr + i);\r\n  }\r\n  return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n  if (!ptr) return null;\r\n  var arr = new Array<i32>();\r\n  // the following is based on Emscripten's UTF8ArrayToString\r\n  var cp: u32;\r\n  var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n  while (cp = load<u8>(ptr++)) {\r\n    if (!(cp & 0x80)) {\r\n      arr.push(cp);\r\n      continue;\r\n    }\r\n    u1 = load<u8>(ptr++) & 63;\r\n    if ((cp & 0xE0) == 0xC0) {\r\n      arr.push(((cp & 31) << 6) | u1);\r\n      continue;\r\n    }\r\n    u2 = load<u8>(ptr++) & 63;\r\n    if ((cp & 0xF0) == 0xE0) {\r\n      cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n    } else {\r\n      u3 = load<u8>(ptr++) & 63;\r\n      if ((cp & 0xF8) == 0xF0) {\r\n        cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n      } else {\r\n        u4 = load<u8>(ptr++) & 63;\r\n        if ((cp & 0xFC) == 0xF8) {\r\n          cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n        } else {\r\n          u5 = load<u8>(ptr++) & 63;\r\n          cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n        }\r\n      }\r\n    }\r\n    arr.push(cp);\r\n    // if (cp < 0x10000) {\r\n    //   arr.push(cp);\r\n    // } else {\r\n    //   var ch = cp - 0x10000;\r\n    //   arr.push(0xD800 | (ch >> 10));\r\n    //   arr.push(0xDC00 | (ch & 0x3FF));\r\n    // }\r\n  }\r\n  // return String.fromCharCodes(arr);\r\n  return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nexport class BinaryModule {\r\n  /** WebAssembly binary. */\r\n  output: Uint8Array;\r\n  /** Source map, if generated. */\r\n  sourceMap: string | null;\r\n}\r\n","/**\r\n * Abstract syntax tree representing a source file once parsed.\r\n * @module ast\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Token,\r\n  Tokenizer,\r\n  Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  normalizePath,\r\n  resolvePath,\r\n  CharCode\r\n} from \"./util\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n  SOURCE,\r\n\r\n  // types\r\n  TYPE,\r\n  TYPEPARAMETER,\r\n  PARAMETER,\r\n  SIGNATURE,\r\n\r\n  // expressions\r\n  IDENTIFIER,\r\n  ASSERTION,\r\n  BINARY,\r\n  CALL,\r\n  CLASS,\r\n  COMMA,\r\n  ELEMENTACCESS,\r\n  FALSE,\r\n  FUNCTION,\r\n  INSTANCEOF,\r\n  LITERAL,\r\n  NEW,\r\n  NULL,\r\n  PARENTHESIZED,\r\n  PROPERTYACCESS,\r\n  TERNARY,\r\n  SUPER,\r\n  THIS,\r\n  TRUE,\r\n  CONSTRUCTOR,\r\n  UNARYPOSTFIX,\r\n  UNARYPREFIX,\r\n\r\n  // statements\r\n  BLOCK,\r\n  BREAK,\r\n  CONTINUE,\r\n  DO,\r\n  EMPTY,\r\n  EXPORT,\r\n  EXPORTIMPORT,\r\n  EXPRESSION,\r\n  FOR,\r\n  IF,\r\n  IMPORT,\r\n  RETURN,\r\n  SWITCH,\r\n  THROW,\r\n  TRY,\r\n  VARIABLE,\r\n  VOID,\r\n  WHILE,\r\n\r\n  // declaration statements\r\n  CLASSDECLARATION,\r\n  ENUMDECLARATION,\r\n  ENUMVALUEDECLARATION,\r\n  FIELDDECLARATION,\r\n  FUNCTIONDECLARATION,\r\n  IMPORTDECLARATION,\r\n  INTERFACEDECLARATION,\r\n  METHODDECLARATION,\r\n  NAMESPACEDECLARATION,\r\n  TYPEDECLARATION,\r\n  VARIABLEDECLARATION,\r\n\r\n  // special\r\n  DECORATOR,\r\n  EXPORTMEMBER,\r\n  SWITCHCASE,\r\n  COMMENT\r\n}\r\n\r\n/** Checks if a node represents a constant value. */\r\nexport function nodeIsConstantValue(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.LITERAL:\r\n    case NodeKind.NULL:\r\n    case NodeKind.TRUE:\r\n    case NodeKind.FALSE: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Checks if a node might be callable. */\r\nexport function nodeIsCallable(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.IDENTIFIER:\r\n    case NodeKind.CALL:\r\n    case NodeKind.ELEMENTACCESS:\r\n    case NodeKind.PROPERTYACCESS: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Checks if a node might be callable with generic arguments. */\r\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.IDENTIFIER:\r\n    case NodeKind.PROPERTYACCESS: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n  /** Node kind indicator. */\r\n  kind: NodeKind;\r\n  /** Source range. */\r\n  range: Range;\r\n  /** Parent node. */\r\n  parent: Node | null = null;\r\n  /** Common flags indicating specific traits. */\r\n  flags: CommonFlags = CommonFlags.NONE;\r\n\r\n  /** Tests if this node has the specified flag or flags. */\r\n  is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this node has one of the specified flags. */\r\n  isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n  /** Sets a specific flag or flags. */\r\n  set(flag: CommonFlags): void { this.flags |= flag; }\r\n\r\n  // types\r\n\r\n  static createType(\r\n    name: IdentifierExpression,\r\n    typeArguments: CommonTypeNode[] | null,\r\n    isNullable: bool,\r\n    range: Range\r\n  ): TypeNode {\r\n    var type = new TypeNode();\r\n    type.range = range;\r\n    type.name = name; name.parent = type;\r\n    type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\r\n    type.isNullable = isNullable;\r\n    return type;\r\n  }\r\n\r\n  static createOmittedType(\r\n    range: Range\r\n  ): TypeNode {\r\n    return Node.createType(\r\n      Node.createIdentifierExpression(\"\", range),\r\n      null,\r\n      false,\r\n      range\r\n    );\r\n  }\r\n\r\n  static createTypeParameter(\r\n    name: IdentifierExpression,\r\n    extendsType: TypeNode | null,\r\n    range: Range\r\n  ): TypeParameterNode {\r\n    var elem = new TypeParameterNode();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n    return elem;\r\n  }\r\n\r\n  static createParameter(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode,\r\n    initializer: Expression | null,\r\n    kind: ParameterKind,\r\n    range: Range\r\n  ): ParameterNode {\r\n    var elem = new ParameterNode();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    elem.type = type; if (type) type.parent = elem;\r\n    elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n    elem.parameterKind = kind;\r\n    return elem;\r\n  }\r\n\r\n  static createSignature(\r\n    parameters: ParameterNode[],\r\n    returnType: CommonTypeNode,\r\n    explicitThisType: TypeNode | null,\r\n    isNullable: bool,\r\n    range: Range\r\n  ): SignatureNode {\r\n    var sig = new SignatureNode();\r\n    sig.range = range;\r\n    sig.parameters = parameters; setParent(parameters, sig);\r\n    sig.returnType = returnType; returnType.parent = sig;\r\n    sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\r\n    sig.isNullable = isNullable;\r\n    return sig;\r\n  }\r\n\r\n  // special\r\n\r\n  static createDecorator(\r\n    name: Expression,\r\n    args: Expression[] | null,\r\n    range: Range\r\n  ): DecoratorNode {\r\n    var stmt = new DecoratorNode();\r\n    stmt.range = range;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.arguments = args; if (args) setParent(args, stmt);\r\n    stmt.decoratorKind = decoratorNameToKind(name);\r\n    return stmt;\r\n  }\r\n\r\n  static createComment(\r\n    text: string,\r\n    kind: CommentKind,\r\n    range: Range\r\n  ): CommentNode {\r\n    var node = new CommentNode();\r\n    node.range = range;\r\n    node.commentKind = kind;\r\n    node.text = text;\r\n    return node;\r\n  }\r\n\r\n  // expressions\r\n\r\n  static createIdentifierExpression(\r\n    name: string,\r\n    range: Range\r\n  ): IdentifierExpression {\r\n    var expr = new IdentifierExpression();\r\n    expr.range = range;\r\n    expr.text = name;\r\n    return expr;\r\n  }\r\n\r\n  static createEmptyIdentifierExpression(\r\n    range: Range\r\n  ): IdentifierExpression {\r\n    var expr = new IdentifierExpression();\r\n    expr.range = range;\r\n    expr.text = \"\";\r\n    return expr;\r\n  }\r\n\r\n  static createArrayLiteralExpression(\r\n    elements: (Expression | null)[],\r\n    range: Range\r\n  ): ArrayLiteralExpression {\r\n    var expr = new ArrayLiteralExpression();\r\n    expr.range = range;\r\n    expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createAssertionExpression(\r\n    assertionKind: AssertionKind,\r\n    expression: Expression,\r\n    toType: CommonTypeNode,\r\n    range: Range\r\n  ): AssertionExpression {\r\n    var expr = new AssertionExpression();\r\n    expr.range = range;\r\n    expr.assertionKind = assertionKind;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.toType = toType; toType.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createBinaryExpression(\r\n    operator: Token,\r\n    left: Expression,\r\n    right: Expression,\r\n    range: Range\r\n  ): BinaryExpression {\r\n    var expr = new BinaryExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.left = left; left.parent = expr;\r\n    expr.right = right; right.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createCallExpression(\r\n    expression: Expression,\r\n    typeArgs: CommonTypeNode[] | null,\r\n    args: Expression[],\r\n    range: Range\r\n  ): CallExpression {\r\n    var expr = new CallExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n    expr.arguments = args; setParent(args, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createClassExpression(\r\n    declaration: ClassDeclaration\r\n  ): ClassExpression {\r\n    var expr = new ClassExpression();\r\n    expr.range = declaration.range;\r\n    expr.declaration = declaration;\r\n    return expr;\r\n  }\r\n\r\n  static createCommaExpression(\r\n    expressions: Expression[],\r\n    range: Range\r\n  ): CommaExpression {\r\n    var expr = new CommaExpression();\r\n    expr.range = range;\r\n    expr.expressions = expressions; setParent(expressions, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createConstructorExpression(\r\n    range: Range\r\n  ): ConstructorExpression {\r\n    var expr = new ConstructorExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createElementAccessExpression(\r\n    expression: Expression,\r\n    element: Expression,\r\n    range: Range\r\n  ): ElementAccessExpression {\r\n    var expr = new ElementAccessExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.elementExpression = element; element.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createFalseExpression(\r\n    range: Range\r\n  ): FalseExpression {\r\n    var expr = new FalseExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createFloatLiteralExpression(\r\n    value: f64,\r\n    range: Range\r\n  ): FloatLiteralExpression {\r\n    var expr = new FloatLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createFunctionExpression(\r\n    declaration: FunctionDeclaration\r\n  ): FunctionExpression {\r\n    var expr = new FunctionExpression();\r\n    expr.flags = declaration.flags & CommonFlags.ARROW;\r\n    expr.range = declaration.range;\r\n    expr.declaration = declaration;\r\n    return expr;\r\n  }\r\n\r\n  static createInstanceOfExpression(\r\n    expression: Expression,\r\n    isType: CommonTypeNode,\r\n    range: Range\r\n  ): InstanceOfExpression {\r\n    var expr = new InstanceOfExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.isType = isType; isType.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createIntegerLiteralExpression(\r\n    value: I64,\r\n    range: Range\r\n  ): IntegerLiteralExpression {\r\n    var expr = new IntegerLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createNewExpression(\r\n    expression: Expression,\r\n    typeArgs: CommonTypeNode[] | null,\r\n    args: Expression[],\r\n    range: Range\r\n  ): NewExpression {\r\n    var expr = new NewExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n    expr.arguments = args; setParent(args, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createNullExpression(\r\n    range: Range\r\n  ): NullExpression {\r\n    var expr = new NullExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createParenthesizedExpression(\r\n    expression: Expression,\r\n    range: Range\r\n  ): ParenthesizedExpression {\r\n    var expr = new ParenthesizedExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createPropertyAccessExpression(\r\n    expression: Expression,\r\n    property: IdentifierExpression,\r\n    range: Range\r\n  ): PropertyAccessExpression {\r\n    var expr = new PropertyAccessExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.property = property; property.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createRegexpLiteralExpression(\r\n    pattern: string,\r\n    flags: string,\r\n    range: Range\r\n  ): RegexpLiteralExpression {\r\n    var expr = new RegexpLiteralExpression();\r\n    expr.range = range;\r\n    expr.pattern = pattern;\r\n    expr.patternFlags = flags;\r\n    return expr;\r\n  }\r\n\r\n  static createTernaryExpression(\r\n    condition: Expression,\r\n    ifThen: Expression,\r\n    ifElse: Expression,\r\n    range: Range\r\n  ): TernaryExpression {\r\n    var expr = new TernaryExpression();\r\n    expr.range = range;\r\n    expr.condition = condition; condition.parent = expr;\r\n    expr.ifThen = ifThen; ifThen.parent = expr;\r\n    expr.ifElse = ifElse; ifElse.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createStringLiteralExpression(\r\n    value: string,\r\n    range: Range\r\n  ): StringLiteralExpression {\r\n    var expr = new StringLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createSuperExpression(\r\n    range: Range\r\n  ): SuperExpression {\r\n    var expr = new SuperExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createThisExpression(\r\n    range: Range\r\n  ): ThisExpression {\r\n    var expr = new ThisExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createTrueExpression(\r\n    range: Range\r\n  ): TrueExpression {\r\n    var expr = new TrueExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createUnaryPostfixExpression(\r\n    operator: Token,\r\n    operand: Expression,\r\n    range: Range\r\n  ): UnaryPostfixExpression {\r\n    var expr = new UnaryPostfixExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.operand = operand; operand.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createUnaryPrefixExpression(\r\n    operator: Token,\r\n    operand: Expression,\r\n    range: Range\r\n  ): UnaryPrefixExpression {\r\n    var expr = new UnaryPrefixExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.operand = operand; operand.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  // statements\r\n\r\n  static createBlockStatement(\r\n    statements: Statement[],\r\n    range: Range\r\n  ): BlockStatement {\r\n    var stmt = new BlockStatement();\r\n    stmt.range = range;\r\n    stmt.statements = statements; setParent(statements, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createBreakStatement(\r\n    label: IdentifierExpression | null,\r\n    range: Range\r\n  ): BreakStatement {\r\n    var stmt = new BreakStatement();\r\n    stmt.range = range;\r\n    stmt.label = label; if (label) label.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createClassDeclaration(\r\n    identifier: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[],\r\n    extendsType: TypeNode | null, // can't be a function\r\n    implementsTypes: TypeNode[] | null, // can't be functions\r\n    members: DeclarationStatement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): ClassDeclaration {\r\n    var stmt = new ClassDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = identifier; identifier.parent = stmt;\r\n    stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n    stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n    stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createContinueStatement(\r\n    label: IdentifierExpression | null,\r\n    range: Range\r\n  ): ContinueStatement {\r\n    var stmt = new ContinueStatement();\r\n    stmt.range = range;\r\n    stmt.label = label; if (label) label.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createDoStatement(\r\n    statement: Statement,\r\n    condition: Expression,\r\n    range: Range\r\n  ): DoStatement {\r\n    var stmt = new DoStatement();\r\n    stmt.range = range;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createEmptyStatement(\r\n    range: Range\r\n  ): EmptyStatement {\r\n    var stmt = new EmptyStatement();\r\n    stmt.range = range;\r\n    return stmt;\r\n  }\r\n\r\n  static createEnumDeclaration(\r\n    name: IdentifierExpression,\r\n    members: EnumValueDeclaration[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): EnumDeclaration {\r\n    var stmt = new EnumDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.values = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createEnumValueDeclaration(\r\n    name: IdentifierExpression,\r\n    value: Expression | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): EnumValueDeclaration {\r\n    var stmt = new EnumValueDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.value = value; if (value) value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createExportStatement(\r\n    members: ExportMember[] | null,\r\n    path: StringLiteralExpression | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): ExportStatement {\r\n    var stmt = new ExportStatement();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.members = members; if (members) setParent(members, stmt);\r\n    stmt.path = path;\r\n    if (path) {\r\n      let normalizedPath = normalizePath(path.value);\r\n      if (path.value.startsWith(\".\")) { // relative\r\n        stmt.normalizedPath = resolvePath(\r\n          normalizedPath,\r\n          range.source.normalizedPath\r\n        );\r\n      } else { // absolute\r\n        stmt.normalizedPath = normalizedPath;\r\n      }\r\n      stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    } else {\r\n      stmt.normalizedPath = null;\r\n      stmt.internalPath = null;\r\n    }\r\n    return stmt;\r\n  }\r\n\r\n  static createExportImportStatement(\r\n    name: IdentifierExpression,\r\n    externalName: IdentifierExpression,\r\n    range: Range\r\n  ): ExportImportStatement {\r\n    var stmt = new ExportImportStatement();\r\n    stmt.range = range;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.externalName = externalName; externalName.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createExportMember(\r\n    name: IdentifierExpression,\r\n    externalName: IdentifierExpression | null,\r\n    range: Range\r\n  ): ExportMember {\r\n    var elem = new ExportMember();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    if (!externalName) {\r\n      externalName = name;\r\n    } else {\r\n      externalName.parent = elem;\r\n    }\r\n    elem.externalName = externalName;\r\n    return elem;\r\n  }\r\n\r\n  static createExpressionStatement(\r\n    expression: Expression\r\n  ): ExpressionStatement {\r\n    var stmt = new ExpressionStatement();\r\n    stmt.range = expression.range;\r\n    stmt.expression = expression; expression.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createIfStatement(\r\n    condition: Expression,\r\n    ifTrue: Statement,\r\n    ifFalse: Statement | null,\r\n    range: Range\r\n  ): IfStatement {\r\n    var stmt = new IfStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n    stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createImportStatement(\r\n    decls: ImportDeclaration[] | null,\r\n    path: StringLiteralExpression,\r\n    range: Range\r\n  ): ImportStatement {\r\n    var stmt = new ImportStatement();\r\n    stmt.range = range;\r\n    stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n    stmt.namespaceName = null;\r\n    stmt.path = path;\r\n    var normalizedPath = normalizePath(path.value);\r\n    if (path.value.startsWith(\".\")) { // relative in project\r\n      stmt.normalizedPath = resolvePath(\r\n        normalizedPath,\r\n        range.source.normalizedPath\r\n      );\r\n    } else { // absolute in library\r\n      if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\r\n        normalizedPath = LIBRARY_PREFIX + normalizedPath;\r\n      }\r\n      stmt.normalizedPath = normalizedPath;\r\n    }\r\n    stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    return stmt;\r\n  }\r\n\r\n  static createImportStatementWithWildcard(\r\n    identifier: IdentifierExpression,\r\n    path: StringLiteralExpression,\r\n    range: Range\r\n  ): ImportStatement {\r\n    var stmt = new ImportStatement();\r\n    stmt.range = range;\r\n    stmt.declarations = null;\r\n    stmt.namespaceName = identifier;\r\n    stmt.path = path;\r\n    stmt.normalizedPath = resolvePath(\r\n      normalizePath(path.value),\r\n      range.source.normalizedPath\r\n    );\r\n    stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    return stmt;\r\n  }\r\n\r\n  static createImportDeclaration(\r\n    externalName: IdentifierExpression,\r\n    name: IdentifierExpression | null,\r\n    range: Range\r\n  ): ImportDeclaration {\r\n    var elem = new ImportDeclaration();\r\n    elem.range = range;\r\n    elem.externalName = externalName; externalName.parent = elem;\r\n    if (!name) {\r\n      name = externalName;\r\n    } else {\r\n      name.parent = elem;\r\n    }\r\n    elem.name = name;\r\n    return elem;\r\n  }\r\n\r\n  static createInterfaceDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[],\r\n    extendsType: TypeNode | null, // can't be a function\r\n    members: DeclarationStatement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): InterfaceDeclaration {\r\n    var stmt = new InterfaceDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createFieldDeclaration(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode | null,\r\n    initializer: Expression | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): FieldDeclaration {\r\n    var stmt = new FieldDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.type = type; if (type) type.parent = stmt;\r\n    stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createForStatement(\r\n    initializer: Statement | null,\r\n    condition: Expression | null,\r\n    incrementor: Expression | null,\r\n    statement: Statement,\r\n    range: Range\r\n  ): ForStatement {\r\n    var stmt = new ForStatement();\r\n    stmt.range = range;\r\n    stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n    stmt.condition = condition; if (condition) condition.parent = stmt;\r\n    stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createFunctionDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    signature: SignatureNode,\r\n    body: Statement | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): FunctionDeclaration {\r\n    var stmt = new FunctionDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.signature = signature; signature.parent = stmt;\r\n    stmt.body = body; if (body) body.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createMethodDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    signature: SignatureNode,\r\n    body: Statement | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): MethodDeclaration {\r\n    var stmt = new MethodDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.signature = signature; signature.parent = stmt;\r\n    stmt.body = body; if (body) body.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createNamespaceDeclaration(\r\n    name: IdentifierExpression,\r\n    members: Statement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): NamespaceDeclaration {\r\n    var stmt = new NamespaceDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createReturnStatement(\r\n    value: Expression | null,\r\n    range: Range\r\n  ): ReturnStatement {\r\n    var stmt = new ReturnStatement();\r\n    stmt.range = range;\r\n    stmt.value = value; if (value) value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createSwitchStatement(\r\n    condition: Expression,\r\n    cases: SwitchCase[],\r\n    range: Range\r\n  ): SwitchStatement {\r\n    var stmt = new SwitchStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.cases = cases; setParent(cases, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createSwitchCase(\r\n    label: Expression | null,\r\n    statements: Statement[],\r\n    range: Range\r\n  ): SwitchCase {\r\n    var elem = new SwitchCase();\r\n    elem.range = range;\r\n    elem.label = label; if (label) label.parent = elem;\r\n    elem.statements = statements; setParent(statements, elem);\r\n    return elem;\r\n  }\r\n\r\n  static createThrowStatement(\r\n    value: Expression,\r\n    range: Range\r\n  ): ThrowStatement {\r\n    var stmt = new ThrowStatement();\r\n    stmt.range = range;\r\n    stmt.value = value; value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createTryStatement(\r\n    statements: Statement[],\r\n    catchVariable: IdentifierExpression | null,\r\n    catchStatements: Statement[] | null,\r\n    finallyStatements: Statement[] | null,\r\n    range: Range\r\n  ): TryStatement {\r\n    var stmt = new TryStatement();\r\n    stmt.range = range;\r\n    stmt.statements = statements; setParent(statements, stmt);\r\n    stmt.catchVariable = catchVariable;\r\n    if (catchVariable) catchVariable.parent = stmt;\r\n    stmt.catchStatements = catchStatements;\r\n    if (catchStatements) setParent(catchStatements, stmt);\r\n    stmt.finallyStatements = finallyStatements;\r\n    if (finallyStatements) setParent(finallyStatements, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createTypeDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    alias: CommonTypeNode,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): TypeDeclaration {\r\n    var stmt = new TypeDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.type = alias; alias.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createVariableStatement(\r\n    declarations: VariableDeclaration[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): VariableStatement {\r\n    var stmt = new VariableStatement();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.declarations = declarations; setParent(declarations, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createVariableDeclaration(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode | null,\r\n    initializer: Expression | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): VariableDeclaration {\r\n    var elem = new VariableDeclaration();\r\n    elem.range = range;\r\n    elem.flags = flags;\r\n    elem.name = name; name.parent = elem;\r\n    elem.type = type; if (type) type.parent = elem;\r\n    elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n    elem.decorators = decorators; // inherited\r\n    return elem;\r\n  }\r\n\r\n  static createVoidStatement(\r\n    expression: Expression,\r\n    range: Range\r\n  ): VoidStatement {\r\n    var stmt = new VoidStatement();\r\n    stmt.range = range;\r\n    stmt.expression = expression;\r\n    return stmt;\r\n  }\r\n\r\n  static createWhileStatement(\r\n    condition: Expression,\r\n    statement: Statement,\r\n    range: Range\r\n  ): WhileStatement {\r\n    var stmt = new WhileStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    return stmt;\r\n  }\r\n}\r\n\r\n// types\r\n\r\nexport abstract class CommonTypeNode extends Node {\r\n  // kind varies\r\n\r\n  /** Whether nullable or not. */\r\n  isNullable: bool;\r\n}\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends CommonTypeNode {\r\n  kind = NodeKind.TYPE;\r\n\r\n  /** Identifier reference. */\r\n  name: IdentifierExpression;\r\n  /** Type argument references. */\r\n  typeArguments: CommonTypeNode[] | null;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameterNode extends Node {\r\n  kind = NodeKind.TYPEPARAMETER;\r\n\r\n  /** Identifier reference. */\r\n  name: IdentifierExpression;\r\n  /** Extended type reference, if any. */\r\n  extendsType: TypeNode | null; // can't be a function\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n  /** No specific flags. */\r\n  DEFAULT,\r\n  /** Is an optional parameter. */\r\n  OPTIONAL,\r\n  /** Is a rest parameter. */\r\n  REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class ParameterNode extends Node {\r\n  kind = NodeKind.PARAMETER;\r\n\r\n  /** Parameter kind. */\r\n  parameterKind: ParameterKind;\r\n  /** Parameter name. */\r\n  name: IdentifierExpression;\r\n  /** Parameter type. */\r\n  type: CommonTypeNode;\r\n  /** Initializer expression, if present. */\r\n  initializer: Expression | null;\r\n  /** Implicit field declaration, if applicable. */\r\n  implicitFieldDeclaration: FieldDeclaration | null = null;\r\n}\r\n\r\n/** Represents a function signature. */\r\nexport class SignatureNode extends CommonTypeNode {\r\n  kind = NodeKind.SIGNATURE;\r\n\r\n  /** Accepted parameters. */\r\n  parameters: ParameterNode[];\r\n  /** Return type. */\r\n  returnType: CommonTypeNode;\r\n  /** Explicitly provided this type, if any. */\r\n  explicitThisType: TypeNode | null; // can't be a function\r\n}\r\n\r\n// special\r\n\r\n/** Built-in decorator kinds. */\r\nexport enum DecoratorKind {\r\n  CUSTOM,\r\n  GLOBAL,\r\n  OPERATOR,\r\n  OPERATOR_BINARY,\r\n  OPERATOR_PREFIX,\r\n  OPERATOR_POSTFIX,\r\n  UNMANAGED,\r\n  SEALED,\r\n  INLINE,\r\n  EXTERNAL\r\n}\r\n\r\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\r\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\r\n  // @global, @inline, @operator, @sealed, @unmanaged\r\n  if (name.kind == NodeKind.IDENTIFIER) {\r\n    let nameStr = (<IdentifierExpression>name).text;\r\n    assert(nameStr.length);\r\n    switch (nameStr.charCodeAt(0)) {\r\n      case CharCode.e: {\r\n        if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\r\n        break;\r\n      }\r\n      case CharCode.g: {\r\n        if (nameStr == \"global\") return DecoratorKind.GLOBAL;\r\n        break;\r\n      }\r\n      case CharCode.i: {\r\n        if (nameStr == \"inline\") return DecoratorKind.INLINE;\r\n        break;\r\n      }\r\n      case CharCode.o: {\r\n        if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\r\n        break;\r\n      }\r\n      case CharCode.s: {\r\n        if (nameStr == \"sealed\") return DecoratorKind.SEALED;\r\n        break;\r\n      }\r\n      case CharCode.u: {\r\n        if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\r\n        break;\r\n      }\r\n    }\r\n  } else if (\r\n    name.kind == NodeKind.PROPERTYACCESS &&\r\n    (<PropertyAccessExpression>name).expression.kind == NodeKind.IDENTIFIER\r\n  ) {\r\n    let nameStr = (<IdentifierExpression>(<PropertyAccessExpression>name).expression).text;\r\n    assert(nameStr.length);\r\n    let propStr = (<PropertyAccessExpression>name).property.text;\r\n    assert(propStr.length);\r\n    // @operator.binary, @operator.prefix, @operator.postfix\r\n    if (nameStr == \"operator\") {\r\n      switch (propStr.charCodeAt(0)) {\r\n        case CharCode.b: {\r\n          if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\r\n          break;\r\n        }\r\n        case CharCode.p: {\r\n          switch (propStr) {\r\n            case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\r\n            case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return DecoratorKind.CUSTOM;\r\n}\r\n\r\n/** Represents a decorator. */\r\nexport class DecoratorNode extends Node {\r\n  kind = NodeKind.DECORATOR;\r\n\r\n  /** Built-in kind, if applicable. */\r\n  decoratorKind: DecoratorKind;\r\n  /** Name expression. */\r\n  name: Expression;\r\n  /** Argument expressions. */\r\n  arguments: Expression[] | null;\r\n}\r\n\r\n/** Comment kinds. */\r\nexport enum CommentKind {\r\n  /** Line comment. */\r\n  LINE,\r\n  /** Triple-slash comment. */\r\n  TRIPLE,\r\n  /** Block comment. */\r\n  BLOCK\r\n}\r\n\r\n/** Represents a comment. */\r\nexport class CommentNode extends Node {\r\n  kind = NodeKind.COMMENT;\r\n\r\n  /** Comment kind. */\r\n  commentKind: CommentKind;\r\n  /** Comment text. */\r\n  text: string;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n  kind = NodeKind.IDENTIFIER;\r\n\r\n  /** Textual name. */\r\n  text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport enum LiteralKind {\r\n  FLOAT,\r\n  INTEGER,\r\n  STRING,\r\n  REGEXP,\r\n  ARRAY,\r\n  OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n  kind = NodeKind.LITERAL;\r\n\r\n  /** Specific literal kind. */\r\n  literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.ARRAY;\r\n\r\n  /** Nested element expressions. */\r\n  elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport enum AssertionKind {\r\n  PREFIX,\r\n  AS\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n  kind = NodeKind.ASSERTION;\r\n\r\n  /** Specific kind of this assertion. */\r\n  assertionKind: AssertionKind;\r\n  /** Expression being asserted. */\r\n  expression: Expression;\r\n  /** Target type. */\r\n  toType: CommonTypeNode;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n  kind = NodeKind.BINARY;\r\n\r\n  /** Operator token. */\r\n  operator: Token;\r\n  /** Left-hand side expression */\r\n  left: Expression;\r\n  /** Right-hand side expression. */\r\n  right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n  kind = NodeKind.CALL;\r\n\r\n  /** Called expression. Usually an identifier or property access expression. */\r\n  expression: Expression;\r\n  /** Provided type arguments. */\r\n  typeArguments: CommonTypeNode[] | null;\r\n  /** Provided arguments. */\r\n  arguments: Expression[];\r\n}\r\n\r\n/** Represents a class expression using the 'class' keyword. */\r\nexport class ClassExpression extends Expression {\r\n  kind = NodeKind.CLASS;\r\n\r\n  /** Inline class declaration. */\r\n  declaration: ClassDeclaration;\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n  kind = NodeKind.COMMA;\r\n\r\n  /** Sequential expressions. */\r\n  expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n  kind = NodeKind.CONSTRUCTOR;\r\n  text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n  kind = NodeKind.ELEMENTACCESS;\r\n\r\n  /** Expression being accessed. */\r\n  expression: Expression;\r\n  /** Element of the expression being accessed. */\r\n  elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.FLOAT;\r\n\r\n  /** Float value. */\r\n  value: f64;\r\n}\r\n\r\n/** Represents a function expression using the 'function' keyword. */\r\nexport class FunctionExpression extends Expression {\r\n  kind = NodeKind.FUNCTION;\r\n\r\n  /** Inline function declaration. */\r\n  declaration: FunctionDeclaration;\r\n}\r\n\r\n/** Represents an `instanceof` expression. */\r\nexport class InstanceOfExpression extends Expression {\r\n  kind = NodeKind.INSTANCEOF;\r\n\r\n  /** Expression being asserted. */\r\n  expression: Expression;\r\n  /** Type to test for. */\r\n  isType: CommonTypeNode;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.INTEGER;\r\n\r\n  /** Integer value. */\r\n  value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n  kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n  kind = NodeKind.NULL;\r\n  text = \"null\";\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n  kind = NodeKind.PARENTHESIZED;\r\n\r\n  /** Expression in parenthesis. */\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n  kind = NodeKind.PROPERTYACCESS;\r\n\r\n  /** Expression being accessed. */\r\n  expression: Expression;\r\n  /** Property of the expression being accessed. */\r\n  property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.REGEXP;\r\n\r\n  /** Regular expression pattern. */\r\n  pattern: string;\r\n  /** Regular expression flags. */\r\n  patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n  kind = NodeKind.TERNARY;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Expression executed when condition is `true`. */\r\n  ifThen: Expression;\r\n  /** Expression executed when condition is `false`. */\r\n  ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.STRING;\r\n\r\n  /** String value without quotes. */\r\n  value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n  kind = NodeKind.SUPER;\r\n  text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n  kind = NodeKind.THIS;\r\n  text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n  kind = NodeKind.TRUE;\r\n  text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n  kind = NodeKind.FALSE;\r\n  text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n  /** Operator token. */\r\n  operator: Token;\r\n  /** Operand expression. */\r\n  operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n  kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n  kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\nexport function isLastStatement(statement: Statement): bool {\r\n  var parent = assert(statement.parent);\r\n  if (parent.kind == NodeKind.BLOCK) {\r\n    let statements = (<BlockStatement>parent).statements;\r\n    if (statements[statements.length - 1] === statement) {\r\n      switch (assert(parent.parent).kind) {\r\n        case NodeKind.FUNCTIONDECLARATION:\r\n        case NodeKind.METHODDECLARATION: return true;\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n  /** Default source. Usually imported from an entry file. */\r\n  DEFAULT,\r\n  /** Entry file. */\r\n  ENTRY,\r\n  /** Library file. */\r\n  LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n  kind = NodeKind.SOURCE;\r\n  parent = null;\r\n\r\n  /** Source kind. */\r\n  sourceKind: SourceKind;\r\n  /** Normalized path. */\r\n  normalizedPath: string;\r\n  /** Path used internally. */\r\n  internalPath: string;\r\n  /** Simple path (last part without extension). */\r\n  simplePath: string;\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n  /** Full source text. */\r\n  text: string;\r\n  /** Tokenizer reference. */\r\n  tokenizer: Tokenizer | null = null;\r\n  /** Source map index. */\r\n  debugInfoIndex: i32 = -1;\r\n  /** Re-exported sources. */\r\n  exportPaths: Set<string> | null = null;\r\n\r\n  /** Constructs a new source node. */\r\n  constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n    super();\r\n    this.sourceKind = kind;\r\n    this.normalizedPath = normalizedPath;\r\n    var internalPath = mangleInternalPath(this.normalizedPath);\r\n    this.internalPath = internalPath;\r\n    var pos = internalPath.lastIndexOf(PATH_DELIMITER);\r\n    this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\r\n    this.statements = new Array();\r\n    this.range = new Range(this, 0, text.length);\r\n    this.text = text;\r\n  }\r\n\r\n  /** Tests if this source is an entry file. */\r\n  get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n  /** Tests if this source is a stdlib file. */\r\n  get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n  /** Simple name being declared. */\r\n  name: IdentifierExpression;\r\n  /** Array of decorators. */\r\n  decorators: DecoratorNode[] | null = null;\r\n\r\n  protected cachedProgramLevelInternalName: string | null = null;\r\n  protected cachedFileLevelInternalName: string | null = null;\r\n\r\n  /** Gets the mangled program-level internal name of this declaration. */\r\n  get programLevelInternalName(): string {\r\n    if (!this.cachedProgramLevelInternalName) {\r\n      this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n    }\r\n    return this.cachedProgramLevelInternalName;\r\n  }\r\n\r\n  /** Gets the mangled file-level internal name of this declaration. */\r\n  get fileLevelInternalName(): string {\r\n    if (!this.cachedFileLevelInternalName) {\r\n      this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n    }\r\n    return this.cachedFileLevelInternalName;\r\n  }\r\n\r\n  /** Tests if this is a top-level declaration within its source file. */\r\n  get isTopLevel(): bool {\r\n    var parent = this.parent;\r\n    if (!parent) {\r\n      return false;\r\n    }\r\n    if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n      return false;\r\n    }\r\n    return parent.kind == NodeKind.SOURCE;\r\n  }\r\n\r\n  /** Tests if this declaration is a top-level export within its source file. */\r\n  get isTopLevelExport(): bool {\r\n    var parent = this.parent;\r\n    if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n      return false;\r\n    }\r\n    if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n      return this.is(CommonFlags.EXPORT) && (<NamespaceDeclaration>parent).isTopLevelExport;\r\n    }\r\n    if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n      return this.is(CommonFlags.STATIC) && (<ClassDeclaration>parent).isTopLevelExport;\r\n    }\r\n    return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\r\n  }\r\n\r\n  /** Tests if this declaration needs an explicit export. */\r\n  needsExplicitExport(member: ExportMember): bool {\r\n    // This is necessary because module-level exports are automatically created\r\n    // for top level declarations of all sorts. This function essentially tests\r\n    // that there isn't a otherwise duplicate top-level export already.\r\n    return (\r\n      member.name.text != member.externalName.text || // if aliased\r\n      this.range.source != member.range.source ||     // if a re-export\r\n      !this.isTopLevelExport                          // if not top-level\r\n    );\r\n  }\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n  /** Variable type. */\r\n  type: CommonTypeNode | null;\r\n  /** Variable initializer. */\r\n  initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n  kind = NodeKind.BLOCK;\r\n\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n  kind = NodeKind.BREAK;\r\n\r\n  /** Target label, if applicable. */\r\n  label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.CLASSDECLARATION;\r\n\r\n  /** Accepted type parameters. */\r\n  typeParameters: TypeParameterNode[];\r\n  /** Base class type being extended, if any. */\r\n  extendsType: TypeNode | null; // can't be a function\r\n  /** Interface types being implemented, if any. */\r\n  implementsTypes: TypeNode[] | null; // can't be functions\r\n  /** Class member declarations. */\r\n  members: DeclarationStatement[];\r\n\r\n  get isGeneric(): bool {\r\n    var typeParameters = this.typeParameters;\r\n    return typeParameters != null && typeParameters.length > 0;\r\n  }\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n  kind = NodeKind.CONTINUE;\r\n\r\n  /** Target label, if applicable. */\r\n  label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n  kind = NodeKind.DO;\r\n\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n  /** Condition when to repeat. */\r\n  condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n  kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.ENUMDECLARATION;\r\n\r\n  /** Enum value declarations. */\r\n  values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.ENUMVALUEDECLARATION;\r\n  // name is inherited\r\n\r\n  /** Value expression. */\r\n  value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n  kind = NodeKind.EXPORTIMPORT;\r\n\r\n  /** Identifier being imported. */\r\n  name: IdentifierExpression;\r\n  /** Identifier being exported. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n  kind = NodeKind.EXPORTMEMBER;\r\n\r\n  /** Identifier being exported. */\r\n  name: IdentifierExpression;\r\n  /** Identifier seen when imported again. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n  kind = NodeKind.EXPORT;\r\n\r\n  /** Array of members if a set of named exports, or `null` if a filespace export. */\r\n  members: ExportMember[] | null;\r\n  /** Path being exported from, if applicable. */\r\n  path: StringLiteralExpression | null;\r\n  /** Normalized path, if `path` is set. */\r\n  normalizedPath: string | null;\r\n  /** Mangled internal path being referenced, if `path` is set. */\r\n  internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n  kind = NodeKind.EXPRESSION;\r\n\r\n  /** Expression being used as a statement.*/\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n  kind = NodeKind.FIELDDECLARATION;\r\n\r\n  /** Parameter index within the constructor, if applicable. */\r\n  parameterIndex: i32 = -1;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n  kind = NodeKind.FOR;\r\n\r\n  /**\r\n   * Initializer statement, if present.\r\n   * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n   */\r\n  initializer: Statement | null;\r\n  /** Condition expression, if present. */\r\n  condition: Expression | null;\r\n  /** Incrementor expression, if present. */\r\n  incrementor: Expression | null;\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n  /** Type parameters, if any. */\r\n  typeParameters: TypeParameterNode[] | null;\r\n  /** Function signature. */\r\n  signature: SignatureNode;\r\n  /** Body statement. Usually a block. */\r\n  body: Statement | null;\r\n\r\n  get isGeneric(): bool {\r\n    var typeParameters = this.typeParameters;\r\n    return typeParameters != null && typeParameters.length > 0;\r\n  }\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n  kind = NodeKind.IF;\r\n\r\n  /** Condition. */\r\n  condition: Expression;\r\n  /** Statement executed when condition is `true`. */\r\n  ifTrue: Statement;\r\n  /** Statement executed when condition is `false`. */\r\n  ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.IMPORTDECLARATION;\r\n\r\n  /** Identifier being imported. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n  kind = NodeKind.IMPORT;\r\n\r\n  /** Array of member declarations or `null` if an asterisk import. */\r\n  declarations: ImportDeclaration[] | null;\r\n  /** Name of the local namespace, if an asterisk import. */\r\n  namespaceName: IdentifierExpression | null;\r\n  /** Path being imported from. */\r\n  path: StringLiteralExpression;\r\n  /** Normalized path. */\r\n  normalizedPath: string;\r\n  /** Mangled internal path being referenced. */\r\n  internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n  kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n  kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n  /** Array of namespace members. */\r\n  members: Statement[];\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n  kind = NodeKind.RETURN;\r\n\r\n  /** Value expression being returned, if present. */\r\n  value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n  kind = NodeKind.SWITCHCASE;\r\n\r\n  /** Label expression. `null` indicates the default case. */\r\n  label: Expression | null;\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n  kind = NodeKind.SWITCH;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Contained cases. */\r\n  cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n  kind = NodeKind.THROW;\r\n\r\n  /** Value expression being thrown. */\r\n  value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n  kind = NodeKind.TRY;\r\n\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n  /** Exception variable name, if a `catch` clause is present. */\r\n  catchVariable: IdentifierExpression | null;\r\n  /** Statements being executed on catch, if a `catch` clause is present. */\r\n  catchStatements: Statement[] | null;\r\n  /** Statements being executed afterwards, if a `finally` clause is present. */\r\n  finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.TYPEDECLARATION;\r\n\r\n  /** Type parameters, if any. */\r\n  typeParameters: TypeParameterNode[] | null;\r\n  /** Type being aliased. */\r\n  type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n  kind = NodeKind.VARIABLEDECLARATION;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n  kind = NodeKind.VARIABLE;\r\n\r\n  /** Array of decorators. */\r\n  decorators: DecoratorNode[] | null;\r\n  /** Array of member declarations. */\r\n  declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a void statement dropping an expression's value. */\r\nexport class VoidStatement extends Statement {\r\n  kind = NodeKind.VOID;\r\n\r\n  /** Expression being dropped. */\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n  kind = NodeKind.WHILE;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n}\r\n\r\n/** Finds the first decorator matching the specified kind. */\r\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\r\n  if (decorators) {\r\n    for (let i = 0, k = decorators.length; i < k; ++i) {\r\n      let decorator = decorators[i];\r\n      if (decorator.decoratorKind == kind) return decorator;\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n  var name = declaration.name.text;\r\n  var parent = declaration.parent;\r\n  if (!parent) return name;\r\n  if (\r\n    declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n    parent.kind == NodeKind.VARIABLE\r\n  ) { // skip over\r\n    if (!(parent = parent.parent)) return name;\r\n  }\r\n  if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n    return mangleInternalName(<ClassDeclaration>parent, asGlobal) + (\r\n      declaration.is(CommonFlags.STATIC)\r\n        ? STATIC_DELIMITER\r\n        : INSTANCE_DELIMITER\r\n    ) + name;\r\n  }\r\n  if (\r\n    parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n    parent.kind == NodeKind.ENUMDECLARATION\r\n  ) {\r\n    return mangleInternalName(<DeclarationStatement>parent, asGlobal) +\r\n           STATIC_DELIMITER + name;\r\n  }\r\n  return asGlobal\r\n    ? name\r\n    : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n  if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n  return path;\r\n}\r\n\r\n// Helpers\r\n\r\n/** Sets the parent node on an array of nodes. */\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n  for (let i = 0, k = nodes.length; i < k; ++i) {\r\n    nodes[i].parent = parent;\r\n  }\r\n}\r\n\r\n/** Sets the parent node on an array of nullable nodes. */\r\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\r\n  for (let i = 0, k = nodes.length; i < k; ++i) {\r\n    let node = nodes[i];\r\n    if (node) node.parent = parent;\r\n  }\r\n}\r\n","/**\r\n * AssemblyScript's intermediate representation describing a program's elements.\r\n * @module program\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  LIBRARY_PREFIX,\r\n  GETTER_PREFIX,\r\n  SETTER_PREFIX,\r\n  FILESPACE_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Options,\r\n  Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticMessage,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags,\r\n  Signature,\r\n  typesToString\r\n} from \"./types\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Source,\r\n  Range,\r\n  CommonTypeNode,\r\n  TypeNode,\r\n  TypeParameterNode,\r\n  ParameterKind,\r\n  SignatureNode,\r\n  DecoratorNode,\r\n  DecoratorKind,\r\n\r\n  Expression,\r\n  AssertionExpression,\r\n  ElementAccessExpression,\r\n  IdentifierExpression,\r\n  LiteralExpression,\r\n  LiteralKind,\r\n  ParenthesizedExpression,\r\n  PropertyAccessExpression,\r\n  StringLiteralExpression,\r\n  CallExpression,\r\n\r\n  ClassDeclaration,\r\n  DeclarationStatement,\r\n  EnumDeclaration,\r\n  EnumValueDeclaration,\r\n  ExportMember,\r\n  ExportStatement,\r\n  FieldDeclaration,\r\n  FunctionDeclaration,\r\n  ImportDeclaration,\r\n  ImportStatement,\r\n  InterfaceDeclaration,\r\n  MethodDeclaration,\r\n  NamespaceDeclaration,\r\n  TypeDeclaration,\r\n  VariableDeclaration,\r\n  VariableLikeDeclarationStatement,\r\n  VariableStatement,\r\n\r\n  decoratorNameToKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Module,\r\n  NativeType,\r\n  FunctionRef,\r\n  ExpressionRef,\r\n  ExpressionId,\r\n  BinaryOp,\r\n  UnaryOp,\r\n\r\n  getExpressionId,\r\n  getGetLocalIndex,\r\n  isTeeLocal,\r\n  getSetLocalValue,\r\n  getBinaryOp,\r\n  getConstValueI32,\r\n  getBinaryLeft,\r\n  getBinaryRight,\r\n  getUnaryOp,\r\n  getExpressionType,\r\n  getLoadBytes,\r\n  isLoadSigned,\r\n  getIfTrue,\r\n  getIfFalse,\r\n  getSelectThen,\r\n  getSelectElse,\r\n  getCallTarget,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getBlockName,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getConstValueI64Low\r\n} from \"./module\";\r\n\r\nimport {\r\n  CharCode\r\n} from \"./util\";\r\n\r\n/** Represents a yet unresolved import. */\r\nclass QueuedImport {\r\n  localName: string;\r\n  externalName: string;\r\n  externalNameAlt: string;\r\n  declaration: ImportDeclaration | null; // not set if a filespace\r\n}\r\n\r\n/** Represents a yet unresolved export. */\r\nclass QueuedExport {\r\n  externalName: string;\r\n  isReExport: bool;\r\n  member: ExportMember;\r\n}\r\n\r\n/** Represents a type alias. */\r\nclass TypeAlias {\r\n  typeParameters: TypeParameterNode[] | null;\r\n  type: CommonTypeNode;\r\n}\r\n\r\n/** Represents the kind of an operator overload. */\r\nexport enum OperatorKind {\r\n  INVALID,\r\n\r\n  // indexed access\r\n  INDEXED_GET,            // a[]\r\n  INDEXED_SET,            // a[]=b\r\n  UNCHECKED_INDEXED_GET,  // unchecked(a[])\r\n  UNCHECKED_INDEXED_SET,  // unchecked(a[]=b)\r\n\r\n  // binary\r\n  ADD,                    // a + b\r\n  SUB,                    // a - b\r\n  MUL,                    // a * b\r\n  DIV,                    // a / b\r\n  REM,                    // a % b\r\n  POW,                    // a ** b\r\n  BITWISE_AND,            // a & b\r\n  BITWISE_OR,             // a | b\r\n  BITWISE_XOR,            // a ^ b\r\n  BITWISE_SHL,            // a << b\r\n  BITWISE_SHR,            // a >> b\r\n  BITWISE_SHR_U,          // a >>> b\r\n  EQ,                     // a == b\r\n  NE,                     // a != b\r\n  GT,                     // a > b\r\n  GE,                     // a >= b\r\n  LT,                     // a < b\r\n  LE,                     // a <= b\r\n\r\n  // unary prefix\r\n  PLUS,                   // +a\r\n  MINUS,                  // -a\r\n  NOT,                    // !a\r\n  BITWISE_NOT,            // ~a\r\n  PREFIX_INC,             // ++a\r\n  PREFIX_DEC,             // --a\r\n\r\n  // unary postfix\r\n  POSTFIX_INC,            // a++\r\n  POSTFIX_DEC             // a--\r\n\r\n  // not overridable:\r\n  // IDENTITY             // a === b\r\n  // LOGICAL_AND          // a && b\r\n  // LOGICAL_OR           // a || b\r\n}\r\n\r\n/** Returns the operator kind represented by the specified decorator and string argument. */\r\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\r\n  assert(arg.length);\r\n  switch (decoratorKind) {\r\n    case DecoratorKind.OPERATOR:\r\n    case DecoratorKind.OPERATOR_BINARY: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.OPENBRACKET: {\r\n          if (arg == \"[]\") return OperatorKind.INDEXED_GET;\r\n          if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\r\n          break;\r\n        }\r\n        case CharCode.OPENBRACE: {\r\n          if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\r\n          if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\r\n          break;\r\n        }\r\n        case CharCode.PLUS: {\r\n          if (arg == \"+\") return OperatorKind.ADD;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"-\") return OperatorKind.SUB;\r\n          break;\r\n        }\r\n        case CharCode.ASTERISK: {\r\n          if (arg == \"*\") return OperatorKind.MUL;\r\n          if (arg == \"**\") return OperatorKind.POW;\r\n          break;\r\n        }\r\n        case CharCode.SLASH: {\r\n          if (arg == \"/\") return OperatorKind.DIV;\r\n          break;\r\n        }\r\n        case CharCode.PERCENT: {\r\n          if (arg == \"%\") return OperatorKind.REM;\r\n          break;\r\n        }\r\n        case CharCode.AMPERSAND: {\r\n          if (arg == \"&\") return OperatorKind.BITWISE_AND;\r\n          break;\r\n        }\r\n        case CharCode.BAR: {\r\n          if (arg == \"|\") return OperatorKind.BITWISE_OR;\r\n          break;\r\n        }\r\n        case CharCode.CARET: {\r\n          if (arg == \"^\") return OperatorKind.BITWISE_XOR;\r\n          break;\r\n        }\r\n        case CharCode.EQUALS: {\r\n          if (arg == \"==\") return OperatorKind.EQ;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          if (arg == \"!=\") return OperatorKind.NE;\r\n          break;\r\n        }\r\n        case CharCode.GREATERTHAN: {\r\n          if (arg == \">\") return OperatorKind.GT;\r\n          if (arg == \">=\") return OperatorKind.GE;\r\n          if (arg == \">>\") return OperatorKind.BITWISE_SHR;\r\n          if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\r\n          break;\r\n        }\r\n        case CharCode.LESSTHAN: {\r\n          if (arg == \"<\") return OperatorKind.LT;\r\n          if (arg == \"<=\") return OperatorKind.LE;\r\n          if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n    case DecoratorKind.OPERATOR_PREFIX: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.PLUS: {\r\n          if (arg == \"+\") return OperatorKind.PLUS;\r\n          if (arg == \"++\") return OperatorKind.PREFIX_INC;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"-\") return OperatorKind.MINUS;\r\n          if (arg == \"--\") return OperatorKind.PREFIX_DEC;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          if (arg == \"!\") return OperatorKind.NOT;\r\n          break;\r\n        }\r\n        case CharCode.TILDE: {\r\n          if (arg == \"~\") return OperatorKind.BITWISE_NOT;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n    case DecoratorKind.OPERATOR_POSTFIX: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.PLUS: {\r\n          if (arg == \"++\") return OperatorKind.POSTFIX_INC;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return OperatorKind.INVALID;\r\n}\r\n\r\nconst noTypesYet = new Map<string,Type>();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n  /** Array of source files. */\r\n  sources: Source[];\r\n  /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */\r\n  diagnosticsOffset: i32 = 0;\r\n  /** Compiler options. */\r\n  options: Options;\r\n\r\n  /** Elements by internal name. */\r\n  elementsLookup: Map<string,Element> = new Map();\r\n  /** Class and function instances by internal name. */\r\n  instancesLookup: Map<string,Element> = new Map();\r\n  /** Types by internal name. */\r\n  typesLookup: Map<string,Type> = noTypesYet;\r\n  /** Declared type aliases. */\r\n  typeAliases: Map<string,TypeAlias> = new Map();\r\n  /** File-level exports by exported name. */\r\n  fileLevelExports: Map<string,Element> = new Map();\r\n  /** Module-level exports by exported name. */\r\n  moduleLevelExports: Map<string,Element> = new Map();\r\n\r\n  /** Array prototype reference. */\r\n  arrayPrototype: ClassPrototype | null = null;\r\n  /** String instance reference. */\r\n  stringInstance: Class | null = null;\r\n  /** Start function reference. */\r\n  startFunction: FunctionPrototype;\r\n  /** Main function reference, if present. */\r\n  mainFunction: FunctionPrototype | null = null;\r\n\r\n  /** Target expression of the previously resolved property or element access. */\r\n  resolvedThisExpression: Expression | null = null;\r\n  /** Element expression of the previously resolved element access. */\r\n  resolvedElementExpression : Expression | null = null;\r\n  /** Currently processing filespace. */\r\n  currentFilespace: Filespace;\r\n\r\n  /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n  constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n    super(diagnostics);\r\n    this.sources = [];\r\n  }\r\n\r\n  /** Gets a source by its exact path. */\r\n  getSource(normalizedPath: string): Source | null {\r\n    var sources = this.sources;\r\n    for (let i = 0, k = sources.length; i < k; ++i) {\r\n      let source = sources[i];\r\n      if (source.normalizedPath == normalizedPath) return source;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Looks up the source for the specified possibly ambiguous path. */\r\n  lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\r\n    var tmp: string;\r\n    return (\r\n      this.getSource(normalizedPathWithoutExtension + \".ts\") ||\r\n      this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\r\n      this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\r\n      this.getSource( tmp                                                    + \"/index.ts\")\r\n    );\r\n  }\r\n\r\n  /** Initializes the program and its elements prior to compilation. */\r\n  initialize(options: Options): void {\r\n    this.options = options;\r\n\r\n    // add built-in types\r\n    this.typesLookup = new Map([\r\n      [\"i8\", Type.i8],\r\n      [\"i16\", Type.i16],\r\n      [\"i32\", Type.i32],\r\n      [\"i64\", Type.i64],\r\n      [\"isize\", options.isizeType],\r\n      [\"u8\", Type.u8],\r\n      [\"u16\", Type.u16],\r\n      [\"u32\", Type.u32],\r\n      [\"u64\", Type.u64],\r\n      [\"usize\", options.usizeType],\r\n      [\"bool\", Type.bool],\r\n      [\"f32\", Type.f32],\r\n      [\"f64\", Type.f64],\r\n      [\"void\", Type.void],\r\n      [\"number\", Type.f64],\r\n      [\"boolean\", Type.bool]\r\n    ]);\r\n\r\n    // add compiler hints\r\n    this.setConstantInteger(\"ASC_TARGET\", Type.i32,\r\n      i64_new(options.isWasm64 ? 2 : 1));\r\n    this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\r\n      i64_new(options.noTreeShaking ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\r\n      i64_new(options.noAssert ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\r\n      i64_new(options.memoryBase, 0));\r\n    this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\r\n      i64_new(options.optimizeLevelHint, 0));\r\n    this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\r\n      i64_new(options.shrinkLevelHint, 0));\r\n    this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\r\n      i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\r\n      i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\r\n\r\n    // remember deferred elements\r\n    var queuedImports = new Array<QueuedImport>();\r\n    var queuedExports = new Map<string,QueuedExport>();\r\n    var queuedExtends = new Array<ClassPrototype>();\r\n    var queuedImplements = new Array<ClassPrototype>();\r\n\r\n    // build initial lookup maps of internal names to declarations\r\n    for (let i = 0, k = this.sources.length; i < k; ++i) {\r\n      let source = this.sources[i];\r\n\r\n      // create one filespace per source\r\n      let filespace = new Filespace(this, source);\r\n      this.elementsLookup.set(filespace.internalName, filespace);\r\n      this.currentFilespace = filespace;\r\n\r\n      // process this source's statements\r\n      let statements = source.statements;\r\n      for (let j = 0, l = statements.length; j < l; ++j) {\r\n        let statement = statements[j];\r\n        switch (statement.kind) {\r\n          case NodeKind.CLASSDECLARATION: {\r\n            this.initializeClass(<ClassDeclaration>statement, queuedExtends, queuedImplements);\r\n            break;\r\n          }\r\n          case NodeKind.ENUMDECLARATION: {\r\n            this.initializeEnum(<EnumDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.EXPORT: {\r\n            this.initializeExports(<ExportStatement>statement, queuedExports);\r\n            break;\r\n          }\r\n          case NodeKind.FUNCTIONDECLARATION: {\r\n            this.initializeFunction(<FunctionDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.IMPORT: {\r\n            this.initializeImports(<ImportStatement>statement, queuedExports, queuedImports);\r\n            break;\r\n          }\r\n          case NodeKind.INTERFACEDECLARATION: {\r\n            this.initializeInterface(<InterfaceDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.NAMESPACEDECLARATION: {\r\n            this.initializeNamespace(<NamespaceDeclaration>statement, queuedExtends, queuedImplements);\r\n            break;\r\n          }\r\n          case NodeKind.TYPEDECLARATION: {\r\n            this.initializeTypeAlias(<TypeDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.VARIABLE: {\r\n            this.initializeVariables(<VariableStatement>statement);\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // queued imports should be resolvable now through traversing exports and queued exports\r\n    for (let i = 0; i < queuedImports.length;) {\r\n      let queuedImport = queuedImports[i];\r\n      let declaration = queuedImport.declaration;\r\n      if (declaration) { // named\r\n        let element = this.tryResolveImport(queuedImport.externalName, queuedExports);\r\n        if (element) {\r\n          this.elementsLookup.set(queuedImport.localName, element);\r\n          queuedImports.splice(i, 1);\r\n        } else {\r\n          if (element = this.tryResolveImport(queuedImport.externalNameAlt, queuedExports)) {\r\n            this.elementsLookup.set(queuedImport.localName, element);\r\n            queuedImports.splice(i, 1);\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Module_0_has_no_exported_member_1,\r\n              declaration.range,\r\n              (<ImportStatement>declaration.parent).path.value,\r\n              declaration.externalName.text\r\n            );\r\n            ++i;\r\n          }\r\n        }\r\n      } else { // filespace\r\n        let element = this.elementsLookup.get(queuedImport.externalName);\r\n        if (element) {\r\n          this.elementsLookup.set(queuedImport.localName, element);\r\n          queuedImports.splice(i, 1);\r\n        } else {\r\n          if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\r\n            this.elementsLookup.set(queuedImport.localName, element);\r\n            queuedImports.splice(i, 1);\r\n          } else {\r\n            assert(false); // already reported by the parser not finding the file\r\n            ++i;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // queued exports should be resolvable now that imports are finalized\r\n    for (let [exportName, queuedExport] of queuedExports) {\r\n      let currentExport: QueuedExport | null = queuedExport; // nullable below\r\n      let element: Element | null;\r\n      do {\r\n        if (currentExport.isReExport) {\r\n          if (element = this.fileLevelExports.get(currentExport.externalName)) {\r\n            this.setExportAndCheckLibrary(\r\n              exportName,\r\n              element,\r\n              currentExport.member.externalName\r\n            );\r\n            break;\r\n          }\r\n          currentExport = queuedExports.get(currentExport.externalName);\r\n          if (!currentExport) {\r\n            this.error(\r\n              DiagnosticCode.Module_0_has_no_exported_member_1,\r\n              queuedExport.member.externalName.range,\r\n              (<StringLiteralExpression>(<ExportStatement>queuedExport.member.parent).path).value,\r\n              queuedExport.member.externalName.text\r\n            );\r\n          }\r\n        } else {\r\n          if (\r\n            // normal export\r\n            (element = this.elementsLookup.get(currentExport.externalName)) ||\r\n            // library re-export\r\n            (element = this.elementsLookup.get(currentExport.member.name.text))\r\n          ) {\r\n            this.setExportAndCheckLibrary(\r\n              exportName,\r\n              element,\r\n              currentExport.member.externalName\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Cannot_find_name_0,\r\n              queuedExport.member.range, queuedExport.member.name.text\r\n            );\r\n          }\r\n          break;\r\n        }\r\n      } while (currentExport);\r\n    }\r\n\r\n    // resolve base prototypes of derived classes\r\n    for (let i = 0, k = queuedExtends.length; i < k; ++i) {\r\n      let derivedPrototype = queuedExtends[i];\r\n      let derivedDeclaration = derivedPrototype.declaration;\r\n      let derivedType = assert(derivedDeclaration.extendsType);\r\n      let baseElement = this.resolveIdentifier(derivedType.name, null); // reports\r\n      if (!baseElement) continue;\r\n      if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\r\n        let basePrototype = <ClassPrototype>baseElement;\r\n        derivedPrototype.basePrototype = basePrototype;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.A_class_may_only_extend_another_class,\r\n          derivedType.range\r\n        );\r\n      }\r\n    }\r\n\r\n    // set up global aliases\r\n    var globalAliases = options.globalAliases;\r\n    if (globalAliases) {\r\n      for (let [alias, name] of globalAliases) {\r\n        if (!name.length) continue; // explicitly disabled\r\n        let element = this.elementsLookup.get(name);\r\n        if (element) this.elementsLookup.set(alias, element);\r\n        else throw new Error(\"element not found: \" + name);\r\n      }\r\n    }\r\n\r\n    // register 'Array'\r\n    var arrayPrototype = this.elementsLookup.get(\"Array\");\r\n    if (arrayPrototype) {\r\n      assert(arrayPrototype.kind == ElementKind.CLASS_PROTOTYPE);\r\n      this.arrayPrototype = <ClassPrototype>arrayPrototype;\r\n    }\r\n\r\n    // register 'String'\r\n    var stringPrototype = this.elementsLookup.get(\"String\");\r\n    if (stringPrototype) {\r\n      assert(stringPrototype.kind == ElementKind.CLASS_PROTOTYPE);\r\n      let stringInstance = (<ClassPrototype>stringPrototype).resolve(null); // reports\r\n      if (stringInstance) {\r\n        if (this.typesLookup.has(\"string\")) {\r\n          let declaration = (<ClassPrototype>stringPrototype).declaration;\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, declaration.programLevelInternalName\r\n          );\r\n        } else {\r\n          this.stringInstance = stringInstance;\r\n          this.typesLookup.set(\"string\", stringInstance.type);\r\n        }\r\n      }\r\n    }\r\n\r\n    // register 'start'\r\n    {\r\n      let element = <Element>assert(this.elementsLookup.get(\"start\"));\r\n      assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n      this.startFunction = <FunctionPrototype>element;\r\n    }\r\n\r\n    // register 'main' if present\r\n    if (this.moduleLevelExports.has(\"main\")) {\r\n      let element = <Element>this.moduleLevelExports.get(\"main\");\r\n      if (\r\n        element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n        !(<FunctionPrototype>element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\r\n      ) {\r\n        (<FunctionPrototype>element).set(CommonFlags.MAIN);\r\n        this.mainFunction = <FunctionPrototype>element;\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Sets a constant integer value. */\r\n  setConstantInteger(globalName: string, type: Type, value: I64): void {\r\n    assert(type.is(TypeFlags.INTEGER));\r\n    this.elementsLookup.set(globalName,\r\n      new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n        .withConstantIntegerValue(value)\r\n    );\r\n  }\r\n\r\n  /** Sets a constant float value. */\r\n  setConstantFloat(globalName: string, type: Type, value: f64): void {\r\n    assert(type.is(TypeFlags.FLOAT));\r\n    this.elementsLookup.set(globalName,\r\n      new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n        .withConstantFloatValue(value)\r\n    );\r\n  }\r\n\r\n  /** Tries to resolve an import by traversing exports and queued exports. */\r\n  private tryResolveImport(\r\n    externalName: string,\r\n    queuedNamedExports: Map<string,QueuedExport>\r\n  ): Element | null {\r\n    var element: Element | null;\r\n    var fileLevelExports = this.fileLevelExports;\r\n    do {\r\n      if (element = fileLevelExports.get(externalName)) return element;\r\n      let queuedExport = queuedNamedExports.get(externalName);\r\n      if (!queuedExport) break;\r\n      if (queuedExport.isReExport) {\r\n        externalName = queuedExport.externalName;\r\n        continue;\r\n      }\r\n      return this.elementsLookup.get(queuedExport.externalName);\r\n    } while (true);\r\n    return null;\r\n  }\r\n\r\n  private filterDecorators(decorators: DecoratorNode[], acceptedFlags: DecoratorFlags): DecoratorFlags {\r\n    var presentFlags = DecoratorFlags.NONE;\r\n    for (let i = 0, k = decorators.length; i < k; ++i) {\r\n      let decorator = decorators[i];\r\n      let kind = decoratorNameToKind(decorator.name);\r\n      let flag = decoratorKindToFlag(kind);\r\n      if (flag) {\r\n        if (!(acceptedFlags & flag)) {\r\n          this.error(\r\n            DiagnosticCode.Decorator_0_is_not_valid_here,\r\n            decorator.range, decorator.name.range.toString()\r\n          );\r\n        } else if (presentFlags & flag) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_decorator,\r\n            decorator.range, decorator.name.range.toString()\r\n          );\r\n        } else {\r\n          presentFlags |= flag;\r\n        }\r\n      }\r\n    }\r\n    return presentFlags;\r\n  }\r\n\r\n  /** Processes global options, if present. */\r\n  private checkGlobalOptions(\r\n    element: Element,\r\n    declaration: DeclarationStatement\r\n  ): void {\r\n    var parentNode = declaration.parent;\r\n    if (\r\n      (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\r\n      (declaration.range.source.is(CommonFlags.BUILTIN)) ||\r\n      (\r\n        declaration.range.source.isLibrary &&\r\n        element.is(CommonFlags.EXPORT) &&\r\n        (\r\n          assert(parentNode).kind == NodeKind.SOURCE ||\r\n          (\r\n            <Node>parentNode).kind == NodeKind.VARIABLE &&\r\n            assert((<Node>parentNode).parent).kind == NodeKind.SOURCE\r\n          )\r\n        )\r\n    ) {\r\n      let globalName = declaration.programLevelInternalName;\r\n      if (this.elementsLookup.has(globalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, element.internalName\r\n        );\r\n      } else {\r\n        this.elementsLookup.set(globalName, element);\r\n        if (element.is(CommonFlags.BUILTIN)) element.internalName = globalName;\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeClass(\r\n    declaration: ClassDeclaration,\r\n    queuedExtends: ClassPrototype[],\r\n    queuedImplements: ClassPrototype[],\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var simpleName = declaration.name.text;\r\n    var prototype = new ClassPrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      decorators\r\n        ? this.filterDecorators(decorators,\r\n            DecoratorFlags.GLOBAL |\r\n            DecoratorFlags.SEALED |\r\n            DecoratorFlags.UNMANAGED\r\n          )\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    var implementsTypes = declaration.implementsTypes;\r\n    if (implementsTypes) {\r\n      let numImplementsTypes = implementsTypes.length;\r\n      if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n        if (numImplementsTypes) {\r\n          this.error(\r\n            DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\r\n            Range.join(\r\n              declaration.name.range,\r\n              implementsTypes[numImplementsTypes - 1].range\r\n            )\r\n          );\r\n        }\r\n\r\n      // remember classes that implement interfaces\r\n      } else if (numImplementsTypes) {\r\n        for (let i = 0; i < numImplementsTypes; ++i) {\r\n          this.warning( // TODO\r\n            DiagnosticCode.Operation_not_supported,\r\n            implementsTypes[i].range\r\n          );\r\n        }\r\n        queuedImplements.push(prototype);\r\n      }\r\n    }\r\n\r\n    // remember classes that extend another one\r\n    if (declaration.extendsType) queuedExtends.push(prototype);\r\n\r\n    // add as namespace member if applicable\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // otherwise add to file-level exports if exported\r\n    } else if (prototype.is(CommonFlags.EXPORT)) {\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    // initialize members\r\n    var memberDeclarations = declaration.members;\r\n    for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n      let memberDeclaration = memberDeclarations[i];\r\n      switch (memberDeclaration.kind) {\r\n        case NodeKind.FIELDDECLARATION: {\r\n          this.initializeField(<FieldDeclaration>memberDeclaration, prototype);\r\n          break;\r\n        }\r\n        case NodeKind.METHODDECLARATION: {\r\n          if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n            this.initializeAccessor(<MethodDeclaration>memberDeclaration, prototype);\r\n          } else {\r\n            this.initializeMethod(<MethodDeclaration>memberDeclaration, prototype);\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          throw new Error(\"class member expected\");\r\n        }\r\n      }\r\n    }\r\n\r\n    this.checkGlobalOptions(prototype, declaration);\r\n  }\r\n\r\n  private initializeField(\r\n    declaration: FieldDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var name = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var decorators = declaration.decorators;\r\n\r\n    // static fields become global variables\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      if (classPrototype.members) {\r\n        if (classPrototype.members.has(name)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.members = new Map();\r\n      }\r\n      let staticField = new Global(\r\n        this,\r\n        name,\r\n        internalName,\r\n        Type.void, // resolved later on\r\n        declaration,\r\n        decorators\r\n          ? this.filterDecorators(decorators, DecoratorFlags.NONE)\r\n          : DecoratorFlags.NONE\r\n      );\r\n      staticField.parent = classPrototype;\r\n      classPrototype.members.set(name, staticField);\r\n      this.elementsLookup.set(internalName, staticField);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        staticField.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance fields are remembered until resolved\r\n    } else {\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(name)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      let instanceField = new FieldPrototype(\r\n        classPrototype,\r\n        name,\r\n        internalName,\r\n        declaration\r\n      );\r\n      if (decorators) this.filterDecorators(decorators, DecoratorFlags.NONE);\r\n      classPrototype.instanceMembers.set(name, instanceField);\r\n      // TBD: no need to mark as MODULE_EXPORT\r\n    }\r\n  }\r\n\r\n  private initializeMethod(\r\n    declaration: MethodDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var simpleName = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var prototype: FunctionPrototype | null = null;\r\n\r\n    var decorators = declaration.decorators;\r\n    var decoratorFlags = DecoratorFlags.NONE;\r\n    if (decorators) {\r\n      decoratorFlags = this.filterDecorators(decorators,\r\n        DecoratorFlags.OPERATOR_BINARY  |\r\n        DecoratorFlags.OPERATOR_PREFIX  |\r\n        DecoratorFlags.OPERATOR_POSTFIX |\r\n        DecoratorFlags.INLINE\r\n      );\r\n    }\r\n\r\n    // static methods become global functions\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n          internalName\r\n        );\r\n        return;\r\n      }\r\n      if (classPrototype.members) {\r\n        if (classPrototype.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.members = new Map();\r\n      }\r\n      prototype = new FunctionPrototype(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      classPrototype.members.set(simpleName, prototype);\r\n      this.elementsLookup.set(internalName, prototype);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance methods are remembered until resolved\r\n    } else {\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      prototype = new FunctionPrototype(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n      //   this.error( Unmanaged classes cannot declare abstract methods. );\r\n      // }\r\n      if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n        if (classPrototype.constructorPrototype) {\r\n          this.error(\r\n            DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n            declaration.name.range\r\n          );\r\n        } else {\r\n          prototype.set(CommonFlags.CONSTRUCTOR);\r\n          classPrototype.constructorPrototype = prototype;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers.set(simpleName, prototype);\r\n      }\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n\r\n    this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\r\n  }\r\n\r\n  private checkOperatorOverloads(\r\n    decorators: DecoratorNode[] | null,\r\n    prototype: FunctionPrototype,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    if (decorators) {\r\n      for (let i = 0, k = decorators.length; i < k; ++i) {\r\n        let decorator = decorators[i];\r\n        switch (decorator.decoratorKind) {\r\n          case DecoratorKind.OPERATOR:\r\n          case DecoratorKind.OPERATOR_BINARY:\r\n          case DecoratorKind.OPERATOR_PREFIX:\r\n          case DecoratorKind.OPERATOR_POSTFIX: {\r\n            let numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n            if (numArgs == 1) {\r\n              let firstArg = (<Expression[]>decorator.arguments)[0];\r\n              if (\r\n                firstArg.kind == NodeKind.LITERAL &&\r\n                (<LiteralExpression>firstArg).literalKind == LiteralKind.STRING\r\n              ) {\r\n                let kind = operatorKindFromDecorator(\r\n                  decorator.decoratorKind,\r\n                  (<StringLiteralExpression>firstArg).value\r\n                );\r\n                if (kind == OperatorKind.INVALID) {\r\n                  this.error(\r\n                    DiagnosticCode.Operation_not_supported,\r\n                    firstArg.range\r\n                  );\r\n                } else {\r\n                  let overloads = classPrototype.overloadPrototypes;\r\n                  if (overloads.has(kind)) {\r\n                    this.error(\r\n                      DiagnosticCode.Duplicate_function_implementation,\r\n                      firstArg.range\r\n                    );\r\n                  } else {\r\n                    prototype.operatorKind = kind;\r\n                    overloads.set(kind, prototype);\r\n                  }\r\n                }\r\n              } else {\r\n                this.error(\r\n                  DiagnosticCode.String_literal_expected,\r\n                  firstArg.range\r\n                );\r\n              }\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Expected_0_arguments_but_got_1,\r\n                decorator.range, \"1\", numArgs.toString(0)\r\n              );\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeAccessor(\r\n    declaration: MethodDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var simpleName = declaration.name.text;\r\n    var internalPropertyName = declaration.fileLevelInternalName;\r\n    var propertyElement = this.elementsLookup.get(internalPropertyName);\r\n    var isGetter = declaration.is(CommonFlags.GET);\r\n    var isNew = false;\r\n    if (propertyElement) {\r\n      if (\r\n        propertyElement.kind != ElementKind.PROPERTY ||\r\n        (isGetter\r\n          ? (<Property>propertyElement).getterPrototype\r\n          : (<Property>propertyElement).setterPrototype\r\n        ) != null\r\n      ) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalPropertyName\r\n        );\r\n        return;\r\n      }\r\n    } else {\r\n      propertyElement = new Property(\r\n        this,\r\n        simpleName,\r\n        internalPropertyName,\r\n        classPrototype\r\n      );\r\n      isNew = true;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var decoratorFlags = DecoratorFlags.NONE;\r\n    if (decorators) {\r\n      decoratorFlags = this.filterDecorators(decorators,\r\n        DecoratorFlags.INLINE\r\n      );\r\n    }\r\n\r\n    var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\r\n\r\n    // static accessors become global functions\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\r\n      if (this.elementsLookup.has(staticName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, staticName\r\n        );\r\n        return;\r\n      }\r\n      let staticPrototype = new FunctionPrototype(\r\n        this,\r\n        baseName,\r\n        staticName,\r\n        declaration,\r\n        null,\r\n        decoratorFlags\r\n      );\r\n      if (isGetter) {\r\n        (<Property>propertyElement).getterPrototype = staticPrototype;\r\n      } else {\r\n        (<Property>propertyElement).setterPrototype = staticPrototype;\r\n      }\r\n      if (isNew) {\r\n        if (classPrototype.members) {\r\n          if (classPrototype.members.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, staticName\r\n            );\r\n            return;\r\n          }\r\n        } else {\r\n          classPrototype.members = new Map();\r\n        }\r\n        classPrototype.members.set(simpleName, propertyElement); // check above\r\n      } else {\r\n        assert(classPrototype.members && classPrototype.members.has(simpleName));\r\n      }\r\n      this.elementsLookup.set(internalPropertyName, propertyElement);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance accessors are remembered until resolved\r\n    } else {\r\n      let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(baseName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalPropertyName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      let instancePrototype = new FunctionPrototype(\r\n        this,\r\n        baseName,\r\n        instanceName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      if (isGetter) {\r\n        (<Property>propertyElement).getterPrototype = instancePrototype;\r\n      } else {\r\n        (<Property>propertyElement).setterPrototype = instancePrototype;\r\n      }\r\n      classPrototype.instanceMembers.set(baseName, propertyElement);\r\n      this.elementsLookup.set(internalPropertyName, propertyElement);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n        instancePrototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeEnum(\r\n    declaration: EnumDeclaration,\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n    var simpleName = declaration.name.text;\r\n    var element = new Enum(this, simpleName, internalName, declaration);\r\n    element.parent = namespace;\r\n    this.elementsLookup.set(internalName, element);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, element);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\r\n        element.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (element.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, element);\r\n      this.currentFilespace.members.set(simpleName, element);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        element.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, element);\r\n      }\r\n    }\r\n\r\n    var values = declaration.values;\r\n    for (let i = 0, k = values.length; i < k; ++i) {\r\n      this.initializeEnumValue(values[i], element);\r\n    }\r\n\r\n    this.checkGlobalOptions(element, declaration);\r\n  }\r\n\r\n  private initializeEnumValue(\r\n    declaration: EnumValueDeclaration,\r\n    enm: Enum\r\n  ): void {\r\n    var name = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (enm.members) {\r\n      if (enm.members.has(name)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n    } else {\r\n      enm.members = new Map();\r\n    }\r\n    var value = new EnumValue(enm, this, name, internalName, declaration);\r\n    enm.members.set(name, value);\r\n    if (enm.is(CommonFlags.MODULE_EXPORT)) {\r\n      value.set(CommonFlags.MODULE_EXPORT);\r\n    }\r\n  }\r\n\r\n  private initializeExports(\r\n    statement: ExportStatement,\r\n    queuedExports: Map<string,QueuedExport>\r\n  ): void {\r\n    var members = statement.members;\r\n    if (members) { // named\r\n      for (let i = 0, k = members.length; i < k; ++i) {\r\n        this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n      }\r\n    } else { // TODO: filespace\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        statement.range\r\n      );\r\n    }\r\n  }\r\n\r\n  private setExportAndCheckLibrary(\r\n    internalName: string,\r\n    element: Element,\r\n    identifier: IdentifierExpression\r\n  ): void {\r\n    // add to file-level exports\r\n    this.fileLevelExports.set(internalName, element);\r\n\r\n    // add to filespace\r\n    var internalPath = identifier.range.source.internalPath;\r\n    var prefix = FILESPACE_PREFIX + internalPath;\r\n    var filespace = this.elementsLookup.get(prefix);\r\n    if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\r\n    assert(filespace.kind == ElementKind.FILESPACE);\r\n    var simpleName = identifier.text;\r\n    (<Filespace>filespace).members.set(simpleName, element);\r\n\r\n    // add global alias if from a library file\r\n    if (identifier.range.source.isLibrary) {\r\n      if (this.elementsLookup.has(simpleName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          identifier.range, simpleName\r\n        );\r\n      } else {\r\n        element.internalName = simpleName;\r\n        this.elementsLookup.set(simpleName, element);\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeExport(\r\n    member: ExportMember,\r\n    internalPath: string | null,\r\n    queuedExports: Map<string,QueuedExport>\r\n  ): void {\r\n    var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n    if (this.fileLevelExports.has(externalName)) {\r\n      this.error(\r\n        DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n        member.externalName.range, externalName\r\n      );\r\n      return;\r\n    }\r\n    var referencedName: string;\r\n    var referencedElement: Element | null;\r\n    var queuedExport: QueuedExport | null;\r\n\r\n    // export local element\r\n    if (internalPath == null) {\r\n      referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n      // resolve right away if the element exists\r\n      if (referencedElement = this.elementsLookup.get(referencedName)) {\r\n        this.setExportAndCheckLibrary(\r\n          externalName,\r\n          referencedElement,\r\n          member.externalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // otherwise queue it\r\n      if (queuedExports.has(externalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          member.externalName.range, externalName\r\n        );\r\n        return;\r\n      }\r\n      queuedExport = new QueuedExport();\r\n      queuedExport.isReExport = false;\r\n      queuedExport.externalName = referencedName; // -> here: local name\r\n      queuedExport.member = member;\r\n      queuedExports.set(externalName, queuedExport);\r\n\r\n    // export external element\r\n    } else {\r\n      referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n      // resolve right away if the export exists\r\n      referencedElement = this.elementsLookup.get(referencedName);\r\n      if (referencedElement) {\r\n        this.setExportAndCheckLibrary(\r\n          externalName,\r\n          referencedElement,\r\n          member.externalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // walk already known queued exports\r\n      let seen = new Set<QueuedExport>();\r\n      while (queuedExport = queuedExports.get(referencedName)) {\r\n        if (queuedExport.isReExport) {\r\n          referencedElement = this.fileLevelExports.get(queuedExport.externalName);\r\n          if (referencedElement) {\r\n            this.setExportAndCheckLibrary(\r\n              externalName,\r\n              referencedElement,\r\n              member.externalName\r\n            );\r\n            return;\r\n          }\r\n          referencedName = queuedExport.externalName;\r\n          if (seen.has(queuedExport)) break;\r\n          seen.add(queuedExport);\r\n        } else {\r\n          referencedElement = this.elementsLookup.get(queuedExport.externalName);\r\n          if (referencedElement) {\r\n            this.setExportAndCheckLibrary(\r\n              externalName,\r\n              referencedElement,\r\n              member.externalName\r\n            );\r\n            return;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n\r\n      // otherwise queue it\r\n      if (queuedExports.has(externalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          member.externalName.range, externalName\r\n        );\r\n        return;\r\n      }\r\n      queuedExport = new QueuedExport();\r\n      queuedExport.isReExport = true;\r\n      queuedExport.externalName = referencedName; // -> here: external name\r\n      queuedExport.member = member;\r\n      queuedExports.set(externalName, queuedExport);\r\n    }\r\n  }\r\n\r\n  private initializeFunction(\r\n    declaration: FunctionDeclaration,\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n    var simpleName = declaration.name.text;\r\n    var decorators = declaration.decorators;\r\n    var prototype = new FunctionPrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      null,\r\n      decorators\r\n        ? this.filterDecorators(decorators,\r\n            DecoratorFlags.GLOBAL |\r\n            DecoratorFlags.INLINE |\r\n            DecoratorFlags.EXTERNAL\r\n          )\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.parent = namespace;\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    this.checkGlobalOptions(prototype, declaration);\r\n  }\r\n\r\n  private initializeImports(\r\n    statement: ImportStatement,\r\n    queuedExports: Map<string,QueuedExport>,\r\n    queuedImports: QueuedImport[]\r\n  ): void {\r\n    var declarations = statement.declarations;\r\n    if (declarations) {\r\n      for (let i = 0, k = declarations.length; i < k; ++i) {\r\n        this.initializeImport(\r\n          declarations[i],\r\n          statement.internalPath,\r\n          queuedExports, queuedImports\r\n        );\r\n      }\r\n    } else if (statement.namespaceName) { // import * as simpleName from \"file\"\r\n      let simpleName = statement.namespaceName.text;\r\n      let internalName = (\r\n        statement.range.source.internalPath +\r\n        PATH_DELIMITER +\r\n        simpleName\r\n      );\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          statement.namespaceName.range,\r\n          internalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // resolve right away if the exact filespace exists\r\n      let filespace = this.elementsLookup.get(statement.internalPath);\r\n      if (filespace) {\r\n        this.elementsLookup.set(internalName, filespace);\r\n        return;\r\n      }\r\n\r\n      // otherwise queue it\r\n      let queuedImport = new QueuedImport();\r\n      queuedImport.localName = internalName;\r\n      let externalName = FILESPACE_PREFIX + statement.internalPath;\r\n      queuedImport.externalName = externalName;\r\n      queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\r\n      queuedImport.declaration = null; // filespace\r\n      queuedImports.push(queuedImport);\r\n    }\r\n  }\r\n\r\n  private initializeImport(\r\n    declaration: ImportDeclaration,\r\n    internalPath: string,\r\n    queuedNamedExports: Map<string,QueuedExport>,\r\n    queuedImports: QueuedImport[]\r\n  ): void {\r\n    var localName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(localName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, localName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n    // resolve right away if the exact export exists\r\n    var element: Element | null;\r\n    if (element = this.fileLevelExports.get(externalName)) {\r\n      this.elementsLookup.set(localName, element);\r\n      return;\r\n    }\r\n\r\n    // otherwise queue it\r\n    const indexPart = PATH_DELIMITER + \"index\";\r\n    var queuedImport = new QueuedImport();\r\n    queuedImport.localName = localName;\r\n    if (internalPath.endsWith(indexPart)) {\r\n      queuedImport.externalName = externalName; // try exact first\r\n      queuedImport.externalNameAlt = (\r\n        internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n        declaration.externalName.text\r\n      );\r\n    } else {\r\n      queuedImport.externalName = externalName; // try exact first\r\n      queuedImport.externalNameAlt = (\r\n        internalPath +\r\n        indexPart +\r\n        PATH_DELIMITER +\r\n        declaration.externalName.text\r\n      );\r\n    }\r\n    queuedImport.declaration = declaration; // named\r\n    queuedImports.push(queuedImport);\r\n  }\r\n\r\n  private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var simpleName = declaration.name.text;\r\n    var prototype = new InterfacePrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      decorators\r\n        ? this.filterDecorators(decorators, DecoratorFlags.GLOBAL)\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(prototype.internalName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(prototype.internalName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    var memberDeclarations = declaration.members;\r\n    for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n      let memberDeclaration = memberDeclarations[i];\r\n      switch (memberDeclaration.kind) {\r\n\r\n        case NodeKind.FIELDDECLARATION: {\r\n          this.initializeField(<FieldDeclaration>memberDeclaration, prototype);\r\n          break;\r\n        }\r\n        case NodeKind.METHODDECLARATION: {\r\n          if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n            this.initializeAccessor(<MethodDeclaration>memberDeclaration, prototype);\r\n          } else {\r\n            this.initializeMethod(<MethodDeclaration>memberDeclaration, prototype);\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          throw new Error(\"interface member expected\");\r\n        }\r\n      }\r\n    }\r\n\r\n    this.checkGlobalOptions(prototype, declaration);\r\n  }\r\n\r\n  private initializeNamespace(\r\n    declaration: NamespaceDeclaration,\r\n    queuedExtends: ClassPrototype[],\r\n    queuedImplements: ClassPrototype[],\r\n    parentNamespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var simpleName = declaration.name.text;\r\n    var namespace = this.elementsLookup.get(internalName);\r\n    if (!namespace) {\r\n      namespace = new Namespace(this, simpleName, internalName, declaration);\r\n      namespace.parent = parentNamespace;\r\n      this.elementsLookup.set(internalName, namespace);\r\n      this.checkGlobalOptions(namespace, declaration);\r\n    }\r\n\r\n    if (parentNamespace) {\r\n      if (parentNamespace.members) {\r\n        if (parentNamespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        parentNamespace.members = new Map();\r\n      }\r\n      parentNamespace.members.set(simpleName, namespace);\r\n      if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\r\n        namespace.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\r\n      let existingExport = this.fileLevelExports.get(internalName);\r\n      if (existingExport) {\r\n        if (!existingExport.is(CommonFlags.EXPORT)) {\r\n          this.error(\r\n            DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\r\n            declaration.name.range, namespace.internalName\r\n          ); // recoverable\r\n        }\r\n        namespace = existingExport; // join\r\n      } else {\r\n        this.fileLevelExports.set(internalName, namespace);\r\n      }\r\n      this.currentFilespace.members.set(simpleName, namespace);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          if (this.moduleLevelExports.get(simpleName) !== namespace) { // not merged\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n            );\r\n            return;\r\n          }\r\n        } else {\r\n          this.moduleLevelExports.set(simpleName, namespace);\r\n        }\r\n        namespace.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n\r\n    var members = declaration.members;\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      switch (members[i].kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          this.initializeClass(<ClassDeclaration>members[i], queuedExtends, queuedImplements, namespace);\r\n          break;\r\n        }\r\n        case NodeKind.ENUMDECLARATION: {\r\n          this.initializeEnum(<EnumDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          this.initializeFunction(<FunctionDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: {\r\n          this.initializeInterface(<InterfaceDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          this.initializeNamespace(<NamespaceDeclaration>members[i], queuedExtends, queuedImplements, namespace);\r\n          break;\r\n        }\r\n        case NodeKind.TYPEDECLARATION: {\r\n          // this.initializeTypeAlias(<TypeDeclaration>members[i], namespace);\r\n          // TODO: what about namespaced types?\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            members[i].range\r\n          );\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: {\r\n          this.initializeVariables(<VariableStatement>members[i], namespace);\r\n          break;\r\n        }\r\n        default: {\r\n          throw new Error(\"namespace member expected\");\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n    // type aliases are program globals\r\n    // TODO: what about namespaced types?\r\n    var name = declaration.name.text;\r\n    if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, name\r\n      );\r\n      return;\r\n    }\r\n    var alias = new TypeAlias();\r\n    alias.typeParameters = declaration.typeParameters;\r\n    alias.type = declaration.type;\r\n    this.typeAliases.set(name, alias);\r\n  }\r\n\r\n  private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n    var declarations = statement.declarations;\r\n    for (let i = 0, k = declarations.length; i < k; ++i) {\r\n      let declaration = declarations[i];\r\n      let decorators = declaration.decorators;\r\n      let internalName = declaration.fileLevelInternalName;\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        continue;\r\n      }\r\n      let simpleName = declaration.name.text;\r\n      let global = new Global(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        Type.void, // resolved later on\r\n        declaration,\r\n        decorators\r\n          ? this.filterDecorators(decorators,\r\n              DecoratorFlags.GLOBAL |\r\n              DecoratorFlags.EXTERNAL\r\n            )\r\n          : DecoratorFlags.NONE\r\n      );\r\n      global.parent = namespace;\r\n      this.elementsLookup.set(internalName, global);\r\n\r\n      if (namespace) {\r\n        if (namespace.members) {\r\n          if (namespace.members.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, internalName\r\n            );\r\n            continue;\r\n          }\r\n        } else {\r\n          namespace.members = new Map();\r\n        }\r\n        namespace.members.set(simpleName, global);\r\n        if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\r\n          global.set(CommonFlags.MODULE_EXPORT);\r\n        }\r\n      } else if (global.is(CommonFlags.EXPORT)) { // no namespace\r\n        if (this.fileLevelExports.has(internalName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n        } else {\r\n          this.fileLevelExports.set(internalName, global);\r\n        }\r\n        this.currentFilespace.members.set(simpleName, global);\r\n        if (declaration.range.source.isEntry) {\r\n          if (this.moduleLevelExports.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n            );\r\n            continue;\r\n          }\r\n          global.set(CommonFlags.MODULE_EXPORT);\r\n          this.moduleLevelExports.set(simpleName, global);\r\n        }\r\n      }\r\n      this.checkGlobalOptions(global, declaration);\r\n    }\r\n  }\r\n\r\n  /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\r\n  resolveSignature(\r\n    node: SignatureNode,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportNotFound: bool = true\r\n  ): Signature | null {\r\n    var explicitThisType = node.explicitThisType;\r\n    var thisType: Type | null = null;\r\n    if (explicitThisType) {\r\n      thisType = this.resolveType(\r\n        explicitThisType,\r\n        contextualTypeArguments,\r\n        reportNotFound\r\n      );\r\n      if (!thisType) return null;\r\n    }\r\n    var parameterTypeNodes = node.parameters;\r\n    var numParameters = parameterTypeNodes.length;\r\n    var parameterTypes = new Array<Type>(numParameters);\r\n    var parameterNames = new Array<string>(numParameters);\r\n    var requiredParameters = 0;\r\n    var hasRest = false;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      let parameterTypeNode = parameterTypeNodes[i];\r\n      switch (parameterTypeNode.parameterKind) {\r\n        case ParameterKind.DEFAULT: {\r\n          requiredParameters = i + 1;\r\n          break;\r\n        }\r\n        case ParameterKind.REST: {\r\n          assert(i == numParameters);\r\n          hasRest = true;\r\n          break;\r\n        }\r\n      }\r\n      let parameterType = this.resolveType(\r\n        assert(parameterTypeNode.type),\r\n        contextualTypeArguments,\r\n        reportNotFound\r\n      );\r\n      if (!parameterType) return null;\r\n      parameterTypes[i] = parameterType;\r\n      parameterNames[i] = parameterTypeNode.name.text;\r\n    }\r\n    var returnTypeNode = node.returnType;\r\n    var returnType: Type | null;\r\n    if (returnTypeNode) {\r\n      returnType = this.resolveType(\r\n        returnTypeNode,\r\n        contextualTypeArguments,\r\n        reportNotFound\r\n      );\r\n      if (!returnType) return null;\r\n    } else {\r\n      returnType = Type.void;\r\n    }\r\n    var signature = new Signature(parameterTypes, returnType, thisType);\r\n    signature.parameterNames = parameterNames;\r\n    signature.requiredParameters = requiredParameters;\r\n    signature.hasRest = hasRest;\r\n    return signature;\r\n  }\r\n\r\n  /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\r\n  resolveType(\r\n    node: CommonTypeNode,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportNotFound: bool = true\r\n  ): Type | null {\r\n    if (node.kind == NodeKind.SIGNATURE) {\r\n      let signature = this.resolveSignature(<SignatureNode>node, contextualTypeArguments, reportNotFound);\r\n      if (!signature) return null;\r\n      return node.isNullable\r\n        ? signature.type.asNullable()\r\n        : signature.type;\r\n    }\r\n    var typeNode = <TypeNode>node;\r\n    var simpleName = typeNode.name.text;\r\n    var globalName = simpleName;\r\n    var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName;\r\n\r\n    var element: Element | null;\r\n    if (\r\n      (element = this.elementsLookup.get(localName)) || // file-global\r\n      (element = this.elementsLookup.get(globalName))   // program-global\r\n    ) {\r\n      switch (element.kind) {\r\n        case ElementKind.ENUM: return Type.i32;\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          let instance = (<ClassPrototype>element).resolveUsingTypeArguments(\r\n            typeNode.typeArguments,\r\n            contextualTypeArguments,\r\n            null\r\n          ); // reports\r\n          if (!instance) return null;\r\n          return node.isNullable\r\n            ? instance.type.asNullable()\r\n            : instance.type;\r\n        }\r\n      }\r\n    }\r\n\r\n    // check (global) type alias\r\n    var alias = this.typeAliases.get(simpleName);\r\n    if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportNotFound);\r\n\r\n    // resolve parameters\r\n    if (typeNode.typeArguments) {\r\n      let k = typeNode.typeArguments.length;\r\n      let paramTypes = new Array<Type>(k);\r\n      for (let i = 0; i < k; ++i) {\r\n        let paramType = this.resolveType( // reports\r\n          typeNode.typeArguments[i],\r\n          contextualTypeArguments,\r\n          reportNotFound\r\n        );\r\n        if (!paramType) return null;\r\n        paramTypes[i] = paramType;\r\n      }\r\n\r\n      if (k) { // can't be a placeholder if it has parameters\r\n        let instanceKey = typesToString(paramTypes);\r\n        if (instanceKey.length) {\r\n          localName += \"<\" + instanceKey + \">\";\r\n          globalName += \"<\" + instanceKey + \">\";\r\n        }\r\n      } else if (contextualTypeArguments) {\r\n        let placeholderType = contextualTypeArguments.get(globalName);\r\n        if (placeholderType) return placeholderType;\r\n      }\r\n    }\r\n\r\n    var type: Type | null;\r\n\r\n    // check file-global / program-global type\r\n    if ((type = this.typesLookup.get(localName)) || (type = this.typesLookup.get(globalName))) {\r\n      return type;\r\n    }\r\n\r\n    if (reportNotFound) {\r\n      this.error(\r\n        DiagnosticCode.Cannot_find_name_0,\r\n        typeNode.name.range, globalName\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Resolves an array of type arguments to concrete types. */\r\n  resolveTypeArguments(\r\n    typeParameters: TypeParameterNode[],\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): Type[] | null {\r\n    var parameterCount = typeParameters.length;\r\n    var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n    if (parameterCount != argumentCount) {\r\n      if (argumentCount) {\r\n        this.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          Range.join(\r\n            (<TypeNode[]>typeArgumentNodes)[0].range,\r\n            (<TypeNode[]>typeArgumentNodes)[argumentCount - 1].range\r\n          ),\r\n          parameterCount.toString(10), argumentCount.toString(10)\r\n        );\r\n      } else if (alternativeReportNode) {\r\n        this.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\"\r\n        );\r\n      }\r\n      return null;\r\n    }\r\n    var typeArguments = new Array<Type>(parameterCount);\r\n    for (let i = 0; i < parameterCount; ++i) {\r\n      let type = this.resolveType( // reports\r\n        (<TypeNode[]>typeArgumentNodes)[i],\r\n        contextualTypeArguments,\r\n        true\r\n      );\r\n      if (!type) return null;\r\n      // TODO: check extendsType\r\n      typeArguments[i] = type;\r\n    }\r\n    return typeArguments;\r\n  }\r\n\r\n  /** Resolves an identifier to the element it refers to. */\r\n  resolveIdentifier(\r\n    identifier: IdentifierExpression,\r\n    context: Element | null\r\n  ): Element | null {\r\n    var name = identifier.text;\r\n    var element: Element | null;\r\n\r\n    if (context) {\r\n\r\n      switch (context.kind) {\r\n        case ElementKind.FUNCTION: { // search locals, use prototype\r\n          element = (<Function>context).flow.getScopedLocal(name);\r\n          if (element) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return element;\r\n          }\r\n          context = (<Function>context).prototype.parent;\r\n          break;\r\n        }\r\n        case ElementKind.CLASS: { // use prototype\r\n          context = (<Class>context).prototype.parent;\r\n          break;\r\n        }\r\n      }\r\n\r\n      // search context\r\n      while (context) {\r\n        let members = context.members;\r\n        if (members) {\r\n          if (element = members.get(name)) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return element;\r\n          }\r\n        }\r\n        context = context.parent;\r\n      }\r\n    }\r\n\r\n    // search current file\r\n    if (element = this.elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n      this.resolvedThisExpression = null;\r\n      this.resolvedElementExpression = null;\r\n      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n    }\r\n\r\n    // search global scope\r\n    if (element = this.elementsLookup.get(name)) {\r\n      this.resolvedThisExpression = null;\r\n      this.resolvedElementExpression = null;\r\n      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n    }\r\n\r\n    this.error(\r\n      DiagnosticCode.Cannot_find_name_0,\r\n      identifier.range, name\r\n    );\r\n    return null;\r\n  }\r\n\r\n  /** Resolves a property access to the element it refers to. */\r\n  resolvePropertyAccess(\r\n    propertyAccess: PropertyAccessExpression,\r\n    contextualFunction: Function\r\n  ): Element | null {\r\n    // start by resolving the lhs target (expression before the last dot)\r\n    var targetExpression = propertyAccess.expression;\r\n    var target = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n    if (!target) return null;\r\n\r\n    // at this point we know exactly what the target is, so look up the element within\r\n    var propertyName = propertyAccess.property.text;\r\n\r\n    // Resolve variable-likes to the class type they reference first\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL:\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        let classReference = (<VariableLikeElement>target).type.classReference;\r\n        if (!classReference) {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.property.range, propertyName, (<VariableLikeElement>target).type.toString()\r\n          );\r\n          return null;\r\n        }\r\n        target = classReference;\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let getter = assert((<Property>target).getterPrototype).resolve(); // reports\r\n        if (!getter) return null;\r\n        let classReference = getter.signature.returnType.classReference;\r\n        if (!classReference) {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\r\n          );\r\n          return null;\r\n        }\r\n        target = classReference;\r\n        break;\r\n      }\r\n      case ElementKind.CLASS: {\r\n        let elementExpression = this.resolvedElementExpression;\r\n        if (elementExpression) {\r\n          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);\r\n          if (!indexedGet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n              elementExpression.range, (<Class>target).internalName\r\n            );\r\n            return null;\r\n          }\r\n          let returnType = indexedGet.signature.returnType;\r\n          if (!(target = returnType.classReference)) {\r\n            this.error(\r\n              DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n              propertyAccess.property.range, propertyName, returnType.toString()\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    // Look up the member within\r\n    switch (target.kind) {\r\n      case ElementKind.CLASS_PROTOTYPE:\r\n      case ElementKind.CLASS: {\r\n        do {\r\n          let members = target.members;\r\n          let member: Element | null;\r\n          if (members && (member = members.get(propertyName))) {\r\n            this.resolvedThisExpression = targetExpression;\r\n            this.resolvedElementExpression = null;\r\n            return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\r\n          }\r\n          // traverse inherited static members on the base prototype if target is a class prototype\r\n          if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n            if ((<ClassPrototype>target).basePrototype) {\r\n              target = <ClassPrototype>(<ClassPrototype>target).basePrototype;\r\n            } else {\r\n              break;\r\n            }\r\n          // traverse inherited instance members on the base class if target is a class instance\r\n          } else if (target.kind == ElementKind.CLASS) {\r\n            if ((<Class>target).base) {\r\n              target = <Class>(<Class>target).base;\r\n            } else {\r\n              break;\r\n            }\r\n          } else {\r\n            break;\r\n          }\r\n        } while (true);\r\n        break;\r\n      }\r\n      default: { // enums or other namespace-like elements\r\n        let members = target.members;\r\n        if (members) {\r\n          let member = members.get(propertyName);\r\n          if (member) {\r\n            this.resolvedThisExpression = targetExpression;\r\n            this.resolvedElementExpression = null;\r\n            return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n      propertyAccess.property.range, propertyName, target.internalName\r\n    );\r\n    return null;\r\n  }\r\n\r\n  resolveElementAccess(\r\n    elementAccess: ElementAccessExpression,\r\n    contextualFunction: Function\r\n  ): Element | null {\r\n    var targetExpression = elementAccess.expression;\r\n    var target = this.resolveExpression(targetExpression, contextualFunction);\r\n    if (!target) return null;\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL:\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        let type = (<VariableLikeElement>target).type;\r\n        if (target = type.classReference) {\r\n          this.resolvedThisExpression = targetExpression;\r\n          this.resolvedElementExpression = elementAccess.elementExpression;\r\n          return target;\r\n        }\r\n        break;\r\n      }\r\n      case ElementKind.CLASS: { // element access on element access\r\n        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);\r\n        if (!indexedGet) {\r\n          this.error(\r\n            DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n            elementAccess.range, (<Class>target).internalName\r\n          );\r\n          return null;\r\n        }\r\n        let returnType = indexedGet.signature.returnType;\r\n        if (target = returnType.classReference) {\r\n          this.resolvedThisExpression = targetExpression;\r\n          this.resolvedElementExpression = elementAccess.elementExpression;\r\n          return target;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      targetExpression.range\r\n    );\r\n    return null;\r\n  }\r\n\r\n  resolveExpression(\r\n    expression: Expression,\r\n    contextualFunction: Function\r\n  ): Element | null {\r\n    while (expression.kind == NodeKind.PARENTHESIZED) {\r\n      expression = (<ParenthesizedExpression>expression).expression;\r\n    }\r\n    switch (expression.kind) {\r\n      case NodeKind.ASSERTION: {\r\n        let type = this.resolveType((<AssertionExpression>expression).toType); // reports\r\n        if (type) {\r\n          let classType = type.classReference;\r\n          if (classType) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return classType;\r\n          }\r\n        }\r\n        return null;\r\n      }\r\n      case NodeKind.BINARY: { // TODO: string concatenation, mostly\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case NodeKind.THIS: { // -> Class / ClassPrototype\r\n        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let explicitLocal = contextualFunction.flow.getScopedLocal(\"this\");\r\n          if (explicitLocal) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return explicitLocal;\r\n          }\r\n        }\r\n        let parent = contextualFunction.parent;\r\n        if (parent) {\r\n          this.resolvedThisExpression = null;\r\n          this.resolvedElementExpression = null;\r\n          return parent;\r\n        }\r\n        this.error(\r\n          DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n          expression.range\r\n        );\r\n        return null;\r\n      }\r\n      case NodeKind.SUPER: { // -> Class\r\n        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let explicitLocal = contextualFunction.flow.getScopedLocal(\"super\");\r\n          if (explicitLocal) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return explicitLocal;\r\n          }\r\n        }\r\n        let parent = contextualFunction.parent;\r\n        if (parent && parent.kind == ElementKind.CLASS && (parent = (<Class>parent).base)) {\r\n          this.resolvedThisExpression = null;\r\n          this.resolvedElementExpression = null;\r\n          return parent;\r\n        }\r\n        this.error(\r\n          DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n          expression.range\r\n        );\r\n        return null;\r\n      }\r\n      case NodeKind.IDENTIFIER: {\r\n        return this.resolveIdentifier(<IdentifierExpression>expression, contextualFunction);\r\n      }\r\n      case NodeKind.LITERAL: {\r\n        switch ((<LiteralExpression>expression).literalKind) {\r\n          case LiteralKind.STRING: {\r\n            this.resolvedThisExpression = expression;\r\n            this.resolvedElementExpression = null;\r\n            return this.stringInstance;\r\n          }\r\n          // case LiteralKind.ARRAY: // TODO\r\n        }\r\n        break;\r\n      }\r\n      case NodeKind.PROPERTYACCESS: {\r\n        return this.resolvePropertyAccess(\r\n          <PropertyAccessExpression>expression,\r\n          contextualFunction\r\n        );\r\n      }\r\n      case NodeKind.ELEMENTACCESS: {\r\n        return this.resolveElementAccess(\r\n          <ElementAccessExpression>expression,\r\n          contextualFunction\r\n        );\r\n      }\r\n      case NodeKind.CALL: {\r\n        let targetExpression = (<CallExpression>expression).expression;\r\n        let target = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n        if (!target) return null;\r\n        if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n          let instance = (<FunctionPrototype>target).resolveUsingTypeArguments( // reports\r\n            (<CallExpression>expression).typeArguments,\r\n            contextualFunction.flow.contextualTypeArguments,\r\n            expression\r\n          );\r\n          if (!instance) return null;\r\n          let returnType = instance.signature.returnType;\r\n          let classType = returnType.classReference;\r\n          if (classType) {\r\n            // reuse resolvedThisExpression (might be property access)\r\n            // reuse resolvedElementExpression (might be element access)\r\n            return classType;\r\n          } else {\r\n            let signature = returnType.signatureReference;\r\n            if (signature) {\r\n              let functionTarget = signature.cachedFunctionTarget;\r\n              if (!functionTarget) {\r\n                functionTarget = new FunctionTarget(this, signature);\r\n                signature.cachedFunctionTarget = functionTarget;\r\n              }\r\n              // reuse resolvedThisExpression (might be property access)\r\n              // reuse resolvedElementExpression (might be element access)\r\n              return functionTarget;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            targetExpression.range, target.internalName\r\n          );\r\n          return null;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return null;\r\n  }\r\n\r\n  // resolveExpressionType(\r\n  //   expression: Expression,\r\n  //   contextualFunction: Function\r\n  // ): Type {\r\n  //   var element = this.resolveExpression(expression, contextualFunction);\r\n  //   switch (element.kind) {\r\n\r\n  //   }\r\n  // }\r\n}\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n  /** A {@link Global}. */\r\n  GLOBAL,\r\n  /** A {@link Local}. */\r\n  LOCAL,\r\n  /** An {@link Enum}. */\r\n  ENUM,\r\n  /** An {@link EnumValue}. */\r\n  ENUMVALUE,\r\n  /** A {@link FunctionPrototype}. */\r\n  FUNCTION_PROTOTYPE,\r\n  /** A {@link Function}. */\r\n  FUNCTION,\r\n  /** A {@link FunctionTarget}. */\r\n  FUNCTION_TARGET,\r\n  /** A {@link ClassPrototype}. */\r\n  CLASS_PROTOTYPE,\r\n  /** A {@link Class}. */\r\n  CLASS,\r\n  /** An {@link InterfacePrototype}. */\r\n  INTERFACE_PROTOTYPE,\r\n  /** An {@link Interface}. */\r\n  INTERFACE,\r\n  /** A {@link FieldPrototype}. */\r\n  FIELD_PROTOTYPE,\r\n  /** A {@link Field}. */\r\n  FIELD,\r\n  /** A {@link Property}. */\r\n  PROPERTY,\r\n  /** A {@link Namespace}. */\r\n  NAMESPACE,\r\n  /** A {@link Filespace}. */\r\n  FILESPACE,\r\n}\r\n\r\nexport enum DecoratorFlags {\r\n  /** No flags set. */\r\n  NONE = 0,\r\n  /** Is a program global. */\r\n  GLOBAL = 1 << 0,\r\n  /** Is a binary operator overload. */\r\n  OPERATOR_BINARY = 1 << 1,\r\n  /** Is a unary prefix operator overload. */\r\n  OPERATOR_PREFIX = 1 << 2,\r\n  /** Is a unary postfix operator overload. */\r\n  OPERATOR_POSTFIX = 1 << 3,\r\n  /** Is an unmanaged class. */\r\n  UNMANAGED = 1 << 4,\r\n  /** Is a sealed class. */\r\n  SEALED = 1 << 5,\r\n  /** Is always inlined. */\r\n  INLINE = 1 << 6,\r\n  /** Is using a different external name. */\r\n  EXTERNAL = 1 << 7\r\n}\r\n\r\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\r\n  switch (kind) {\r\n    case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\r\n    case DecoratorKind.OPERATOR:\r\n    case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\r\n    case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\r\n    case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\r\n    case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\r\n    case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\r\n    case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\r\n    case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\r\n    default: return DecoratorFlags.NONE;\r\n  }\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n  /** Specific element kind. */\r\n  kind: ElementKind;\r\n  /** Containing {@link Program}. */\r\n  program: Program;\r\n  /** Simple name. */\r\n  simpleName: string;\r\n  /** Internal name referring to this element. */\r\n  internalName: string;\r\n  /** Common flags indicating specific traits. */\r\n  flags: CommonFlags = CommonFlags.NONE;\r\n  /** Decorator flags indicating annotated traits. */\r\n  decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\r\n  /** Namespaced member elements. */\r\n  members: Map<string,Element> | null = null;\r\n  /** Parent element, if applicable. */\r\n  parent: Element | null = null;\r\n\r\n  /** Constructs a new element, linking it to its containing {@link Program}. */\r\n  protected constructor(program: Program, simpleName: string, internalName: string) {\r\n    this.program = program;\r\n    this.simpleName = simpleName;\r\n    this.internalName = internalName;\r\n  }\r\n\r\n  /** Tests if this element has a specific flag or flags. */\r\n  is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this element has any of the specified flags. */\r\n  isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\r\n  /** Sets a specific flag or flags. */\r\n  set(flag: CommonFlags): void { this.flags |= flag; }\r\n  /** Tests if this element has a specific decorator flag or flags. */\r\n  hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\r\n}\r\n\r\n/** A filespace representing the implicit top-level namespace of a source. */\r\nexport class Filespace extends Element {\r\n\r\n  kind = ElementKind.FILESPACE;\r\n\r\n  /** File members (externally visible only). */\r\n  members: Map<string,Element>; // more specific\r\n\r\n  /** Constructs a new filespace. */\r\n  constructor(\r\n    program: Program,\r\n    source: Source\r\n  ) {\r\n    super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\r\n    this.members = new Map();\r\n  }\r\n}\r\n\r\n/** A namespace that differs from a filespace in being user-declared with a name. */\r\nexport class Namespace extends Element {\r\n\r\n  // All elements have namespace semantics. This is an explicitly declared one.\r\n  kind = ElementKind.NAMESPACE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: NamespaceDeclaration; // more specific\r\n\r\n  /** Constructs a new namespace. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: NamespaceDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n  kind = ElementKind.ENUM;\r\n\r\n  /** Declaration reference. */\r\n  declaration: EnumDeclaration;\r\n\r\n  /** Constructs a new enum. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: EnumDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n  kind = ElementKind.ENUMVALUE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: EnumValueDeclaration;\r\n  /** Constant value, if applicable. */\r\n  constantValue: i32 = 0;\r\n\r\n  constructor(\r\n    enm: Enum,\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: EnumValueDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.parent = enm;\r\n    this.declaration = declaration;\r\n  }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n  NONE,\r\n  INTEGER,\r\n  FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n  // kind varies\r\n\r\n  /** Declaration reference. */\r\n  declaration: VariableLikeDeclarationStatement | null;\r\n  /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n  type: Type;\r\n  /** Constant value kind. */\r\n  constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n  /** Constant integer value, if applicable. */\r\n  constantIntegerValue: I64;\r\n  /** Constant float value, if applicable. */\r\n  constantFloatValue: f64;\r\n\r\n  protected constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.type = type;\r\n    this.declaration = declaration;\r\n  }\r\n\r\n  withConstantIntegerValue(value: I64): this {\r\n    this.constantValueKind = ConstantValueKind.INTEGER;\r\n    this.constantIntegerValue = value;\r\n    this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n    return this;\r\n  }\r\n\r\n  withConstantFloatValue(value: f64): this {\r\n    this.constantValueKind = ConstantValueKind.FLOAT;\r\n    this.constantFloatValue = value;\r\n    this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n    return this;\r\n  }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n  kind = ElementKind.GLOBAL;\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName, type, declaration);\r\n    this.flags = declaration ? declaration.flags : CommonFlags.NONE;\r\n    this.decoratorFlags = decoratorFlags;\r\n    this.type = type; // resolved later if `void`\r\n  }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n  // not an Element on its own\r\n\r\n  /** Parameter name. */\r\n  name: string;\r\n  /** Parameter type. */\r\n  type: Type;\r\n  /** Parameter initializer. */\r\n  initializer: Expression | null;\r\n\r\n  /** Constructs a new function parameter. */\r\n  constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n    this.name = name;\r\n    this.type = type;\r\n    this.initializer = initializer;\r\n  }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n  kind = ElementKind.LOCAL;\r\n\r\n  /** Local index. */\r\n  index: i32;\r\n  /** Respective scoped global, if any. */\r\n  scopedGlobal: Global | null = null;\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    index: i32,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null = null\r\n  ) {\r\n    super(program, simpleName, simpleName, type, declaration);\r\n    this.index = index;\r\n  }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n  kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: FunctionDeclaration;\r\n  /** If an instance method, the class prototype reference. */\r\n  classPrototype: ClassPrototype | null;\r\n  /** Resolved instances. */\r\n  instances: Map<string,Function> = new Map();\r\n  /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\r\n  classTypeArguments: Type[] | null = null;\r\n  /** Operator kind, if an overload. */\r\n  operatorKind: OperatorKind = OperatorKind.INVALID;\r\n\r\n  /** Constructs a new function prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: FunctionDeclaration,\r\n    classPrototype: ClassPrototype | null = null,\r\n    decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n    this.classPrototype = classPrototype;\r\n    this.decoratorFlags = decoratorFlags;\r\n  }\r\n\r\n  /** Resolves this prototype to an instance using the specified concrete type arguments. */\r\n  resolve(\r\n    functionTypeArguments: Type[] | null = null,\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ): Function | null {\r\n    var instanceKey = functionTypeArguments ? typesToString(functionTypeArguments) : \"\";\r\n    var instance = this.instances.get(instanceKey);\r\n    if (instance) return instance;\r\n\r\n    var declaration = this.declaration;\r\n    var isInstance = this.is(CommonFlags.INSTANCE);\r\n    var classPrototype = this.classPrototype;\r\n\r\n    // inherit contextual type arguments as provided. might be overridden.\r\n    var inheritedTypeArguments = contextualTypeArguments;\r\n    contextualTypeArguments = new Map();\r\n    if (inheritedTypeArguments) {\r\n      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n        contextualTypeArguments.set(\r\n          inheritedName,\r\n          inheritedType\r\n        );\r\n      }\r\n    }\r\n\r\n    // override with class type arguments if a partially resolved instance method\r\n    var classTypeArguments = this.classTypeArguments;\r\n    if (classTypeArguments) { // set only if partially resolved\r\n      assert(this.is(CommonFlags.INSTANCE));\r\n      let classDeclaration = assert(classPrototype).declaration;\r\n      let classTypeParameters = classDeclaration.typeParameters;\r\n      let numClassTypeParameters = classTypeParameters.length;\r\n      assert(numClassTypeParameters == classTypeArguments.length);\r\n      for (let i = 0; i < numClassTypeParameters; ++i) {\r\n        contextualTypeArguments.set(\r\n          classTypeParameters[i].name.text,\r\n          classTypeArguments[i]\r\n        );\r\n      }\r\n    } else {\r\n      assert(!classTypeArguments);\r\n    }\r\n\r\n    // override with function specific type arguments\r\n    var signatureNode = declaration.signature;\r\n    var functionTypeParameters = declaration.typeParameters;\r\n    var numFunctionTypeArguments: i32;\r\n    if (functionTypeArguments && (numFunctionTypeArguments = functionTypeArguments.length)) {\r\n      assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\r\n      for (let i = 0; i < numFunctionTypeArguments; ++i) {\r\n        contextualTypeArguments.set(\r\n          (<TypeParameterNode[]>functionTypeParameters)[i].name.text,\r\n          functionTypeArguments[i]\r\n        );\r\n      }\r\n    } else {\r\n      assert(!functionTypeParameters || functionTypeParameters.length == 0);\r\n    }\r\n\r\n    // resolve class if an instance method\r\n    var classInstance: Class | null = null;\r\n    var thisType: Type | null = null;\r\n    if (isInstance) {\r\n      classInstance = assert(classPrototype).resolve(classTypeArguments, contextualTypeArguments); // reports\r\n      if (!classInstance) return null;\r\n      thisType = classInstance.type;\r\n      contextualTypeArguments.set(\"this\", thisType);\r\n    }\r\n\r\n    // resolve signature node\r\n    var signatureParameters = signatureNode.parameters;\r\n    var signatureParameterCount = signatureParameters.length;\r\n    var parameterTypes = new Array<Type>(signatureParameterCount);\r\n    var parameterNames = new Array<string>(signatureParameterCount);\r\n    var requiredParameters = 0;\r\n    for (let i = 0; i < signatureParameterCount; ++i) {\r\n      let parameterDeclaration = signatureParameters[i];\r\n      if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\r\n        requiredParameters = i + 1;\r\n      }\r\n      let typeNode = assert(parameterDeclaration.type);\r\n      let parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n      if (!parameterType) return null;\r\n      parameterTypes[i] = parameterType;\r\n      parameterNames[i] = parameterDeclaration.name.text;\r\n    }\r\n\r\n    var returnType: Type;\r\n    if (this.is(CommonFlags.SET)) {\r\n      returnType = Type.void; // not annotated\r\n    } else if (this.is(CommonFlags.CONSTRUCTOR)) {\r\n      returnType = assert(classInstance).type; // not annotated\r\n    } else {\r\n      let typeNode = assert(signatureNode.returnType);\r\n      let type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n      if (!type) return null;\r\n      returnType = type;\r\n    }\r\n\r\n    var signature = new Signature(parameterTypes, returnType, thisType);\r\n    signature.parameterNames = parameterNames;\r\n    signature.requiredParameters = requiredParameters;\r\n\r\n    var internalName = this.internalName;\r\n    if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\r\n    instance = new Function(\r\n      this,\r\n      internalName,\r\n      signature,\r\n      classInstance\r\n        ? classInstance\r\n        : classPrototype,\r\n      contextualTypeArguments\r\n    );\r\n    this.instances.set(instanceKey, instance);\r\n    this.program.instancesLookup.set(internalName, instance);\r\n    return instance;\r\n  }\r\n\r\n  /** Resolves this prototype partially by applying the specified inherited class type arguments. */\r\n  resolvePartial(classTypeArguments: Type[] | null): FunctionPrototype | null {\r\n    assert(this.is(CommonFlags.INSTANCE));\r\n    var classPrototype = assert(this.classPrototype);\r\n\r\n    if (!(classTypeArguments && classTypeArguments.length)) return this; // no need to clone\r\n\r\n    var simpleName = this.simpleName;\r\n    var partialKey = typesToString(classTypeArguments);\r\n    var partialPrototype = new FunctionPrototype(\r\n      this.program,\r\n      simpleName,\r\n      classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\r\n      this.declaration,\r\n      classPrototype,\r\n      this.decoratorFlags\r\n    );\r\n    partialPrototype.flags = this.flags;\r\n    partialPrototype.operatorKind = this.operatorKind;\r\n    partialPrototype.classTypeArguments = classTypeArguments;\r\n    return partialPrototype;\r\n  }\r\n\r\n  /** Resolves the specified type arguments prior to resolving this prototype to an instance. */\r\n  resolveUsingTypeArguments(\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    reportNode: Node\r\n  ): Function | null {\r\n    var resolvedTypeArguments: Type[] | null = null;\r\n    if (this.is(CommonFlags.GENERIC)) {\r\n      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n      resolvedTypeArguments = this.program.resolveTypeArguments( // reports\r\n        assert(this.declaration.typeParameters),\r\n        typeArgumentNodes,\r\n        contextualTypeArguments,\r\n        reportNode\r\n      );\r\n      if (!resolvedTypeArguments) return null;\r\n    }\r\n    return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n  }\r\n\r\n  /** Resolves the type arguments to use when compiling a built-in call. Must be a built-in. */\r\n  resolveBuiltinTypeArguments(\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null\r\n  ): Type[] | null {\r\n    assert(this.is(CommonFlags.BUILTIN));\r\n    var resolvedTypeArguments: Type[] | null = null;\r\n    if (typeArgumentNodes) {\r\n      let k = typeArgumentNodes.length;\r\n      resolvedTypeArguments = new Array<Type>(k);\r\n      for (let i = 0; i < k; ++i) {\r\n        let resolvedType = this.program.resolveType( // reports\r\n          typeArgumentNodes[i],\r\n          contextualTypeArguments,\r\n          true\r\n        );\r\n        if (!resolvedType) return null;\r\n        resolvedTypeArguments[i] = resolvedType;\r\n      }\r\n    }\r\n    return resolvedTypeArguments;\r\n  }\r\n\r\n  toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n  kind = ElementKind.FUNCTION;\r\n\r\n  /** Prototype reference. */\r\n  prototype: FunctionPrototype;\r\n  /** Function signature. */\r\n  signature: Signature;\r\n  /** Map of locals by name. */\r\n  localsByName: Map<string,Local> = new Map();\r\n  /** Array of locals by index. */\r\n  localsByIndex: Local[] = [];\r\n  /** List of additional non-parameter locals. */\r\n  additionalLocals: Type[] = [];\r\n  /** Current break context label. */\r\n  breakContext: string | null = null;\r\n  /** Contextual type arguments. */\r\n  contextualTypeArguments: Map<string,Type> | null;\r\n  /** Current control flow. */\r\n  flow: Flow;\r\n  /** Remembered debug locations. */\r\n  debugLocations: Range[] = [];\r\n  /** Function reference, if compiled. */\r\n  ref: FunctionRef = 0;\r\n  /** Function table index, if any. */\r\n  functionTableIndex: i32 = -1;\r\n  /** Trampoline function for calling with omitted arguments. */\r\n  trampoline: Function | null = null;\r\n  /** The outer scope, if a function expression. */\r\n  outerScope: Flow | null = null;\r\n\r\n  private nextBreakId: i32 = 0;\r\n  private breakStack: i32[] | null = null;\r\n  nextInlineId: i32 = 0;\r\n\r\n  /** Constructs a new concrete function. */\r\n  constructor(\r\n    prototype: FunctionPrototype,\r\n    internalName: string,\r\n    signature: Signature,\r\n    parent: Element | null = null,\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ) {\r\n    super(prototype.program, prototype.simpleName, internalName);\r\n    this.prototype = prototype;\r\n    this.signature = signature;\r\n    this.parent = parent;\r\n    this.flags = prototype.flags;\r\n    this.decoratorFlags = prototype.decoratorFlags;\r\n    this.contextualTypeArguments = contextualTypeArguments;\r\n    if (!(prototype.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN) || prototype.is(CommonFlags.DECLARE))) {\r\n      let localIndex = 0;\r\n      if (parent && parent.kind == ElementKind.CLASS) {\r\n        assert(this.is(CommonFlags.INSTANCE));\r\n        let local = new Local(\r\n          prototype.program,\r\n          \"this\",\r\n          localIndex++,\r\n          assert(signature.thisType)\r\n        );\r\n        this.localsByName.set(\"this\", local);\r\n        this.localsByIndex[local.index] = local;\r\n        let inheritedTypeArguments = (<Class>parent).contextualTypeArguments;\r\n        if (inheritedTypeArguments) {\r\n          if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n          for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n            if (!this.contextualTypeArguments.has(inheritedName)) {\r\n              this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n            }\r\n          }\r\n        }\r\n      } else {\r\n        assert(!this.is(CommonFlags.INSTANCE)); // internal error\r\n      }\r\n      let parameterTypes = signature.parameterTypes;\r\n      for (let i = 0, k = parameterTypes.length; i < k; ++i) {\r\n        let parameterType = parameterTypes[i];\r\n        let parameterName = signature.getParameterName(i);\r\n        let local = new Local(\r\n          prototype.program,\r\n          parameterName,\r\n          localIndex++,\r\n          parameterType\r\n          // FIXME: declaration?\r\n        );\r\n        this.localsByName.set(parameterName, local);\r\n        this.localsByIndex[local.index] = local;\r\n      }\r\n    }\r\n    this.flow = Flow.create(this);\r\n  }\r\n\r\n  /** Adds a local of the specified type, with an optional name. */\r\n  addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\r\n    // if it has a name, check previously as this method will throw otherwise\r\n    var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\r\n    if (this.is(CommonFlags.INSTANCE)) ++localIndex;\r\n    var local = new Local(\r\n      this.prototype.program,\r\n      name\r\n        ? name\r\n        : \"var$\" + localIndex.toString(10),\r\n      localIndex,\r\n      type,\r\n      declaration\r\n    );\r\n    if (name) {\r\n      if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\r\n      this.localsByName.set(name, local);\r\n    }\r\n    this.localsByIndex[local.index] = local;\r\n    this.additionalLocals.push(type);\r\n    return local;\r\n  }\r\n\r\n  private tempI32s: Local[] | null = null;\r\n  private tempI64s: Local[] | null = null;\r\n  private tempF32s: Local[] | null = null;\r\n  private tempF64s: Local[] | null = null;\r\n\r\n  /** Gets a free temporary local of the specified type. */\r\n  getTempLocal(type: Type, wrapped: bool = false): Local {\r\n    var temps: Local[] | null;\r\n    switch (type.toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s;\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s;\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s;\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s;\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    var local: Local;\r\n    if (temps && temps.length) {\r\n      local = temps.pop();\r\n      local.type = type;\r\n      local.flags = CommonFlags.NONE;\r\n    } else {\r\n      local = this.addLocal(type);\r\n    }\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.flow.setLocalWrapped(local.index, wrapped);\r\n    }\r\n    return local;\r\n  }\r\n\r\n  /** Frees the temporary local for reuse. */\r\n  freeTempLocal(local: Local): void {\r\n    if (local.is(CommonFlags.INLINED)) return;\r\n    assert(local.index >= 0);\r\n    var temps: Local[];\r\n    assert(local.type != null); // internal error\r\n    switch ((<Type>local.type).toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s || (this.tempI32s = []);\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s || (this.tempI64s = []);\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s || (this.tempF32s = []);\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s || (this.tempF64s = []);\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    assert(local.index >= 0);\r\n    temps.push(local);\r\n  }\r\n\r\n  /** Gets and immediately frees a temporary local of the specified type. */\r\n  getAndFreeTempLocal(type: Type, wrapped: bool): Local {\r\n    var temps: Local[];\r\n    switch (type.toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s || (this.tempI32s = []);\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s || (this.tempI64s = []);\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s || (this.tempF32s = []);\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s || (this.tempF64s = []);\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    var local: Local;\r\n    if (temps.length) {\r\n      local = temps[temps.length - 1];\r\n      local.type = type;\r\n    } else {\r\n      local = this.addLocal(type);\r\n      temps.push(local);\r\n    }\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.flow.setLocalWrapped(local.index, wrapped);\r\n    }\r\n    return local;\r\n  }\r\n\r\n  /** Enters a(nother) break context. */\r\n  enterBreakContext(): string {\r\n    var id = this.nextBreakId++;\r\n    if (!this.breakStack) this.breakStack = [ id ];\r\n    else this.breakStack.push(id);\r\n    return this.breakContext = id.toString(10);\r\n  }\r\n\r\n  /** Leaves the current break context. */\r\n  leaveBreakContext(): void {\r\n    assert(this.breakStack != null);\r\n    var length = (<i32[]>this.breakStack).length;\r\n    assert(length > 0);\r\n    (<i32[]>this.breakStack).pop();\r\n    if (length > 1) {\r\n      this.breakContext = (<i32[]>this.breakStack)[length - 2].toString(10);\r\n    } else {\r\n      this.breakContext = null;\r\n      this.breakStack = null;\r\n    }\r\n  }\r\n\r\n  /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n  finalize(module: Module, ref: FunctionRef): void {\r\n    this.ref = ref;\r\n    assert(!this.breakStack || !this.breakStack.length); // internal error\r\n    this.breakStack = null;\r\n    this.breakContext = null;\r\n    this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n    if (this.program.options.sourceMap) {\r\n      let debugLocations = this.debugLocations;\r\n      for (let i = 0, k = debugLocations.length; i < k; ++i) {\r\n        let debugLocation = debugLocations[i];\r\n        module.setDebugLocation(\r\n          ref,\r\n          debugLocation.debugInfoRef,\r\n          debugLocation.source.debugInfoIndex,\r\n          debugLocation.line,\r\n          debugLocation.column\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Returns the TypeScript representation of this function. */\r\n  toString(): string { return this.prototype.simpleName; }\r\n}\r\n\r\n/** A resolved function target, that is a function called indirectly by an index and signature. */\r\nexport class FunctionTarget extends Element {\r\n\r\n  kind = ElementKind.FUNCTION_TARGET;\r\n\r\n  /** Underlying signature. */\r\n  signature: Signature;\r\n  /** Function type. */\r\n  type: Type;\r\n\r\n  /** Constructs a new function target. */\r\n  constructor(program: Program, signature: Signature) {\r\n    super(program, \"\", \"\");\r\n    var simpleName = signature.toSignatureString();\r\n    this.simpleName = simpleName;\r\n    this.internalName = simpleName;\r\n    this.signature = signature;\r\n    this.type = Type.u32.asFunction(signature);\r\n  }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n  kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: FieldDeclaration;\r\n  /** Parent class prototype. */\r\n  classPrototype: ClassPrototype;\r\n\r\n  /** Constructs a new field prototype. */\r\n  constructor(\r\n    classPrototype: ClassPrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: FieldDeclaration\r\n  ) {\r\n    super(classPrototype.program, simpleName, internalName);\r\n    this.classPrototype = classPrototype;\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n  kind = ElementKind.FIELD;\r\n\r\n  /** Field prototype reference. */\r\n  prototype: FieldPrototype;\r\n  /** Field memory offset, if an instance field. */\r\n  memoryOffset: i32 = -1;\r\n\r\n  /** Constructs a new field. */\r\n  constructor(\r\n    prototype: FieldPrototype,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: FieldDeclaration,\r\n    parent: Class\r\n  ) {\r\n    super(prototype.program, prototype.simpleName, internalName, type, declaration);\r\n    this.prototype = prototype;\r\n    this.flags = prototype.flags;\r\n    this.type = type;\r\n    this.parent = parent;\r\n  }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n  kind = ElementKind.PROPERTY;\r\n\r\n  /** Parent class prototype. */\r\n  parent: ClassPrototype;\r\n  /** Getter prototype. */\r\n  getterPrototype: FunctionPrototype | null = null;\r\n  /** Setter prototype. */\r\n  setterPrototype: FunctionPrototype | null = null;\r\n\r\n  /** Constructs a new property prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    parent: ClassPrototype\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.parent = parent;\r\n  }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n  kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: ClassDeclaration;\r\n  /** Resolved instances. */\r\n  instances: Map<string,Class> = new Map();\r\n  /** Instance member prototypes. */\r\n  instanceMembers: Map<string,Element> | null = null;\r\n  /** Base class prototype, if applicable. */\r\n  basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n  /** Constructor prototype. */\r\n  constructorPrototype: FunctionPrototype | null = null;\r\n  /** Operator overload prototypes. */\r\n  overloadPrototypes: Map<OperatorKind, FunctionPrototype> = new Map();\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: ClassDeclaration,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n    this.decoratorFlags = decoratorFlags;\r\n  }\r\n\r\n  /** Resolves this prototype to an instance using the specified concrete type arguments. */\r\n  resolve(\r\n    typeArguments: Type[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ): Class | null {\r\n    var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n    var instance = this.instances.get(instanceKey);\r\n    if (instance) return instance;\r\n\r\n    // inherit contextual type arguments\r\n    var inheritedTypeArguments = contextualTypeArguments;\r\n    contextualTypeArguments = new Map();\r\n    if (inheritedTypeArguments) {\r\n      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n        contextualTypeArguments.set(inheritedName, inheritedType);\r\n      }\r\n    }\r\n\r\n    var declaration = this.declaration;\r\n    var baseClass: Class | null = null;\r\n    if (declaration.extendsType) {\r\n      let baseClassType = this.program.resolveType(declaration.extendsType, null); // reports\r\n      if (!baseClassType) return null;\r\n      if (!(baseClass = baseClassType.classReference)) {\r\n        this.program.error(\r\n          DiagnosticCode.A_class_may_only_extend_another_class,\r\n          declaration.extendsType.range\r\n        );\r\n        return null;\r\n      }\r\n      if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\r\n        this.program.error(\r\n          DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\r\n          declaration.extendsType.range, baseClass.internalName\r\n        );\r\n        return null;\r\n      }\r\n      if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != this.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n        this.program.error(\r\n          DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\r\n          Range.join(declaration.name.range, declaration.extendsType.range)\r\n        );\r\n        return null;\r\n      }\r\n    }\r\n\r\n    // override call specific contextual type arguments if provided\r\n    var i: i32, k: i32;\r\n    if (typeArguments) {\r\n      if ((k = typeArguments.length) != declaration.typeParameters.length) {\r\n        throw new Error(\"type argument count mismatch\");\r\n      }\r\n      for (i = 0; i < k; ++i) {\r\n        contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);\r\n      }\r\n    } else if (declaration.typeParameters.length) {\r\n      throw new Error(\"type argument count mismatch\");\r\n    }\r\n\r\n    var simpleName = this.simpleName;\r\n    var internalName = this.internalName;\r\n    if (instanceKey.length) {\r\n      simpleName += \"<\" + instanceKey + \">\";\r\n      internalName += \"<\" + instanceKey + \">\";\r\n    }\r\n    instance = new Class(this, simpleName, internalName, typeArguments, baseClass);\r\n    instance.contextualTypeArguments = contextualTypeArguments;\r\n    this.instances.set(instanceKey, instance);\r\n    this.program.instancesLookup.set(internalName, instance);\r\n\r\n    var memoryOffset: u32 = 0;\r\n    if (baseClass) {\r\n      memoryOffset = baseClass.currentMemoryOffset;\r\n      if (baseClass.members) {\r\n        if (!instance.members) instance.members = new Map();\r\n        for (let inheritedMember of baseClass.members.values()) {\r\n          instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Resolve constructor\r\n    if (this.constructorPrototype) {\r\n      let partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports\r\n      if (partialConstructor) instance.constructorInstance = partialConstructor.resolve(); // reports\r\n    }\r\n\r\n    // Resolve instance members\r\n    if (this.instanceMembers) {\r\n      for (let member of this.instanceMembers.values()) {\r\n        switch (member.kind) {\r\n\r\n          // Lay out fields in advance\r\n          case ElementKind.FIELD_PROTOTYPE: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let fieldDeclaration = (<FieldPrototype>member).declaration;\r\n            if (!fieldDeclaration.type) {\r\n              throw new Error(\"type expected\"); // TODO: check if parent class defines a type\r\n            }\r\n            let fieldType = this.program.resolveType( // reports\r\n              fieldDeclaration.type,\r\n              instance.contextualTypeArguments\r\n            );\r\n            if (!fieldType) break;\r\n            let fieldInstance = new Field(\r\n              <FieldPrototype>member,\r\n              internalName + INSTANCE_DELIMITER + (<FieldPrototype>member).simpleName,\r\n              fieldType,\r\n              fieldDeclaration,\r\n              instance\r\n            );\r\n            switch (fieldType.byteSize) { // align\r\n              case 1: break;\r\n              case 2: {\r\n                if (memoryOffset & 1) ++memoryOffset;\r\n                break;\r\n              }\r\n              case 4: {\r\n                if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1;\r\n                break;\r\n              }\r\n              case 8: {\r\n                if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1;\r\n                break;\r\n              }\r\n              default: assert(false);\r\n            }\r\n            fieldInstance.memoryOffset = memoryOffset;\r\n            memoryOffset += fieldType.byteSize;\r\n            instance.members.set(member.simpleName, fieldInstance);\r\n            break;\r\n          }\r\n\r\n          // Partially resolve methods as these might have type arguments on their own\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let partialPrototype = (<FunctionPrototype>member).resolvePartial(typeArguments); // reports\r\n            if (partialPrototype) {\r\n              partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\r\n              instance.members.set(member.simpleName, partialPrototype);\r\n            }\r\n            break;\r\n          }\r\n\r\n          // Clone properties and partially resolve the wrapped accessors for consistence with other methods\r\n          case ElementKind.PROPERTY: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let getterPrototype = assert((<Property>member).getterPrototype);\r\n            let setterPrototype = (<Property>member).setterPrototype;\r\n            let instanceProperty = new Property(\r\n              this.program,\r\n              member.simpleName,\r\n              internalName + INSTANCE_DELIMITER + member.simpleName,\r\n              this\r\n            );\r\n            let partialGetterPrototype = getterPrototype.resolvePartial(typeArguments);\r\n            if (!partialGetterPrototype) return null;\r\n            partialGetterPrototype.internalName = (\r\n              internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName\r\n            );\r\n            instanceProperty.getterPrototype = partialGetterPrototype;\r\n            if (setterPrototype) {\r\n              let partialSetterPrototype = setterPrototype.resolvePartial(typeArguments);\r\n              if (!partialSetterPrototype) return null;\r\n              partialSetterPrototype.internalName = (\r\n                internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName\r\n              );\r\n              instanceProperty.setterPrototype = partialSetterPrototype;\r\n            }\r\n            instance.members.set(member.simpleName, instanceProperty);\r\n            break;\r\n          }\r\n          default: assert(false);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Fully resolve operator overloads (don't have type parameters on their own)\r\n    for (let [kind, prototype] of this.overloadPrototypes) {\r\n      assert(kind != OperatorKind.INVALID);\r\n      let operatorInstance: Function | null;\r\n      if (prototype.is(CommonFlags.INSTANCE)) {\r\n        let operatorPartial = prototype.resolvePartial(typeArguments); // reports\r\n        if (!operatorPartial) continue;\r\n        operatorInstance = operatorPartial.resolve(); // reports\r\n      } else {\r\n        operatorInstance = prototype.resolve(); // reports\r\n      }\r\n      if (!operatorInstance) continue;\r\n      let overloads = instance.overloads;\r\n      if (!overloads) instance.overloads = overloads = new Map();\r\n      overloads.set(kind, operatorInstance);\r\n    }\r\n\r\n    instance.currentMemoryOffset = memoryOffset; // offsetof<this>() is the class' byte size in memory\r\n    return instance;\r\n  }\r\n\r\n  /** Resolves the specified type arguments prior to resolving this prototype to an instance. */\r\n  resolveUsingTypeArguments(\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    alternativeReportNode: Node | null\r\n  ): Class | null {\r\n    var resolvedTypeArguments: Type[] | null = null;\r\n    if (this.is(CommonFlags.GENERIC)) {\r\n      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n      resolvedTypeArguments = this.program.resolveTypeArguments(\r\n        this.declaration.typeParameters,\r\n        typeArgumentNodes,\r\n        contextualTypeArguments,\r\n        alternativeReportNode\r\n      );\r\n      if (!resolvedTypeArguments) return null;\r\n    } else {\r\n      assert(typeArgumentNodes == null || !typeArgumentNodes.length);\r\n    }\r\n    return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n  }\r\n\r\n  toString(): string {\r\n    return this.simpleName;\r\n  }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n  kind = ElementKind.CLASS;\r\n\r\n  /** Prototype reference. */\r\n  prototype: ClassPrototype;\r\n  /** Resolved type arguments. */\r\n  typeArguments: Type[] | null;\r\n  /** Resolved class type. */\r\n  type: Type;\r\n  /** Base class, if applicable. */\r\n  base: Class | null;\r\n  /** Contextual type arguments for fields and methods. */\r\n  contextualTypeArguments: Map<string,Type> | null = null;\r\n  /** Current member memory offset. */\r\n  currentMemoryOffset: u32 = 0;\r\n  /** Constructor instance. */\r\n  constructorInstance: Function | null = null;\r\n  /** Operator overloads. */\r\n  overloads: Map<OperatorKind,Function> | null = null;\r\n\r\n  /** Constructs a new class. */\r\n  constructor(\r\n    prototype: ClassPrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    typeArguments: Type[] | null = null,\r\n    base: Class | null = null\r\n  ) {\r\n    super(prototype.program, simpleName, internalName);\r\n    this.prototype = prototype;\r\n    this.flags = prototype.flags;\r\n    this.decoratorFlags = prototype.decoratorFlags;\r\n    this.typeArguments = typeArguments;\r\n    this.type = prototype.program.options.usizeType.asClass(this);\r\n    this.base = base;\r\n\r\n    // inherit static members and contextual type arguments from base class\r\n    if (base) {\r\n      let inheritedTypeArguments = base.contextualTypeArguments;\r\n      if (inheritedTypeArguments) {\r\n        if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n        for (let [baseName, baseType] of inheritedTypeArguments) {\r\n          this.contextualTypeArguments.set(baseName, baseType);\r\n        }\r\n      }\r\n    }\r\n\r\n    // apply instance-specific contextual type arguments\r\n    var declaration = this.prototype.declaration;\r\n    var i: i32, k: i32;\r\n    if (declaration) { // irrelevant for built-ins\r\n      let typeParameters = declaration.typeParameters;\r\n      if (typeArguments) {\r\n        if ((k = typeArguments.length) != typeParameters.length) {\r\n          throw new Error(\"type argument count mismatch\");\r\n        }\r\n        if (k) {\r\n          if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n          for (i = 0; i < k; ++i) {\r\n            this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n          }\r\n        }\r\n      } else if (typeParameters.length) {\r\n        throw new Error(\"type argument count mismatch\");\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Tests if a value of this class type is assignable to a target of the specified class type. */\r\n  isAssignableTo(target: Class): bool {\r\n    var current: Class | null = this;\r\n    do if (current == target) return true;\r\n    while (current = current.base);\r\n    return false;\r\n  }\r\n\r\n  /** Looks up the operator overload of the specified kind. */\r\n  lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\r\n    if (unchecked) {\r\n      switch (kind) {\r\n        case OperatorKind.INDEXED_GET: {\r\n          let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\r\n          if (uncheckedOverload) return uncheckedOverload;\r\n          break;\r\n        }\r\n        case OperatorKind.INDEXED_SET: {\r\n          let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\r\n          if (uncheckedOverload) return uncheckedOverload;\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n    var instance: Class | null = this;\r\n    do {\r\n      let overloads = instance.overloads;\r\n      if (overloads) {\r\n        let overload = overloads.get(kind);\r\n        if (overload) return overload;\r\n      }\r\n    } while (instance = instance.base);\r\n    return null;\r\n  }\r\n\r\n  toString(): string {\r\n    return this.simpleName;\r\n  }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n  kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: InterfaceDeclaration; // more specific\r\n\r\n  /** Constructs a new interface prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: InterfaceDeclaration,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName, declaration, decoratorFlags);\r\n  }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n  kind = ElementKind.INTERFACE;\r\n\r\n  /** Prototype reference. */\r\n  prototype: InterfacePrototype; // more specific\r\n  /** Base interface, if applcable. */\r\n  base: Interface | null; // more specific\r\n\r\n  /** Constructs a new interface. */\r\n  constructor(\r\n    prototype: InterfacePrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    typeArguments: Type[] = [],\r\n    base: Interface | null = null\r\n  ) {\r\n    super(prototype, simpleName, internalName, typeArguments, base);\r\n  }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n  /** No specific conditions. */\r\n  NONE = 0,\r\n\r\n  // categorical\r\n\r\n  /** This branch always returns. */\r\n  RETURNS = 1 << 0,\r\n  /** This branch always returns a wrapped value. */\r\n  RETURNS_WRAPPED = 1 << 1,\r\n  /** This branch always throws. */\r\n  THROWS = 1 << 2,\r\n  /** This branch always breaks. */\r\n  BREAKS = 1 << 3,\r\n  /** This branch always continues. */\r\n  CONTINUES = 1 << 4,\r\n  /** This branch always allocates. Constructors only. */\r\n  ALLOCATES = 1 << 5,\r\n\r\n  // conditional\r\n\r\n  /** This branch conditionally returns in a child branch. */\r\n  CONDITIONALLY_RETURNS = 1 << 6,\r\n  /** This branch conditionally throws in a child branch. */\r\n  CONDITIONALLY_THROWS = 1 << 7,\r\n  /** This branch conditionally breaks in a child branch. */\r\n  CONDITIONALLY_BREAKS = 1 << 8,\r\n  /** This branch conditionally continues in a child branch. */\r\n  CONDITIONALLY_CONTINUES = 1 << 9,\r\n  /** This branch conditionally allocates in a child branch. Constructors only. */\r\n  CONDITIONALLY_ALLOCATES = 1 << 10,\r\n\r\n  // special\r\n\r\n  /** This branch is part of inlining a function. */\r\n  INLINE_CONTEXT = 1 << 11,\r\n  /** This branch explicitly requests no bounds checking. */\r\n  UNCHECKED_CONTEXT = 1 << 12,\r\n\r\n  // masks\r\n\r\n  /** Any terminating flag. */\r\n  ANY_TERMINATING = FlowFlags.RETURNS\r\n                  | FlowFlags.THROWS\r\n                  | FlowFlags.BREAKS\r\n                  | FlowFlags.CONTINUES,\r\n\r\n  /** Any categorical flag. */\r\n  ANY_CATEGORICAL = FlowFlags.RETURNS\r\n                  | FlowFlags.RETURNS_WRAPPED\r\n                  | FlowFlags.THROWS\r\n                  | FlowFlags.BREAKS\r\n                  | FlowFlags.CONTINUES\r\n                  | FlowFlags.ALLOCATES,\r\n\r\n  /** Any conditional flag. */\r\n  ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\r\n                  | FlowFlags.CONDITIONALLY_THROWS\r\n                  | FlowFlags.CONDITIONALLY_BREAKS\r\n                  | FlowFlags.CONDITIONALLY_CONTINUES\r\n                  | FlowFlags.CONDITIONALLY_ALLOCATES\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n  /** Parent flow. */\r\n  parent: Flow | null;\r\n  /** Flow flags indicating specific conditions. */\r\n  flags: FlowFlags;\r\n  /** Function this flow belongs to. */\r\n  currentFunction: Function;\r\n  /** The label we break to when encountering a continue statement. */\r\n  continueLabel: string | null;\r\n  /** The label we break to when encountering a break statement. */\r\n  breakLabel: string | null;\r\n  /** The label we break to when encountering a return statement, when inlining. */\r\n  returnLabel: string | null;\r\n  /** The current return type. */\r\n  returnType: Type;\r\n  /** The current contextual type arguments. */\r\n  contextualTypeArguments: Map<string,Type> | null;\r\n  /** Scoped local variables. */\r\n  scopedLocals: Map<string,Local> | null = null;\r\n  /** Local variable wrap states for the first 64 locals. */\r\n  wrappedLocals: I64;\r\n  /** Local variable wrap states for locals with index >= 64. */\r\n  wrappedLocalsExt: I64[] | null;\r\n\r\n  /** Creates the parent flow of the specified function. */\r\n  static create(currentFunction: Function): Flow {\r\n    var parentFlow = new Flow();\r\n    parentFlow.parent = null;\r\n    parentFlow.flags = FlowFlags.NONE;\r\n    parentFlow.currentFunction = currentFunction;\r\n    parentFlow.continueLabel = null;\r\n    parentFlow.breakLabel = null;\r\n    parentFlow.returnLabel = null;\r\n    parentFlow.returnType = currentFunction.signature.returnType;\r\n    parentFlow.contextualTypeArguments = currentFunction.contextualTypeArguments;\r\n    parentFlow.wrappedLocals = i64_new(0);\r\n    parentFlow.wrappedLocalsExt = null;\r\n    return parentFlow;\r\n  }\r\n\r\n  private constructor() { }\r\n\r\n  /** Tests if this flow has the specified flag or flags. */\r\n  is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this flow has one of the specified flags. */\r\n  isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\r\n  /** Sets the specified flag or flags. */\r\n  set(flag: FlowFlags): void { this.flags |= flag; }\r\n  /** Unsets the specified flag or flags. */\r\n  unset(flag: FlowFlags): void { this.flags &= ~flag; }\r\n\r\n  /** Forks this flow to a child flow. */\r\n  fork(): Flow {\r\n    var branch = new Flow();\r\n    branch.parent = this;\r\n    branch.flags = this.flags;\r\n    branch.currentFunction = this.currentFunction;\r\n    branch.continueLabel = this.continueLabel;\r\n    branch.breakLabel = this.breakLabel;\r\n    branch.returnLabel = this.returnLabel;\r\n    branch.returnType = this.returnType;\r\n    branch.contextualTypeArguments = this.contextualTypeArguments;\r\n    branch.wrappedLocals = this.wrappedLocals;\r\n    branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\r\n    return branch;\r\n  }\r\n\r\n  /** Frees this flow's scoped variables. */\r\n  free(): Flow {\r\n    var parent = assert(this.parent);\r\n    if (this.scopedLocals) { // free block-scoped locals\r\n      for (let scopedLocal of this.scopedLocals.values()) {\r\n        if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n          this.currentFunction.freeTempLocal(scopedLocal);\r\n        }\r\n      }\r\n      this.scopedLocals = null;\r\n    }\r\n    return parent;\r\n  }\r\n\r\n  /** Adds a new scoped local of the specified name. */\r\n  addScopedLocal(type: Type, name: string, wrapped: bool, declaration?: VariableDeclaration): Local {\r\n    var scopedLocal = this.currentFunction.getTempLocal(type, false);\r\n    if (!this.scopedLocals) this.scopedLocals = new Map();\r\n    else {\r\n      let existingLocal = this.scopedLocals.get(name);\r\n      if (existingLocal) {\r\n        if (declaration) {\r\n          this.currentFunction.program.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range\r\n          );\r\n        } else assert(false);\r\n        return existingLocal;\r\n      }\r\n    }\r\n    scopedLocal.set(CommonFlags.SCOPED);\r\n    this.scopedLocals.set(name, scopedLocal);\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.setLocalWrapped(scopedLocal.index, wrapped);\r\n    }\r\n    return scopedLocal;\r\n  }\r\n\r\n  /** Adds a new scoped alias for the specified local. */\r\n  addScopedLocalAlias(index: i32, type: Type, name: string): Local {\r\n    if (!this.scopedLocals) this.scopedLocals = new Map();\r\n    else {\r\n      let existingLocal = this.scopedLocals.get(name);\r\n      if (existingLocal) {\r\n        let declaration = existingLocal.declaration;\r\n        if (declaration) {\r\n          this.currentFunction.program.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range\r\n          );\r\n        } else assert(false);\r\n        return existingLocal;\r\n      }\r\n    }\r\n    assert(index < this.currentFunction.localsByIndex.length);\r\n    var scopedAlias = new Local( // not SCOPED as an indicator that it isn't automatically free'd\r\n      this.currentFunction.program,\r\n      name,\r\n      index,\r\n      type,\r\n      null\r\n    );\r\n    this.scopedLocals.set(name, scopedAlias);\r\n    return scopedAlias;\r\n  }\r\n\r\n  /** Gets the local of the specified name in the current scope. */\r\n  getScopedLocal(name: string): Local | null {\r\n    var local: Local | null;\r\n    var current: Flow | null = this;\r\n    do {\r\n      if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n        return local;\r\n      }\r\n    } while (current = current.parent);\r\n    return this.currentFunction.localsByName.get(name);\r\n  }\r\n\r\n  /** Tests if the local with the specified index is considered wrapped. */\r\n  isLocalWrapped(index: i32): bool {\r\n    var map: I64;\r\n    var ext: I64[] | null;\r\n    if (index < 64) {\r\n      if (index < 0) return true; // inlined constant\r\n      map = this.wrappedLocals;\r\n    } else if (ext = this.wrappedLocalsExt) {\r\n      let i = ((index - 64) / 64) | 0;\r\n      if (i >= ext.length) return false;\r\n      map = ext[i];\r\n      index -= (i + 1) * 64;\r\n    } else {\r\n      return false;\r\n    }\r\n    return i64_ne(\r\n      i64_and(\r\n        map,\r\n        i64_shl(\r\n          i64_one,\r\n          i64_new(index)\r\n        )\r\n      ),\r\n      i64_zero\r\n    );\r\n  }\r\n\r\n  /** Sets if the local with the specified index is considered wrapped. */\r\n  setLocalWrapped(index: i32, wrapped: bool): void {\r\n    var map: I64;\r\n    var off: i32 = -1;\r\n    if (index < 64) {\r\n      if (index < 0) return; // inlined constant\r\n      map = this.wrappedLocals;\r\n    } else {\r\n      let ext = this.wrappedLocalsExt;\r\n      off = ((index - 64) / 64) | 0;\r\n      if (!ext) {\r\n        this.wrappedLocalsExt = ext = new Array(off + 1);\r\n        ext.length = 0;\r\n      }\r\n      while (ext.length <= off) ext.push(i64_new(0));\r\n      map = ext[off];\r\n      index -= (off + 1) * 64;\r\n    }\r\n    map = wrapped\r\n      ? i64_or(\r\n          map,\r\n          i64_shl(\r\n            i64_one,\r\n            i64_new(index)\r\n          )\r\n        )\r\n      : i64_and(\r\n          map,\r\n          i64_not(\r\n            i64_shl(\r\n              i64_one,\r\n              i64_new(index)\r\n            )\r\n          )\r\n        );\r\n    if (off >= 0) (<I64[]>this.wrappedLocalsExt)[off] = map;\r\n    else this.wrappedLocals = map;\r\n  }\r\n\r\n  /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\r\n  inherit(other: Flow): void {\r\n    this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\r\n    this.wrappedLocals = other.wrappedLocals;\r\n    this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\r\n  }\r\n\r\n  /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\r\n  inheritConditional(other: Flow): void {\r\n    if (other.is(FlowFlags.RETURNS)) {\r\n      this.set(FlowFlags.CONDITIONALLY_RETURNS);\r\n    }\r\n    if (other.is(FlowFlags.THROWS)) {\r\n      this.set(FlowFlags.CONDITIONALLY_THROWS);\r\n    }\r\n    if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\r\n      this.set(FlowFlags.CONDITIONALLY_BREAKS);\r\n    }\r\n    if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\r\n      this.set(FlowFlags.CONDITIONALLY_CONTINUES);\r\n    }\r\n    if (other.is(FlowFlags.ALLOCATES)) {\r\n      this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\r\n    }\r\n  }\r\n\r\n  /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\r\n  inheritMutual(left: Flow, right: Flow): void {\r\n    // categorical flags set in both arms\r\n    this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\r\n\r\n    // conditional flags set in at least one arm\r\n    this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\r\n    this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\r\n\r\n    // locals wrapped in both arms\r\n    this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\r\n    var leftExt = left.wrappedLocalsExt;\r\n    var rightExt = right.wrappedLocalsExt;\r\n    if (leftExt != null && rightExt != null) {\r\n      let thisExt = this.wrappedLocalsExt;\r\n      let minLength = min(leftExt.length, rightExt.length);\r\n      if (minLength) {\r\n        if (!thisExt) thisExt = new Array(minLength);\r\n        else while (thisExt.length < minLength) thisExt.push(i64_new(0));\r\n        for (let i = 0; i < minLength; ++i) {\r\n          thisExt[i] = i64_and(\r\n            leftExt[i],\r\n            rightExt[i]\r\n          );\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\r\n   * expression might already have overflown and returns `false` only if the operation neglects\r\n   * any possibly combination of garbage bits being present.\r\n   */\r\n  canOverflow(expr: ExpressionRef, type: Type): bool {\r\n    // TODO: the following catches most common and a few uncommon cases, but there are additional\r\n    // opportunities here, obviously.\r\n    assert(type != Type.void);\r\n\r\n    // types other than i8, u8, i16, u16 and bool do not overflow\r\n    if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\r\n\r\n    var operand: ExpressionRef;\r\n    switch (getExpressionId(expr)) {\r\n\r\n      // overflows if the local isn't wrapped or the conversion does\r\n      case ExpressionId.GetLocal: {\r\n        let currentFunction = this.currentFunction;\r\n        let local = currentFunction.localsByIndex[getGetLocalIndex(expr)];\r\n        return !currentFunction.flow.isLocalWrapped(local.index)\r\n            || canConversionOverflow(local.type, type);\r\n      }\r\n\r\n      // overflows if the value does\r\n      case ExpressionId.SetLocal: {\r\n        assert(isTeeLocal(expr));\r\n        return this.canOverflow(getSetLocalValue(expr), type);\r\n      }\r\n\r\n      // never overflows because globals are wrapped on set\r\n      case ExpressionId.GetGlobal: return false;\r\n\r\n      case ExpressionId.Binary: {\r\n        switch (getBinaryOp(expr)) {\r\n\r\n          // comparisons do not overflow (result is 0 or 1)\r\n          case BinaryOp.EqI32:\r\n          case BinaryOp.EqI64:\r\n          case BinaryOp.EqF32:\r\n          case BinaryOp.EqF64:\r\n          case BinaryOp.NeI32:\r\n          case BinaryOp.NeI64:\r\n          case BinaryOp.NeF32:\r\n          case BinaryOp.NeF64:\r\n          case BinaryOp.LtI32:\r\n          case BinaryOp.LtU32:\r\n          case BinaryOp.LtI64:\r\n          case BinaryOp.LtU64:\r\n          case BinaryOp.LtF32:\r\n          case BinaryOp.LtF64:\r\n          case BinaryOp.LeI32:\r\n          case BinaryOp.LeU32:\r\n          case BinaryOp.LeI64:\r\n          case BinaryOp.LeU64:\r\n          case BinaryOp.LeF32:\r\n          case BinaryOp.LeF64:\r\n          case BinaryOp.GtI32:\r\n          case BinaryOp.GtU32:\r\n          case BinaryOp.GtI64:\r\n          case BinaryOp.GtU64:\r\n          case BinaryOp.GtF32:\r\n          case BinaryOp.GtF64:\r\n          case BinaryOp.GeI32:\r\n          case BinaryOp.GeU32:\r\n          case BinaryOp.GeI64:\r\n          case BinaryOp.GeU64:\r\n          case BinaryOp.GeF32:\r\n          case BinaryOp.GeF64: return false;\r\n\r\n          // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\r\n          case BinaryOp.MulI32: {\r\n            return !(\r\n              (\r\n                getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n                (\r\n                  getConstValueI32(operand) == 0 ||\r\n                  (\r\n                    getConstValueI32(operand) == 1 &&\r\n                    !this.canOverflow(getBinaryRight(expr), type)\r\n                  )\r\n                )\r\n              ) || (\r\n                getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                (\r\n                  getConstValueI32(operand) == 0 ||\r\n                  (\r\n                    getConstValueI32(operand) == 1 &&\r\n                    !this.canOverflow(getBinaryLeft(expr), type)\r\n                  )\r\n                )\r\n              )\r\n            );\r\n          }\r\n\r\n          // result won't overflow if one side is a constant less than this type's mask or one side\r\n          // is wrapped\r\n          case BinaryOp.AndI32: {\r\n            // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\r\n            // because signed value garbage bits must be guaranteed to be equal to the MSB.\r\n            return !(\r\n              (\r\n                (\r\n                  getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n                ) || !this.canOverflow(operand, type)\r\n              ) || (\r\n                (\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n                ) || !this.canOverflow(operand, type)\r\n              )\r\n            );\r\n          }\r\n\r\n          // overflows if the shift doesn't clear potential garbage bits\r\n          case BinaryOp.ShlI32: {\r\n            let shift = 32 - type.size;\r\n            return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\r\n                || getConstValueI32(operand) < shift;\r\n          }\r\n\r\n          // overflows if the value does and the shift doesn't clear potential garbage bits\r\n          case BinaryOp.ShrI32: {\r\n            let shift = 32 - type.size;\r\n            return this.canOverflow(getBinaryLeft(expr), type) && (\r\n              getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\r\n              getConstValueI32(operand) < shift\r\n            );\r\n          }\r\n\r\n          // overflows if the shift does not clear potential garbage bits. if an unsigned value is\r\n          // wrapped, it can't overflow.\r\n          case BinaryOp.ShrU32: {\r\n            let shift = 32 - type.size;\r\n            return type.is(TypeFlags.SIGNED)\r\n              ? !(\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) > shift // must clear MSB\r\n                )\r\n              : this.canOverflow(getBinaryLeft(expr), type) && !(\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) >= shift // can leave MSB\r\n                );\r\n          }\r\n\r\n          // overflows if any side does\r\n          case BinaryOp.DivU32:\r\n          case BinaryOp.RemI32:\r\n          case BinaryOp.RemU32: {\r\n            return this.canOverflow(getBinaryLeft(expr), type)\r\n                || this.canOverflow(getBinaryRight(expr), type);\r\n          }\r\n        }\r\n        break;\r\n      }\r\n\r\n      case ExpressionId.Unary: {\r\n        switch (getUnaryOp(expr)) {\r\n\r\n          // comparisons do not overflow (result is 0 or 1)\r\n          case UnaryOp.EqzI32:\r\n          case UnaryOp.EqzI64: return false;\r\n\r\n          // overflow if the maximum result (32) cannot be represented in the target type\r\n          case UnaryOp.ClzI32:\r\n          case UnaryOp.CtzI32:\r\n          case UnaryOp.PopcntI32: return type.size < 7;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // overflows if the value cannot be represented in the target type\r\n      case ExpressionId.Const: {\r\n        let value: i32 = 0;\r\n        switch (getExpressionType(expr)) {\r\n          case NativeType.I32: { value = getConstValueI32(expr); break; }\r\n          case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\r\n          case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\r\n          case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\r\n          default: assert(false);\r\n        }\r\n        switch (type.kind) {\r\n          case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\r\n          case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\r\n          case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\r\n          case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\r\n          case TypeKind.BOOL: return (value & ~1) != 0;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // overflows if the conversion does\r\n      case ExpressionId.Load: {\r\n        let fromType: Type;\r\n        switch (getLoadBytes(expr)) {\r\n          case 1:  { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\r\n          case 2:  { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\r\n          default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\r\n        }\r\n        return canConversionOverflow(fromType, type);\r\n      }\r\n\r\n      // overflows if the result does, which is either\r\n      // - the last expression of the block, by contract, if the block doesn't have a label\r\n      // - the last expression or the value of an inner br if the block has a label (TODO)\r\n      case ExpressionId.Block: {\r\n        if (!getBlockName(expr)) {\r\n          let size = assert(getBlockChildCount(expr));\r\n          let last = getBlockChild(expr, size - 1);\r\n          return this.canOverflow(last, type);\r\n        }\r\n        // actually, brs with a value that'd be handled here is not emitted atm\r\n        break;\r\n      }\r\n\r\n      // overflows if either side does\r\n      case ExpressionId.If: {\r\n        return this.canOverflow(getIfTrue(expr), type)\r\n            || this.canOverflow(assert(getIfFalse(expr)), type);\r\n      }\r\n\r\n      // overflows if either side does\r\n      case ExpressionId.Select: {\r\n        return this.canOverflow(getSelectThen(expr), type)\r\n            || this.canOverflow(getSelectElse(expr), type);\r\n      }\r\n\r\n      // overflows if the call does not return a wrapped value or the conversion does\r\n      case ExpressionId.Call: {\r\n        let program = this.currentFunction.program;\r\n        let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\r\n        assert(instance.kind == ElementKind.FUNCTION);\r\n        let returnType = (<Function>instance).signature.returnType;\r\n        return !(<Function>instance).flow.is(FlowFlags.RETURNS_WRAPPED)\r\n            || canConversionOverflow(returnType, type);\r\n      }\r\n\r\n      // doesn't technically overflow\r\n      case ExpressionId.Unreachable: return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n  finalize(): void {\r\n    assert(this.parent == null); // must be the topmost parent flow\r\n    this.continueLabel = null;\r\n    this.breakLabel = null;\r\n    this.returnLabel = null;\r\n    this.contextualTypeArguments = null;\r\n  }\r\n}\r\n\r\n/** Tests if a conversion from one type to another can technically overflow. */\r\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\r\n  var fromSize = fromType.byteSize;\r\n  var toSize = toType.byteSize;\r\n  return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\r\n      || fromSize > toSize\r\n      || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\r\n}\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * Mappings from AssemblyScript types to WebAssembly types.\r\n * @module types\r\n *//***/\r\n\r\nimport {\r\n  Class,\r\n  FunctionTarget\r\n} from \"./program\";\r\n\r\nimport {\r\n  NativeType,\r\n  ExpressionRef,\r\n  Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n  // signed integers\r\n\r\n  /** An 8-bit signed integer. */\r\n  I8,\r\n  /** A 16-bit signed integer. */\r\n  I16,\r\n  /** A 32-bit signed integer. */\r\n  I32,\r\n  /** A 64-bit signed integer. */\r\n  I64,\r\n  /** A 32-bit/64-bit signed integer, depending on the target. */\r\n  ISIZE,\r\n\r\n  // unsigned integers\r\n\r\n  /** An 8-bit unsigned integer. */\r\n  U8,\r\n  /** A 16-bit unsigned integer. */\r\n  U16,\r\n  /** A 32-bit unsigned integer. Also the base of function types. */\r\n  U32,\r\n  /** A 64-bit unsigned integer. */\r\n  U64,\r\n  /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\r\n  USIZE,\r\n  /** A 1-bit unsigned integer. */\r\n  BOOL, // sic\r\n\r\n  // floats\r\n\r\n  /** A 32-bit float. */\r\n  F32,\r\n  /** A 64-bit double. */\r\n  F64,\r\n\r\n  // other\r\n\r\n  /** No return type. */\r\n  VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n  NONE = 0,\r\n  /** Is a signed type that can represent negative values. */\r\n  SIGNED = 1 << 0,\r\n  /** Is an unsigned type that cannot represent negative values. */\r\n  UNSIGNED = 1 << 1,\r\n  /** Is an integer type. */\r\n  INTEGER = 1 << 2,\r\n  /** Is a floating point type. */\r\n  FLOAT = 1 << 3,\r\n  /** Is a pointer type. */\r\n  POINTER = 1 << 4,\r\n  /** Is smaller than 32-bits. */\r\n  SHORT = 1 << 5,\r\n  /** Is larger than 32-bits. */\r\n  LONG = 1 << 6,\r\n  /** Is a value type. */\r\n  VALUE = 1 << 7,\r\n  /** Is a reference type. */\r\n  REFERENCE = 1 << 8,\r\n  /** Is a nullable type. */\r\n  NULLABLE = 1 << 9\r\n}\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n  /** Type kind. */\r\n  kind: TypeKind;\r\n  /** Type flags. */\r\n  flags: TypeFlags;\r\n  /** Size in bits. */\r\n  size: u32;\r\n  /** Size in bytes. */\r\n  byteSize: i32;\r\n  /** Underlying class reference, if a class type. */\r\n  classReference: Class | null;\r\n  /** Underlying signature reference, if a function type. */\r\n  signatureReference: Signature | null;\r\n  /** Respective non-nullable type, if nullable. */\r\n  nonNullableType: Type;\r\n  /** Cached nullable type, if non-nullable. */\r\n  private cachedNullableType: Type | null = null;\r\n\r\n  /** Constructs a new resolved type. */\r\n  constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\r\n    this.kind = kind;\r\n    this.flags = flags;\r\n    this.size = size;\r\n    this.byteSize = <i32>ceil<f64>(<f64>size / 8);\r\n    this.classReference = null;\r\n    this.signatureReference = null;\r\n    this.nonNullableType = this;\r\n  }\r\n\r\n  /** Returns the closest int type representing this type. */\r\n  get intType(): Type {\r\n    switch (this.kind) {\r\n      case TypeKind.I8: return Type.i8;\r\n      case TypeKind.I16: return Type.i16;\r\n      case TypeKind.F32:\r\n      case TypeKind.I32: return Type.i32;\r\n      case TypeKind.F64:\r\n      case TypeKind.I64: return Type.i64;\r\n      case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\r\n      case TypeKind.U8: return Type.u8;\r\n      case TypeKind.U16: return Type.u16;\r\n      case TypeKind.U32: return Type.u32;\r\n      case TypeKind.U64: return Type.u64;\r\n      case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\r\n      case TypeKind.BOOL:\r\n      default: return Type.i32;\r\n    }\r\n  }\r\n\r\n  /** Computes the sign-extending shift in the target type. */\r\n  computeSmallIntegerShift(targetType: Type): u32 {\r\n    return targetType.size - this.size;\r\n  }\r\n\r\n  /** Computes the truncating mask in the target type. */\r\n  computeSmallIntegerMask(targetType: Type): u32 {\r\n    var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\r\n    return ~0 >>> (targetType.size - size);\r\n  }\r\n\r\n  /** Tests if this type has (all of) the specified flags. */\r\n  is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\r\n  /** Tests if this type has any of the specified flags. */\r\n  isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\r\n\r\n  /** Composes a class type from this type and a class. */\r\n  asClass(classType: Class): Type {\r\n    assert(this.kind == TypeKind.USIZE && !this.classReference);\r\n    var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n    ret.classReference = classType;\r\n    return ret;\r\n  }\r\n\r\n  /** Composes a function type from this type and a function. */\r\n  asFunction(signature: Signature): Type {\r\n    assert(this.kind == TypeKind.U32 && !this.signatureReference);\r\n    var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n    ret.signatureReference = signature;\r\n    return ret;\r\n  }\r\n\r\n  /** Composes the respective nullable type of this type. */\r\n  asNullable(): Type {\r\n    assert(this.is(TypeFlags.REFERENCE));\r\n    if (!this.cachedNullableType) {\r\n      assert(!this.is(TypeFlags.NULLABLE));\r\n      this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n      this.cachedNullableType.nonNullableType = this;\r\n      this.cachedNullableType.classReference = this.classReference;       // either a class reference\r\n      this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\r\n    }\r\n    return this.cachedNullableType;\r\n  }\r\n\r\n  /** Tests if a value of this type is assignable to a target of the specified type. */\r\n  isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\r\n    var currentClass: Class | null;\r\n    var targetClass: Class | null;\r\n    var currentFunction: Signature | null;\r\n    var targetFunction: Signature | null;\r\n    if (this.is(TypeFlags.REFERENCE)) {\r\n      if (target.is(TypeFlags.REFERENCE)) {\r\n        if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\r\n          if (currentClass = this.classReference) {\r\n            if (targetClass = target.classReference) {\r\n              return currentClass.isAssignableTo(targetClass);\r\n            }\r\n          } else if (currentFunction = this.signatureReference) {\r\n            if (targetFunction = target.signatureReference) {\r\n              return currentFunction.isAssignableTo(targetFunction);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } else if (!target.is(TypeFlags.REFERENCE)) {\r\n      if (this.is(TypeFlags.INTEGER)) {\r\n        if (target.is(TypeFlags.INTEGER)) {\r\n          if (!signednessIsRelevant || this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)) {\r\n            return this.size <= target.size;\r\n          }\r\n        } else if (target.kind == TypeKind.F32) {\r\n          return this.size <= 23; // mantissa bits\r\n        } else if (target.kind == TypeKind.F64) {\r\n          return this.size <= 52; // ^\r\n        }\r\n      } else if (this.is(TypeFlags.FLOAT)) {\r\n        if (target.is(TypeFlags.FLOAT)) {\r\n          return this.size <= target.size;\r\n        }\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  /** Determines the common compatible type of two types, if any. */\r\n  static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\r\n    if (right.isAssignableTo(left, signednessIsImportant)) return left;\r\n    else if (left.isAssignableTo(right, signednessIsImportant)) return right;\r\n    return null;\r\n  }\r\n\r\n  /** Converts this type to its TypeScript representation. */\r\n  toString(kindOnly: bool = false): string {\r\n    if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\r\n      let classReference = this.classReference;\r\n      if (classReference) {\r\n        return this.is(TypeFlags.NULLABLE)\r\n          ? classReference.toString() + \" | null\"\r\n          : classReference.toString();\r\n      }\r\n      let signatureReference = this.signatureReference;\r\n      if (signatureReference) {\r\n        return this.is(TypeFlags.NULLABLE)\r\n          ? \"(\" + signatureReference.toString(true) + \") | null\"\r\n          : signatureReference.toString(true);\r\n      }\r\n      assert(false);\r\n    }\r\n    switch (this.kind) {\r\n      case TypeKind.I8: return \"i8\";\r\n      case TypeKind.I16: return \"i16\";\r\n      case TypeKind.I32: return \"i32\";\r\n      case TypeKind.I64: return \"i64\";\r\n      case TypeKind.ISIZE: return \"isize\";\r\n      case TypeKind.U8: return \"u8\";\r\n      case TypeKind.U16: return \"u16\";\r\n      case TypeKind.U32: return \"u32\";\r\n      case TypeKind.U64: return \"u64\";\r\n      case TypeKind.USIZE: return \"usize\";\r\n      case TypeKind.BOOL: return \"bool\";\r\n      case TypeKind.F32: return \"f32\";\r\n      case TypeKind.F64: return \"f64\";\r\n      default: assert(false);\r\n      case TypeKind.VOID: return \"void\";\r\n    }\r\n  }\r\n\r\n  // Binaryen specific\r\n\r\n  /** Converts this type to its respective native type. */\r\n  toNativeType(): NativeType {\r\n    switch (this.kind) {\r\n      default: return NativeType.I32;\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return NativeType.I64;\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n      case TypeKind.F32: return NativeType.F32;\r\n      case TypeKind.F64: return NativeType.F64;\r\n      case TypeKind.VOID:  return NativeType.None;\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `0` value. */\r\n  toNativeZero(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(0);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(0);\r\n      case TypeKind.F32: return module.createF32(0);\r\n      case TypeKind.F64: return module.createF64(0);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `1` value. */\r\n  toNativeOne(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(1);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(1);\r\n      case TypeKind.F32: return module.createF32(1);\r\n      case TypeKind.F64: return module.createF64(1);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `-1` value. */\r\n  toNativeNegOne(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(-1);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(-1, -1);\r\n      case TypeKind.F32: return module.createF32(-1);\r\n      case TypeKind.F64: return module.createF64(-1);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its signature string. */\r\n  toSignatureString(): string {\r\n    switch (this.kind) {\r\n      default: return \"i\";\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return \"I\";\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\r\n      case TypeKind.F32: return \"f\";\r\n      case TypeKind.F64: return \"F\";\r\n      case TypeKind.VOID: return \"v\";\r\n    }\r\n  }\r\n\r\n  // Types\r\n\r\n  /** An 8-bit signed integer. */\r\n  static readonly i8: Type  = new Type(TypeKind.I8,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   8\r\n  );\r\n\r\n  /** A 16-bit signed integer. */\r\n  static readonly i16: Type = new Type(TypeKind.I16,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  16\r\n  );\r\n\r\n  /** A 32-bit signed integer. */\r\n  static readonly i32: Type = new Type(TypeKind.I32,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit signed integer. */\r\n  static readonly i64: Type = new Type(TypeKind.I64,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 32-bit signed size. WASM32 only. */\r\n  static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit signed size. WASM64 only. */\r\n  static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** An 8-bit unsigned integer. */\r\n  static readonly u8: Type = new Type(TypeKind.U8,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   8\r\n  );\r\n\r\n  /** A 16-bit unsigned integer. */\r\n  static readonly u16: Type = new Type(TypeKind.U16,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  16\r\n  );\r\n\r\n  /** A 32-bit unsigned integer. */\r\n  static readonly u32: Type = new Type(TypeKind.U32,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit unsigned integer. */\r\n  static readonly u64: Type = new Type(TypeKind.U64,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 32-bit unsigned size. WASM32 only. */\r\n  static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit unsigned size. WASM64 only. */\r\n  static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 1-bit unsigned integer. */\r\n  static readonly bool: Type = new Type(TypeKind.BOOL,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   1\r\n  );\r\n\r\n  /** A 32-bit float. */\r\n  static readonly f32: Type = new Type(TypeKind.F32,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.FLOAT    |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit float. */\r\n  static readonly f64: Type = new Type(TypeKind.F64,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.FLOAT    |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** No return type. */\r\n  static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n  var numTypes = types.length;\r\n  var ret = new Array<NativeType>(numTypes);\r\n  for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\r\n  return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n  var numTypes = types.length;\r\n  if (!numTypes) return \"\";\r\n  var sb = new Array<string>(numTypes);\r\n  for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\r\n  return sb.join(\",\");\r\n}\r\n\r\n/** Represents a fully resolved function signature. */\r\nexport class Signature {\r\n\r\n  /** Parameter types, if any, excluding `this`. */\r\n  parameterTypes: Type[];\r\n  /** Parameter names, if known, excluding `this`. */\r\n  parameterNames: string[] | null;\r\n  /** Number of required parameters excluding `this`. Other parameters are considered optional. */\r\n  requiredParameters: i32;\r\n  /** Return type. */\r\n  returnType: Type;\r\n  /** This type, if an instance signature. */\r\n  thisType: Type | null;\r\n  /** Whether the last parameter is a rest parameter. */\r\n  hasRest: bool;\r\n  /** Cached {@link FunctionTarget}. */\r\n  cachedFunctionTarget: FunctionTarget | null = null;\r\n  /** Respective function type. */\r\n  type: Type;\r\n\r\n  /** Constructs a new signature. */\r\n  constructor(\r\n    parameterTypes: Type[] | null = null,\r\n    returnType: Type | null = null,\r\n    thisType: Type | null = null\r\n  ) {\r\n    this.parameterTypes = parameterTypes ? parameterTypes : [];\r\n    this.parameterNames = null;\r\n    this.requiredParameters = 0;\r\n    this.returnType = returnType ? returnType : Type.void;\r\n    this.thisType = thisType;\r\n    this.hasRest = false;\r\n    this.type = Type.u32.asFunction(this);\r\n  }\r\n\r\n  /** Gets the known or, alternatively, generic parameter name at the specified index. */\r\n  getParameterName(index: i32): string {\r\n    var parameterNames = this.parameterNames;\r\n    return parameterNames && parameterNames.length > index\r\n      ? parameterNames[index]\r\n      : getDefaultParameterName(index);\r\n  }\r\n\r\n  /** Tests if a value of this function type is assignable to a target of the specified function type. */\r\n  isAssignableTo(target: Signature): bool {\r\n    // TODO: maybe cache results?\r\n\r\n    // check `this` type\r\n    var thisThisType = this.thisType;\r\n    var targetThisType = target.thisType;\r\n    if (thisThisType) {\r\n      if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\r\n    } else if (targetThisType) {\r\n      return false;\r\n    }\r\n\r\n    // check rest parameter\r\n    if (this.hasRest != target.hasRest) return false; // TODO\r\n\r\n    // check parameter types\r\n    var thisParameterTypes = this.parameterTypes;\r\n    var targetParameterTypes = target.parameterTypes;\r\n    var numParameters = thisParameterTypes.length;\r\n    if (numParameters != targetParameterTypes.length) return false;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      let thisParameterType = thisParameterTypes[i];\r\n      let targetParameterType = targetParameterTypes[i];\r\n      if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\r\n    }\r\n\r\n    // check return type\r\n    var thisReturnType = this.returnType;\r\n    var targetReturnType = target.returnType;\r\n    return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\r\n  }\r\n\r\n  /** Converts a signature to a function type string. */\r\n  static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\r\n    var sb = [];\r\n    if (thisType) sb.push(thisType.toSignatureString());\r\n    if (parameterTypes) {\r\n      for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\r\n    }\r\n    sb.push(returnType.toSignatureString());\r\n    return sb.join(\"\");\r\n  }\r\n\r\n  /** Converts this signature to a function type string. */\r\n  toSignatureString(): string {\r\n    return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\r\n  }\r\n\r\n  /** Converts this signature to a string. */\r\n  toString(includeThis: bool = false): string {\r\n    var sb = new Array<string>();\r\n    sb.push(\"(\");\r\n    var index = 0;\r\n    var thisType = this.thisType;\r\n    if (thisType) {\r\n      if (includeThis) {\r\n        sb.push(\"this: \");\r\n        sb.push(thisType.toString());\r\n        index = 1;\r\n      }\r\n    }\r\n    var parameters = this.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    if (numParameters) {\r\n      let names = this.parameterNames;\r\n      let numNames = names ? names.length : 0;\r\n      let optionalStart = this.requiredParameters;\r\n      let restIndex = this.hasRest ? numParameters - 1 : -1;\r\n      for (let i = 0; i < numParameters; ++i, ++index) {\r\n        if (index) sb.push(\", \");\r\n        if (i == restIndex) sb.push(\"...\");\r\n        if (i < numNames) sb.push((<string[]>names)[i]);\r\n        else sb.push(getDefaultParameterName(i));\r\n        if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\r\n        else sb.push(\": \");\r\n        sb.push(parameters[i].toString());\r\n      }\r\n    }\r\n    sb.push(\") => \");\r\n    sb.push(this.returnType.toString());\r\n    return sb.join(\"\");\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\n// Cached default parameter names used where names are unknown.\r\nvar cachedDefaultParameterNames: string[] | null = null;\r\n\r\n/** Gets the cached default parameter name for the specified index. */\r\nexport function getDefaultParameterName(index: i32): string {\r\n  if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\r\n  for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\r\n    cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\r\n  }\r\n  return cachedDefaultParameterNames[index - 1];\r\n}\r\n","/**\r\n * A TypeScript tokenizer modified for AssemblyScript.\r\n *\r\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\r\n * ambiguous tokens.\r\n *\r\n * @module tokenizer\r\n *//***/\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticMessage,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Source,\r\n  CommentKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n  CharCode,\r\n  isLineBreak,\r\n  isWhiteSpace,\r\n  isIdentifierStart,\r\n  isIdentifierPart,\r\n  isDecimalDigit,\r\n  isOctalDigit,\r\n  isKeywordCharacter\r\n} from \"./util\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n  // keywords\r\n  // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n  ABSTRACT,\r\n  AS,\r\n  ASYNC,\r\n  AWAIT,        // ES2017\r\n  BREAK,        // ES2017\r\n  CASE,         // ES2017\r\n  CATCH,        // ES2017\r\n  CLASS,        // ES2017\r\n  CONST,        // ES2017\r\n  CONTINUE,     // ES2017\r\n  CONSTRUCTOR,\r\n  DEBUGGER,     // ES2017\r\n  DECLARE,\r\n  DEFAULT,      // ES2017\r\n  DELETE,       // ES2017\r\n  DO,           // ES2017\r\n  ELSE,         // ES2017\r\n  ENUM,         // ES2017 future\r\n  EXPORT,       // ES2017\r\n  EXTENDS,      // ES2017\r\n  FALSE,        // ES\r\n  FINALLY,      // ES2017\r\n  FOR,          // ES2017\r\n  FROM,         // AS possible identifier\r\n  FUNCTION,     // ES2017\r\n  GET,\r\n  IF,           // ES2017\r\n  IMPLEMENTS,   // ES2017 non-lexical\r\n  IMPORT,       // ES2017\r\n  IN,           // ES2017\r\n  INSTANCEOF,   // ES2017\r\n  INTERFACE,    // ES2017 non-lexical\r\n  IS,\r\n  KEYOF,\r\n  LET,          // ES2017 non-lexical\r\n  MODULE,       // AS possible identifier\r\n  NAMESPACE,    // AS possible identifier\r\n  NEW,          // ES2017\r\n  NULL,         // ES\r\n  OF,\r\n  PACKAGE,      // ES2017 non-lexical\r\n  PRIVATE,      // ES2017 non-lexical\r\n  PROTECTED,    // ES2017 non-lexical\r\n  PUBLIC,       // ES2017 non-lexical\r\n  READONLY,\r\n  RETURN,       // ES2017\r\n  SET,\r\n  STATIC,       // ES2017 non-lexical\r\n  SUPER,        // ES2017\r\n  SWITCH,       // ES2017\r\n  THIS,         // ES2017\r\n  THROW,        // ES2017\r\n  TRUE,         // ES\r\n  TRY,          // ES2017\r\n  TYPE,         // AS possible identifier\r\n  TYPEOF,       // ES2017\r\n  VAR,          // ES2017\r\n  VOID,         // ES2017\r\n  WHILE,        // ES2017\r\n  WITH,         // ES2017\r\n  YIELD,        // ES2017\r\n\r\n  // punctuation\r\n\r\n  OPENBRACE,\r\n  CLOSEBRACE,\r\n  OPENPAREN,\r\n  CLOSEPAREN,\r\n  OPENBRACKET,\r\n  CLOSEBRACKET,\r\n  DOT,\r\n  DOT_DOT_DOT,\r\n  SEMICOLON,\r\n  COMMA,\r\n  LESSTHAN,\r\n  GREATERTHAN,\r\n  LESSTHAN_EQUALS,\r\n  GREATERTHAN_EQUALS,\r\n  EQUALS_EQUALS,\r\n  EXCLAMATION_EQUALS,\r\n  EQUALS_EQUALS_EQUALS,\r\n  EXCLAMATION_EQUALS_EQUALS,\r\n  EQUALS_GREATERTHAN,\r\n  PLUS,\r\n  MINUS,\r\n  ASTERISK_ASTERISK,\r\n  ASTERISK,\r\n  SLASH,\r\n  PERCENT,\r\n  PLUS_PLUS,\r\n  MINUS_MINUS,\r\n  LESSTHAN_LESSTHAN,\r\n  GREATERTHAN_GREATERTHAN,\r\n  GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n  AMPERSAND,\r\n  BAR,\r\n  CARET,\r\n  EXCLAMATION,\r\n  TILDE,\r\n  AMPERSAND_AMPERSAND,\r\n  BAR_BAR,\r\n  QUESTION,\r\n  COLON,\r\n  EQUALS,\r\n  PLUS_EQUALS,\r\n  MINUS_EQUALS,\r\n  ASTERISK_EQUALS,\r\n  ASTERISK_ASTERISK_EQUALS,\r\n  SLASH_EQUALS,\r\n  PERCENT_EQUALS,\r\n  LESSTHAN_LESSTHAN_EQUALS,\r\n  GREATERTHAN_GREATERTHAN_EQUALS,\r\n  GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n  AMPERSAND_EQUALS,\r\n  BAR_EQUALS,\r\n  CARET_EQUALS,\r\n  AT,\r\n\r\n  // literals\r\n\r\n  IDENTIFIER,\r\n  STRINGLITERAL,\r\n  INTEGERLITERAL,\r\n  FLOATLITERAL,\r\n\r\n  // meta\r\n\r\n  INVALID,\r\n  ENDOFFILE\r\n}\r\n\r\nexport enum IdentifierHandling {\r\n  DEFAULT,\r\n  PREFER,\r\n  ALWAYS\r\n}\r\n\r\nexport function tokenFromKeyword(text: string): Token {\r\n  assert(text.length);\r\n  switch (text.charCodeAt(0)) {\r\n    case CharCode.a: {\r\n      switch (text) {\r\n        case \"abstract\": return Token.ABSTRACT;\r\n        case \"as\": return Token.AS;\r\n        case \"async\": return Token.ASYNC;\r\n        case \"await\": return Token.AWAIT;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.b: {\r\n      switch (text) {\r\n        case \"break\": return Token.BREAK;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.c: {\r\n      switch (text) {\r\n        case \"case\": return Token.CASE;\r\n        case \"catch\": return Token.CATCH;\r\n        case \"class\": return Token.CLASS;\r\n        case \"continue\": return Token.CONTINUE;\r\n        case \"const\": return Token.CONST;\r\n        case \"constructor\": return Token.CONSTRUCTOR;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.d: {\r\n      switch (text) {\r\n        case \"debugger\": return Token.DEBUGGER;\r\n        case \"declare\": return Token.DECLARE;\r\n        case \"default\": return Token.DEFAULT;\r\n        case \"delete\": return Token.DELETE;\r\n        case \"do\": return Token.DO;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.e: {\r\n      switch (text) {\r\n        case \"else\": return Token.ELSE;\r\n        case \"enum\": return Token.ENUM;\r\n        case \"export\": return Token.EXPORT;\r\n        case \"extends\": return Token.EXTENDS;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.f: {\r\n      switch (text) {\r\n        case \"false\": return Token.FALSE;\r\n        case \"finally\": return Token.FINALLY;\r\n        case \"for\": return Token.FOR;\r\n        case \"from\": return Token.FROM;\r\n        case \"function\": return Token.FUNCTION;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.g: {\r\n      switch (text) {\r\n        case \"get\": return Token.GET;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.i: {\r\n      switch (text) {\r\n        case \"if\": return Token.IF;\r\n        case \"implements\": return Token.IMPLEMENTS;\r\n        case \"import\": return Token.IMPORT;\r\n        case \"in\": return Token.IN;\r\n        case \"instanceof\": return Token.INSTANCEOF;\r\n        case \"interface\": return Token.INTERFACE;\r\n        case \"is\": return Token.IS;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.k: {\r\n      switch (text) {\r\n        case \"keyof\": return Token.KEYOF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.l: {\r\n      switch (text) {\r\n        case \"let\": return Token.LET;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.m: {\r\n      switch (text) {\r\n        case \"module\": return Token.MODULE;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.n: {\r\n      switch (text) {\r\n        case \"namespace\": return Token.NAMESPACE;\r\n        case \"new\": return Token.NEW;\r\n        case \"null\": return Token.NULL;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.o: {\r\n      switch (text) {\r\n        case \"of\": return Token.OF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.p: {\r\n      switch (text) {\r\n        case \"package\": return Token.PACKAGE;\r\n        case \"private\": return Token.PRIVATE;\r\n        case \"protected\": return Token.PROTECTED;\r\n        case \"public\": return Token.PUBLIC;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.r: {\r\n      switch (text) {\r\n        case \"readonly\": return Token.READONLY;\r\n        case \"return\": return Token.RETURN;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.s: {\r\n      switch (text) {\r\n        case \"set\": return Token.SET;\r\n        case \"static\": return Token.STATIC;\r\n        case \"super\": return Token.SUPER;\r\n        case \"switch\": return Token.SWITCH;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.t: {\r\n      switch (text) {\r\n        case \"this\": return Token.THIS;\r\n        case \"throw\": return Token.THROW;\r\n        case \"true\": return Token.TRUE;\r\n        case \"try\": return Token.TRY;\r\n        case \"type\": return Token.TYPE;\r\n        case \"typeof\": return Token.TYPEOF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.v: {\r\n      switch (text) {\r\n        case \"var\": return Token.VAR;\r\n        case \"void\": return Token.VOID;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.w: {\r\n      switch (text) {\r\n        case \"while\": return Token.WHILE;\r\n        case \"with\": return Token.WITH;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.y: {\r\n      switch (text) {\r\n        case \"yield\": return Token.YIELD;\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return Token.INVALID;\r\n}\r\n\r\nexport function tokenIsAlsoIdentifier(token: Token): bool {\r\n  switch (token) {\r\n    case Token.ABSTRACT:\r\n    case Token.AS:\r\n    case Token.CONSTRUCTOR:\r\n    case Token.DECLARE:\r\n    case Token.DELETE:\r\n    case Token.FROM:\r\n    case Token.FOR:\r\n    case Token.GET:\r\n    case Token.IS:\r\n    case Token.KEYOF:\r\n    case Token.MODULE:\r\n    case Token.NAMESPACE:\r\n    case Token.READONLY:\r\n    case Token.SET:\r\n    case Token.TYPE: return true;\r\n    default: return false;\r\n  }\r\n}\r\n\r\nexport function operatorTokenToString(token: Token): string {\r\n  switch (token) {\r\n    case Token.DELETE: return \"delete\";\r\n    case Token.IN: return \"in\";\r\n    case Token.INSTANCEOF: return \"instanceof\";\r\n    case Token.NEW: return \"new\";\r\n    case Token.TYPEOF: return \"typeof\";\r\n    case Token.VOID: return \"void\";\r\n    case Token.YIELD: return \"yield\";\r\n    case Token.DOT_DOT_DOT: return \"...\";\r\n    case Token.COMMA: return \",\";\r\n    case Token.LESSTHAN: return \"<\";\r\n    case Token.GREATERTHAN: return \">\";\r\n    case Token.LESSTHAN_EQUALS: return \"<=\";\r\n    case Token.GREATERTHAN_EQUALS: return \">=\";\r\n    case Token.EQUALS_EQUALS: return \"==\";\r\n    case Token.EXCLAMATION_EQUALS: return \"!=\";\r\n    case Token.EQUALS_EQUALS_EQUALS: return \"===\";\r\n    case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\r\n    case Token.PLUS: return \"+\";\r\n    case Token.MINUS: return \"-\";\r\n    case Token.ASTERISK_ASTERISK: return \"**\";\r\n    case Token.ASTERISK: return \"*\";\r\n    case Token.SLASH: return \"/\";\r\n    case Token.PERCENT: return \"%\";\r\n    case Token.PLUS_PLUS: return \"++\";\r\n    case Token.MINUS_MINUS: return \"--\";\r\n    case Token.LESSTHAN_LESSTHAN: return \"<<\";\r\n    case Token.GREATERTHAN_GREATERTHAN: return \">>\";\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\r\n    case Token.AMPERSAND: return \"&\";\r\n    case Token.BAR: return \"|\";\r\n    case Token.CARET: return \"^\";\r\n    case Token.EXCLAMATION: return \"!\";\r\n    case Token.TILDE: return \"~\";\r\n    case Token.AMPERSAND_AMPERSAND: return \"&&\";\r\n    case Token.BAR_BAR: return \"||\";\r\n    case Token.EQUALS: return \"=\";\r\n    case Token.PLUS_EQUALS: return \"+=\";\r\n    case Token.MINUS_EQUALS: return \"-=\";\r\n    case Token.ASTERISK_EQUALS: return \"*=\";\r\n    case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\r\n    case Token.SLASH_EQUALS: return \"/=\";\r\n    case Token.PERCENT_EQUALS: return \"%=\";\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\r\n    case Token.AMPERSAND_EQUALS: return \"&=\";\r\n    case Token.BAR_EQUALS: return \"|=\";\r\n    case Token.CARET_EQUALS: return \"^=\";\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\nexport class Range {\r\n\r\n  source: Source;\r\n  start: i32;\r\n  end: i32;\r\n\r\n  // TODO: set these while tokenizing\r\n  // line: i32;\r\n  // column: i32;\r\n\r\n  constructor(source: Source, start: i32, end: i32) {\r\n    this.source = source;\r\n    this.start = start;\r\n    this.end = end;\r\n  }\r\n\r\n  static join(a: Range, b: Range): Range {\r\n    if (a.source != b.source) throw new Error(\"source mismatch\");\r\n    return new Range(a.source,\r\n      a.start < b.start ? a.start : b.start,\r\n      a.end > b.end ? a.end : b.end\r\n    );\r\n  }\r\n\r\n  get atStart(): Range {\r\n    return new Range(this.source, this.start, this.start);\r\n  }\r\n  get atEnd(): Range {\r\n    return new Range(this.source, this.end, this.end);\r\n  }\r\n\r\n  get line(): i32 {\r\n    var text = this.source.text;\r\n    var line = 1;\r\n    for (let pos = this.start; pos >= 0; --pos) {\r\n      if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\r\n    }\r\n    return line;\r\n  }\r\n\r\n  get column(): i32 {\r\n    var text = this.source.text;\r\n    var column = 0;\r\n    for (let pos = this.start - 1; pos >= 0; --pos) {\r\n      if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n      ++column;\r\n    }\r\n    return column;\r\n  }\r\n\r\n  toString(): string {\r\n    return this.source.text.substring(this.start, this.end);\r\n  }\r\n\r\n  debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\n/** Handler for intercepting comments while tokenizing. */\r\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\r\n\r\n/** Tokenizes a source to individual {@link Token}s. */\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n  source: Source;\r\n  end: i32 = 0;\r\n\r\n  pos: i32 = 0;\r\n  token: Token = -1;\r\n  tokenPos: i32 = 0;\r\n\r\n  nextToken: Token = -1;\r\n  nextTokenPos: i32 = 0;\r\n  nextTokenOnNewLine: bool = false;\r\n\r\n  onComment: CommentHandler | null = null;\r\n\r\n  /** Constructs a new tokenizer. */\r\n  constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n    super(diagnostics);\r\n    this.source = source;\r\n    this.pos = 0;\r\n    this.end = source.text.length;\r\n    this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n    var text = source.text;\r\n\r\n    // skip bom\r\n    if (\r\n      this.pos < this.end &&\r\n      text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n    ) {\r\n      ++this.pos;\r\n    }\r\n\r\n    // skip shebang\r\n    if (\r\n      this.pos + 1 < this.end &&\r\n      text.charCodeAt(this.pos) == CharCode.HASH &&\r\n      text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n    ) {\r\n      this.pos += 2;\r\n      while (\r\n        this.pos < this.end &&\r\n        text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n      ) {\r\n        ++this.pos;\r\n      }\r\n      // 'next' now starts at lf or eof\r\n    }\r\n  }\r\n\r\n  next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\r\n    this.nextToken = -1;\r\n    return this.token = this.unsafeNext(identifierHandling);\r\n  }\r\n\r\n  private unsafeNext(\r\n    identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n    maxTokenLength: i32 = i32.MAX_VALUE\r\n  ): Token {\r\n    var text = this.source.text;\r\n    while (this.pos < this.end) {\r\n      this.tokenPos = this.pos;\r\n      let c = text.charCodeAt(this.pos);\r\n      switch (c) {\r\n        case CharCode.CARRIAGERETURN: {\r\n          if (!(\r\n            ++this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n          )) break;\r\n          // otherwise fall-through\r\n        }\r\n        case CharCode.LINEFEED:\r\n        case CharCode.TAB:\r\n        case CharCode.VERTICALTAB:\r\n        case CharCode.FORMFEED:\r\n        case CharCode.SPACE: {\r\n          ++this.pos;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            if (\r\n              maxTokenLength > 2 && this.pos < this.end &&\r\n              text.charCodeAt(this.pos) == CharCode.EQUALS\r\n            ) {\r\n              ++this.pos;\r\n              return Token.EXCLAMATION_EQUALS_EQUALS;\r\n            }\r\n            return Token.EXCLAMATION_EQUALS;\r\n          }\r\n          return Token.EXCLAMATION;\r\n        }\r\n        case CharCode.DOUBLEQUOTE:\r\n        case CharCode.SINGLEQUOTE:\r\n        case CharCode.BACKTICK: { // TODO\r\n          return Token.STRINGLITERAL; // expects a call to readString\r\n        }\r\n        case CharCode.PERCENT: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            return Token.PERCENT_EQUALS;\r\n          }\r\n          return Token.PERCENT;\r\n        }\r\n        case CharCode.AMPERSAND: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n              ++this.pos;\r\n              return Token.AMPERSAND_AMPERSAND;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.AMPERSAND_EQUALS;\r\n            }\r\n          }\r\n          return Token.AMPERSAND;\r\n        }\r\n        case CharCode.OPENPAREN: {\r\n          ++this.pos;\r\n          return Token.OPENPAREN;\r\n        }\r\n        case CharCode.CLOSEPAREN: {\r\n          ++this.pos;\r\n          return Token.CLOSEPAREN;\r\n        }\r\n        case CharCode.ASTERISK: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.ASTERISK_EQUALS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 && this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.ASTERISK_ASTERISK_EQUALS;\r\n              }\r\n              return Token.ASTERISK_ASTERISK;\r\n            }\r\n          }\r\n          return Token.ASTERISK;\r\n        }\r\n        case CharCode.PLUS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n              ++this.pos;\r\n              return Token.PLUS_PLUS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.PLUS_EQUALS;\r\n            }\r\n          }\r\n          return Token.PLUS;\r\n        }\r\n        case CharCode.COMMA: {\r\n          ++this.pos;\r\n          return Token.COMMA;\r\n        }\r\n        case CharCode.MINUS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n              ++this.pos;\r\n              return Token.MINUS_MINUS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.MINUS_EQUALS;\r\n            }\r\n          }\r\n          return Token.MINUS;\r\n        }\r\n        case CharCode.DOT: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n              --this.pos;\r\n              return Token.FLOATLITERAL; // expects a call to readFloat\r\n            }\r\n            if (\r\n              maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n              text.charCodeAt(this.pos) == CharCode.DOT &&\r\n              text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n            ) {\r\n              this.pos += 2;\r\n              return Token.DOT_DOT_DOT;\r\n            }\r\n          }\r\n          return Token.DOT;\r\n        }\r\n        case CharCode.SLASH: {\r\n          let commentStartPos = this.pos;\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n              let commentKind = CommentKind.LINE;\r\n              if (\r\n                this.pos + 1 < this.end &&\r\n                text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n              ) {\r\n                ++this.pos;\r\n                commentKind = CommentKind.TRIPLE;\r\n              }\r\n              while (++this.pos < this.end) {\r\n                if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\r\n                  ++this.pos;\r\n                  break;\r\n                }\r\n              }\r\n              if (this.onComment) {\r\n                this.onComment(\r\n                  commentKind,\r\n                  text.substring(commentStartPos, this.pos),\r\n                  this.range(commentStartPos, this.pos)\r\n                );\r\n              }\r\n              break;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n              let closed = false;\r\n              while (++this.pos < this.end) {\r\n                c = text.charCodeAt(this.pos);\r\n                if (\r\n                  c == CharCode.ASTERISK &&\r\n                  this.pos + 1 < this.end &&\r\n                  text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n                ) {\r\n                  this.pos += 2;\r\n                  closed = true;\r\n                  break;\r\n                }\r\n              }\r\n              if (!closed) {\r\n                this.error(\r\n                  DiagnosticCode._0_expected,\r\n                  this.range(this.pos), \"*/\"\r\n                );\r\n              } else if (this.onComment) {\r\n                this.onComment(\r\n                  CommentKind.BLOCK,\r\n                  text.substring(commentStartPos, this.pos),\r\n                  this.range(commentStartPos, this.pos)\r\n                );\r\n              }\r\n              break;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.SLASH_EQUALS;\r\n            }\r\n          }\r\n          return Token.SLASH;\r\n        }\r\n        case CharCode._0:\r\n        case CharCode._1:\r\n        case CharCode._2:\r\n        case CharCode._3:\r\n        case CharCode._4:\r\n        case CharCode._5:\r\n        case CharCode._6:\r\n        case CharCode._7:\r\n        case CharCode._8:\r\n        case CharCode._9: {\r\n          return this.testInteger()\r\n            ? Token.INTEGERLITERAL // expects a call to readInteger\r\n            : Token.FLOATLITERAL;  // expects a call to readFloat\r\n        }\r\n        case CharCode.COLON: {\r\n          ++this.pos;\r\n          return Token.COLON;\r\n        }\r\n        case CharCode.SEMICOLON: {\r\n          ++this.pos;\r\n          return Token.SEMICOLON;\r\n        }\r\n        case CharCode.LESSTHAN: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 &&\r\n                this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n              }\r\n              return Token.LESSTHAN_LESSTHAN;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.LESSTHAN_EQUALS;\r\n            }\r\n          }\r\n          return Token.LESSTHAN;\r\n        }\r\n        case CharCode.EQUALS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 &&\r\n                this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.EQUALS_EQUALS_EQUALS;\r\n              }\r\n              return Token.EQUALS_EQUALS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n              ++this.pos;\r\n              return Token.EQUALS_GREATERTHAN;\r\n            }\r\n          }\r\n          return Token.EQUALS;\r\n        }\r\n        case CharCode.GREATERTHAN: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n              ++this.pos;\r\n              if (maxTokenLength > 2 && this.pos < this.end) {\r\n                if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n                  ++this.pos;\r\n                  if (\r\n                    maxTokenLength > 3 && this.pos < this.end &&\r\n                    text.charCodeAt(this.pos) == CharCode.EQUALS\r\n                  ) {\r\n                    ++this.pos;\r\n                    return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n                  }\r\n                  return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n                }\r\n                if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n                  ++this.pos;\r\n                  return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n                }\r\n              }\r\n              return Token.GREATERTHAN_GREATERTHAN;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.GREATERTHAN_EQUALS;\r\n            }\r\n          }\r\n          return Token.GREATERTHAN;\r\n        }\r\n        case CharCode.QUESTION: {\r\n          ++this.pos;\r\n          return Token.QUESTION;\r\n        }\r\n        case CharCode.OPENBRACKET: {\r\n          ++this.pos;\r\n          return Token.OPENBRACKET;\r\n        }\r\n        case CharCode.CLOSEBRACKET: {\r\n          ++this.pos;\r\n          return Token.CLOSEBRACKET;\r\n        }\r\n        case CharCode.CARET: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            return Token.CARET_EQUALS;\r\n          }\r\n          return Token.CARET;\r\n        }\r\n        case CharCode.OPENBRACE: {\r\n          ++this.pos;\r\n          return Token.OPENBRACE;\r\n        }\r\n        case CharCode.BAR: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n              ++this.pos;\r\n              return Token.BAR_BAR;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.BAR_EQUALS;\r\n            }\r\n          }\r\n          return Token.BAR;\r\n        }\r\n        case CharCode.CLOSEBRACE: {\r\n          ++this.pos;\r\n          return Token.CLOSEBRACE;\r\n        }\r\n        case CharCode.TILDE: {\r\n          ++this.pos;\r\n          return Token.TILDE;\r\n        }\r\n        case CharCode.AT: {\r\n          ++this.pos;\r\n          return Token.AT;\r\n        }\r\n        default: {\r\n          if (isIdentifierStart(c)) {\r\n            if (isKeywordCharacter(c)) {\r\n              let posBefore = this.pos;\r\n              while (\r\n                ++this.pos < this.end &&\r\n                isIdentifierPart(c = text.charCodeAt(this.pos))\r\n              ) {\r\n                if (!isKeywordCharacter(c)) {\r\n                  this.pos = posBefore;\r\n                  return Token.IDENTIFIER;\r\n                }\r\n              }\r\n              let keywordText = text.substring(posBefore, this.pos);\r\n              let keywordToken = tokenFromKeyword(keywordText);\r\n              if (\r\n                keywordToken != Token.INVALID &&\r\n                identifierHandling !== IdentifierHandling.ALWAYS &&\r\n                !(\r\n                  identifierHandling === IdentifierHandling.PREFER &&\r\n                  tokenIsAlsoIdentifier(keywordToken)\r\n                )\r\n              ) {\r\n                return keywordToken;\r\n              }\r\n              this.pos = posBefore;\r\n            }\r\n            return Token.IDENTIFIER; // expects a call to readIdentifier\r\n          } else if (isWhiteSpace(c)) {\r\n            ++this.pos;\r\n            break;\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Invalid_character,\r\n            this.range(this.pos, this.pos + 1)\r\n          );\r\n          ++this.pos;\r\n          return Token.INVALID;\r\n        }\r\n      }\r\n    }\r\n    return Token.ENDOFFILE;\r\n  }\r\n\r\n  peek(\r\n    checkOnNewLine: bool = false,\r\n    identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n    maxCompoundLength: i32 = i32.MAX_VALUE\r\n  ): Token {\r\n    var text = this.source.text;\r\n    if (this.nextToken < 0) {\r\n      let posBefore = this.pos;\r\n      let tokenBefore = this.token;\r\n      let tokenPosBefore = this.tokenPos;\r\n      this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n      this.nextTokenPos = this.tokenPos;\r\n      if (checkOnNewLine) {\r\n        this.nextTokenOnNewLine = false;\r\n        for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\r\n          if (isLineBreak(text.charCodeAt(pos))) {\r\n            this.nextTokenOnNewLine = true;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      this.pos = posBefore;\r\n      this.token = tokenBefore;\r\n      this.tokenPos = tokenPosBefore;\r\n    }\r\n    return this.nextToken;\r\n  }\r\n\r\n  skipIdentifier(): bool {\r\n    return this.skip(Token.IDENTIFIER, IdentifierHandling.PREFER);\r\n  }\r\n\r\n  skipIdentifierName(): bool {\r\n    return this.skip(Token.IDENTIFIER, IdentifierHandling.ALWAYS);\r\n  }\r\n\r\n  skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\r\n    var posBefore = this.pos;\r\n    var tokenBefore = this.token;\r\n    var tokenPosBefore = this.tokenPos;\r\n    var maxCompoundLength = i32.MAX_VALUE;\r\n    switch (token) {\r\n      case Token.GREATERTHAN: { // where parsing type arguments\r\n        maxCompoundLength = 1;\r\n        break;\r\n      }\r\n    }\r\n    this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n    if (this.token == token) {\r\n      this.nextToken = -1;\r\n      return true;\r\n    } else {\r\n      this.pos = posBefore;\r\n      this.token = tokenBefore;\r\n      this.tokenPos = tokenPosBefore;\r\n      return false;\r\n    }\r\n  }\r\n\r\n  mark(): State {\r\n    var state: State;\r\n    if (reusableState) {\r\n      state = reusableState;\r\n      reusableState = null;\r\n    } else {\r\n      state = new State();\r\n    }\r\n    state.pos = this.pos;\r\n    state.token = this.token;\r\n    state.tokenPos = this.tokenPos;\r\n    return state;\r\n  }\r\n\r\n  discard(state: State): void {\r\n    reusableState = state;\r\n  }\r\n\r\n  reset(state: State): void {\r\n    this.pos = state.pos;\r\n    this.token = state.token;\r\n    this.tokenPos = state.tokenPos;\r\n    this.nextToken = -1;\r\n  }\r\n\r\n  range(start: i32 = -1, end: i32 = -1): Range {\r\n    if (start < 0) {\r\n      start = this.tokenPos;\r\n      end = this.pos;\r\n    } else if (end < 0) {\r\n      end = start;\r\n    }\r\n    return new Range(this.source, start, end);\r\n  }\r\n\r\n  readIdentifier(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    while (\r\n      ++this.pos < this.end &&\r\n      isIdentifierPart(text.charCodeAt(this.pos))\r\n    );\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  readString(): string {\r\n    var text = this.source.text;\r\n    var quote = text.charCodeAt(this.pos++);\r\n    var start = this.pos;\r\n    var result = \"\";\r\n    while (true) {\r\n      if (this.pos >= this.end) {\r\n        result += text.substring(start, this.pos);\r\n        this.error(\r\n          DiagnosticCode.Unterminated_string_literal,\r\n          this.range(start - 1, this.end)\r\n        );\r\n        break;\r\n      }\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == quote) {\r\n        result += text.substring(start, this.pos++);\r\n        break;\r\n      }\r\n      if (c == CharCode.BACKSLASH) {\r\n        result += text.substring(start, this.pos);\r\n        result += this.readEscapeSequence();\r\n        start = this.pos;\r\n        continue;\r\n      }\r\n      if (isLineBreak(c)) {\r\n        result += text.substring(start, this.pos);\r\n        this.error(\r\n          DiagnosticCode.Unterminated_string_literal,\r\n          this.range(start - 1, this.pos)\r\n        );\r\n        break;\r\n      }\r\n      ++this.pos;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  readEscapeSequence(): string {\r\n    if (++this.pos >= this.end) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(this.end)\r\n      );\r\n      return \"\";\r\n    }\r\n\r\n    var text = this.source.text;\r\n    var c = text.charCodeAt(this.pos++);\r\n    switch (c) {\r\n      case CharCode._0: return \"\\0\";\r\n      case CharCode.b: return \"\\b\";\r\n      case CharCode.t: return \"\\t\";\r\n      case CharCode.n: return \"\\n\";\r\n      case CharCode.v: return \"\\v\";\r\n      case CharCode.f: return \"\\f\";\r\n      case CharCode.r: return \"\\r\";\r\n      case CharCode.SINGLEQUOTE: return \"'\";\r\n      case CharCode.DOUBLEQUOTE: return \"\\\"\";\r\n      case CharCode.u: {\r\n        if (\r\n          this.pos < this.end &&\r\n          text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n        ) {\r\n          ++this.pos;\r\n          return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n        }\r\n        return this.readUnicodeEscape(); // \\uDDDD\r\n      }\r\n      case CharCode.CARRIAGERETURN: {\r\n        if (\r\n          this.pos < this.end &&\r\n          text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n        ) {\r\n          ++this.pos;\r\n        }\r\n        // fall through\r\n      }\r\n      case CharCode.LINEFEED:\r\n      case CharCode.LINESEPARATOR:\r\n      case CharCode.PARAGRAPHSEPARATOR: return \"\";\r\n      default: return String.fromCharCode(c);\r\n    }\r\n  }\r\n\r\n  readRegexpPattern(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var escaped = false;\r\n    while (true) {\r\n      if (this.pos >= this.end) {\r\n        this.error(\r\n          DiagnosticCode.Unterminated_regular_expression_literal,\r\n          this.range(start, this.end)\r\n        );\r\n        break;\r\n      }\r\n      if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n        ++this.pos;\r\n        escaped = true;\r\n        continue;\r\n      }\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == CharCode.SLASH && !escaped) break;\r\n      if (isLineBreak(c)) {\r\n        this.error(\r\n          DiagnosticCode.Unterminated_regular_expression_literal,\r\n          this.range(start, this.pos)\r\n        );\r\n        break;\r\n      }\r\n      ++this.pos;\r\n      escaped = false;\r\n    }\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  readRegexpFlags(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var flags = 0;\r\n    while (this.pos < this.end) {\r\n      let c: i32 = text.charCodeAt(this.pos);\r\n      if (!isIdentifierPart(c)) break;\r\n      ++this.pos;\r\n\r\n      // make sure each supported flag is unique\r\n      switch (c) {\r\n        case CharCode.g: {\r\n          flags |= flags & 1 ? -1 : 1;\r\n          break;\r\n        }\r\n        case CharCode.i: {\r\n          flags |= flags & 2 ? -1 : 2;\r\n          break;\r\n        }\r\n        case CharCode.m: {\r\n          flags |= flags & 4 ? -1 : 4;\r\n          break;\r\n        }\r\n        default: {\r\n          flags = -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    if (flags == -1) {\r\n      this.error(\r\n        DiagnosticCode.Invalid_regular_expression_flags,\r\n        this.range(start, this.pos)\r\n      );\r\n    }\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  testInteger(): bool {\r\n    var text = this.source.text;\r\n    if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n      switch (text.charCodeAt(this.pos + 2)) {\r\n        case CharCode.X:\r\n        case CharCode.x:\r\n        case CharCode.B:\r\n        case CharCode.b:\r\n        case CharCode.O:\r\n        case CharCode.o: return true;\r\n      }\r\n    }\r\n    var pos = this.pos;\r\n    while (pos < this.end) {\r\n      let c = text.charCodeAt(pos);\r\n      if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n        return false;\r\n      }\r\n      if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\r\n      // does not validate separator placement (this is done in readXYInteger)\r\n      pos++;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  readInteger(): I64 {\r\n    var text = this.source.text;\r\n    if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n      switch (text.charCodeAt(this.pos + 1)) {\r\n        case CharCode.X:\r\n        case CharCode.x: {\r\n          this.pos += 2;\r\n          return this.readHexInteger();\r\n        }\r\n        case CharCode.B:\r\n        case CharCode.b: {\r\n          this.pos += 2;\r\n          return this.readBinaryInteger();\r\n        }\r\n        case CharCode.O:\r\n        case CharCode.o: {\r\n          this.pos += 2;\r\n          return this.readOctalInteger();\r\n        }\r\n      }\r\n      if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n        let start = this.pos;\r\n        ++this.pos;\r\n        let value = this.readOctalInteger();\r\n        this.error(\r\n          DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n          this.range(start, this.pos)\r\n        );\r\n        return value;\r\n      }\r\n    }\r\n    return this.readDecimalInteger();\r\n  }\r\n\r\n  readHexInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_16 = i64_new(16, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        // value = value * 16 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n       } else if (c >= CharCode.A && c <= CharCode.F) {\r\n        // value = value * 16 + 10 + c - CharCode.A;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(10 + c - CharCode.A, 0)\r\n        );\r\n      } else if (c >= CharCode.a && c <= CharCode.f) {\r\n        // value = value * 16 + 10 + c - CharCode.a;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(10 + c - CharCode.a, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Hexadecimal_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readDecimalInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_10 = i64_new(10, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        // value = value * 10 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_10),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readOctalInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_8 = i64_new(8, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._7) {\r\n        // value = value * 8 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_8),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      ++this.pos;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Octal_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readBinaryInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_2 = i64_new(2, 0);\r\n    var i64_1 = i64_new(1, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c == CharCode._0) {\r\n        // value = value * 2;\r\n        value = i64_mul(\r\n          value,\r\n          i64_2\r\n        );\r\n      } else if (c == CharCode._1) {\r\n        // value = value * 2 + 1;\r\n        value = i64_add(\r\n          i64_mul(value, i64_2),\r\n          i64_1\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Binary_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readFloat(): f64 {\r\n    // var text = this.source.text;\r\n    // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n    //   switch (text.charCodeAt(this.pos + 1)) {\r\n    //     case CharCode.X:\r\n    //     case CharCode.x: {\r\n    //       this.pos += 2;\r\n    //       return this.readHexFloat();\r\n    //     }\r\n    //   }\r\n    // }\r\n    return this.readDecimalFloat();\r\n  }\r\n\r\n  readDecimalFloat(): f64 {\r\n    // TODO: numeric separators (parseFloat can't handle these)\r\n    var start = this.pos;\r\n    var text = this.source.text;\r\n    while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n      ++this.pos;\r\n    }\r\n    if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n      ++this.pos;\r\n      while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n        ++this.pos;\r\n      }\r\n    }\r\n    if (this.pos < this.end) {\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == CharCode.E || c == CharCode.e) {\r\n        if (\r\n          ++this.pos < this.end && (\r\n            text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n            text.charCodeAt(this.pos) == CharCode.PLUS\r\n          ) &&\r\n          isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n        ) {\r\n          ++this.pos;\r\n        }\r\n        while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n          ++this.pos;\r\n        }\r\n      }\r\n    }\r\n    return parseFloat(text.substring(start, this.pos));\r\n  }\r\n\r\n  readHexFloat(): f64 {\r\n    throw new Error(\"not implemented\"); // TBD\r\n  }\r\n\r\n  readUnicodeEscape(): string {\r\n    var remain = 4;\r\n    var value = 0;\r\n    var text = this.source.text;\r\n    while (this.pos < this.end) {\r\n      let c = text.charCodeAt(this.pos++);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        value = value * 16 + c - CharCode._0;\r\n      } else if (c >= CharCode.A && c <= CharCode.F) {\r\n        value = value * 16 + 10 + c - CharCode.A;\r\n      } else if (c >= CharCode.a && c <= CharCode.f) {\r\n        value = value * 16 + 10 + c - CharCode.a;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Hexadecimal_digit_expected,\r\n          this.range(this.pos - 1, this.pos)\r\n        );\r\n        return \"\";\r\n      }\r\n      if (--remain == 0) break;\r\n    }\r\n    if (remain) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(this.pos)\r\n      );\r\n      return \"\";\r\n    }\r\n    return String.fromCharCode(value);\r\n  }\r\n\r\n  private readExtendedUnicodeEscape(): string {\r\n    var start = this.pos;\r\n    var value = this.readHexInteger();\r\n    var value32 = i64_low(value);\r\n    var invalid = false;\r\n\r\n    assert(!i64_high(value));\r\n    if (value32 > 0x10FFFF) {\r\n      this.error(\r\n        DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n        this.range(start, this.pos)\r\n      );\r\n      invalid = true;\r\n    }\r\n\r\n    var text = this.source.text;\r\n    if (this.pos >= this.end) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(start, this.end)\r\n      );\r\n      invalid = true;\r\n    } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n      ++this.pos;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n        this.range(start, this.pos)\r\n      );\r\n      invalid = true;\r\n    }\r\n\r\n    if (invalid) return \"\";\r\n    return value32 < 65536\r\n      ? String.fromCharCode(value32)\r\n      : String.fromCharCode(\r\n        (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n        ( (value32 - 65536) % 1024      + 0xDC00) as i32\r\n      );\r\n  }\r\n\r\n  finish(): void {\r\n  }\r\n}\r\n\r\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\r\nexport class State {\r\n  /** Current position. */\r\n  pos: i32;\r\n  /** Current token. */\r\n  token: Token;\r\n  /** Current token's position. */\r\n  tokenPos: i32;\r\n}\r\n\r\n// Reusable state object to reduce allocations\r\nvar reusableState: State | null = null;\r\n","/**\n * Generated from diagnosticsMessages.json. Do not edit.\n * @module diagnostics\n *//***/\n\n/* tslint:disable:max-line-length */\n\n/** Enum of available diagnostic codes. */\nexport enum DiagnosticCode {\n  Operation_not_supported = 100,\n  Operation_is_unsafe = 101,\n  Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\n  Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n  Type_0_cannot_be_changed_to_type_1 = 202,\n  Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n  Basic_type_0_cannot_be_nullable = 204,\n  Cannot_export_a_mutable_global = 205,\n  Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n  Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\n  Unmanaged_classes_cannot_implement_interfaces = 208,\n  Invalid_regular_expression_flags = 209,\n  Implementation_0_must_match_the_signature_1 = 210,\n  Class_0_is_sealed_and_cannot_be_extended = 211,\n  Decorator_0_is_not_valid_here = 212,\n  Duplicate_decorator = 213,\n  An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\n  Optional_parameter_must_have_an_initializer = 215,\n  Unterminated_string_literal = 1002,\n  Identifier_expected = 1003,\n  _0_expected = 1005,\n  A_file_cannot_have_a_reference_to_itself = 1006,\n  Trailing_comma_not_allowed = 1009,\n  Unexpected_token = 1012,\n  A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n  Parameter_cannot_have_question_mark_and_initializer = 1015,\n  A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n  Enum_member_must_have_initializer = 1061,\n  Statements_are_not_allowed_in_ambient_contexts = 1036,\n  Initializers_are_not_allowed_in_ambient_contexts = 1039,\n  _0_modifier_cannot_be_used_here = 1042,\n  A_rest_parameter_cannot_be_optional = 1047,\n  A_rest_parameter_cannot_have_an_initializer = 1048,\n  A_set_accessor_must_have_exactly_one_parameter = 1049,\n  A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n  A_get_accessor_cannot_have_parameters = 1054,\n  Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n  Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n  An_accessor_cannot_have_type_parameters = 1094,\n  A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n  Type_parameter_list_cannot_be_empty = 1098,\n  A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n  A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n  A_return_statement_can_only_be_used_within_a_function_body = 1108,\n  Expression_expected = 1109,\n  Type_expected = 1110,\n  A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n  Duplicate_label_0 = 1114,\n  Octal_literals_are_not_allowed_in_strict_mode = 1121,\n  Digit_expected = 1124,\n  Hexadecimal_digit_expected = 1125,\n  Unexpected_end_of_text = 1126,\n  Invalid_character = 1127,\n  _case_or_default_expected = 1130,\n  A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\n  Type_argument_expected = 1140,\n  String_literal_expected = 1141,\n  Line_break_not_permitted_here = 1142,\n  Declaration_expected = 1146,\n  _const_declarations_must_be_initialized = 1155,\n  Unterminated_regular_expression_literal = 1161,\n  Interface_declaration_cannot_have_implements_clause = 1176,\n  Binary_digit_expected = 1177,\n  Octal_digit_expected = 1178,\n  An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n  An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n  Unterminated_Unicode_escape_sequence = 1199,\n  Decorators_are_not_valid_here = 1206,\n  _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n  Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\n  A_class_may_only_extend_another_class = 1311,\n  A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\n  Duplicate_identifier_0 = 2300,\n  Cannot_find_name_0 = 2304,\n  Module_0_has_no_exported_member_1 = 2305,\n  Generic_type_0_requires_1_type_argument_s = 2314,\n  Type_0_is_not_generic = 2315,\n  Type_0_is_not_assignable_to_type_1 = 2322,\n  Index_signature_is_missing_in_type_0 = 2329,\n  _this_cannot_be_referenced_in_current_location = 2332,\n  _super_can_only_be_referenced_in_a_derived_class = 2335,\n  Property_0_does_not_exist_on_type_1 = 2339,\n  Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n  Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n  A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n  The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n  The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n  Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\n  _get_and_set_accessor_must_have_the_same_type = 2380,\n  Constructor_implementation_is_missing = 2390,\n  Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n  Multiple_constructor_implementations_are_not_allowed = 2392,\n  Duplicate_function_implementation = 2393,\n  Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\n  Type_0_has_no_property_1 = 2460,\n  The_0_operator_cannot_be_applied_to_type_1 = 2469,\n  Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n  Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n  The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n  Index_signature_in_type_0_only_permits_reading = 2542,\n  Expected_0_arguments_but_got_1 = 2554,\n  Expected_at_least_0_arguments_but_got_1 = 2555,\n  Expected_0_type_arguments_but_got_1 = 2558,\n  A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n  Namespace_0_has_no_exported_member_1 = 2694,\n  File_0_not_found = 6054,\n  Numeric_separators_are_not_allowed_here = 6188,\n  Multiple_consecutive_numeric_separators_are_not_permitted = 6189\n}\n\n/** Translates a diagnostic code to its respective string. */\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n  switch (code) {\n    case 100: return \"Operation not supported.\";\n    case 101: return \"Operation is unsafe.\";\n    case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\n    case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n    case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n    case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n    case 204: return \"Basic type '{0}' cannot be nullable.\";\n    case 205: return \"Cannot export a mutable global.\";\n    case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n    case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\n    case 208: return \"Unmanaged classes cannot implement interfaces.\";\n    case 209: return \"Invalid regular expression flags.\";\n    case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n    case 211: return \"Class '{0}' is sealed and cannot be extended.\";\n    case 212: return \"Decorator '{0}' is not valid here.\";\n    case 213: return \"Duplicate decorator.\";\n    case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\n    case 215: return \"Optional parameter must have an initializer.\";\n    case 1002: return \"Unterminated string literal.\";\n    case 1003: return \"Identifier expected.\";\n    case 1005: return \"'{0}' expected.\";\n    case 1006: return \"A file cannot have a reference to itself.\";\n    case 1009: return \"Trailing comma not allowed.\";\n    case 1012: return \"Unexpected token.\";\n    case 1014: return \"A rest parameter must be last in a parameter list.\";\n    case 1015: return \"Parameter cannot have question mark and initializer.\";\n    case 1016: return \"A required parameter cannot follow an optional parameter.\";\n    case 1061: return \"Enum member must have initializer.\";\n    case 1036: return \"Statements are not allowed in ambient contexts.\";\n    case 1039: return \"Initializers are not allowed in ambient contexts.\";\n    case 1042: return \"'{0}' modifier cannot be used here.\";\n    case 1047: return \"A rest parameter cannot be optional.\";\n    case 1048: return \"A rest parameter cannot have an initializer.\";\n    case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n    case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n    case 1054: return \"A 'get' accessor cannot have parameters.\";\n    case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n    case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n    case 1094: return \"An accessor cannot have type parameters.\";\n    case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n    case 1098: return \"Type parameter list cannot be empty.\";\n    case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n    case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n    case 1108: return \"A 'return' statement can only be used within a function body.\";\n    case 1109: return \"Expression expected.\";\n    case 1110: return \"Type expected.\";\n    case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n    case 1114: return \"Duplicate label '{0}'.\";\n    case 1121: return \"Octal literals are not allowed in strict mode.\";\n    case 1124: return \"Digit expected.\";\n    case 1125: return \"Hexadecimal digit expected.\";\n    case 1126: return \"Unexpected end of text.\";\n    case 1127: return \"Invalid character.\";\n    case 1130: return \"'case' or 'default' expected.\";\n    case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\n    case 1140: return \"Type argument expected.\";\n    case 1141: return \"String literal expected.\";\n    case 1142: return \"Line break not permitted here.\";\n    case 1146: return \"Declaration expected.\";\n    case 1155: return \"'const' declarations must be initialized.\";\n    case 1161: return \"Unterminated regular expression literal.\";\n    case 1176: return \"Interface declaration cannot have 'implements' clause.\";\n    case 1177: return \"Binary digit expected.\";\n    case 1178: return \"Octal digit expected.\";\n    case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n    case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n    case 1199: return \"Unterminated Unicode escape sequence.\";\n    case 1206: return \"Decorators are not valid here.\";\n    case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n    case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\n    case 1311: return \"A class may only extend another class.\";\n    case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\n    case 2300: return \"Duplicate identifier '{0}'.\";\n    case 2304: return \"Cannot find name '{0}'.\";\n    case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n    case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n    case 2315: return \"Type '{0}' is not generic.\";\n    case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n    case 2329: return \"Index signature is missing in type '{0}'.\";\n    case 2332: return \"'this' cannot be referenced in current location.\";\n    case 2335: return \"'super' can only be referenced in a derived class.\";\n    case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n    case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n    case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n    case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n    case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n    case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n    case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\n    case 2380: return \"'get' and 'set' accessor must have the same type.\";\n    case 2390: return \"Constructor implementation is missing.\";\n    case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n    case 2392: return \"Multiple constructor implementations are not allowed.\";\n    case 2393: return \"Duplicate function implementation.\";\n    case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\n    case 2460: return \"Type '{0}' has no property '{1}'.\";\n    case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\n    case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n    case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n    case 2541: return \"The target of an assignment must be a variable or a property access.\";\n    case 2542: return \"Index signature in type '{0}' only permits reading.\";\n    case 2554: return \"Expected {0} arguments, but got {1}.\";\n    case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n    case 2558: return \"Expected {0} type arguments, but got {1}.\";\n    case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n    case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n    case 6054: return \"File '{0}' not found.\";\n    case 6188: return \"Numeric separators are not allowed here.\";\n    case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\n    default: return \"\";\n  }\n}\n","/**\r\n * The AssemblyScript compiler.\r\n * @module compiler\r\n *//***/\r\n\r\nimport {\r\n  compileCall as compileBuiltinCall,\r\n  compileAllocate as compileBuiltinAllocate,\r\n  compileAbort as compileBuiltinAbort\r\n} from \"./builtins\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Module,\r\n  MemorySegment,\r\n  ExpressionRef,\r\n  UnaryOp,\r\n  BinaryOp,\r\n  NativeType,\r\n  FunctionRef,\r\n  ExpressionId,\r\n  FunctionTypeRef,\r\n  GlobalRef,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getConstValueI32,\r\n  getConstValueI64Low,\r\n  getConstValueI64High,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getFunctionBody,\r\n  getGetLocalIndex,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getBlockName\r\n} from \"./module\";\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  INNER_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  GETTER_PREFIX,\r\n  SETTER_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program,\r\n  ClassPrototype,\r\n  Class,\r\n  Element,\r\n  ElementKind,\r\n  Enum,\r\n  Field,\r\n  FunctionPrototype,\r\n  Function,\r\n  FunctionTarget,\r\n  Global,\r\n  Local,\r\n  Namespace,\r\n  EnumValue,\r\n  Property,\r\n  VariableLikeElement,\r\n  FlowFlags,\r\n  ConstantValueKind,\r\n  Flow,\r\n  OperatorKind,\r\n  DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n  Token,\r\n  operatorTokenToString\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  TypeNode,\r\n  Source,\r\n  Range,\r\n  DecoratorKind,\r\n\r\n  Statement,\r\n  BlockStatement,\r\n  BreakStatement,\r\n  ClassDeclaration,\r\n  ContinueStatement,\r\n  DeclarationStatement,\r\n  DoStatement,\r\n  EmptyStatement,\r\n  EnumDeclaration,\r\n  ExportStatement,\r\n  ExpressionStatement,\r\n  FunctionDeclaration,\r\n  ForStatement,\r\n  IfStatement,\r\n  ImportStatement,\r\n  InstanceOfExpression,\r\n  InterfaceDeclaration,\r\n  NamespaceDeclaration,\r\n  ReturnStatement,\r\n  SwitchStatement,\r\n  ThrowStatement,\r\n  TryStatement,\r\n  VariableDeclaration,\r\n  VariableStatement,\r\n  VoidStatement,\r\n  WhileStatement,\r\n\r\n  Expression,\r\n  AssertionExpression,\r\n  BinaryExpression,\r\n  CallExpression,\r\n  CommaExpression,\r\n  ElementAccessExpression,\r\n  FloatLiteralExpression,\r\n  FunctionExpression,\r\n  IdentifierExpression,\r\n  IntegerLiteralExpression,\r\n  LiteralExpression,\r\n  LiteralKind,\r\n  NewExpression,\r\n  ParenthesizedExpression,\r\n  PropertyAccessExpression,\r\n  TernaryExpression,\r\n  ArrayLiteralExpression,\r\n  StringLiteralExpression,\r\n  UnaryPostfixExpression,\r\n  UnaryPrefixExpression,\r\n  FieldDeclaration,\r\n\r\n  nodeIsConstantValue,\r\n  isLastStatement,\r\n  findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags,\r\n  Signature,\r\n\r\n  typesToNativeTypes\r\n} from \"./types\";\r\n\r\nimport {\r\n  writeI32,\r\n  writeI64,\r\n  writeF32,\r\n  writeF64\r\n} from \"./util\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n  /** WebAssembly with 32-bit pointers. */\r\n  WASM32,\r\n  /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n  WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n  /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n  target: Target = Target.WASM32;\r\n  /** If true, compiles everything instead of just reachable code. */\r\n  noTreeShaking: bool = false;\r\n  /** If true, replaces assertions with nops. */\r\n  noAssert: bool = false;\r\n  /** If true, imports the memory provided by the embedder. */\r\n  importMemory: bool = false;\r\n  /** If true, imports the function table provided by the embedder. */\r\n  importTable: bool = false;\r\n  /** If true, generates information necessary for source maps. */\r\n  sourceMap: bool = false;\r\n  /** Static memory start offset. */\r\n  memoryBase: i32 = 0;\r\n  /** Global aliases. */\r\n  globalAliases: Map<string,string> | null = null;\r\n  /** Additional features to activate. */\r\n  features: Feature = Feature.NONE;\r\n\r\n  /** Hinted optimize level. Not applied by the compiler itself. */\r\n  optimizeLevelHint: i32 = 0;\r\n  /** Hinted shrink level. Not applied by the compiler itself. */\r\n  shrinkLevelHint: i32 = 0;\r\n\r\n  /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n  get isWasm64(): bool {\r\n    return this.target == Target.WASM64;\r\n  }\r\n\r\n  /** Gets the unsigned size type matching the target. */\r\n  get usizeType(): Type {\r\n    return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n  }\r\n\r\n  /** Gets the signed size type matching the target. */\r\n  get isizeType(): Type {\r\n    return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n  }\r\n\r\n  /** Gets the native size type matching the target. */\r\n  get nativeSizeType(): NativeType {\r\n    return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n  }\r\n\r\n  /** Tests if a specific feature is activated. */\r\n  hasFeature(feature: Feature): bool {\r\n    return (this.features & feature) != 0;\r\n  }\r\n}\r\n\r\n/** Indicates specific features to activate. */\r\nexport const enum Feature {\r\n  /** No additional features. */\r\n  NONE = 0,\r\n  /** Sign extension operations. */\r\n  SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\r\n  /** Mutable global imports and exports. */\r\n  MUTABLE_GLOBAL = 1 << 1  // see: https://github.com/WebAssembly/mutable-global\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n  /** No conversion. */\r\n  NONE,\r\n  /** Implicit conversion. */\r\n  IMPLICIT,\r\n  /** Explicit conversion. */\r\n  EXPLICIT\r\n}\r\n\r\n/** Indicates the desired wrap mode of a conversion. */\r\nexport const enum WrapMode {\r\n  /** No wrapping. */\r\n  NONE,\r\n  /** Wrap small integer values. */\r\n  WRAP\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n  /** Program reference. */\r\n  program: Program;\r\n  /** Provided options. */\r\n  options: Options;\r\n  /** Module instance being compiled. */\r\n  module: Module;\r\n  /** Current function in compilation. */\r\n  currentFunction: Function;\r\n  /** Current outer function in compilation, if compiling a function expression. */\r\n  currentOuterFunction: Function | null = null;\r\n  /** Current enum in compilation. */\r\n  currentEnum: Enum | null = null;\r\n  /** Current type in compilation. */\r\n  currentType: Type = Type.void;\r\n  /** Start function being compiled. */\r\n  startFunctionInstance: Function;\r\n  /** Start function statements. */\r\n  startFunctionBody: ExpressionRef[];\r\n  /** Counting memory offset. */\r\n  memoryOffset: I64;\r\n  /** Memory segments being compiled. */\r\n  memorySegments: MemorySegment[] = [];\r\n  /** Map of already compiled static string segments. */\r\n  stringSegments: Map<string,MemorySegment> = new Map();\r\n  /** Function table being compiled. */\r\n  functionTable: Function[] = [];\r\n  /** Argument count helper global. */\r\n  argcVar: GlobalRef = 0;\r\n  /** Argument count helper setter. */\r\n  argcSet: FunctionRef = 0;\r\n\r\n  /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n  static compile(program: Program, options: Options | null = null): Module {\r\n    return new Compiler(program, options).compile();\r\n  }\r\n\r\n  /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n  constructor(program: Program, options: Options | null = null) {\r\n    super(program.diagnostics);\r\n    this.program = program;\r\n    if (!options) options = new Options();\r\n    this.options = options;\r\n    this.memoryOffset = i64_new(\r\n      // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\r\n      // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\r\n      max(options.memoryBase, 8)\r\n    );\r\n    this.module = Module.create();\r\n  }\r\n\r\n  /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n  compile(): Module {\r\n    var options = this.options;\r\n    var module = this.module;\r\n    var program = this.program;\r\n\r\n    // initialize lookup maps, built-ins, imports, exports, etc.\r\n    program.initialize(options);\r\n\r\n    // set up the start function\r\n    var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\r\n    this.startFunctionInstance = startFunctionInstance;\r\n    var startFunctionBody = new Array<ExpressionRef>();\r\n    this.startFunctionBody = startFunctionBody;\r\n    this.currentFunction = startFunctionInstance;\r\n\r\n    // compile entry file(s) while traversing reachable elements\r\n    var sources = program.sources;\r\n    for (let i = 0, k = sources.length; i < k; ++i) {\r\n      if (sources[i].isEntry) this.compileSource(sources[i]);\r\n    }\r\n\r\n    // compile the start function if not empty or called by main\r\n    if (startFunctionBody.length || program.mainFunction !== null) {\r\n      let signature = startFunctionInstance.signature;\r\n      let funcRef = module.addFunction(\r\n        startFunctionInstance.internalName,\r\n        this.ensureFunctionType(\r\n          signature.parameterTypes,\r\n          signature.returnType,\r\n          signature.thisType\r\n        ),\r\n        typesToNativeTypes(startFunctionInstance.additionalLocals),\r\n        module.createBlock(null, startFunctionBody)\r\n      );\r\n      startFunctionInstance.finalize(module, funcRef);\r\n      if (!program.mainFunction) module.setStart(funcRef);\r\n    }\r\n\r\n    // set up static memory segments and the heap base pointer\r\n    var memoryOffset = this.memoryOffset;\r\n    memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\r\n    this.memoryOffset = memoryOffset;\r\n    if (options.isWasm64) {\r\n      module.addGlobal(\r\n        \"HEAP_BASE\",\r\n        NativeType.I64,\r\n        false,\r\n        module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n      );\r\n    } else {\r\n      module.addGlobal(\r\n        \"HEAP_BASE\",\r\n        NativeType.I32,\r\n        false,\r\n        module.createI32(i64_low(memoryOffset))\r\n      );\r\n    }\r\n\r\n    // determine initial page size\r\n    var numPages = this.memorySegments.length\r\n      ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\r\n      : 0;\r\n    module.setMemory(\r\n      numPages,\r\n      this.options.isWasm64\r\n        ? Module.MAX_MEMORY_WASM64\r\n        : Module.MAX_MEMORY_WASM32,\r\n      this.memorySegments,\r\n      options.target,\r\n      \"memory\"\r\n    );\r\n\r\n    // import memory if requested (default memory is named '0' by Binaryen)\r\n    if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\r\n\r\n    // set up function table\r\n    var functionTable = this.functionTable;\r\n    var functionTableSize = functionTable.length;\r\n    var functionTableExported = false;\r\n    if (functionTableSize) {\r\n      let entries = new Array<FunctionRef>(functionTableSize);\r\n      for (let i = 0; i < functionTableSize; ++i) {\r\n        entries[i] = functionTable[i].ref;\r\n      }\r\n      module.setFunctionTable(entries);\r\n      module.addTableExport(\"0\", \"table\");\r\n      functionTableExported = true;\r\n    }\r\n\r\n    // import table if requested (default table is named '0' by Binaryen)\r\n    if (options.importTable) {\r\n      module.addTableImport(\"0\", \"env\", \"table\");\r\n      if (!functionTableExported) module.addTableExport(\"0\", \"table\");\r\n    }\r\n\r\n    return module;\r\n  }\r\n\r\n  // sources\r\n\r\n  /** Compiles a source by looking it up by path first. */\r\n  compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n    var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\r\n    if (source) this.compileSource(source);\r\n    else {\r\n      this.error(\r\n        DiagnosticCode.File_0_not_found,\r\n        reportNode.range, normalizedPathWithoutExtension\r\n      );\r\n    }\r\n  }\r\n\r\n  /** Compiles a source. */\r\n  compileSource(source: Source): void {\r\n    if (source.is(CommonFlags.COMPILED)) return;\r\n    source.set(CommonFlags.COMPILED);\r\n\r\n    // compile top-level statements\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    var isEntry = source.isEntry;\r\n    var startFunctionInstance = this.startFunctionInstance;\r\n    var startFunctionBody = this.startFunctionBody;\r\n    var statements = source.statements;\r\n    for (let i = 0, k = statements.length; i < k; ++i) {\r\n      let statement = statements[i];\r\n      switch (statement.kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          if (\r\n            (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n            !(<ClassDeclaration>statement).isGeneric\r\n          ) {\r\n            this.compileClassDeclaration(<ClassDeclaration>statement, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: break;\r\n        case NodeKind.ENUMDECLARATION: {\r\n          if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n            this.compileEnumDeclaration(<EnumDeclaration>statement);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          if (\r\n            (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n            !(<FunctionDeclaration>statement).isGeneric\r\n          ) {\r\n            this.compileFunctionDeclaration(<FunctionDeclaration>statement, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.IMPORT: {\r\n          this.compileSourceByPath(\r\n            (<ImportStatement>statement).normalizedPath,\r\n            (<ImportStatement>statement).path\r\n          );\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n            this.compileNamespaceDeclaration(<NamespaceDeclaration>statement);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\r\n          let variableInit = this.compileVariableStatement(<VariableStatement>statement);\r\n          if (variableInit) startFunctionBody.push(variableInit);\r\n          break;\r\n        }\r\n        case NodeKind.EXPORT: {\r\n          if ((<ExportStatement>statement).normalizedPath != null) {\r\n            this.compileSourceByPath(\r\n              <string>(<ExportStatement>statement).normalizedPath,\r\n              <StringLiteralExpression>(<ExportStatement>statement).path\r\n            );\r\n          }\r\n          if (noTreeShaking || isEntry) {\r\n            this.compileExportStatement(<ExportStatement>statement);\r\n          }\r\n          break;\r\n        }\r\n        default: { // otherwise a top-level statement that is part of the start function's body\r\n          let previousFunction = this.currentFunction;\r\n          this.currentFunction = startFunctionInstance;\r\n          startFunctionBody.push(this.compileStatement(statement));\r\n          this.currentFunction = previousFunction;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // globals\r\n\r\n  compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n    // look up the initialized program element\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.GLOBAL);\r\n    if (!this.compileGlobal(<Global>element)) return null; // reports\r\n    return <Global>element;\r\n  }\r\n\r\n  compileGlobal(global: Global): bool {\r\n    if (global.is(CommonFlags.COMPILED)) return true;\r\n    global.set(CommonFlags.COMPILED);\r\n\r\n    var module = this.module;\r\n    var declaration = global.declaration;\r\n    var initExpr: ExpressionRef = 0;\r\n\r\n    if (global.type == Type.void) { // type is void if not yet resolved or not annotated\r\n      if (declaration) {\r\n\r\n        // resolve now if annotated\r\n        if (declaration.type) {\r\n          let resolvedType = this.program.resolveType(declaration.type); // reports\r\n          if (!resolvedType) return false;\r\n          if (resolvedType == Type.void) {\r\n            this.error(\r\n              DiagnosticCode.Type_expected,\r\n              declaration.type.range\r\n            );\r\n            return false;\r\n          }\r\n          global.type = resolvedType;\r\n\r\n        // infer from initializer if not annotated\r\n        } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n          initExpr = this.compileExpressionRetainType( // reports\r\n            declaration.initializer,\r\n            Type.void,\r\n            WrapMode.WRAP\r\n          );\r\n          if (this.currentType == Type.void) {\r\n            this.error(\r\n              DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n              declaration.initializer.range, this.currentType.toString(), \"<auto>\"\r\n            );\r\n            return false;\r\n          }\r\n          global.type = this.currentType;\r\n\r\n        // must either be annotated or have an initializer\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Type_expected,\r\n            declaration.name.range.atEnd\r\n          );\r\n          return false;\r\n        }\r\n      } else {\r\n        assert(false); // must have a declaration if 'void' (and thus resolved later on)\r\n      }\r\n    }\r\n\r\n    // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\r\n    if (global.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN)) return true;\r\n\r\n    var nativeType = global.type.toNativeType();\r\n    var isConstant = global.isAny(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n\r\n    // handle imports\r\n    if (global.is(CommonFlags.AMBIENT)) {\r\n\r\n      // constant global\r\n      if (isConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n        global.set(CommonFlags.MODULE_IMPORT);\r\n        if (declaration) {\r\n          mangleImportName(global, declaration, global.parent);\r\n        } else {\r\n          mangleImportName_moduleName = \"env\";\r\n          mangleImportName_elementName = global.simpleName;\r\n        }\r\n        module.addGlobalImport(\r\n          global.internalName,\r\n          mangleImportName_moduleName,\r\n          mangleImportName_elementName,\r\n          nativeType\r\n        );\r\n        global.set(CommonFlags.COMPILED);\r\n        return true;\r\n\r\n      // importing mutable globals is not supported in the MVP\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          assert(declaration).range\r\n        );\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // the MVP does not yet support initializer expressions other than constant values (and\r\n    // get_globals), hence such initializations must be performed in the start function for now.\r\n    var initializeInStart = false;\r\n\r\n    // inlined constant can be compiled as-is\r\n    if (global.is(CommonFlags.INLINED)) {\r\n      initExpr = this.compileInlineConstant(global, global.type, true);\r\n\r\n    } else {\r\n\r\n      // evaluate initializer if present\r\n      if (declaration && declaration.initializer) {\r\n        if (!initExpr) {\r\n          initExpr = this.compileExpression(\r\n            declaration.initializer,\r\n            global.type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP\r\n          );\r\n        }\r\n\r\n        // check if the initializer is constant\r\n        if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n\r\n          // if a constant global, check if the initializer becomes constant after precompute\r\n          if (isConstant) {\r\n            initExpr = this.precomputeExpressionRef(initExpr);\r\n            if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n              this.warning(\r\n                DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                declaration.range\r\n              );\r\n              initializeInStart = true;\r\n            }\r\n          } else {\r\n            initializeInStart = true;\r\n          }\r\n        }\r\n\r\n      // initialize to zero if there's no initializer\r\n      } else {\r\n        initExpr = global.type.toNativeZero(module);\r\n      }\r\n    }\r\n\r\n    var internalName = global.internalName;\r\n\r\n    if (initializeInStart) { // initialize to mutable zero and set the actual value in start\r\n      module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\r\n      this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\r\n\r\n    } else { // compile as-is\r\n\r\n      if (isConstant) {\r\n        let exprType = getExpressionType(initExpr);\r\n        switch (exprType) {\r\n          case NativeType.I32: {\r\n            global.constantValueKind = ConstantValueKind.INTEGER;\r\n            global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\r\n            break;\r\n          }\r\n          case NativeType.I64: {\r\n            global.constantValueKind = ConstantValueKind.INTEGER;\r\n            global.constantIntegerValue = i64_new(\r\n              getConstValueI64Low(initExpr),\r\n              getConstValueI64High(initExpr)\r\n            );\r\n            break;\r\n          }\r\n          case NativeType.F32: {\r\n            global.constantValueKind = ConstantValueKind.FLOAT;\r\n            global.constantFloatValue = getConstValueF32(initExpr);\r\n            break;\r\n          }\r\n          case NativeType.F64: {\r\n            global.constantValueKind = ConstantValueKind.FLOAT;\r\n            global.constantFloatValue = getConstValueF64(initExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return false;\r\n          }\r\n        }\r\n        global.set(CommonFlags.INLINED); // inline the value from now on\r\n        if (global.is(CommonFlags.MODULE_EXPORT)) {\r\n          module.addGlobal(internalName, nativeType, false, initExpr);\r\n          module.addGlobalExport(internalName, mangleExportName(global));\r\n        } else if (declaration && declaration.isTopLevel) { // might become re-exported\r\n          module.addGlobal(internalName, nativeType, false, initExpr);\r\n        }\r\n\r\n      } else /* mutable */ {\r\n        module.addGlobal(internalName, nativeType, !isConstant, initExpr);\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  // enums\r\n\r\n  compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.ENUM);\r\n    if (!this.compileEnum(<Enum>element)) return null;\r\n    return <Enum>element;\r\n  }\r\n\r\n  compileEnum(element: Enum): bool {\r\n    if (element.is(CommonFlags.COMPILED)) return true;\r\n    element.set(CommonFlags.COMPILED);\r\n\r\n    var module = this.module;\r\n    this.currentEnum = element;\r\n    var previousValue: EnumValue | null = null;\r\n\r\n    if (element.members) {\r\n      for (let member of element.members.values()) {\r\n        if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n        let initInStart = false;\r\n        let val = <EnumValue>member;\r\n        let valueDeclaration = val.declaration;\r\n        val.set(CommonFlags.COMPILED);\r\n        if (val.is(CommonFlags.INLINED)) {\r\n          if (element.declaration.isTopLevelExport) {\r\n            module.addGlobal(\r\n              val.internalName,\r\n              NativeType.I32,\r\n              false, // constant\r\n              module.createI32(val.constantValue)\r\n            );\r\n          }\r\n        } else {\r\n          let initExpr: ExpressionRef;\r\n          if (valueDeclaration.value) {\r\n            initExpr = this.compileExpression(\r\n              <Expression>valueDeclaration.value,\r\n              Type.i32,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE\r\n            );\r\n            if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n              initExpr = this.precomputeExpressionRef(initExpr);\r\n              if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n                if (element.is(CommonFlags.CONST)) {\r\n                  this.warning(\r\n                    DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                    valueDeclaration.range\r\n                  );\r\n                }\r\n                initInStart = true;\r\n              }\r\n            }\r\n          } else if (previousValue == null) {\r\n            initExpr = module.createI32(0);\r\n          } else if (previousValue.is(CommonFlags.INLINED)) {\r\n            initExpr = module.createI32(previousValue.constantValue + 1);\r\n          } else {\r\n            // in TypeScript this errors with TS1061, but actually we can do:\r\n            initExpr = module.createBinary(BinaryOp.AddI32,\r\n              module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n              module.createI32(1)\r\n            );\r\n            if (element.is(CommonFlags.CONST)) {\r\n              this.warning(\r\n                DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                valueDeclaration.range\r\n              );\r\n            }\r\n            initInStart = true;\r\n          }\r\n          if (initInStart) {\r\n            module.addGlobal(\r\n              val.internalName,\r\n              NativeType.I32,\r\n              true, // mutable\r\n              module.createI32(0)\r\n            );\r\n            this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\r\n          } else {\r\n            module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\r\n            if (getExpressionType(initExpr) == NativeType.I32) {\r\n              val.constantValue = getConstValueI32(initExpr);\r\n              val.set(CommonFlags.INLINED);\r\n            } else {\r\n              assert(false);\r\n              val.constantValue = 0;\r\n            }\r\n          }\r\n        }\r\n        previousValue = <EnumValue>val;\r\n\r\n        // export values if the enum is exported\r\n        if (element.is(CommonFlags.MODULE_EXPORT)) {\r\n          if (member.is(CommonFlags.INLINED) || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n            module.addGlobalExport(member.internalName, mangleExportName(member));\r\n          } else if (valueDeclaration) {\r\n            this.warning(\r\n              DiagnosticCode.Cannot_export_a_mutable_global,\r\n              valueDeclaration.range\r\n            );\r\n          }\r\n        }\r\n      }\r\n    }\r\n    this.currentEnum = null;\r\n    return true;\r\n  }\r\n\r\n  // functions\r\n\r\n  /** Compiles a top-level function given its declaration. */\r\n  compileFunctionDeclaration(\r\n    declaration: FunctionDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ): Function | null {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n    return this.compileFunctionUsingTypeArguments( // reports\r\n      <FunctionPrototype>element,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      null, // no outer scope (is top level)\r\n      (<FunctionPrototype>element).declaration.name\r\n    );\r\n  }\r\n\r\n  /** Resolves the specified type arguments prior to compiling the resulting function instance. */\r\n  compileFunctionUsingTypeArguments(\r\n    prototype: FunctionPrototype,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    outerScope: Flow | null,\r\n    reportNode: Node\r\n  ): Function | null {\r\n    var instance = prototype.resolveUsingTypeArguments( // reports\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      reportNode\r\n    );\r\n    if (!instance) return null;\r\n    instance.outerScope = outerScope;\r\n    if (!this.compileFunction(instance)) return null; // reports\r\n    return instance;\r\n  }\r\n\r\n  /** Either reuses or creates the function type matching the specified signature. */\r\n  private ensureFunctionType(\r\n    parameterTypes: Type[] | null,\r\n    returnType: Type,\r\n    thisType: Type | null = null\r\n  ): FunctionTypeRef {\r\n    var numParameters = parameterTypes ? parameterTypes.length : 0;\r\n    var paramTypes: NativeType[];\r\n    var index = 0;\r\n    if (thisType) {\r\n      paramTypes = new Array(1 + numParameters);\r\n      paramTypes[0] = thisType.toNativeType();\r\n      index = 1;\r\n    } else {\r\n      paramTypes = new Array(numParameters);\r\n    }\r\n    if (parameterTypes) {\r\n      for (let i = 0; i < numParameters; ++i, ++index) {\r\n        paramTypes[index] = parameterTypes[i].toNativeType();\r\n      }\r\n    }\r\n    var resultType = returnType.toNativeType();\r\n    var module = this.module;\r\n    var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\r\n    if (!typeRef) {\r\n      let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\r\n      typeRef = module.addFunctionType(name, resultType, paramTypes);\r\n    }\r\n    return typeRef;\r\n  }\r\n\r\n  /** Compiles a readily resolved function instance. */\r\n  compileFunction(instance: Function): bool {\r\n    if (instance.is(CommonFlags.COMPILED)) return true;\r\n    assert(!instance.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN));\r\n    instance.set(CommonFlags.COMPILED);\r\n\r\n    // check that modifiers are matching\r\n    var declaration = instance.prototype.declaration;\r\n    var body = declaration.body;\r\n    if (body) {\r\n      if (instance.is(CommonFlags.AMBIENT)) {\r\n        this.error(\r\n          DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n          declaration.name.range\r\n        );\r\n      }\r\n    } else {\r\n      if (!instance.is(CommonFlags.AMBIENT)) {\r\n        this.error(\r\n          DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n          declaration.name.range\r\n        );\r\n      }\r\n    }\r\n\r\n    var ref: FunctionRef;\r\n    var signature = instance.signature;\r\n    var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n    var module = this.module;\r\n    if (body) {\r\n      let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\r\n      let returnType = instance.signature.returnType;\r\n\r\n      // compile body\r\n      let previousFunction = this.currentFunction;\r\n      this.currentFunction = instance;\r\n      let flow = instance.flow;\r\n      let stmt: ExpressionRef;\r\n      if (body.kind == NodeKind.EXPRESSION) { // () => expression\r\n        assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\r\n        assert(instance.is(CommonFlags.ARROW));\r\n        stmt = this.compileExpression(\r\n          (<ExpressionStatement>body).expression,\r\n          returnType,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        flow.set(FlowFlags.RETURNS);\r\n        if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n        flow.finalize();\r\n      } else {\r\n        assert(body.kind == NodeKind.BLOCK);\r\n        let stmts = this.compileStatements((<BlockStatement>body).statements);\r\n        if (instance.is(CommonFlags.MAIN)) {\r\n          module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\r\n          stmts.unshift(\r\n            module.createIf(\r\n              module.createUnary(\r\n                UnaryOp.EqzI32,\r\n                module.createGetGlobal(\"~started\", NativeType.I32)\r\n              ),\r\n              module.createBlock(null, [\r\n                module.createCall(\"start\", null, NativeType.None),\r\n                module.createSetGlobal(\"~started\", module.createI32(1))\r\n              ])\r\n            )\r\n          );\r\n        }\r\n        flow.finalize();\r\n        if (isConstructor) {\r\n          let nativeSizeType = this.options.nativeSizeType;\r\n          assert(instance.is(CommonFlags.INSTANCE));\r\n\r\n          // implicitly return `this` if the constructor doesn't always return on its own\r\n          if (!flow.is(FlowFlags.RETURNS)) {\r\n\r\n            // if all branches are guaranteed to allocate, skip the final conditional allocation\r\n            if (flow.is(FlowFlags.ALLOCATES)) {\r\n              stmts.push(module.createGetLocal(0, nativeSizeType));\r\n\r\n            // if not all branches are guaranteed to allocate, also append a conditional allocation\r\n            } else {\r\n              let parent = assert(instance.parent);\r\n              assert(parent.kind == ElementKind.CLASS);\r\n              stmts.push(module.createTeeLocal(0,\r\n                this.makeConditionalAllocate(<Class>parent, declaration.name)\r\n              ));\r\n            }\r\n          }\r\n\r\n        // make sure all branches return\r\n        } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\r\n          this.error(\r\n            DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n            declaration.signature.returnType.range\r\n          );\r\n        }\r\n        stmt = !stmts.length\r\n          ? module.createNop()\r\n          : stmts.length == 1\r\n            ? stmts[0]\r\n            : module.createBlock(null, stmts, returnType.toNativeType());\r\n      }\r\n      this.currentFunction = previousFunction;\r\n\r\n      // create the function\r\n      ref = module.addFunction(\r\n        instance.internalName,\r\n        typeRef,\r\n        typesToNativeTypes(instance.additionalLocals),\r\n        stmt\r\n      );\r\n\r\n      // concrete functions cannot have an annotated external name\r\n      if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\r\n        let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          decorator.range\r\n        );\r\n      }\r\n\r\n    } else {\r\n      instance.set(CommonFlags.MODULE_IMPORT);\r\n      mangleImportName(instance, declaration, instance.prototype.parent); // TODO: check for duplicates\r\n\r\n      // create the function import\r\n      ref = module.addFunctionImport(\r\n        instance.internalName,\r\n        mangleImportName_moduleName,\r\n        mangleImportName_elementName,\r\n        typeRef\r\n      );\r\n    }\r\n\r\n    // check module-level export\r\n    if (instance.is(CommonFlags.MODULE_EXPORT)) {\r\n      if (signature.requiredParameters < signature.parameterTypes.length) {\r\n        // export the trampoline if the function takes optional parameters\r\n        instance = this.ensureTrampoline(instance);\r\n        this.ensureArgcSet();\r\n      }\r\n      module.addFunctionExport(instance.internalName, mangleExportName(instance));\r\n    }\r\n\r\n    instance.finalize(module, ref);\r\n    return true;\r\n  }\r\n\r\n  // namespaces\r\n\r\n  compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n    var members = declaration.members;\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      let member = members[i];\r\n      switch (member.kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<ClassDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileClassDeclaration(<ClassDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<InterfaceDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileInterfaceDeclaration(<InterfaceDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.ENUMDECLARATION: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            this.compileEnumDeclaration(<EnumDeclaration>member);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<FunctionDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileFunctionDeclaration(<FunctionDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            this.compileNamespaceDeclaration(<NamespaceDeclaration>member);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            let variableInit = this.compileVariableStatement(<VariableStatement>member, true);\r\n            if (variableInit) this.startFunctionBody.push(variableInit);\r\n          }\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n  }\r\n\r\n  compileNamespace(ns: Namespace): void {\r\n    if (!ns.members) return;\r\n\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    for (let element of ns.members.values()) {\r\n      switch (element.kind) {\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          if (\r\n            (\r\n              noTreeShaking ||\r\n              (<ClassPrototype>element).is(CommonFlags.EXPORT)\r\n            ) && !(<ClassPrototype>element).is(CommonFlags.GENERIC)\r\n          ) {\r\n            this.compileClassUsingTypeArguments(<ClassPrototype>element, []);\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.ENUM: {\r\n          this.compileEnum(<Enum>element);\r\n          break;\r\n        }\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          if (\r\n            (\r\n              noTreeShaking || (<FunctionPrototype>element).is(CommonFlags.EXPORT)\r\n            ) && !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n          ) {\r\n            this.compileFunctionUsingTypeArguments(\r\n              <FunctionPrototype>element,\r\n              [],\r\n              null, // no contextual type arguments\r\n              null, // no outer scope\r\n              (<FunctionPrototype>element).declaration.name\r\n            );\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.GLOBAL: {\r\n          this.compileGlobal(<Global>element);\r\n          break;\r\n        }\r\n        case ElementKind.NAMESPACE: {\r\n          this.compileNamespace(<Namespace>element);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // exports\r\n\r\n  compileExportStatement(statement: ExportStatement): void {\r\n    var module = this.module;\r\n    var fileLevelExports = this.program.fileLevelExports;\r\n    var members = statement.members;\r\n    if (!members) return; // filespace\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      let member = members[i];\r\n      let internalExportName = (\r\n        statement.range.source.internalPath +\r\n        PATH_DELIMITER +\r\n        member.externalName.text\r\n      );\r\n      let element = fileLevelExports.get(internalExportName);\r\n      if (!element) continue; // reported in Program#initialize\r\n      switch (element.kind) {\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          if (!(<ClassPrototype>element).is(CommonFlags.GENERIC)) {\r\n            this.compileClassUsingTypeArguments(<ClassPrototype>element, []);\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.ENUM: {\r\n          this.compileEnum(<Enum>element);\r\n          break;\r\n        }\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          if (\r\n            !(<FunctionPrototype>element).is(CommonFlags.GENERIC) &&\r\n            statement.range.source.isEntry\r\n          ) {\r\n            let functionInstance = this.compileFunctionUsingTypeArguments(\r\n              <FunctionPrototype>element,\r\n              [],\r\n              null, // no contextual type arguments\r\n              null, // no outer scope\r\n              (<FunctionPrototype>element).declaration.name\r\n            );\r\n            if (functionInstance) {\r\n              let functionDeclaration = functionInstance.prototype.declaration;\r\n              if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n                module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n              }\r\n            }\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.GLOBAL: {\r\n          if (this.compileGlobal(<Global>element) && statement.range.source.isEntry) {\r\n            let globalDeclaration = (<Global>element).declaration;\r\n            if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n              if ((<Global>element).is(CommonFlags.INLINED)) {\r\n                module.addGlobalExport(element.internalName, member.externalName.text);\r\n              } else {\r\n                this.warning(\r\n                  DiagnosticCode.Cannot_export_a_mutable_global,\r\n                  member.range\r\n                );\r\n              }\r\n            }\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.NAMESPACE: {\r\n          this.compileNamespace(<Namespace>element);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // classes\r\n\r\n  compileClassDeclaration(\r\n    declaration: ClassDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): void {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n    this.compileClassUsingTypeArguments(\r\n      <ClassPrototype>element,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      alternativeReportNode\r\n    );\r\n  }\r\n\r\n  compileClassUsingTypeArguments(\r\n    prototype: ClassPrototype,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): void {\r\n    var instance = prototype.resolveUsingTypeArguments( // reports\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      alternativeReportNode\r\n    );\r\n    if (!instance) return;\r\n    this.compileClass(instance);\r\n  }\r\n\r\n  compileClass(instance: Class): bool {\r\n    if (instance.is(CommonFlags.COMPILED)) return true;\r\n    instance.set(CommonFlags.COMPILED);\r\n\r\n    var staticMembers = instance.prototype.members;\r\n    if (staticMembers) {\r\n      for (let element of staticMembers.values()) {\r\n        switch (element.kind) {\r\n          case ElementKind.GLOBAL: {\r\n            this.compileGlobal(<Global>element);\r\n            break;\r\n          }\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (\r\n              !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n            ) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                <FunctionPrototype>element,\r\n                [], null, null,\r\n                (<FunctionPrototype>element).declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n          case ElementKind.PROPERTY: {\r\n            let getter = (<Property>element).getterPrototype;\r\n            if (getter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                getter,\r\n                [], null, null,\r\n                getter.declaration.name\r\n              );\r\n            }\r\n            let setter = (<Property>element).setterPrototype;\r\n            if (setter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                setter,\r\n                [], null, null,\r\n                setter.declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    var ctorInstance = instance.constructorInstance;\r\n    if (ctorInstance) this.compileFunction(ctorInstance);\r\n    var instanceMembers = instance.members;\r\n    if (instanceMembers) {\r\n      for (let element of instanceMembers.values()) {\r\n        switch (element.kind) {\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (\r\n              !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n            ) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                <FunctionPrototype>element,\r\n                [],\r\n                instance.contextualTypeArguments,\r\n                null, // no outer scope\r\n                (<FunctionPrototype>element).declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n          case ElementKind.FIELD: {\r\n            element.set(CommonFlags.COMPILED);\r\n            if (!instance.is(CommonFlags.MODULE_EXPORT) || element.is(CommonFlags.PRIVATE)) break;\r\n            let module = this.module;\r\n            let name = (<Field>element).simpleName;\r\n            let type = (<Field>element).type;\r\n            let nativeType = type.toNativeType();\r\n            let offset = (<Field>element).memoryOffset;\r\n            let usizeType = this.options.usizeType;\r\n            let nativeSizeType = this.options.nativeSizeType;\r\n\r\n            // export an implicit getter: get:fieldName(this: usize) -> fieldType\r\n            let getterName = mangleExportName(element, GETTER_PREFIX + name);\r\n            module.addFunction(\r\n              getterName,\r\n              this.ensureFunctionType(null, type, usizeType),\r\n              null,\r\n              module.createLoad(\r\n                type.byteSize,\r\n                type.is(TypeFlags.SIGNED),\r\n                module.createGetLocal(0, nativeSizeType),\r\n                nativeType,\r\n                offset\r\n              )\r\n            );\r\n            module.addFunctionExport(getterName, getterName);\r\n\r\n            // export an implicit setter: set:fieldName(this: usize, value: fieldType) -> void\r\n            if (element.is(CommonFlags.READONLY)) break;\r\n            let setterName = mangleExportName(element, SETTER_PREFIX + name);\r\n            module.addFunction(\r\n              setterName,\r\n              this.ensureFunctionType([ type ], Type.void, usizeType),\r\n              null,\r\n              module.createStore(\r\n                type.byteSize,\r\n                module.createGetLocal(0, nativeSizeType),\r\n                module.createGetLocal(1, nativeType),\r\n                nativeType,\r\n                offset\r\n              )\r\n            );\r\n            module.addFunctionExport(setterName, setterName);\r\n            break;\r\n          }\r\n          case ElementKind.PROPERTY: {\r\n            let getter = (<Property>element).getterPrototype;\r\n            if (getter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                getter,\r\n                [], instance.contextualTypeArguments, null,\r\n                getter.declaration.name\r\n              );\r\n            }\r\n            let setter = (<Property>element).setterPrototype;\r\n            if (setter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                setter,\r\n                [], instance.contextualTypeArguments, null,\r\n                setter.declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  compileInterfaceDeclaration(\r\n    declaration: InterfaceDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): void {\r\n    // TODO\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      declaration.range\r\n    );\r\n  }\r\n\r\n  // memory\r\n\r\n  /** Adds a static memory segment with the specified data. */\r\n  addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n    var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n    var segment = MemorySegment.create(buffer, memoryOffset);\r\n    this.memorySegments.push(segment);\r\n    this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n    return segment;\r\n  }\r\n\r\n  // function table\r\n\r\n  /** Ensures that a table entry exists for the specified function and returns its index. */\r\n  ensureFunctionTableEntry(func: Function): i32 {\r\n    assert(func.is(CommonFlags.COMPILED));\r\n    if (func.functionTableIndex >= 0) {\r\n      return func.functionTableIndex;\r\n    }\r\n    var functionTable = this.functionTable;\r\n    var index = functionTable.length;\r\n    if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\r\n      // insert the trampoline if the function has optional parameters\r\n      func = this.ensureTrampoline(func);\r\n    }\r\n    functionTable.push(func);\r\n    func.functionTableIndex = index;\r\n    return index;\r\n  }\r\n\r\n  // statements\r\n\r\n  compileStatement(statement: Statement): ExpressionRef {\r\n    var module = this.module;\r\n    var stmt: ExpressionRef;\r\n    switch (statement.kind) {\r\n      case NodeKind.BLOCK: {\r\n        stmt = this.compileBlockStatement(<BlockStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.BREAK: {\r\n        stmt = this.compileBreakStatement(<BreakStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.CONTINUE: {\r\n        stmt = this.compileContinueStatement(<ContinueStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.DO: {\r\n        stmt = this.compileDoStatement(<DoStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.EMPTY: {\r\n        stmt = this.compileEmptyStatement(<EmptyStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.EXPRESSION: {\r\n        stmt = this.compileExpressionStatement(<ExpressionStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.FOR: {\r\n        stmt = this.compileForStatement(<ForStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.IF: {\r\n        stmt = this.compileIfStatement(<IfStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.RETURN: {\r\n        stmt = this.compileReturnStatement(<ReturnStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.SWITCH: {\r\n        stmt = this.compileSwitchStatement(<SwitchStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.THROW: {\r\n        stmt = this.compileThrowStatement(<ThrowStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.TRY: {\r\n        stmt = this.compileTryStatement(<TryStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.VARIABLE: {\r\n        stmt = this.compileVariableStatement(<VariableStatement>statement);\r\n        if (!stmt) stmt = module.createNop();\r\n        break;\r\n      }\r\n      case NodeKind.VOID: {\r\n        stmt = this.compileVoidStatement(<VoidStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.WHILE: {\r\n        stmt = this.compileWhileStatement(<WhileStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.TYPEDECLARATION: {\r\n        // type declarations must be top-level because function bodies are evaluated when\r\n        // reachaable only.\r\n        if (this.currentFunction == this.startFunctionInstance) {\r\n          return module.createNop();\r\n        }\r\n        // otherwise fall-through\r\n      }\r\n      default: {\r\n        assert(false);\r\n        stmt = module.createUnreachable();\r\n      }\r\n    }\r\n    if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\r\n    return stmt;\r\n  }\r\n\r\n  compileStatements(statements: Statement[]): ExpressionRef[] {\r\n    var numStatements = statements.length;\r\n    var stmts = new Array<ExpressionRef>(numStatements);\r\n    stmts.length = 0;\r\n    var flow = this.currentFunction.flow;\r\n    for (let i = 0; i < numStatements; ++i) {\r\n      let stmt = this.compileStatement(statements[i]);\r\n      switch (getExpressionId(stmt)) {\r\n        case ExpressionId.Block: {\r\n          if (!getBlockName(stmt)) {\r\n            for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: stmts.push(stmt);\r\n        case ExpressionId.Nop:\r\n      }\r\n      if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\r\n    }\r\n    return stmts;\r\n  }\r\n\r\n  compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n    var statements = statement.statements;\r\n    var parentFlow = this.currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    this.currentFunction.flow = flow;\r\n\r\n    var stmts = this.compileStatements(statements);\r\n    var stmt = stmts.length == 0\r\n      ? this.module.createNop()\r\n      : stmts.length == 1\r\n        ? stmts[0]\r\n        : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\r\n\r\n    this.currentFunction.flow = flow.free();\r\n    parentFlow.inherit(flow);\r\n    return stmt;\r\n  }\r\n\r\n  compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n    var module = this.module;\r\n    if (statement.label) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        statement.label.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    var flow = this.currentFunction.flow;\r\n    var breakLabel = flow.breakLabel;\r\n    if (breakLabel == null) {\r\n      this.error(\r\n        DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n        statement.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    flow.set(FlowFlags.BREAKS);\r\n    return module.createBreak(breakLabel);\r\n  }\r\n\r\n  compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var label = statement.label;\r\n    if (label) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        label.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    // Check if 'continue' is allowed here\r\n    var flow = this.currentFunction.flow;\r\n    var continueLabel = flow.continueLabel;\r\n    if (continueLabel == null) {\r\n      this.error(\r\n        DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n        statement.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    flow.set(FlowFlags.CONTINUES);\r\n    return module.createBreak(continueLabel);\r\n  }\r\n\r\n  compileDoStatement(statement: DoStatement): ExpressionRef {\r\n    var currentFunction = this.currentFunction;\r\n    var module = this.module;\r\n\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n\r\n    var body = this.compileStatement(statement.statement);\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n    // TODO: check if condition is always false and if so, omit it (just a block)\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    parentFlow.inherit(flow);\r\n\r\n    return module.createBlock(breakLabel, [\r\n      module.createLoop(continueLabel,\r\n        terminated\r\n          ? body // skip trailing continue if unnecessary\r\n          : module.createBlock(null, [\r\n              body,\r\n              module.createBreak(continueLabel, condExpr)\r\n            ], NativeType.None)\r\n      )\r\n    ], terminated ? NativeType.Unreachable : NativeType.None);\r\n  }\r\n\r\n  compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n    return this.module.createNop();\r\n  }\r\n\r\n  compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n    var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\r\n    if (this.currentType != Type.void) {\r\n      expr = this.module.createDrop(expr);\r\n      this.currentType = Type.void;\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  compileForStatement(statement: ForStatement): ExpressionRef {\r\n    // A for statement initiates a new branch with its own scoped variables\r\n    // possibly declared in its initializer, and break context.\r\n    var currentFunction = this.currentFunction;\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = flow.breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n    var repeatLabel = \"repeat|\" + label;\r\n\r\n    // Compile in correct order\r\n    var module = this.module;\r\n    var initExpr = statement.initializer\r\n      ? this.compileStatement(<Statement>statement.initializer)\r\n      : 0;\r\n    var condExpr: ExpressionRef = 0;\r\n    var alwaysTrue = false;\r\n    if (statement.condition) {\r\n      condExpr = this.makeIsTrueish(\r\n        this.compileExpressionRetainType(<Expression>statement.condition, Type.bool, WrapMode.NONE),\r\n        this.currentType\r\n      );\r\n      // check if the condition is always true\r\n      let condPre = this.precomputeExpressionRef(condExpr);\r\n      if (getExpressionId(condPre) == ExpressionId.Const) {\r\n        assert(getExpressionType(condPre) == NativeType.I32);\r\n        if (getConstValueI32(condPre) != 0) alwaysTrue = true;\r\n        // TODO: could skip compilation if the condition is always false here, but beware that the\r\n        // initializer could still declare new 'var's that are used later on.\r\n      }\r\n      // recompile to original\r\n      condExpr = this.makeIsTrueish(\r\n        this.compileExpressionRetainType(<Expression>statement.condition, Type.bool, WrapMode.NONE),\r\n        this.currentType\r\n      );\r\n    } else {\r\n      // omitted condition is always true\r\n      condExpr = module.createI32(1);\r\n      alwaysTrue = true;\r\n    }\r\n    var incrExpr = statement.incrementor\r\n      ? this.compileExpression(<Expression>statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n      : 0;\r\n    var bodyExpr = this.compileStatement(statement.statement);\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    var usesContinue = flow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    var terminated = alwaysTrue && flow.isAny(FlowFlags.ANY_TERMINATING);\r\n    if (alwaysTrue) parentFlow.inherit(flow);\r\n    else parentFlow.inheritConditional(flow);\r\n\r\n    var breakBlock = new Array<ExpressionRef>(); // outer 'break' block\r\n    if (initExpr) breakBlock.push(initExpr);\r\n\r\n    var repeatBlock = new Array<ExpressionRef>(); // block repeating the loop\r\n    if (usesContinue) {\r\n      repeatBlock.push(\r\n        module.createBlock(continueLabel, [ // inner 'continue' block\r\n          module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\r\n          bodyExpr\r\n        ], NativeType.None)\r\n      );\r\n    } else { // can omit the 'continue' block\r\n      repeatBlock.push(\r\n        module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\r\n      );\r\n      repeatBlock.push(bodyExpr);\r\n    }\r\n    if (incrExpr) repeatBlock.push(incrExpr);\r\n    repeatBlock.push(\r\n      module.createBreak(repeatLabel)\r\n    );\r\n\r\n    breakBlock.push(\r\n      module.createLoop(repeatLabel,\r\n        module.createBlock(null, repeatBlock, NativeType.None)\r\n      )\r\n    );\r\n\r\n    return module.createBlock(\r\n      breakLabel,\r\n      breakBlock,\r\n      terminated\r\n        ? NativeType.Unreachable\r\n        : NativeType.None\r\n      );\r\n  }\r\n\r\n  compileIfStatement(statement: IfStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var ifTrue = statement.ifTrue;\r\n    var ifFalse = statement.ifFalse;\r\n\r\n    // The condition doesn't initiate a branch yet\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary branches if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        return getConstValueI32(condExprPrecomp)\r\n          ? this.compileStatement(ifTrue)\r\n          : ifFalse\r\n            ? this.compileStatement(ifFalse)\r\n            : module.createNop();\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    // Each arm initiates a branch\r\n    var parentFlow = currentFunction.flow;\r\n    var ifTrueFlow = parentFlow.fork();\r\n    currentFunction.flow = ifTrueFlow;\r\n    var ifTrueExpr = this.compileStatement(ifTrue);\r\n    currentFunction.flow = ifTrueFlow.free();\r\n\r\n    var ifFalseExpr: ExpressionRef = 0;\r\n    if (ifFalse) {\r\n      let ifFalseFlow = parentFlow.fork();\r\n      currentFunction.flow = ifFalseFlow;\r\n      ifFalseExpr = this.compileStatement(ifFalse);\r\n      currentFunction.flow = ifFalseFlow.free();\r\n      parentFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\r\n    } else {\r\n      parentFlow.inheritConditional(ifTrueFlow);\r\n    }\r\n    return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\r\n  }\r\n\r\n  compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var expr: ExpressionRef = 0;\r\n    var flow = currentFunction.flow;\r\n\r\n    // Remember that this flow returns\r\n    flow.set(FlowFlags.RETURNS);\r\n\r\n    if (statement.value) {\r\n      let returnType = flow.returnType;\r\n      if (returnType == Type.void) {\r\n        this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\r\n        this.error(\r\n          DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n          statement.value.range, this.currentType.toString(), returnType.toString()\r\n        );\r\n        this.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      expr = this.compileExpression(\r\n        statement.value,\r\n        returnType,\r\n        ConversionKind.IMPLICIT,\r\n        currentFunction.is(CommonFlags.MODULE_EXPORT)\r\n          ? WrapMode.WRAP\r\n          : WrapMode.NONE\r\n      );\r\n\r\n      // Remember whether returning a properly wrapped value\r\n      if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n    }\r\n\r\n    // If the last statement anyway, make it the block's return value\r\n    if (isLastStatement(statement)) return expr ? expr : module.createNop();\r\n\r\n    // When inlining, break to the end of the inlined function's block (no need to wrap)\r\n    return flow.is(FlowFlags.INLINE_CONTEXT)\r\n      ? module.createBreak(assert(flow.returnLabel), 0, expr)\r\n      : module.createReturn(expr);\r\n  }\r\n\r\n  compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    var cases = statement.cases;\r\n    var numCases = cases.length;\r\n    if (!numCases) {\r\n      return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    }\r\n\r\n    // Everything within a switch uses the same break context\r\n    var context = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n\r\n    // introduce a local for evaluating the condition (exactly once)\r\n    var tempLocal = currentFunction.getTempLocal(Type.u32, false);\r\n    var tempLocalIndex = tempLocal.index;\r\n\r\n    // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n    var breaks = new Array<ExpressionRef>(1 + numCases);\r\n    breaks[0] = module.createSetLocal( // initializer\r\n      tempLocalIndex,\r\n      this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n    );\r\n\r\n    // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n    var breakIndex = 1;\r\n    var defaultIndex = -1;\r\n    for (let i = 0; i < numCases; ++i) {\r\n      let case_ = cases[i];\r\n      let label = case_.label;\r\n      if (label) {\r\n        breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n          module.createBinary(BinaryOp.EqI32,\r\n            module.createGetLocal(tempLocalIndex, NativeType.I32),\r\n            this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n          )\r\n        );\r\n      } else {\r\n        defaultIndex = i;\r\n      }\r\n    }\r\n\r\n    currentFunction.freeTempLocal(tempLocal);\r\n\r\n    // otherwise br to default respectively out of the switch if there is no default case\r\n    breaks[breakIndex] = module.createBreak((defaultIndex >= 0\r\n        ? \"case\" + defaultIndex.toString(10)\r\n        : \"break\"\r\n      ) + \"|\" + context);\r\n\r\n    // nest blocks in order\r\n    var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n    var alwaysReturns = true;\r\n    var alwaysReturnsWrapped = true;\r\n    var alwaysThrows = true;\r\n    var alwaysAllocates = true;\r\n    for (let i = 0; i < numCases; ++i) {\r\n      let case_ = cases[i];\r\n      let statements = case_.statements;\r\n      let numStatements = statements.length;\r\n\r\n      // Each switch case initiates a new branch\r\n      let flow = parentFlow.fork();\r\n      currentFunction.flow = flow;\r\n      let breakLabel = \"break|\" + context;\r\n      flow.breakLabel = breakLabel;\r\n\r\n      let isLast = i == numCases - 1;\r\n      let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n      let stmts = new Array<ExpressionRef>(1 + numStatements);\r\n      stmts[0] = currentBlock;\r\n      let count = 1;\r\n      let terminated = false;\r\n      for (let j = 0; j < numStatements; ++j) {\r\n        let stmt = this.compileStatement(statements[j]);\r\n        if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n          stmts[count++] = stmt;\r\n          if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n            terminated = true;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      stmts.length = count;\r\n      if (terminated || isLast) {\r\n        if (!flow.is(FlowFlags.RETURNS)) alwaysReturns = false;\r\n        if (!flow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\r\n        if (!flow.is(FlowFlags.THROWS)) alwaysThrows = false;\r\n        if (!flow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\r\n      }\r\n\r\n      // Switch back to the parent flow\r\n      flow.unset(\r\n        FlowFlags.BREAKS |\r\n        FlowFlags.CONDITIONALLY_BREAKS\r\n      );\r\n      currentFunction.flow = flow.free();\r\n      currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\r\n    }\r\n    currentFunction.leaveBreakContext();\r\n\r\n    // If the switch has a default (guaranteed to handle any value), propagate common flags\r\n    if (defaultIndex >= 0) {\r\n      if (alwaysReturns) parentFlow.set(FlowFlags.RETURNS);\r\n      if (alwaysReturnsWrapped) parentFlow.set(FlowFlags.RETURNS_WRAPPED);\r\n      if (alwaysThrows) parentFlow.set(FlowFlags.THROWS);\r\n      if (alwaysAllocates) parentFlow.set(FlowFlags.ALLOCATES);\r\n    }\r\n    return currentBlock;\r\n  }\r\n\r\n  compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n    var flow = this.currentFunction.flow;\r\n\r\n    // Remember that this branch throws\r\n    flow.set(FlowFlags.THROWS);\r\n\r\n    // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n    flow.set(FlowFlags.RETURNS);\r\n\r\n    // TODO: requires exception-handling spec.\r\n    return compileBuiltinAbort(this, null, statement);\r\n  }\r\n\r\n  compileTryStatement(statement: TryStatement): ExpressionRef {\r\n    // TODO\r\n    // can't yet support something like: try { return ... } finally { ... }\r\n    // worthwhile to investigate lowering returns to block results (here)?\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      statement.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  /**\r\n   * Compiles a variable statement. Returns `0` if an initializer is not\r\n   * necessary.\r\n   */\r\n  compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n    var program = this.program;\r\n    var currentFunction = this.currentFunction;\r\n    var declarations = statement.declarations;\r\n    var numDeclarations = declarations.length;\r\n\r\n    // top-level variables and constants become globals\r\n    if (isKnownGlobal || (\r\n      currentFunction == this.startFunctionInstance &&\r\n      statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n    )) {\r\n      // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n      // though such variables could also become start function locals if, and only if, not used\r\n      // within any function declared in the same source, which is unknown at this point. the only\r\n      // efficient way to deal with this would be to keep track of all occasions it is used and\r\n      // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n      for (let i = 0; i < numDeclarations; ++i) {\r\n        this.compileGlobalDeclaration(declarations[i]);\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    // other variables become locals\r\n    var initializers = new Array<ExpressionRef>();\r\n    var flow = this.currentFunction.flow;\r\n    for (let i = 0; i < numDeclarations; ++i) {\r\n      let declaration = declarations[i];\r\n      let name = declaration.name.text;\r\n      let type: Type | null = null;\r\n      let initExpr: ExpressionRef = 0;\r\n      if (declaration.type) {\r\n        type = program.resolveType( // reports\r\n          declaration.type,\r\n          flow.contextualTypeArguments\r\n        );\r\n        if (!type) continue;\r\n        if (declaration.initializer) {\r\n          initExpr = this.compileExpression( // reports\r\n            declaration.initializer,\r\n            type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n        }\r\n      } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n        initExpr = this.compileExpressionRetainType( // reports\r\n          declaration.initializer,\r\n          Type.void,\r\n          WrapMode.NONE\r\n        );\r\n        if (this.currentType == Type.void) {\r\n          this.error(\r\n            DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n            declaration.range, this.currentType.toString(), \"<auto>\"\r\n          );\r\n          continue;\r\n        }\r\n        type = this.currentType;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          declaration.name.range.atEnd\r\n        );\r\n        continue;\r\n      }\r\n      let isInlined = false;\r\n      if (declaration.is(CommonFlags.CONST)) {\r\n        if (initExpr) {\r\n          initExpr = this.precomputeExpressionRef(initExpr);\r\n          if (getExpressionId(initExpr) == ExpressionId.Const) {\r\n            let local = new Local(program, name, -1, type);\r\n            switch (getExpressionType(initExpr)) {\r\n              case NativeType.I32: {\r\n                local = local.withConstantIntegerValue(\r\n                  i64_new(\r\n                    getConstValueI32(initExpr),\r\n                    0\r\n                  )\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.I64: {\r\n                local = local.withConstantIntegerValue(\r\n                  i64_new(\r\n                    getConstValueI64Low(initExpr),\r\n                    getConstValueI64High(initExpr)\r\n                  )\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.F32: {\r\n                local = local.withConstantFloatValue(<f64>getConstValueF32(initExpr));\r\n                break;\r\n              }\r\n              case NativeType.F64: {\r\n                local = local.withConstantFloatValue(getConstValueF64(initExpr));\r\n                break;\r\n              }\r\n              default: {\r\n                assert(false);\r\n                return this.module.createUnreachable();\r\n              }\r\n            }\r\n            // Create a virtual local that doesn't actually exist in WebAssembly\r\n            let scopedLocals = currentFunction.flow.scopedLocals;\r\n            if (!scopedLocals) currentFunction.flow.scopedLocals = scopedLocals = new Map();\r\n            else if (scopedLocals.has(name)) {\r\n              this.error(\r\n                DiagnosticCode.Duplicate_identifier_0,\r\n                declaration.name.range, name\r\n              );\r\n              return this.module.createUnreachable();\r\n            }\r\n            scopedLocals.set(name, local);\r\n            isInlined = true;\r\n          } else {\r\n            this.warning(\r\n              DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n              declaration.range\r\n            );\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._const_declarations_must_be_initialized,\r\n            declaration.range\r\n          );\r\n        }\r\n      }\r\n      if (!isInlined) {\r\n        let local: Local;\r\n        if (\r\n          declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\r\n          flow.is(FlowFlags.INLINE_CONTEXT)\r\n        ) { // here: not top-level\r\n          local = flow.addScopedLocal(type, name, false, declaration); // reports\r\n        } else {\r\n          local = currentFunction.addLocal(type, name, declaration); // reports\r\n        }\r\n        if (initExpr) {\r\n          initializers.push(this.compileAssignmentWithValue(declaration.name, initExpr));\r\n          if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n            flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\r\n          }\r\n        } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n          flow.setLocalWrapped(local.index, true); // zero\r\n        }\r\n      }\r\n    }\r\n    return initializers.length   // we can unwrap these here because the\r\n      ? initializers.length == 1 // source didn't tell us exactly what to do\r\n        ? initializers[0]\r\n        : this.module.createBlock(null, initializers, NativeType.None)\r\n      : 0;\r\n  }\r\n\r\n  compileVoidStatement(statement: VoidStatement): ExpressionRef {\r\n    return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n  }\r\n\r\n  compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n    var module = this.module;\r\n\r\n    // The condition does not yet initialize a branch\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary loops if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        if (!getConstValueI32(condExprPrecomp)) return module.createNop();\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    // Statements initiate a new branch with its own break context\r\n    var currentFunction = this.currentFunction;\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n\r\n    var body = this.compileStatement(statement.statement);\r\n    var alwaysTrue = false; // TODO\r\n    var alwaysReturns = alwaysTrue && flow.is(FlowFlags.RETURNS);\r\n    var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    if (alwaysTrue) parentFlow.inherit(flow);\r\n    else parentFlow.inheritConditional(flow);\r\n\r\n    var expr = module.createBlock(breakLabel, [\r\n      module.createLoop(continueLabel,\r\n        module.createIf(condExpr,\r\n          terminated\r\n            ? body // skip trailing continue if unnecessary\r\n            : module.createBlock(null, [\r\n                body,\r\n                module.createBreak(continueLabel)\r\n              ], NativeType.None)\r\n        )\r\n      )\r\n    ], alwaysReturns ? NativeType.Unreachable : NativeType.None);\r\n    return expr;\r\n  }\r\n\r\n  // expressions\r\n\r\n  /**\r\n   * Compiles the value of an inlined constant element.\r\n   * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\r\n   *  is precomputed according to context.\r\n   */\r\n  compileInlineConstant(\r\n    element: VariableLikeElement,\r\n    contextualType: Type,\r\n    retainType: bool\r\n  ): ExpressionRef {\r\n    assert(element.is(CommonFlags.INLINED));\r\n    var type = element.type;\r\n    switch (\r\n      !retainType &&\r\n      type.is(TypeFlags.INTEGER) &&\r\n      contextualType.is(TypeFlags.INTEGER) &&\r\n      type.size < contextualType.size\r\n        ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n        : (this.currentType = type).kind\r\n    ) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16: {\r\n        let shift = type.computeSmallIntegerShift(Type.i32);\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue) << shift >> shift\r\n            : 0\r\n        ); // recognized by canOverflow\r\n      }\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        let mask = element.type.computeSmallIntegerMask(Type.i32);\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue) & mask\r\n            : 0\r\n        ); // recognized by canOverflow\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue)\r\n            : 0\r\n        );\r\n      }\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: {\r\n        if (!element.program.options.isWasm64) {\r\n          return this.module.createI32(\r\n            element.constantValueKind == ConstantValueKind.INTEGER\r\n              ? i64_low(element.constantIntegerValue)\r\n              : 0\r\n          );\r\n        }\r\n        // fall-through\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return element.constantValueKind == ConstantValueKind.INTEGER\r\n          ? this.module.createI64(\r\n              i64_low(element.constantIntegerValue),\r\n              i64_high(element.constantIntegerValue)\r\n            )\r\n          : this.module.createI64(0);\r\n      }\r\n      case TypeKind.F64: {\r\n        if (!(element.is(CommonFlags.BUILTIN) && contextualType == Type.f32)) {\r\n          return this.module.createF64((<VariableLikeElement>element).constantFloatValue);\r\n        }\r\n        // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\r\n        this.currentType = Type.f32;\r\n      }\r\n      case TypeKind.F32: {\r\n        return this.module.createF32((<VariableLikeElement>element).constantFloatValue);\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return this.module.createUnreachable();\r\n      }\r\n    }\r\n  }\r\n\r\n  compileExpression(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    this.currentType = contextualType;\r\n\r\n    var expr: ExpressionRef;\r\n    switch (expression.kind) {\r\n      case NodeKind.ASSERTION: {\r\n        expr = this.compileAssertionExpression(<AssertionExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.BINARY: {\r\n        expr = this.compileBinaryExpression(<BinaryExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.CALL: {\r\n        expr = this.compileCallExpression(<CallExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.COMMA: {\r\n        expr = this.compileCommaExpression(<CommaExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.ELEMENTACCESS: {\r\n        expr = this.compileElementAccessExpression(<ElementAccessExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.FUNCTION: {\r\n        expr = this.compileFunctionExpression(<FunctionExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.IDENTIFIER:\r\n      case NodeKind.FALSE:\r\n      case NodeKind.NULL:\r\n      case NodeKind.THIS:\r\n      case NodeKind.SUPER:\r\n      case NodeKind.TRUE: {\r\n        expr = this.compileIdentifierExpression(\r\n          <IdentifierExpression>expression,\r\n          contextualType,\r\n          conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n        );\r\n        break;\r\n      }\r\n      case NodeKind.INSTANCEOF: {\r\n        expr = this.compileInstanceOfExpression(<InstanceOfExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.LITERAL: {\r\n        expr = this.compileLiteralExpression(<LiteralExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.NEW: {\r\n        expr = this.compileNewExpression(<NewExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.PARENTHESIZED: {\r\n        expr = this.compileParenthesizedExpression(<ParenthesizedExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.PROPERTYACCESS: {\r\n        expr = this.compilePropertyAccessExpression(\r\n          <PropertyAccessExpression>expression,\r\n          contextualType,\r\n          conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n        );\r\n        break;\r\n      }\r\n      case NodeKind.TERNARY: {\r\n        expr = this.compileTernaryExpression(<TernaryExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.UNARYPOSTFIX: {\r\n        expr = this.compileUnaryPostfixExpression(<UnaryPostfixExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.UNARYPREFIX: {\r\n        expr = this.compileUnaryPrefixExpression(<UnaryPrefixExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        expr = this.module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    var currentType = this.currentType;\r\n    if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\r\n      expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\r\n      this.currentType = contextualType;\r\n    } else if (wrapMode == WrapMode.WRAP) {\r\n      expr = this.ensureSmallIntegerWrap(expr, currentType);\r\n    }\r\n\r\n    if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n    return expr;\r\n  }\r\n\r\n  compileExpressionRetainType(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    return this.compileExpression(\r\n      expression,\r\n      contextualType == Type.void\r\n        ? Type.i32\r\n        : contextualType,\r\n      ConversionKind.NONE,\r\n      wrapMode\r\n    );\r\n  }\r\n\r\n  precomputeExpression(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    return this.precomputeExpressionRef(\r\n      this.compileExpression(expression, contextualType, conversionKind, wrapMode)\r\n    );\r\n  }\r\n\r\n  precomputeExpressionRef(expr: ExpressionRef): ExpressionRef {\r\n    var module = this.module;\r\n    var type = this.currentType;\r\n    var nativeType = type.toNativeType();\r\n    var funcRef = module.addTemporaryFunction(nativeType, null, expr);\r\n    module.runPasses([ \"precompute\" ], funcRef);\r\n    var ret = getFunctionBody(funcRef);\r\n    module.removeTemporaryFunction();\r\n    return ret;\r\n  }\r\n\r\n  convertExpression(\r\n    expr: ExpressionRef,\r\n    fromType: Type,\r\n    toType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    assert(conversionKind != ConversionKind.NONE);\r\n    var module = this.module;\r\n\r\n    // void to any\r\n    if (fromType.kind == TypeKind.VOID) {\r\n      assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\r\n      this.error(\r\n        DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n        reportNode.range, fromType.toString(), toType.toString()\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n\r\n    // any to void\r\n    if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\r\n\r\n    if (!fromType.isAssignableTo(toType)) {\r\n      if (conversionKind == ConversionKind.IMPLICIT) {\r\n        this.error(\r\n          DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\r\n          reportNode.range, fromType.toString(), toType.toString()\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n      // float to float\r\n      if (toType.is(TypeFlags.FLOAT)) {\r\n        if (fromType.kind == TypeKind.F32) {\r\n\r\n          // f32 to f64\r\n          if (toType.kind == TypeKind.F64) {\r\n            expr = module.createUnary(UnaryOp.PromoteF32, expr);\r\n          }\r\n\r\n          // otherwise f32 to f32\r\n\r\n        // f64 to f32\r\n        } else if (toType.kind == TypeKind.F32) {\r\n          expr = module.createUnary(UnaryOp.DemoteF64, expr);\r\n        }\r\n\r\n        // otherwise f64 to f64\r\n\r\n      // float to int\r\n      } else if (toType.is(TypeFlags.INTEGER)) {\r\n\r\n        // f32 to int\r\n        if (fromType.kind == TypeKind.F32) {\r\n          if (toType.is(TypeFlags.SIGNED)) {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n            }\r\n          } else {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n            }\r\n          }\r\n\r\n        // f64 to int\r\n        } else {\r\n          if (toType.is(TypeFlags.SIGNED)) {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n            }\r\n          } else {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n            }\r\n          }\r\n        }\r\n\r\n      // float to void\r\n      } else {\r\n        assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n        expr = module.createDrop(expr);\r\n      }\r\n\r\n    // int to float\r\n    } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n      // int to f32\r\n      if (toType.kind == TypeKind.F32) {\r\n        if (fromType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI64ToF32\r\n              : UnaryOp.ConvertU64ToF32,\r\n            expr\r\n          );\r\n        } else {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI32ToF32\r\n              : UnaryOp.ConvertU32ToF32,\r\n            expr\r\n          );\r\n        }\r\n\r\n      // int to f64\r\n      } else {\r\n        if (fromType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI64ToF64\r\n              : UnaryOp.ConvertU64ToF64,\r\n            expr\r\n          );\r\n        } else {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI32ToF64\r\n              : UnaryOp.ConvertU32ToF64,\r\n            expr\r\n          );\r\n        }\r\n      }\r\n\r\n    // int to int\r\n    } else {\r\n      // i64 to ...\r\n      if (fromType.is(TypeFlags.LONG)) {\r\n\r\n        // i64 to i32 or smaller\r\n        if (!toType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n        }\r\n\r\n      // i32 or smaller to i64\r\n      } else if (toType.is(TypeFlags.LONG)) {\r\n        expr = module.createUnary(\r\n          toType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\r\n          this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\r\n        );\r\n        wrapMode = WrapMode.NONE;\r\n\r\n      // i32 to i32\r\n      } else {\r\n        // small i32 to ...\r\n        if (fromType.is(TypeFlags.SHORT)) {\r\n          // small i32 to larger i32\r\n          if (fromType.size < toType.size) {\r\n            expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\r\n            wrapMode = WrapMode.NONE;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    this.currentType = toType;\r\n    return wrapMode == WrapMode.WRAP\r\n      ? this.ensureSmallIntegerWrap(expr, toType)\r\n      : expr;\r\n  }\r\n\r\n  compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n    var toType = this.program.resolveType( // reports\r\n      expression.toType,\r\n      this.currentFunction.flow.contextualTypeArguments\r\n    );\r\n    if (!toType) return this.module.createUnreachable();\r\n    return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n  }\r\n\r\n  private f32ModInstance: Function | null = null;\r\n  private f64ModInstance: Function | null = null;\r\n  private f32PowInstance: Function | null = null;\r\n  private f64PowInstance: Function | null = null;\r\n\r\n  compileBinaryExpression(\r\n    expression: BinaryExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var left = expression.left;\r\n    var right = expression.right;\r\n\r\n    var leftExpr: ExpressionRef;\r\n    var leftType: Type;\r\n    var rightExpr: ExpressionRef;\r\n    var rightType: Type;\r\n    var commonType: Type | null;\r\n\r\n    var expr: ExpressionRef;\r\n    var compound = false;\r\n\r\n    var operator = expression.operator;\r\n    switch (operator) {\r\n      case Token.LESSTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.LT);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \"<\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LtI64\r\n                : BinaryOp.LtI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LtU64\r\n                : BinaryOp.LtU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.GT);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \">\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GtU64\r\n                : BinaryOp.GtU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.LESSTHAN_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.LE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \"<=\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LeI64\r\n                : BinaryOp.LeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LeU64\r\n                : BinaryOp.LeU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.GE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \">=\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GeI64\r\n                : BinaryOp.GeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GeU64\r\n                : BinaryOp.GeU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n\r\n      case Token.EQUALS_EQUALS_EQUALS:\r\n      case Token.EQUALS_EQUALS: {\r\n\r\n        // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n        // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n        // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n         // check operator overload\r\n        if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.EQ);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          // still allow '==' with references\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.EqI64\r\n                : BinaryOp.EqI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.EXCLAMATION_EQUALS_EQUALS:\r\n      case Token.EXCLAMATION_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n         // check operator overload\r\n        if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.NE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          // still allow '!=' with references\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.NeI64\r\n                : BinaryOp.NeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.EQUALS: {\r\n        return this.compileAssignment(left, right, contextualType);\r\n      }\r\n      case Token.PLUS_EQUALS: compound = true;\r\n      case Token.PLUS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.ADD);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"+\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:   // addition might overflow\r\n          case TypeKind.I16:  // ^\r\n          case TypeKind.U8:   // ^\r\n          case TypeKind.U16:  // ^\r\n          case TypeKind.BOOL: // ^\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AddI64\r\n                : BinaryOp.AddI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_EQUALS: compound = true;\r\n      case Token.MINUS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.SUB);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"-\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:   // subtraction might overflow\r\n          case TypeKind.I16:  // ^\r\n          case TypeKind.U8:   // ^\r\n          case TypeKind.U16:  // ^\r\n          case TypeKind.BOOL: // ^\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.ASTERISK_EQUALS: compound = true;\r\n      case Token.ASTERISK: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.MUL);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"*\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.MulI64\r\n                : BinaryOp.MulI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\r\n      case Token.ASTERISK_ASTERISK: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.POW);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        let instance: Function | null;\r\n\r\n        // Mathf.pow if lhs is f32 (result is f32)\r\n        if (this.currentType.kind == TypeKind.F32) {\r\n          rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (!(instance = this.f32PowInstance)) {\r\n            let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n            if (!namespace) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Mathf\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n            if (!prototype) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Mathf.pow\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n            this.f32PowInstance = instance = (<FunctionPrototype>prototype).resolve();\r\n          }\r\n\r\n        // Math.pow otherwise (result is f64)\r\n        // TODO: should the result be converted back?\r\n        } else {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            this.currentType,\r\n            Type.f64,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE,\r\n            left\r\n          );\r\n          leftType = this.currentType;\r\n          rightExpr = this.compileExpression(\r\n            right,\r\n            Type.f64,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          rightType = this.currentType;\r\n          if (!(instance = this.f64PowInstance)) {\r\n            let namespace = this.program.elementsLookup.get(\"Math\");\r\n            if (!namespace) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Math\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n            if (!prototype) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Math.pow\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n            this.f64PowInstance = instance = (<FunctionPrototype>prototype).resolve();\r\n          }\r\n        }\r\n        if (!(instance && this.compileFunction(instance))) {\r\n          expr = module.createUnreachable();\r\n        } else {\r\n          expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n        }\r\n        break;\r\n      }\r\n      case Token.SLASH_EQUALS: compound = true;\r\n      case Token.SLASH: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.DIV);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"/\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:  // signed div on signed small integers might overflow, e.g. -128/-1\r\n          case TypeKind.I16: // ^\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.DivI64\r\n                : BinaryOp.DivI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.DivU64\r\n                : BinaryOp.DivU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.PERCENT_EQUALS: compound = true;\r\n      case Token.PERCENT: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.REM);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"%\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16: {\r\n            expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.RemI64\r\n                : BinaryOp.RemI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.RemU64\r\n                : BinaryOp.RemU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            let instance = this.f32ModInstance;\r\n            if (!instance) {\r\n              let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n              if (!namespace) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Mathf\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n              if (!prototype) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Mathf.mod\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n              this.f32ModInstance = instance = (<FunctionPrototype>prototype).resolve();\r\n            }\r\n            if (!(instance && this.compileFunction(instance))) {\r\n              expr = module.createUnreachable();\r\n            } else {\r\n              expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n            }\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            let instance = this.f64ModInstance;\r\n            if (!instance) {\r\n              let namespace = this.program.elementsLookup.get(\"Math\");\r\n              if (!namespace) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Math\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n              if (!prototype) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Math.mod\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n              this.f64ModInstance = instance = (<FunctionPrototype>prototype).resolve();\r\n            }\r\n            if (!(instance && this.compileFunction(instance))) {\r\n              expr = module.createUnreachable();\r\n            } else {\r\n              expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n            }\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\r\n      case Token.LESSTHAN_LESSTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShlI64\r\n                : BinaryOp.ShlI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n      case Token.GREATERTHAN_GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16: {\r\n            expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrI64\r\n                : BinaryOp.ShrI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrU64\r\n                : BinaryOp.ShrU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n      case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n          }\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrU64\r\n                : BinaryOp.ShrU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.AMPERSAND_EQUALS: compound = true;\r\n      case Token.AMPERSAND: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overloadd\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"&\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AndI64\r\n                : BinaryOp.AndI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.BAR_EQUALS: compound = true;\r\n      case Token.BAR: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"|\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.OrI64\r\n                : BinaryOp.OrI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.CARET_EQUALS: compound = true;\r\n      case Token.CARET: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"^\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.XorI64\r\n                : BinaryOp.XorI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n\r\n      // logical (no overloading)\r\n\r\n      case Token.AMPERSAND_AMPERSAND: { // left && right\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n\r\n        // simplify if cloning left without side effects is possible\r\n        if (expr = module.cloneExpression(leftExpr, true, 0)) {\r\n          this.makeIsTrueish(leftExpr, this.currentType);\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(leftExpr, this.currentType),\r\n            rightExpr,\r\n            expr\r\n          );\r\n\r\n        // if not possible, tee left to a temp. local\r\n        } else {\r\n          let flow = this.currentFunction.flow;\r\n          let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n            this.currentType,\r\n            !flow.canOverflow(leftExpr, this.currentType)\r\n          );\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(\r\n              module.createTeeLocal(tempLocal.index, leftExpr),\r\n              this.currentType\r\n            ),\r\n            rightExpr,\r\n            module.createGetLocal(\r\n              assert(tempLocal).index, // to be sure\r\n              this.currentType.toNativeType()\r\n            )\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case Token.BAR_BAR: { // left || right\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n\r\n        // simplify if cloning left without side effects is possible\r\n        if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\r\n          expr = this.module.createIf(\r\n            this.makeIsTrueish(leftExpr, this.currentType),\r\n            expr,\r\n            rightExpr\r\n          );\r\n\r\n        // if not possible, tee left to a temp. local\r\n        } else {\r\n          let flow = this.currentFunction.flow;\r\n          let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n            this.currentType,\r\n            !flow.canOverflow(leftExpr, this.currentType)\r\n          );\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(\r\n              module.createTeeLocal(tempLocal.index, leftExpr),\r\n              this.currentType\r\n            ),\r\n            module.createGetLocal(\r\n              assert(tempLocal).index, // to be sure\r\n              this.currentType.toNativeType()\r\n            ),\r\n            rightExpr\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n        assert(false);\r\n        expr = this.module.createUnreachable();\r\n      }\r\n    }\r\n    return compound\r\n      ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\r\n      : expr;\r\n  }\r\n\r\n  compileUnaryOverload(\r\n    operatorInstance: Function,\r\n    value: Expression,\r\n    valueExpr: ExpressionRef,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    var argumentExpressions: Expression[];\r\n    var thisArg: ExpressionRef = 0;\r\n    if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n      thisArg = valueExpr;  // can reuse the previously evaluated expr as the this value here\r\n      argumentExpressions = [];\r\n    } else {\r\n      argumentExpressions = [ value ]; // annotated type might differ -> recompile\r\n    }\r\n    return this.compileCallDirect(\r\n      operatorInstance,\r\n      argumentExpressions,\r\n      reportNode,\r\n      thisArg,\r\n      operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n    );\r\n  }\r\n\r\n  compileBinaryOverload(\r\n    operatorInstance: Function,\r\n    left: Expression,\r\n    leftExpr: ExpressionRef,\r\n    right: Expression,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    var argumentExpressions: Expression[];\r\n    var thisArg: ExpressionRef = 0;\r\n    if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n      let parent = assert(operatorInstance.parent);\r\n      assert(parent.kind == ElementKind.CLASS);\r\n      thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\r\n      argumentExpressions = [ right ];\r\n    } else {\r\n      argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\r\n    }\r\n    var ret = this.compileCallDirect(\r\n      operatorInstance,\r\n      argumentExpressions,\r\n      reportNode,\r\n      thisArg,\r\n      operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n    );\r\n    return ret;\r\n  }\r\n\r\n  compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n    var program = this.program;\r\n    var currentFunction = this.currentFunction;\r\n    var target = program.resolveExpression(expression, currentFunction); // reports\r\n    if (!target) return this.module.createUnreachable();\r\n\r\n    // to compile just the value, we need to know the target's type\r\n    var targetType: Type;\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field compiled as a global\r\n          return this.module.createUnreachable();\r\n        }\r\n        assert((<Global>target).type != Type.void); // compileGlobal must guarantee this\r\n        // fall-through\r\n      }\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        targetType = (<VariableLikeElement>target).type;\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let prototype = (<Property>target).setterPrototype;\r\n        if (prototype) {\r\n          let instance = prototype.resolve(); // reports\r\n          if (!instance) return this.module.createUnreachable();\r\n          assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n          targetType = instance.signature.parameterTypes[0];\r\n          break;\r\n        }\r\n        this.error(\r\n          DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n          expression.range, (<Property>target).internalName\r\n        );\r\n        return this.module.createUnreachable();\r\n      }\r\n      case ElementKind.CLASS: {\r\n        if (program.resolvedElementExpression) { // indexed access\r\n          let isUnchecked = currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n          let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n          if (!indexedSet) {\r\n            let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n            if (!indexedGet) {\r\n              this.error(\r\n                DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n                expression.range, (<Class>target).internalName\r\n              );\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n                expression.range, (<Class>target).internalName\r\n              );\r\n            }\r\n            return this.module.createUnreachable();\r\n          }\r\n          assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\r\n          targetType = indexedSet.signature.parameterTypes[1];    // 2nd parameter is the element\r\n          break;\r\n        }\r\n        // fall-through\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return this.module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // compile the value and do the assignment\r\n    assert(targetType != Type.void);\r\n    var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    return this.compileAssignmentWithValue(\r\n      expression,\r\n      valueExpr,\r\n      contextualType != Type.void\r\n    );\r\n  }\r\n\r\n  compileAssignmentWithValue(\r\n    expression: Expression,\r\n    valueWithCorrectType: ExpressionRef,\r\n    tee: bool = false\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var target = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.LOCAL: {\r\n        let type = (<Local>target).type;\r\n        assert(type != Type.void);\r\n        this.currentType = tee ? type : Type.void;\r\n        if ((<Local>target).is(CommonFlags.CONST)) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, target.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let flow = this.currentFunction.flow;\r\n        if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n          flow.setLocalWrapped((<Local>target).index, !flow.canOverflow(valueWithCorrectType, type));\r\n        }\r\n        return tee\r\n          ? module.createTeeLocal((<Local>target).index, valueWithCorrectType)\r\n          : module.createSetLocal((<Local>target).index, valueWithCorrectType);\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) return module.createUnreachable();\r\n        let type = (<Global>target).type;\r\n        assert(type != Type.void);\r\n        this.currentType = tee ? type : Type.void;\r\n        if ((<Local>target).is(CommonFlags.CONST)) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range,\r\n            target.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\r\n        if (tee) {\r\n          let nativeType = type.toNativeType();\r\n          let internalName = target.internalName;\r\n          return module.createBlock(null, [ // emulated teeGlobal\r\n            module.createSetGlobal(internalName, valueWithCorrectType),\r\n            module.createGetGlobal(internalName, nativeType)\r\n          ], nativeType);\r\n        } else {\r\n          return module.createSetGlobal(target.internalName, valueWithCorrectType);\r\n        }\r\n      }\r\n      case ElementKind.FIELD: {\r\n        const declaration = (<Field>target).declaration;\r\n        if (\r\n          (<Field>target).is(CommonFlags.READONLY) &&\r\n          !(\r\n            this.currentFunction.is(CommonFlags.CONSTRUCTOR) ||\r\n            declaration == null ||\r\n            declaration.initializer != null\r\n          )\r\n        ) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, (<Field>target).internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let thisExpression = assert(this.program.resolvedThisExpression);\r\n        let thisExpr = this.compileExpressionRetainType(\r\n          thisExpression,\r\n          this.options.usizeType,\r\n          WrapMode.NONE\r\n        );\r\n        let type = (<Field>target).type;\r\n        this.currentType = tee ? type : Type.void;\r\n        let nativeType = type.toNativeType();\r\n        if (type.kind == TypeKind.BOOL) {\r\n          // make sure bools are wrapped (usually are) when storing as 8 bits\r\n          valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\r\n        }\r\n        if (tee) {\r\n          let currentFunction = this.currentFunction;\r\n          let flow = currentFunction.flow;\r\n          let tempLocal = currentFunction.getAndFreeTempLocal(\r\n            type,\r\n            !flow.canOverflow(valueWithCorrectType, type)\r\n          );\r\n          let tempLocalIndex = tempLocal.index;\r\n          // TODO: simplify if valueWithCorrectType has no side effects\r\n          return module.createBlock(null, [\r\n            module.createSetLocal(tempLocalIndex, valueWithCorrectType),\r\n            module.createStore(\r\n              type.byteSize,\r\n              thisExpr,\r\n              module.createGetLocal(tempLocalIndex, nativeType),\r\n              nativeType,\r\n              (<Field>target).memoryOffset\r\n            ),\r\n            module.createGetLocal(tempLocalIndex, nativeType)\r\n          ], nativeType);\r\n        } else {\r\n          return module.createStore(\r\n            type.byteSize,\r\n            thisExpr,\r\n            valueWithCorrectType,\r\n            nativeType,\r\n            (<Field>target).memoryOffset\r\n          );\r\n        }\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let setterPrototype = (<Property>target).setterPrototype;\r\n        if (setterPrototype) {\r\n          let setterInstance = setterPrototype.resolve(); // reports\r\n          if (!setterInstance) return module.createUnreachable();\r\n\r\n          // call just the setter if the return value isn't of interest\r\n          if (!tee) {\r\n            if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n              let thisExpression = assert(this.program.resolvedThisExpression);\r\n              let thisExpr = this.compileExpressionRetainType(\r\n                thisExpression,\r\n                this.options.usizeType,\r\n                WrapMode.NONE\r\n              );\r\n              return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\r\n            } else {\r\n              return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\r\n            }\r\n          }\r\n\r\n          // otherwise call the setter first, then the getter\r\n          let getterPrototype = (<Property>target).getterPrototype;\r\n          assert(getterPrototype != null); // must have one if there is a setter\r\n          let getterInstance = (<FunctionPrototype>getterPrototype).resolve(); // reports\r\n          if (!getterInstance) return module.createUnreachable();\r\n          let returnType = getterInstance.signature.returnType;\r\n          let nativeReturnType = returnType.toNativeType();\r\n          if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n            let thisExpression = assert(this.program.resolvedThisExpression);\r\n            let thisExpr = this.compileExpressionRetainType(\r\n              thisExpression,\r\n              this.options.usizeType,\r\n              WrapMode.NONE\r\n            );\r\n            let tempLocal = this.currentFunction.getAndFreeTempLocal(returnType, false);\r\n            let tempLocalIndex = tempLocal.index;\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(setterInstance, [ // set and remember the target\r\n                module.createTeeLocal(tempLocalIndex, thisExpr),\r\n                valueWithCorrectType\r\n              ]),\r\n              this.makeCallDirect(getterInstance, [ // get from remembered target\r\n                module.createGetLocal(tempLocalIndex, nativeReturnType)\r\n              ])\r\n            ], nativeReturnType);\r\n          } else {\r\n            // note that this must be performed here because `resolved` is shared\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\r\n              this.makeCallDirect(getterInstance)\r\n            ], nativeReturnType);\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, target.internalName\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      case ElementKind.CLASS: {\r\n        let elementExpression = this.program.resolvedElementExpression;\r\n        if (elementExpression) {\r\n          let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n          if (!indexedGet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n              expression.range, target.internalName\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n          if (!indexedSet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n              expression.range, target.internalName\r\n            );\r\n            this.currentType = tee ? indexedGet.signature.returnType : Type.void;\r\n            return module.createUnreachable();\r\n          }\r\n          let targetType = (<Class>target).type;\r\n          let thisExpression = assert(this.program.resolvedThisExpression);\r\n          let thisExpr = this.compileExpressionRetainType(\r\n            thisExpression,\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n          let elementExpr = this.compileExpression(\r\n            elementExpression,\r\n            Type.i32,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          if (tee) {\r\n            let currentFunction = this.currentFunction;\r\n            let tempLocalTarget = currentFunction.getTempLocal(targetType, false);\r\n            let tempLocalElement = currentFunction.getAndFreeTempLocal(this.currentType, false);\r\n            let returnType = indexedGet.signature.returnType;\r\n            this.currentFunction.freeTempLocal(tempLocalTarget);\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(indexedSet, [\r\n                module.createTeeLocal(tempLocalTarget.index, thisExpr),\r\n                module.createTeeLocal(tempLocalElement.index, elementExpr),\r\n                valueWithCorrectType\r\n              ]),\r\n              this.makeCallDirect(indexedGet, [\r\n                module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\r\n                module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\r\n              ])\r\n            ], returnType.toNativeType());\r\n          } else {\r\n            return this.makeCallDirect(indexedSet, [\r\n              thisExpr,\r\n              elementExpr,\r\n              valueWithCorrectType\r\n            ]);\r\n          }\r\n        }\r\n        // fall-through\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var target = this.program.resolveExpression(expression.expression, currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    var signature: Signature | null;\r\n    var indexArg: ExpressionRef;\r\n    switch (target.kind) {\r\n\r\n      // direct call: concrete function\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        let prototype = <FunctionPrototype>target;\r\n        let typeArguments = expression.typeArguments;\r\n\r\n        // builtins handle present respectively omitted type arguments on their own\r\n        if (prototype.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN)) {\r\n          return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\r\n        }\r\n\r\n        let instance: Function | null = null;\r\n\r\n        // resolve generic call if type arguments have been provided\r\n        if (typeArguments) {\r\n          if (!prototype.is(CommonFlags.GENERIC)) {\r\n            this.error(\r\n              DiagnosticCode.Type_0_is_not_generic,\r\n              expression.expression.range, prototype.internalName\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          instance = prototype.resolveUsingTypeArguments( // reports\r\n            typeArguments,\r\n            this.currentFunction.flow.contextualTypeArguments,\r\n            expression\r\n          );\r\n\r\n        // infer generic call if type arguments have been omitted\r\n        } else if (prototype.is(CommonFlags.GENERIC)) {\r\n          let inferredTypes = new Map<string,Type | null>();\r\n          let typeParameters = assert(prototype.declaration.typeParameters);\r\n          let numTypeParameters = typeParameters.length;\r\n          for (let i = 0; i < numTypeParameters; ++i) {\r\n            inferredTypes.set(typeParameters[i].name.text, null);\r\n          }\r\n          // let numInferred = 0;\r\n          let parameterTypes = prototype.declaration.signature.parameters;\r\n          let numParameterTypes = parameterTypes.length;\r\n          let argumentExpressions = expression.arguments;\r\n          let numArguments = argumentExpressions.length;\r\n          let argumentExprs = new Array<ExpressionRef>(numArguments);\r\n          for (let i = 0; i < numParameterTypes; ++i) {\r\n            let typeNode = parameterTypes[i].type;\r\n            let name = typeNode.kind == NodeKind.TYPE ? (<TypeNode>typeNode).name.text : null;\r\n            let argumentExpression = i < numArguments\r\n              ? argumentExpressions[i]\r\n              : prototype.declaration.signature.parameters[i].initializer;\r\n            if (!argumentExpression) { // missing initializer -> too few arguments\r\n              this.error(\r\n                DiagnosticCode.Expected_0_arguments_but_got_1,\r\n                expression.range, numParameterTypes.toString(10), numArguments.toString(10)\r\n              );\r\n              return module.createUnreachable();\r\n            }\r\n            if (name !== null && inferredTypes.has(name)) {\r\n              let inferredType = inferredTypes.get(name);\r\n              if (inferredType) {\r\n                argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\r\n                let commonType: Type | null;\r\n                if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\r\n                  if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\r\n                    this.error(\r\n                      DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n                      parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\r\n                    );\r\n                    return module.createUnreachable();\r\n                  }\r\n                }\r\n                inferredType = commonType;\r\n              } else {\r\n                argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\r\n                inferredType = this.currentType;\r\n                // ++numInferred;\r\n              }\r\n              inferredTypes.set(name, inferredType);\r\n            } else {\r\n              let concreteType = this.program.resolveType(\r\n                parameterTypes[i].type,\r\n                this.currentFunction.flow.contextualTypeArguments,\r\n                true\r\n              );\r\n              if (!concreteType) return module.createUnreachable();\r\n              argumentExprs[i] = this.compileExpression(\r\n                argumentExpression,\r\n                concreteType,\r\n                ConversionKind.IMPLICIT,\r\n                WrapMode.NONE\r\n              );\r\n            }\r\n          }\r\n          let resolvedTypeArguments = new Array<Type>(numTypeParameters);\r\n          for (let i = 0; i < numTypeParameters; ++i) {\r\n            let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\r\n            resolvedTypeArguments[i] = inferredType;\r\n          }\r\n          instance = prototype.resolve(\r\n            resolvedTypeArguments,\r\n            this.currentFunction.flow.contextualTypeArguments\r\n          );\r\n          if (!instance) return this.module.createUnreachable();\r\n          return this.makeCallDirect(instance, argumentExprs);\r\n          // TODO: this skips inlining because inlining requires compiling its temporary locals in\r\n          // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\r\n          // so inlining can be performed in `makeCallDirect` instead?\r\n\r\n        // otherwise resolve the non-generic call as usual\r\n        } else {\r\n          instance = prototype.resolve(\r\n            null,\r\n            this.currentFunction.flow.contextualTypeArguments\r\n          );\r\n        }\r\n        if (!instance) return this.module.createUnreachable();\r\n\r\n        // compile 'this' expression if an instance method\r\n        let thisExpr: ExpressionRef = 0;\r\n        if (instance.is(CommonFlags.INSTANCE)) {\r\n          thisExpr = this.compileExpressionRetainType(\r\n            assert(this.program.resolvedThisExpression),\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n        }\r\n\r\n        return this.compileCallDirect(\r\n          instance,\r\n          expression.arguments,\r\n          expression,\r\n          thisExpr,\r\n          instance.hasDecorator(DecoratorFlags.INLINE)\r\n        );\r\n      }\r\n\r\n      // indirect call: index argument with signature (non-generic, can't be inlined)\r\n      case ElementKind.LOCAL: {\r\n        if (signature = (<Local>target).type.signatureReference) {\r\n          indexArg = module.createGetLocal((<Local>target).index, NativeType.I32);\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Local>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (signature = (<Global>target).type.signatureReference) {\r\n          indexArg = module.createGetGlobal((<Global>target).internalName, (<Global>target).type.toNativeType());\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Global>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.FIELD: {\r\n        let type = (<Field>target).type;\r\n        if (signature = type.signatureReference) {\r\n          let thisExpression = assert(this.program.resolvedThisExpression);\r\n          let thisExpr = this.compileExpressionRetainType(\r\n            thisExpression,\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n          indexArg = module.createLoad(\r\n            4,\r\n            false,\r\n            thisExpr,\r\n            NativeType.I32,\r\n            (<Field>target).memoryOffset\r\n          );\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Field>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.FUNCTION_TARGET: {\r\n        signature = (<FunctionTarget>target).signature;\r\n        indexArg = this.compileExpression(\r\n          expression.expression,\r\n          (<FunctionTarget>target).type,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: // TODO\r\n\r\n      // not supported\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n    return this.compileCallIndirect(\r\n      signature,\r\n      indexArg,\r\n      expression.arguments,\r\n      expression\r\n    );\r\n  }\r\n\r\n  private compileCallExpressionBuiltin(\r\n    prototype: FunctionPrototype,\r\n    expression: CallExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var expr = compileBuiltinCall( // reports\r\n      this,\r\n      prototype,\r\n      prototype.resolveBuiltinTypeArguments(\r\n        expression.typeArguments,\r\n        this.currentFunction.flow.contextualTypeArguments\r\n      ),\r\n      expression.arguments,\r\n      contextualType,\r\n      expression\r\n    );\r\n    if (!expr) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      return this.module.createUnreachable();\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /**\r\n   * Checks that a call with the given number as arguments can be performed according to the\r\n   * specified signature.\r\n   */\r\n  checkCallSignature(\r\n    signature: Signature,\r\n    numArguments: i32,\r\n    hasThis: bool,\r\n    reportNode: Node\r\n  ): bool {\r\n\r\n    // cannot call an instance method without a `this` argument (TODO: `.call`?)\r\n    var thisType = signature.thisType;\r\n    if (hasThis != (thisType != null)) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported, // TODO: better message?\r\n        reportNode.range\r\n      );\r\n      return false;\r\n    }\r\n\r\n    // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\r\n    var hasRest = signature.hasRest;\r\n    if (hasRest) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        reportNode.range\r\n      );\r\n      return false;\r\n    }\r\n\r\n    var minimum = signature.requiredParameters;\r\n    var maximum = signature.parameterTypes.length;\r\n\r\n    // must at least be called with required arguments\r\n    if (numArguments < minimum) {\r\n      this.error(\r\n        minimum < maximum\r\n          ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\r\n          : DiagnosticCode.Expected_0_arguments_but_got_1,\r\n        reportNode.range, minimum.toString(), numArguments.toString()\r\n      );\r\n      return false;\r\n    }\r\n\r\n    // must not be called with more than the maximum arguments\r\n    if (numArguments > maximum && !hasRest) {\r\n      this.error(\r\n        DiagnosticCode.Expected_0_arguments_but_got_1,\r\n        reportNode.range, maximum.toString(), numArguments.toString()\r\n      );\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /** Compiles a direct call to a concrete function. */\r\n  compileCallDirect(\r\n    instance: Function,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0,\r\n    inline: bool = false\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n    var signature = instance.signature;\r\n\r\n    if (!this.checkCallSignature( // reports\r\n      signature,\r\n      numArguments,\r\n      thisArg != 0,\r\n      reportNode\r\n    )) {\r\n      return this.module.createUnreachable();\r\n    }\r\n\r\n    // Inline if explicitly requested\r\n    if (inline) {\r\n      assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\r\n      return this.compileCallInlineUnchecked(instance, argumentExpressions, reportNode, thisArg);\r\n    }\r\n\r\n    // Otherwise compile to just a call\r\n    var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n    var operands = new Array<ExpressionRef>(numArgumentsInclThis);\r\n    var index = 0;\r\n    if (thisArg) {\r\n      operands[0] = thisArg;\r\n      index = 1;\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i, ++index) {\r\n      operands[index] = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    assert(index == numArgumentsInclThis);\r\n    return this.makeCallDirect(instance, operands);\r\n  }\r\n\r\n  // Depends on being pre-checked in compileCallDirect\r\n  private compileCallInlineUnchecked(\r\n    instance: Function,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n    var signature = instance.signature;\r\n    var currentFunction = this.currentFunction;\r\n    var module = this.module;\r\n    var declaration = instance.prototype.declaration;\r\n\r\n    // Create an empty child flow with its own scope and mark it for inlining\r\n    var previousFlow = currentFunction.flow;\r\n    var returnLabel = instance.internalName + \"|inlined.\" + (instance.nextInlineId++).toString(10);\r\n    var returnType = instance.signature.returnType;\r\n    var flow = Flow.create(currentFunction);\r\n    flow.set(FlowFlags.INLINE_CONTEXT);\r\n    flow.returnLabel = returnLabel;\r\n    flow.returnType = returnType;\r\n    flow.contextualTypeArguments = instance.contextualTypeArguments;\r\n\r\n    // Convert provided call arguments to temporary locals. It is important that these are compiled\r\n    // here, with their respective locals being blocked. There is no 'makeCallInline'.\r\n    var body = [];\r\n    if (thisArg) {\r\n      let parent = assert(instance.parent);\r\n      assert(parent.kind == ElementKind.CLASS);\r\n      if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\r\n        flow.addScopedLocalAlias(\r\n          getGetLocalIndex(thisArg),\r\n          (<Class>parent).type,\r\n          \"this\"\r\n        );\r\n      } else {\r\n        let thisLocal = flow.addScopedLocal((<Class>parent).type, \"this\", false);\r\n        body.push(\r\n          module.createSetLocal(thisLocal.index, thisArg)\r\n        );\r\n      }\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i) {\r\n      let paramExpr = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      if (getExpressionId(paramExpr) == ExpressionId.GetLocal) {\r\n        flow.addScopedLocalAlias(\r\n          getGetLocalIndex(paramExpr),\r\n          parameterTypes[i],\r\n          signature.getParameterName(i)\r\n        );\r\n        // inherits wrap status\r\n      } else {\r\n        let argumentLocal = flow.addScopedLocal(\r\n          parameterTypes[i],\r\n          signature.getParameterName(i),\r\n          !flow.canOverflow(paramExpr, parameterTypes[i])\r\n        );\r\n        body.push(\r\n          module.createSetLocal(argumentLocal.index, paramExpr)\r\n        );\r\n      }\r\n    }\r\n\r\n    // Compile optional parameter initializers in the scope of the inlined flow\r\n    currentFunction.flow = flow;\r\n    var numParameters = signature.parameterTypes.length;\r\n    for (let i = numArguments; i < numParameters; ++i) {\r\n      let initExpr = this.compileExpression(\r\n        assert(declaration.signature.parameters[i].initializer),\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.WRAP\r\n      );\r\n      let argumentLocal = flow.addScopedLocal(\r\n        parameterTypes[i],\r\n        signature.getParameterName(i),\r\n        !flow.canOverflow(initExpr, parameterTypes[i])\r\n      );\r\n      body.push(\r\n        module.createSetLocal(argumentLocal.index, initExpr)\r\n      );\r\n    }\r\n\r\n    // Compile the called function's body in the scope of the inlined flow\r\n    var bodyStatement = assert(declaration.body);\r\n    if (bodyStatement.kind == NodeKind.BLOCK) {\r\n      let statements = (<BlockStatement>bodyStatement).statements;\r\n      for (let i = 0, k = statements.length; i < k; ++i) {\r\n        let stmt = this.compileStatement(statements[i]);\r\n        if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n          body.push(stmt);\r\n          if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\r\n        }\r\n      }\r\n    } else {\r\n      body.push(this.compileStatement(bodyStatement));\r\n    }\r\n\r\n    // Free any new scoped locals and reset to the original flow\r\n    var scopedLocals = flow.scopedLocals;\r\n    if (scopedLocals) {\r\n      for (let scopedLocal of scopedLocals.values()) {\r\n        if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n          currentFunction.freeTempLocal(scopedLocal);\r\n        }\r\n      }\r\n      flow.scopedLocals = null;\r\n    }\r\n    flow.finalize();\r\n    this.currentFunction.flow = previousFlow;\r\n    this.currentType = returnType;\r\n\r\n    // Check that all branches are terminated\r\n    if (returnType != Type.void && !flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n      this.error(\r\n        DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n        declaration.signature.returnType.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    return module.createBlock(returnLabel, body, returnType.toNativeType());\r\n  }\r\n\r\n  /** Gets the trampoline for the specified function. */\r\n  ensureTrampoline(original: Function): Function {\r\n    // A trampoline is a function that takes a fixed amount of operands with some of them possibly\r\n    // being zeroed. It takes one additional argument denoting the number of actual operands\r\n    // provided to the call, and takes appropriate steps to initialize zeroed operands to their\r\n    // default values using the optional parameter initializers of the original function. Doing so\r\n    // allows calls to functions with optional parameters to circumvent the trampoline when all\r\n    // parameters are provided as a fast route, respectively setting up omitted operands in a proper\r\n    // context otherwise.\r\n    var trampoline = original.trampoline;\r\n    if (trampoline) return trampoline;\r\n\r\n    var originalSignature = original.signature;\r\n    var originalName = original.internalName;\r\n    var originalParameterTypes = originalSignature.parameterTypes;\r\n    var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\r\n    var commonReturnType = originalSignature.returnType;\r\n    var commonThisType = originalSignature.thisType;\r\n    var isInstance = original.is(CommonFlags.INSTANCE);\r\n\r\n    // arguments excl. `this`, operands incl. `this`\r\n    var minArguments = originalSignature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = originalParameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (isInstance) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n    }\r\n    var numOptional = assert(maxOperands - minOperands);\r\n\r\n    var forwardedOperands = new Array<ExpressionRef>(minOperands);\r\n    var operandIndex = 0;\r\n\r\n    // forward `this` if applicable\r\n    var module = this.module;\r\n    if (isInstance) {\r\n      forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\r\n      operandIndex = 1;\r\n    }\r\n\r\n    // forward required arguments\r\n    for (let i = 0; i < minArguments; ++i, ++operandIndex) {\r\n      forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\r\n    }\r\n    assert(operandIndex == minOperands);\r\n\r\n    // create the trampoline element\r\n    var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\r\n    var trampolineName = originalName + \"|trampoline\";\r\n    trampolineSignature.requiredParameters = maxArguments;\r\n    trampoline = new Function(\r\n      original.prototype,\r\n      trampolineName,\r\n      trampolineSignature,\r\n      original.parent,\r\n      original.contextualTypeArguments\r\n    );\r\n    trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\r\n    original.trampoline = trampoline;\r\n\r\n    // compile initializers of omitted arguments in scope of the trampoline function\r\n    // this is necessary because initializers might need additional locals and a proper this context\r\n    var previousFunction = this.currentFunction;\r\n    this.currentFunction = trampoline;\r\n\r\n    // create a br_table switching over the number of optional parameters provided\r\n    var numNames = numOptional + 1; // incl. outer block\r\n    var names = new Array<string>(numNames);\r\n    var ofN = \"of\" + numOptional.toString(10);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      let label = i.toString(10) + ofN;\r\n      names[i] = label;\r\n    }\r\n    var body = module.createBlock(names[0], [\r\n      module.createBlock(\"oob\", [\r\n        module.createSwitch(names, \"oob\",\r\n          // condition is number of provided optional arguments, so subtract required arguments\r\n          minArguments\r\n            ? module.createBinary(\r\n                BinaryOp.SubI32,\r\n                module.createGetGlobal(\"~argc\", NativeType.I32),\r\n                module.createI32(minArguments)\r\n              )\r\n            : module.createGetGlobal(\"~argc\", NativeType.I32)\r\n        )\r\n      ]),\r\n      module.createUnreachable()\r\n    ]);\r\n    for (let i = 0; i < numOptional; ++i, ++operandIndex) {\r\n      let type = originalParameterTypes[minArguments + i];\r\n      let declaration = originalParameterDeclarations[minArguments + i];\r\n      let initializer = declaration.initializer;\r\n      let initExpr: ExpressionRef;\r\n      if (initializer) {\r\n        initExpr = module.createSetLocal(operandIndex,\r\n          this.compileExpression(\r\n            initializer,\r\n            type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP\r\n          )\r\n        );\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Optional_parameter_must_have_an_initializer,\r\n          declaration.range\r\n        );\r\n        initExpr = module.createUnreachable();\r\n      }\r\n      body = module.createBlock(names[i + 1], [\r\n        body,\r\n        initExpr,\r\n      ]);\r\n      forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\r\n    }\r\n    this.currentFunction = previousFunction;\r\n    assert(operandIndex == maxOperands);\r\n\r\n    var funcRef = module.addFunction(\r\n      trampolineName,\r\n      this.ensureFunctionType(\r\n        trampolineSignature.parameterTypes,\r\n        trampolineSignature.returnType,\r\n        trampolineSignature.thisType\r\n      ),\r\n      typesToNativeTypes(trampoline.additionalLocals),\r\n      module.createBlock(null, [\r\n        body,\r\n        module.createCall(\r\n          originalName,\r\n          forwardedOperands,\r\n          commonReturnType.toNativeType()\r\n        )\r\n      ], commonReturnType.toNativeType())\r\n    );\r\n    trampoline.finalize(module, funcRef);\r\n    return trampoline;\r\n  }\r\n\r\n  /** Makes sure that the argument count helper global is present and returns its name. */\r\n  private ensureArgcVar(): string {\r\n    var internalName = \"~argc\";\r\n    if (!this.argcVar) {\r\n      let module = this.module;\r\n      this.argcVar = module.addGlobal(\r\n        internalName,\r\n        NativeType.I32,\r\n        true,\r\n        module.createI32(0)\r\n      );\r\n    }\r\n    return internalName;\r\n  }\r\n\r\n  /** Makes sure that the argument count helper setter is present and returns its name. */\r\n  private ensureArgcSet(): string {\r\n    var internalName = \"~setargc\";\r\n    if (!this.argcSet) {\r\n      let module = this.module;\r\n      this.argcSet = module.addFunction(internalName,\r\n        this.ensureFunctionType([ Type.u32 ], Type.void),\r\n        null,\r\n        module.createSetGlobal(this.ensureArgcVar(),\r\n          module.createGetLocal(0, NativeType.I32)\r\n        )\r\n      );\r\n      module.addFunctionExport(internalName, \"_setargc\");\r\n    }\r\n    return internalName;\r\n  }\r\n\r\n  /** Creates a direct call to the specified function. */\r\n  makeCallDirect(\r\n    instance: Function,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var numOperands = operands ? operands.length : 0;\r\n    var numArguments = numOperands;\r\n    var minArguments = instance.signature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = instance.signature.parameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (instance.is(CommonFlags.INSTANCE)) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n      --numArguments;\r\n    }\r\n    assert(numOperands >= minOperands);\r\n\r\n    var module = this.module;\r\n    if (!this.compileFunction(instance)) return module.createUnreachable();\r\n    var returnType = instance.signature.returnType;\r\n    var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\r\n\r\n    // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\r\n    if (numOperands < maxOperands) {\r\n      if (!operands) {\r\n        operands = new Array(maxOperands);\r\n        operands.length = 0;\r\n      }\r\n      let parameterTypes = instance.signature.parameterTypes;\r\n      let parameterNodes = instance.prototype.declaration.signature.parameters;\r\n      let allOptionalsAreConstant = true;\r\n      for (let i = numArguments; i < maxArguments; ++i) {\r\n        let initializer = parameterNodes[i].initializer;\r\n        if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\r\n          allOptionalsAreConstant = false;\r\n          break;\r\n        }\r\n      }\r\n      if (allOptionalsAreConstant) { // inline into the call\r\n        for (let i = numArguments; i < maxArguments; ++i) {\r\n          operands.push(\r\n            this.compileExpression(\r\n              <Expression>parameterNodes[i].initializer,\r\n              parameterTypes[i],\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE\r\n            )\r\n          );\r\n        }\r\n      } else { // otherwise fill up with zeroes and call the trampoline\r\n        for (let i = numArguments; i < maxArguments; ++i) {\r\n          operands.push(parameterTypes[i].toNativeZero(module));\r\n        }\r\n        if (!isCallImport) {\r\n          let original = instance;\r\n          instance = this.ensureTrampoline(instance);\r\n          if (!this.compileFunction(instance)) return module.createUnreachable();\r\n          instance.flow.flags = original.flow.flags;\r\n          this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\r\n          let nativeReturnType = returnType.toNativeType();\r\n          this.currentType = returnType;\r\n          return module.createBlock(null, [\r\n            module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\r\n            module.createCall(instance.internalName, operands, nativeReturnType)\r\n          ], nativeReturnType);\r\n        }\r\n      }\r\n    }\r\n\r\n    // otherwise just call through\r\n    this.currentType = returnType;\r\n    if (isCallImport) return module.createCallImport(instance.internalName, operands, returnType.toNativeType());\r\n    var ret = module.createCall(instance.internalName, operands, returnType.toNativeType());\r\n    return ret;\r\n  }\r\n\r\n  /** Compiles an indirect call using an index argument and a signature. */\r\n  compileCallIndirect(\r\n    signature: Signature,\r\n    indexArg: ExpressionRef,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n\r\n    if (!this.checkCallSignature( // reports\r\n      signature,\r\n      numArguments,\r\n      thisArg != 0,\r\n      reportNode\r\n    )) {\r\n      return this.module.createUnreachable();\r\n    }\r\n\r\n    var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n    var operands = new Array<ExpressionRef>(numArgumentsInclThis);\r\n    var index = 0;\r\n    if (thisArg) {\r\n      operands[0] = thisArg;\r\n      index = 1;\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i, ++index) {\r\n      operands[index] = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    assert(index == numArgumentsInclThis);\r\n    return this.makeCallIndirect(signature, indexArg, operands);\r\n  }\r\n\r\n  /** Creates an indirect call to the function at `indexArg` in the function table. */\r\n  makeCallIndirect(\r\n    signature: Signature,\r\n    indexArg: ExpressionRef,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var numOperands = operands ? operands.length : 0;\r\n    var numArguments = numOperands;\r\n    var minArguments = signature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = signature.parameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (signature.thisType) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n      --numArguments;\r\n    }\r\n    assert(numOperands >= minOperands);\r\n\r\n    this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n    var module = this.module;\r\n\r\n    // fill up omitted arguments with zeroes\r\n    if (numOperands < maxOperands) {\r\n      if (!operands) {\r\n        operands = new Array(maxOperands);\r\n        operands.length = 0;\r\n      }\r\n      let parameterTypes = signature.parameterTypes;\r\n      for (let i = numArguments; i < maxArguments; ++i) {\r\n        operands.push(parameterTypes[i].toNativeZero(module));\r\n      }\r\n    }\r\n\r\n    var returnType = signature.returnType;\r\n    this.currentType = returnType;\r\n    return module.createBlock(null, [\r\n      module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\r\n        module.createI32(numArguments)\r\n      ),\r\n      module.createCallIndirect(indexArg, operands, signature.toSignatureString())\r\n    ], returnType.toNativeType()); // not necessarily wrapped\r\n  }\r\n\r\n  compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n    var expressions = expression.expressions;\r\n    var numExpressions = expressions.length;\r\n    var exprs = new Array<ExpressionRef>(numExpressions--);\r\n    for (let i = 0; i < numExpressions; ++i) {\r\n      exprs[i] = this.compileExpression(\r\n        expressions[i],\r\n        Type.void, // drop all\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    exprs[numExpressions] = this.compileExpression(\r\n      expressions[numExpressions],\r\n      contextualType, // except last\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE\r\n    );\r\n    return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n  }\r\n\r\n  compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n    var target = this.program.resolveElementAccess(expression, this.currentFunction); // reports\r\n    if (!target) return this.module.createUnreachable();\r\n    switch (target.kind) {\r\n      case ElementKind.CLASS: {\r\n        let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n        if (!indexedGet) {\r\n          this.error(\r\n            DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n            expression.expression.range, (<Class>target).internalName\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n        let thisArg = this.compileExpression(\r\n          expression.expression,\r\n          (<Class>target).type,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        return this.compileCallDirect(indexedGet, [\r\n          expression.elementExpression\r\n        ], expression, thisArg);\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\r\n    var declaration = expression.declaration;\r\n    var name = declaration.name;\r\n    var simpleName = (name.text.length\r\n      ? name.text\r\n      : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\r\n    var currentFunction = this.currentFunction;\r\n    var prototype = new FunctionPrototype(\r\n      this.program,\r\n      simpleName,\r\n      currentFunction.internalName + INNER_DELIMITER + simpleName,\r\n      declaration,\r\n      null,\r\n      DecoratorFlags.NONE\r\n    );\r\n    var flow = currentFunction.flow;\r\n    var instance = this.compileFunctionUsingTypeArguments(\r\n      prototype,\r\n      [],\r\n      flow.contextualTypeArguments,\r\n      flow,\r\n      declaration\r\n    );\r\n    if (!instance) return this.module.createUnreachable();\r\n    this.currentType = instance.signature.type; // TODO: get cached type?\r\n    // NOTE that, in order to make this work in every case, the function must be represented by a\r\n    // value, so we add it and rely on the optimizer to figure out where it can be called directly.\r\n    var index = this.ensureFunctionTableEntry(instance); // reports\r\n    return index < 0\r\n      ? this.module.createUnreachable()\r\n      : this.module.createI32(index);\r\n  }\r\n\r\n  /**\r\n   * Compiles an identifier in the specified context.\r\n   * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n   *  precomputes them according to context.\r\n   */\r\n  compileIdentifierExpression(\r\n    expression: IdentifierExpression,\r\n    contextualType: Type,\r\n    retainConstantType: bool\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // check special keywords first\r\n    switch (expression.kind) {\r\n      case NodeKind.NULL: {\r\n        let options = this.options;\r\n        if (!contextualType.classReference) {\r\n          this.currentType = options.usizeType;\r\n        }\r\n        return options.isWasm64\r\n          ? module.createI64(0)\r\n          : module.createI32(0);\r\n      }\r\n      case NodeKind.TRUE: {\r\n        this.currentType = Type.bool;\r\n        return module.createI32(1);\r\n      }\r\n      case NodeKind.FALSE: {\r\n        this.currentType = Type.bool;\r\n        return module.createI32(0);\r\n      }\r\n      case NodeKind.THIS: {\r\n        let flow = currentFunction.flow;\r\n        if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let scopedThis = flow.getScopedLocal(\"this\");\r\n          if (scopedThis) {\r\n            this.currentType = scopedThis.type;\r\n            return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\r\n          }\r\n        }\r\n        if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n          let parent = assert(currentFunction.parent);\r\n          assert(parent.kind == ElementKind.CLASS);\r\n          let thisType = (<Class>parent).type;\r\n          if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n            if (!flow.is(FlowFlags.ALLOCATES)) {\r\n              flow.set(FlowFlags.ALLOCATES);\r\n              // must be conditional because `this` could have been provided by a derived class\r\n              this.currentType = thisType;\r\n              return module.createTeeLocal(0,\r\n                this.makeConditionalAllocate(<Class>parent, expression)\r\n              );\r\n            }\r\n          }\r\n          this.currentType = thisType;\r\n          return module.createGetLocal(0, thisType.toNativeType());\r\n        }\r\n        this.error(\r\n          DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n          expression.range\r\n        );\r\n        this.currentType = this.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n      case NodeKind.SUPER: {\r\n        let flow = currentFunction.flow;\r\n        if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let scopedThis = flow.getScopedLocal(\"this\");\r\n          if (scopedThis) {\r\n            let scopedThisClass = assert(scopedThis.type.classReference);\r\n            let base = scopedThisClass.base;\r\n            if (base) {\r\n              this.currentType = base.type;\r\n              return module.createGetLocal(scopedThis.index, base.type.toNativeType());\r\n            }\r\n          }\r\n        }\r\n        if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n          let parent = assert(currentFunction.parent);\r\n          assert(parent.kind == ElementKind.CLASS);\r\n          let base = (<Class>parent).base;\r\n          if (base) {\r\n            let superType = base.type;\r\n            this.currentType = superType;\r\n            return module.createGetLocal(0, superType.toNativeType());\r\n          }\r\n        }\r\n        this.error(\r\n          DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n          expression.range\r\n        );\r\n        this.currentType = this.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // otherwise resolve\r\n    var target = this.program.resolveIdentifier( // reports\r\n      expression,\r\n      this.currentEnum || currentFunction\r\n    );\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.LOCAL: {\r\n        if ((<Local>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Local>target, contextualType, retainConstantType);\r\n        }\r\n        let localType = (<Local>target).type;\r\n        let localIndex = (<Local>target).index;\r\n        assert(localIndex >= 0);\r\n        this.currentType = localType;\r\n        return this.module.createGetLocal(localIndex, localType.toNativeType());\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field\r\n          return this.module.createUnreachable();\r\n        }\r\n        let globalType = (<Global>target).type;\r\n        assert(globalType != Type.void);\r\n        if ((<Global>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Global>target, contextualType, retainConstantType);\r\n        }\r\n        this.currentType = globalType;\r\n        return this.module.createGetGlobal((<Global>target).internalName, globalType.toNativeType());\r\n      }\r\n      case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\r\n        if (!target.is(CommonFlags.COMPILED)) {\r\n          this.error(\r\n            DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n            expression.range\r\n          );\r\n          this.currentType = Type.i32;\r\n          return this.module.createUnreachable();\r\n        }\r\n        this.currentType = Type.i32;\r\n        if ((<EnumValue>target).is(CommonFlags.INLINED)) {\r\n          return this.module.createI32((<EnumValue>target).constantValue);\r\n        }\r\n        return this.module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);\r\n      }\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        let instance = (<FunctionPrototype>target).resolve(\r\n          null,\r\n          currentFunction.flow.contextualTypeArguments\r\n        );\r\n        if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\r\n        let index = this.ensureFunctionTableEntry(instance);\r\n        this.currentType = instance.signature.type;\r\n        return this.module.createI32(index);\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  compileInstanceOfExpression(\r\n    expression: InstanceOfExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\r\n    // time of implementation, this seemed more useful because dynamic rhs expressions are not\r\n    // possible in AS anyway.\r\n    var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\r\n    var type = this.currentType;\r\n    var isType = this.program.resolveType(expression.isType);\r\n    this.currentType = Type.bool;\r\n    if (!isType) return module.createUnreachable();\r\n    return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\r\n      ? type.nonNullableType.isAssignableTo(isType)\r\n        ? module.createBinary( // not precomputeable\r\n            type.is(TypeFlags.LONG)\r\n              ? BinaryOp.NeI64\r\n              : BinaryOp.NeI32,\r\n            expr,\r\n            type.toNativeZero(module)\r\n          )\r\n        : module.createI32(0)\r\n      : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\r\n  }\r\n\r\n  compileLiteralExpression(\r\n    expression: LiteralExpression,\r\n    contextualType: Type,\r\n    implicitNegate: bool = false\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n\r\n    switch (expression.literalKind) {\r\n      case LiteralKind.ARRAY: {\r\n        assert(!implicitNegate);\r\n        let classType = contextualType.classReference;\r\n        if (\r\n          classType &&\r\n          classType.prototype == this.program.arrayPrototype\r\n        ) {\r\n          return this.compileArrayLiteral(\r\n            assert(classType.typeArguments)[0],\r\n            (<ArrayLiteralExpression>expression).elementExpressions,\r\n            expression\r\n          );\r\n        }\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      case LiteralKind.FLOAT: {\r\n        let floatValue = (<FloatLiteralExpression>expression).value;\r\n        if (implicitNegate) {\r\n          floatValue = -floatValue;\r\n        }\r\n        if (contextualType == Type.f32) {\r\n          return module.createF32(<f32>floatValue);\r\n        }\r\n        this.currentType = Type.f64;\r\n        return module.createF64(floatValue);\r\n      }\r\n      case LiteralKind.INTEGER: {\r\n        let intValue = (<IntegerLiteralExpression>expression).value;\r\n        if (implicitNegate) {\r\n          intValue = i64_sub(\r\n            i64_new(0),\r\n            intValue\r\n          );\r\n        }\r\n        switch (contextualType.kind) {\r\n\r\n          // compile to contextualType if matching\r\n\r\n          case TypeKind.I8: {\r\n            if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U8: {\r\n            if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.I16: {\r\n            if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U16: {\r\n            if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.BOOL: {\r\n            if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            if (!this.options.isWasm64) {\r\n              if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\r\n              break;\r\n            }\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.USIZE: {\r\n            if (!this.options.isWasm64) {\r\n              if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\r\n              break;\r\n            }\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.F32: {\r\n            if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            break; // compiles to best fitting type below, being dropped\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n\r\n        // otherwise compile to best fitting native type\r\n\r\n        if (i64_is_i32(intValue)) {\r\n          this.currentType = Type.i32;\r\n          return module.createI32(i64_low(intValue));\r\n        } else if (i64_is_u32(intValue)) {\r\n          this.currentType = Type.u32;\r\n          return module.createI32(i64_low(intValue));\r\n        } else {\r\n          this.currentType = Type.i64;\r\n          return module.createI64(i64_low(intValue), i64_high(intValue));\r\n        }\r\n      }\r\n      case LiteralKind.STRING: {\r\n        assert(!implicitNegate);\r\n        return this.compileStaticString((<StringLiteralExpression>expression).value);\r\n      }\r\n      // case LiteralKind.OBJECT:\r\n      // case LiteralKind.REGEXP:\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    this.currentType = contextualType;\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileStaticString(stringValue: string): ExpressionRef {\r\n    var module = this.module;\r\n    var options = this.options;\r\n    var stringSegments = this.stringSegments;\r\n\r\n    var stringSegment: MemorySegment | null = stringSegments.get(stringValue);\r\n    if (!stringSegment) {\r\n      let stringLength = stringValue.length;\r\n      let stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n      stringBuffer[0] =  stringLength         & 0xff;\r\n      stringBuffer[1] = (stringLength >>>  8) & 0xff;\r\n      stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n      stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n      for (let i = 0; i < stringLength; ++i) {\r\n        stringBuffer[4 + i * 2] =  stringValue.charCodeAt(i)        & 0xff;\r\n        stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n      }\r\n      stringSegment = this.addMemorySegment(stringBuffer, options.usizeType.byteSize);\r\n      stringSegments.set(stringValue, stringSegment);\r\n    }\r\n    var stringOffset = stringSegment.offset;\r\n    var stringType = this.program.typesLookup.get(\"string\");\r\n    this.currentType = stringType ? stringType : options.usizeType;\r\n    if (options.isWasm64) {\r\n      return module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n    }\r\n    assert(i64_is_i32(stringOffset));\r\n    return module.createI32(i64_low(stringOffset));\r\n  }\r\n\r\n  compileArrayLiteral(elementType: Type, expressions: (Expression | null)[], reportNode: Node): ExpressionRef {\r\n    var isStatic = true;\r\n    var module = this.module;\r\n\r\n    // obtain the array type\r\n    var arrayPrototype = assert(this.program.arrayPrototype);\r\n    if (!arrayPrototype || arrayPrototype.kind != ElementKind.CLASS_PROTOTYPE) return module.createUnreachable();\r\n    var arrayInstance = (<ClassPrototype>arrayPrototype).resolve([ elementType ]);\r\n    if (!arrayInstance) return module.createUnreachable();\r\n    var arrayType = arrayInstance.type;\r\n\r\n    var elementCount = expressions.length;\r\n    if (elementCount) { // non-empty static or dynamic\r\n      let nativeElementType = elementType.toNativeType();\r\n      let values: usize;\r\n      let byteLength: usize;\r\n      switch (nativeElementType) {\r\n        case NativeType.I32: {\r\n          values = changetype<usize>(new Int32Array(elementCount));\r\n          byteLength = elementCount * 4;\r\n          break;\r\n        }\r\n        case NativeType.I64: {\r\n          values = changetype<usize>(new Array<I64>(elementCount));\r\n          byteLength = elementCount * 8;\r\n          break;\r\n        }\r\n        case NativeType.F32: {\r\n          values = changetype<usize>(new Float32Array(elementCount));\r\n          byteLength = elementCount * 4;\r\n          break;\r\n        }\r\n        case NativeType.F64: {\r\n          values = changetype<usize>(new Float64Array(elementCount));\r\n          byteLength = elementCount * 8;\r\n          break;\r\n        }\r\n        default: {\r\n          assert(false);\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n\r\n      // precompute value expressions\r\n      let exprs = new Array<ExpressionRef>(elementCount);\r\n      let expr: BinaryenExpressionRef;\r\n      for (let i = 0; i < elementCount; ++i) {\r\n        exprs[i] = expressions[i]\r\n          ? this.compileExpression(<Expression>expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n          : elementType.toNativeZero(module);\r\n        if (isStatic) {\r\n          expr = this.precomputeExpressionRef(exprs[i]);\r\n          if (getExpressionId(expr) == ExpressionId.Const) {\r\n            assert(getExpressionType(expr) == nativeElementType);\r\n            switch (nativeElementType) {\r\n              case NativeType.I32: {\r\n                changetype<i32[]>(values)[i] = getConstValueI32(expr);\r\n                break;\r\n              }\r\n              case NativeType.I64: {\r\n                changetype<I64[]>(values)[i] = i64_new(\r\n                  getConstValueI64Low(expr),\r\n                  getConstValueI64High(expr)\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.F32: {\r\n                changetype<f32[]>(values)[i] = getConstValueF32(expr);\r\n                break;\r\n              }\r\n              case NativeType.F64: {\r\n                changetype<f64[]>(values)[i] = getConstValueF64(expr);\r\n                break;\r\n              }\r\n              default: assert(false); // checked above\r\n            }\r\n          } else {\r\n            // TODO: emit a warning if declared 'const'\r\n            // if (isConst) {\r\n            //   this.warn(\r\n            //     DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n            //     reportNode.range\r\n            //   );\r\n            // }\r\n            isStatic = false;\r\n          }\r\n        }\r\n      }\r\n\r\n      let usizeTypeSize = this.options.usizeType.byteSize;\r\n      if (isStatic) { // non-empty, all elements can be precomputed\r\n\r\n        // Create a combined static memory segment composed of:\r\n        // Array struct + ArrayBuffer struct + aligned ArrayBuffer data\r\n\r\n        let arraySize = usizeTypeSize + 4; // buffer_ & length_\r\n        let bufferHeaderSize = (4 + 7) & ~7; // aligned byteLength (8)\r\n        let bufferTotalSize = 1 << (32 - clz(byteLength + bufferHeaderSize - 1)); // see internals\r\n        let data = new Uint8Array(arraySize + bufferTotalSize);\r\n        let segment = this.addMemorySegment(data);\r\n        let offset = 0;\r\n\r\n        // write Array struct\r\n        if (usizeTypeSize == 8) {\r\n          writeI64(i64_add(segment.offset, i64_new(arraySize)), data, offset); // buffer_ @ segment[arSize]\r\n          offset += 8;\r\n        } else {\r\n          assert(i64_high(segment.offset) == 0);\r\n          writeI32(i64_low(segment.offset) + arraySize, data, offset); // buffer_ @ segment[arSize]\r\n          offset += 4;\r\n        }\r\n        writeI32(elementCount, data, offset); // length_\r\n        offset += 4;\r\n        assert(offset == arraySize);\r\n\r\n        // write ArrayBuffer struct\r\n        writeI32(byteLength, data, offset);\r\n        offset += bufferHeaderSize; // incl. alignment\r\n\r\n        // write ArrayBuffer data\r\n        switch (nativeElementType) {\r\n          case NativeType.I32: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeI32(changetype<i32[]>(values)[i], data, offset); offset += 4;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.I64: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeI64(changetype<I64[]>(values)[i], data, offset); offset += 8;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.F32: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeF32(changetype<f32[]>(values)[i], data, offset); offset += 4;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.F64: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeF64(changetype<f64[]>(values)[i], data, offset); offset += 8;\r\n            }\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        assert(offset <= arraySize + bufferTotalSize);\r\n\r\n        this.currentType = arrayType;\r\n        return usizeTypeSize == 8\r\n          ? module.createI64(\r\n              i64_low(segment.offset),\r\n              i64_high(segment.offset)\r\n            )\r\n          : module.createI32(\r\n              i64_low(segment.offset)\r\n            );\r\n\r\n      } else { // non-empty, some elements can't be precomputed\r\n\r\n        this.currentType = arrayType;\r\n        let setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\r\n        if (!setter) {\r\n          this.error(\r\n            DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n            reportNode.range, arrayInstance.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let nativeArrayType = arrayType.toNativeType();\r\n        let currentFunction = this.currentFunction;\r\n        let tempLocal = currentFunction.getTempLocal(arrayType, false);\r\n        let stmts = new Array<ExpressionRef>(2 + elementCount);\r\n        let index = 0;\r\n        stmts[index++] = module.createSetLocal(tempLocal.index,\r\n          this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n            module.createI32(0), // this\r\n            module.createI32(elementCount)\r\n          ])\r\n        );\r\n        for (let i = 0; i < elementCount; ++i) {\r\n          stmts[index++] = this.makeCallDirect(setter, [\r\n            module.createGetLocal(tempLocal.index, nativeArrayType), // this\r\n            module.createI32(i),\r\n            exprs[i]\r\n          ]);\r\n        }\r\n        assert(index + 1 == stmts.length);\r\n        stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\r\n        currentFunction.freeTempLocal(tempLocal);\r\n        this.currentType = arrayType;\r\n        return module.createBlock(null, stmts, nativeArrayType);\r\n      }\r\n\r\n    } else { // empty, TBD: cache this somehow?\r\n      this.currentType = arrayType;\r\n      return this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n        module.createI32(0), // this\r\n        module.createI32(0)\r\n      ]);\r\n    }\r\n  }\r\n\r\n  compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var options = this.options;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // obtain the class being instantiated\r\n    var target = this.program.resolveExpression( // reports\r\n      expression.expression,\r\n      currentFunction\r\n    );\r\n    if (!target) return module.createUnreachable();\r\n    if (target.kind != ElementKind.CLASS_PROTOTYPE) {\r\n      this.error(\r\n        DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n        expression.expression.range\r\n      );\r\n      return this.module.createUnreachable();\r\n    }\r\n    var classPrototype = <ClassPrototype>target;\r\n    var classInstance: Class | null = null;\r\n    var typeArguments = expression.typeArguments;\r\n    var classReference: Class | null;\r\n    if (\r\n      !typeArguments &&\r\n      (classReference = contextualType.classReference) !== null &&\r\n      classReference.is(CommonFlags.GENERIC)\r\n    ) {\r\n      classInstance = classPrototype.resolve(\r\n        classReference.typeArguments,\r\n        currentFunction.flow.contextualTypeArguments\r\n      );\r\n    } else {\r\n      classInstance = classPrototype.resolveUsingTypeArguments( // reports\r\n        typeArguments,\r\n        currentFunction.flow.contextualTypeArguments,\r\n        expression\r\n      );\r\n    }\r\n    if (!classInstance) return module.createUnreachable();\r\n\r\n    var expr: ExpressionRef;\r\n\r\n    // traverse to the first matching constructor\r\n    var currentClassInstance: Class | null = classInstance;\r\n    var constructorInstance = classInstance.constructorInstance;\r\n    while (!constructorInstance && (currentClassInstance = classInstance.base)) {\r\n      constructorInstance = currentClassInstance.constructorInstance;\r\n    }\r\n\r\n    // if a constructor is present, call it with a zero `this`\r\n    if (constructorInstance) {\r\n      expr = this.compileCallDirect(constructorInstance, expression.arguments, expression,\r\n        options.usizeType.toNativeZero(module)\r\n      );\r\n\r\n    // otherwise simply allocate a new instance and initialize its fields\r\n    } else {\r\n      expr = this.makeAllocate(classInstance, expression);\r\n    }\r\n\r\n    this.currentType = classInstance.type;\r\n    return expr;\r\n  }\r\n\r\n  compileParenthesizedExpression(\r\n    expression: ParenthesizedExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    // does not change types, just order\r\n    return this.compileExpression(\r\n      expression.expression,\r\n      contextualType,\r\n      ConversionKind.NONE,\r\n      WrapMode.NONE\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Compiles a property access in the specified context.\r\n   * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n   *  precomputes them according to context.\r\n   */\r\n  compilePropertyAccessExpression(\r\n    propertyAccess: PropertyAccessExpression,\r\n    contextualType: Type,\r\n    retainConstantType: bool\r\n  ): ExpressionRef {\r\n    var program = this.program;\r\n    var module = this.module;\r\n\r\n    var target = program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL: { // static property\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field\r\n          return module.createUnreachable();\r\n        }\r\n        let globalType = (<Global>target).type;\r\n        assert(globalType != Type.void);\r\n        if ((<Global>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Global>target, contextualType, retainConstantType);\r\n        }\r\n        this.currentType = globalType;\r\n        return module.createGetGlobal((<Global>target).internalName, globalType.toNativeType());\r\n      }\r\n      case ElementKind.ENUMVALUE: { // enum value\r\n        let parent = (<EnumValue>target).parent;\r\n        assert(parent !== null && parent.kind == ElementKind.ENUM);\r\n        if (!this.compileEnum(<Enum>parent)) {\r\n          return this.module.createUnreachable();\r\n        }\r\n        this.currentType = Type.i32;\r\n        if ((<EnumValue>target).is(CommonFlags.INLINED)) {\r\n          return module.createI32((<EnumValue>target).constantValue);\r\n        }\r\n        return module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);\r\n      }\r\n      case ElementKind.FIELD: { // instance field\r\n        let thisExpression = assert(program.resolvedThisExpression);\r\n        assert((<Field>target).memoryOffset >= 0);\r\n        let thisExpr = this.compileExpressionRetainType(\r\n          thisExpression,\r\n          this.options.usizeType,\r\n          WrapMode.NONE\r\n        );\r\n        this.currentType = (<Field>target).type;\r\n        return module.createLoad(\r\n          (<Field>target).type.byteSize,\r\n          (<Field>target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n          thisExpr,\r\n          (<Field>target).type.toNativeType(),\r\n          (<Field>target).memoryOffset\r\n        );\r\n      }\r\n      case ElementKind.PROPERTY: { // instance property (here: getter)\r\n        let prototype = (<Property>target).getterPrototype;\r\n        if (prototype) {\r\n          let instance = prototype.resolve(null); // reports\r\n          if (!instance) return module.createUnreachable();\r\n          let signature = instance.signature;\r\n          if (!this.checkCallSignature( // reports\r\n            signature,\r\n            0,\r\n            instance.is(CommonFlags.INSTANCE),\r\n            propertyAccess\r\n          )) {\r\n            return module.createUnreachable();\r\n          }\r\n          let inline = (instance.decoratorFlags & DecoratorFlags.INLINE) != 0;\r\n          if (instance.is(CommonFlags.INSTANCE)) {\r\n            let parent = assert(instance.parent);\r\n            assert(parent.kind == ElementKind.CLASS);\r\n            let thisExpression = assert(program.resolvedThisExpression);\r\n            let thisExpr = this.compileExpressionRetainType(\r\n              thisExpression,\r\n              this.options.usizeType,\r\n              WrapMode.NONE\r\n            );\r\n            this.currentType = signature.returnType;\r\n            return this.compileCallDirect(instance, [], propertyAccess, thisExpr, inline);\r\n          } else {\r\n            this.currentType = signature.returnType;\r\n            return this.compileCallDirect(instance, [], propertyAccess, 0, inline);\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.range, (<Property>target).simpleName, (<Property>target).parent.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      propertyAccess.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n    var ifThen = expression.ifThen;\r\n    var ifElse = expression.ifElse;\r\n    var currentFunction = this.currentFunction;\r\n    var parentFlow = currentFunction.flow;\r\n\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary branches if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        return getConstValueI32(condExprPrecomp)\r\n          ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\r\n          : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    var ifThenFlow = parentFlow.fork();\r\n    currentFunction.flow = ifThenFlow;\r\n    var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\r\n    var ifThenType = this.currentType;\r\n    ifThenFlow.free();\r\n\r\n    var ifElseFlow = parentFlow.fork();\r\n    currentFunction.flow = ifElseFlow;\r\n    var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n    var ifElseType = this.currentType;\r\n    currentFunction.flow = ifElseFlow.free();\r\n\r\n    parentFlow.inheritMutual(ifThenFlow, ifElseFlow);\r\n\r\n    var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\r\n    if (!commonType) {\r\n      this.error(\r\n        DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n        expression.range, ifThenType.toString(), ifElseType.toString()\r\n      );\r\n      this.currentType = contextualType;\r\n      return this.module.createUnreachable();\r\n    }\r\n    ifThenExpr = this.convertExpression(\r\n      ifThenExpr,\r\n      ifThenType,\r\n      commonType,\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE,\r\n      ifThen\r\n    );\r\n    ifElseExpr = this.convertExpression(\r\n      ifElseExpr,\r\n      ifElseType,\r\n      commonType,\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE,\r\n      ifElse\r\n    );\r\n    this.currentType = commonType;\r\n    return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\r\n  }\r\n\r\n  compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // make a getter for the expression (also obtains the type)\r\n    var getValue = this.compileExpression( // reports\r\n      expression.operand,\r\n      contextualType == Type.void\r\n        ? Type.i32\r\n        : contextualType,\r\n      ConversionKind.NONE,\r\n      WrapMode.NONE\r\n    );\r\n    // shortcut if compiling the getter already failed\r\n    if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\r\n    var currentType = this.currentType;\r\n\r\n    var op: BinaryOp;\r\n    var nativeType: NativeType;\r\n    var nativeOne: ExpressionRef;\r\n\r\n    switch (expression.operator) {\r\n      case Token.PLUS_PLUS: {\r\n\r\n        // TODO: check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        switch (currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            op = BinaryOp.AddI32;\r\n            nativeType = NativeType.I32;\r\n            nativeOne = module.createI32(1);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: // TODO: check operator overload\r\n          case TypeKind.ISIZE: {\r\n            let options = this.options;\r\n            op = options.isWasm64\r\n              ? BinaryOp.AddI64\r\n              : BinaryOp.AddI32;\r\n            nativeType = options.nativeSizeType;\r\n            nativeOne = currentType.toNativeOne(module);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            op = BinaryOp.AddI64;\r\n            nativeType = NativeType.I64;\r\n            nativeOne = module.createI64(1);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            op = BinaryOp.AddF32;\r\n            nativeType = NativeType.F32;\r\n            nativeOne = module.createF32(1);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            op = BinaryOp.AddF64;\r\n            nativeType = NativeType.F64;\r\n            nativeOne = module.createF64(1);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_MINUS: {\r\n\r\n        // TODO: check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        switch (currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            op = BinaryOp.SubI32;\r\n            nativeType = NativeType.I32;\r\n            nativeOne = module.createI32(1);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: // TODO: check operator overload\r\n          case TypeKind.ISIZE: {\r\n            let options = this.options;\r\n            op = options.isWasm64\r\n              ? BinaryOp.SubI64\r\n              : BinaryOp.SubI32;\r\n            nativeType = options.nativeSizeType;\r\n            nativeOne = currentType.toNativeOne(module);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            op = BinaryOp.SubI64;\r\n            nativeType = NativeType.I64;\r\n            nativeOne = module.createI64(1);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            op = BinaryOp.SubF32;\r\n            nativeType = NativeType.F32;\r\n            nativeOne = module.createF32(1);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            op = BinaryOp.SubF64;\r\n            nativeType = NativeType.F64;\r\n            nativeOne = module.createF64(1);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // simplify if dropped anyway\r\n    if (contextualType == Type.void) {\r\n      return this.compileAssignmentWithValue(expression.operand,\r\n        module.createBinary(op,\r\n          getValue,\r\n          nativeOne\r\n        ),\r\n        false\r\n      );\r\n    }\r\n\r\n    // otherwise use a temp local for the intermediate value (always possibly overflows)\r\n    var tempLocal = currentFunction.getTempLocal(currentType, false);\r\n    var setValue = this.compileAssignmentWithValue(expression.operand,\r\n      module.createBinary(op,\r\n        this.module.createGetLocal(tempLocal.index, nativeType),\r\n        nativeOne\r\n      ),\r\n      false\r\n    );\r\n    this.currentType = assert(tempLocal).type;\r\n    currentFunction.freeTempLocal(<Local>tempLocal);\r\n\r\n    var localIndex = (<Local>tempLocal).index;\r\n    return module.createBlock(null, [\r\n      module.createSetLocal(localIndex, getValue),\r\n      setValue,\r\n      module.createGetLocal(localIndex, nativeType)\r\n    ], nativeType); // result of 'x++' / 'x--' might overflow\r\n  }\r\n\r\n  compileUnaryPrefixExpression(\r\n    expression: UnaryPrefixExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var compound = false;\r\n    var expr: ExpressionRef;\r\n\r\n    switch (expression.operator) {\r\n      case Token.PLUS: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PLUS);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        // nop\r\n        break;\r\n      }\r\n      case Token.MINUS: {\r\n        if (expression.operand.kind == NodeKind.LITERAL && (\r\n          (<LiteralExpression>expression.operand).literalKind == LiteralKind.INTEGER ||\r\n          (<LiteralExpression>expression.operand).literalKind == LiteralKind.FLOAT\r\n        )) {\r\n          // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n          expr = this.compileLiteralExpression(<LiteralExpression>expression.operand, contextualType, true);\r\n          // compileExpression normally does this:\r\n          if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n          break;\r\n        }\r\n\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.MINUS);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              this.currentType.toNativeZero(module),\r\n              expr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createUnary(UnaryOp.NegF32, expr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createUnary(UnaryOp.NegF64, expr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.PLUS_PLUS: {\r\n        compound = true;\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AddI64\r\n                : BinaryOp.AddI32,\r\n              expr,\r\n              this.currentType.toNativeOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_MINUS: {\r\n        compound = true;\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              expr,\r\n              this.currentType.toNativeOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.EXCLAMATION: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.NOT);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          // allow '!' for references even without an overload\r\n        }\r\n\r\n        expr = this.makeIsFalseish(expr, this.currentType);\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.TILDE: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType.is(TypeFlags.FLOAT)\r\n              ? Type.i64\r\n              : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        } else {\r\n          expr = this.convertExpression(\r\n            expr,\r\n            this.currentType, this.currentType.intType,\r\n            ConversionKind.IMPLICIT, WrapMode.NONE,\r\n            expression.operand\r\n          );\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.XorI64\r\n                : BinaryOp.XorI32,\r\n              expr,\r\n              this.currentType.toNativeNegOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.TYPEOF: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n    return compound\r\n      ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n      : expr;\r\n  }\r\n\r\n  /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\r\n  ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var flow = this.currentFunction.flow;\r\n    switch (type.kind) {\r\n      case TypeKind.I8: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n            ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\r\n            : module.createBinary(BinaryOp.ShrI32,\r\n                module.createBinary(BinaryOp.ShlI32,\r\n                  expr,\r\n                  module.createI32(24)\r\n                ),\r\n                module.createI32(24)\r\n              );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.I16: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n            ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\r\n            : module.createBinary(BinaryOp.ShrI32,\r\n                module.createBinary(BinaryOp.ShlI32,\r\n                  expr,\r\n                  module.createI32(16)\r\n                ),\r\n                module.createI32(16)\r\n              );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.U8: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0xff)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.U16: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0xffff)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.BOOL: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0x1)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /** Creates a comparison whether an expression is 'false' in a broader sense. */\r\n  makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    switch (type.kind) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16:\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        expr = this.ensureSmallIntegerWrap(expr, type);\r\n        // fall-through\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return module.createUnary(UnaryOp.EqzI32, expr);\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return module.createUnary(UnaryOp.EqzI64, expr);\r\n      }\r\n      case TypeKind.USIZE: // TODO: strings?\r\n      case TypeKind.ISIZE: {\r\n        return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n      }\r\n      case TypeKind.F32: {\r\n        return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n      }\r\n      case TypeKind.F64: {\r\n        return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createI32(1);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Creates a comparison whether an expression is 'true' in a broader sense. */\r\n  makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    switch (type.kind) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16:\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        expr = this.ensureSmallIntegerWrap(expr, type);\r\n        // fall-through\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return expr;\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n      }\r\n      case TypeKind.USIZE: // TODO: strings?\r\n      case TypeKind.ISIZE: {\r\n        return type.size == 64\r\n          ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n          : expr;\r\n      }\r\n      case TypeKind.F32: {\r\n        return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n      }\r\n      case TypeKind.F64: {\r\n        return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createI32(0);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Makes an allocation expression for an instance of the specified class. */\r\n  makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var nativeSizeType = this.options.nativeSizeType;\r\n\r\n    // allocate the necessary memory and tee the pointer to a temp. local for reuse\r\n    var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\r\n    var initializers = new Array<ExpressionRef>();\r\n    initializers.push(\r\n      module.createSetLocal(tempLocal.index,\r\n        compileBuiltinAllocate(this, classInstance, reportNode)\r\n      )\r\n    );\r\n\r\n    // apply field initializers\r\n    if (classInstance.members) {\r\n      for (let member of classInstance.members.values()) {\r\n        if (member.kind == ElementKind.FIELD) {\r\n          let field = <Field>member;\r\n          let fieldType = field.type;\r\n          let nativeFieldType = fieldType.toNativeType();\r\n          let fieldDeclaration = field.prototype.declaration;\r\n          assert(!field.isAny(CommonFlags.CONST));\r\n          if (fieldDeclaration.initializer) { // use initializer\r\n            initializers.push(module.createStore(fieldType.byteSize,\r\n              module.createGetLocal(tempLocal.index, nativeSizeType),\r\n              this.compileExpression( // reports\r\n                fieldDeclaration.initializer,\r\n                fieldType,\r\n                ConversionKind.IMPLICIT,\r\n                WrapMode.NONE\r\n              ),\r\n              nativeFieldType,\r\n              field.memoryOffset\r\n            ));\r\n          } else { // initialize with zero\r\n            // TODO: might be unnecessary if the ctor initializes the field\r\n            let parameterIndex = (<FieldDeclaration>field.prototype.declaration).parameterIndex;\r\n            initializers.push(module.createStore(fieldType.byteSize,\r\n              module.createGetLocal(tempLocal.index, nativeSizeType),\r\n              parameterIndex >= 0 // initialized via parameter\r\n                ? module.createGetLocal(1 + parameterIndex, nativeFieldType)\r\n                : fieldType.toNativeZero(module),\r\n                nativeFieldType,\r\n              field.memoryOffset\r\n            ));\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // return `this`\r\n    initializers.push(\r\n      module.createGetLocal(tempLocal.index, nativeSizeType)\r\n    );\r\n\r\n    currentFunction.freeTempLocal(tempLocal);\r\n    this.currentType = classInstance.type;\r\n    return module.createBlock(null, initializers, nativeSizeType);\r\n  }\r\n\r\n  /** Makes a conditional allocation expression inside of the constructor of the specified class. */\r\n  makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n    // requires that `this` is the first local\r\n    var module = this.module;\r\n    var nativeSizeType = this.options.nativeSizeType;\r\n    this.currentType = classInstance.type;\r\n    return module.createIf(\r\n      nativeSizeType == NativeType.I64\r\n        ? module.createBinary(\r\n            BinaryOp.NeI64,\r\n            module.createGetLocal(0, NativeType.I64),\r\n            module.createI64(0)\r\n          )\r\n        : module.createGetLocal(0, NativeType.I32),\r\n      module.createGetLocal(0, nativeSizeType),\r\n      module.createTeeLocal(0,\r\n        this.makeAllocate(classInstance, reportNode)\r\n      )\r\n    );\r\n  }\r\n\r\n  /** Adds the debug location of the specified expression at the specified range to the source map. */\r\n  addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n    var currentFunction = this.currentFunction;\r\n    var source = range.source;\r\n    if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n    range.debugInfoRef = expr;\r\n    currentFunction.debugLocations.push(range);\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\nfunction mangleExportName(element: Element, simpleName: string = element.simpleName): string {\r\n  switch (element.kind) {\r\n    case ElementKind.FUNCTION: {\r\n      let parent = (<Function>element).parent || (<Function>element).prototype.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n    case ElementKind.FIELD: {\r\n      let parent = assert((<Field>element).parent);\r\n      return mangleExportName(parent)\r\n          + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n          + simpleName;\r\n    }\r\n    case ElementKind.ENUMVALUE: {\r\n      let parent = assert((<EnumValue>element).parent);\r\n      return mangleExportName(parent)\r\n          + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n          + simpleName;\r\n    }\r\n    case ElementKind.CLASS: {\r\n      let parent = (<Class>element).prototype.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + STATIC_DELIMITER\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n    default: {\r\n      let parent = element.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + STATIC_DELIMITER\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n  }\r\n}\r\n\r\nfunction mangleImportName(\r\n  element: Element,\r\n  declaration: DeclarationStatement,\r\n  parentElement: Element | null = null\r\n): void {\r\n  mangleImportName_moduleName = parentElement ? parentElement.simpleName : declaration.range.source.simplePath;\r\n  mangleImportName_elementName = element.simpleName;\r\n\r\n  if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\r\n\r\n  var program = element.program;\r\n  var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n  var args = decorator.arguments;\r\n  if (args && args.length) {\r\n    let arg = args[0];\r\n    if (arg.kind == NodeKind.LITERAL && (<LiteralExpression>arg).literalKind == LiteralKind.STRING) {\r\n      mangleImportName_elementName = (<StringLiteralExpression>arg).value;\r\n      if (args.length >= 2) {\r\n        arg = args[1];\r\n        if (arg.kind == NodeKind.LITERAL && (<LiteralExpression>arg).literalKind == LiteralKind.STRING) {\r\n          mangleImportName_moduleName = mangleImportName_elementName;\r\n          mangleImportName_elementName = (<StringLiteralExpression>arg).value;\r\n          if (args.length > 2) {\r\n            program.error(\r\n              DiagnosticCode.Expected_0_arguments_but_got_1,\r\n              decorator.range, \"2\", args.length.toString()\r\n            );\r\n          }\r\n        } else {\r\n          program.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            arg.range\r\n          );\r\n        }\r\n      }\r\n    } else {\r\n      program.error(\r\n        DiagnosticCode.String_literal_expected,\r\n        arg.range\r\n      );\r\n    }\r\n  } else {\r\n    program.error(\r\n      DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n      decorator.range, \"1\", \"0\"\r\n    );\r\n  }\r\n}\r\n\r\nvar mangleImportName_moduleName: string;\r\nvar mangleImportName_elementName: string;\r\n","/**\r\n * A TypeScript parser for the AssemblyScript subset.\r\n * @module parser\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  LIBRARY_PREFIX,\r\n  PATH_DELIMITER\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program\r\n} from \"./program\";\r\n\r\nimport {\r\n  Tokenizer,\r\n  Token,\r\n  Range,\r\n  CommentHandler,\r\n  IdentifierHandling\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  normalizePath\r\n} from \"./util\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Source,\r\n  SourceKind,\r\n  CommonTypeNode,\r\n  TypeNode,\r\n  SignatureNode,\r\n\r\n  Expression,\r\n  AssertionKind,\r\n  CallExpression,\r\n  ClassExpression,\r\n  FunctionExpression,\r\n  IdentifierExpression,\r\n  StringLiteralExpression,\r\n\r\n  Statement,\r\n  BlockStatement,\r\n  BreakStatement,\r\n  ClassDeclaration,\r\n  ContinueStatement,\r\n  DeclarationStatement,\r\n  DecoratorNode,\r\n  DoStatement,\r\n  EnumDeclaration,\r\n  EnumValueDeclaration,\r\n  ExportImportStatement,\r\n  ExportMember,\r\n  ExportStatement,\r\n  ExpressionStatement,\r\n  ForStatement,\r\n  FunctionDeclaration,\r\n  IfStatement,\r\n  ImportDeclaration,\r\n  ImportStatement,\r\n  NamespaceDeclaration,\r\n  ParameterNode,\r\n  ParameterKind,\r\n  ReturnStatement,\r\n  SwitchCase,\r\n  SwitchStatement,\r\n  ThrowStatement,\r\n  TryStatement,\r\n  TypeDeclaration,\r\n  TypeParameterNode,\r\n  VariableStatement,\r\n  VariableDeclaration,\r\n  VoidStatement,\r\n  WhileStatement,\r\n\r\n  mangleInternalPath,\r\n  nodeIsCallable,\r\n  nodeIsGenericCallable\r\n} from \"./ast\";\r\n\r\nconst builtinsFile = LIBRARY_PREFIX + \"builtins.ts\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n  /** Program being created. */\r\n  program: Program;\r\n  /** Source file names to be requested next. */\r\n  backlog: string[] = new Array();\r\n  /** Source file names already seen, that is processed or backlogged. */\r\n  seenlog: Set<string> = new Set();\r\n  /** Source file names already completely processed. */\r\n  donelog: Set<string> = new Set();\r\n  /** Optional handler to intercept comments while tokenizing. */\r\n  onComment: CommentHandler | null = null;\r\n\r\n  /** Constructs a new parser. */\r\n  constructor() {\r\n    super();\r\n    this.program = new Program(this.diagnostics);\r\n  }\r\n\r\n  /** Parses a file and adds its definitions to the program. */\r\n  parseFile(\r\n    text: string,\r\n    path: string,\r\n    isEntry: bool\r\n  ): void {\r\n    var normalizedPath = normalizePath(path);\r\n    var internalPath = mangleInternalPath(normalizedPath);\r\n\r\n    // check if already processed\r\n    if (this.donelog.has(internalPath)) return;\r\n    this.donelog.add(internalPath); // do not parse again\r\n    this.seenlog.add(internalPath); // do not request again\r\n\r\n    // create the source element\r\n    var source = new Source(\r\n      normalizedPath,\r\n      text,\r\n      isEntry\r\n        ? SourceKind.ENTRY\r\n        : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n          ? SourceKind.LIBRARY\r\n          : SourceKind.DEFAULT\r\n    );\r\n    var program = this.program;\r\n    program.sources.push(source);\r\n\r\n    // mark the special builtins library file\r\n    if (source.normalizedPath == builtinsFile) {\r\n      source.set(CommonFlags.BUILTIN);\r\n    }\r\n\r\n    // tokenize and parse\r\n    var tn = new Tokenizer(source, program.diagnostics);\r\n    tn.onComment = this.onComment;\r\n    source.tokenizer = tn;\r\n    var statements = source.statements;\r\n    while (!tn.skip(Token.ENDOFFILE)) {\r\n      let statement = this.parseTopLevelStatement(tn);\r\n      if (statement) {\r\n        statement.parent = source;\r\n        statements.push(statement);\r\n      }\r\n    }\r\n    tn.finish();\r\n  }\r\n\r\n  /** Parses a top-level statement. */\r\n  parseTopLevelStatement(\r\n    tn: Tokenizer,\r\n    namespace: Node | null = null\r\n  ): Statement | null {\r\n    var flags = CommonFlags.NONE;\r\n    var startPos: i32 = -1;\r\n\r\n    // check decorators\r\n    var decorators: DecoratorNode[] | null = null;\r\n    while (tn.skip(Token.AT)) {\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      let decorator = this.parseDecorator(tn);\r\n      if (!decorator) {\r\n        this.skipStatement(tn);\r\n        continue;\r\n      }\r\n      if (!decorators) decorators = [];\r\n      decorators.push(decorator);\r\n    }\r\n\r\n    // mark builtins\r\n    flags |= (tn.source.flags & CommonFlags.BUILTIN);\r\n\r\n    // check modifiers\r\n    var exportStart: i32 = 0;\r\n    var exportEnd: i32 = 0;\r\n    if (tn.skip(Token.EXPORT)) {\r\n      if (tn.skip(Token.DEFAULT)) {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          tn.range()\r\n        );\r\n      }\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      flags |= CommonFlags.EXPORT;\r\n      exportStart = tn.tokenPos;\r\n      exportEnd = tn.pos;\r\n    }\r\n\r\n    var declareStart: i32 = 0;\r\n    var declareEnd: i32 = 0;\r\n    var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\r\n    if (tn.skip(Token.DECLARE)) {\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      if (contextIsAmbient) {\r\n        this.error(\r\n          DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\r\n    } else if (contextIsAmbient) {\r\n      flags |= CommonFlags.AMBIENT;\r\n    }\r\n\r\n    // parse the statement\r\n    var statement: Statement | null = null;\r\n\r\n    // handle declarations\r\n    var first = tn.peek();\r\n    if (startPos < 0) startPos = tn.nextTokenPos;\r\n    switch (first) {\r\n      case Token.CONST: {\r\n        tn.next();\r\n        flags |= CommonFlags.CONST;\r\n        if (tn.skip(Token.ENUM)) {\r\n          statement = this.parseEnum(tn, flags, decorators, startPos);\r\n          break;\r\n        } else {\r\n          statement = this.parseVariable(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        }\r\n        break;\r\n      }\r\n      case Token.LET: flags |= CommonFlags.LET;\r\n      case Token.VAR: {\r\n        tn.next();\r\n        statement = this.parseVariable(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.ENUM: {\r\n        tn.next();\r\n        statement = this.parseEnum(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.FUNCTION: {\r\n        tn.next();\r\n        statement = this.parseFunction(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.ABSTRACT: {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (!tn.skip(Token.CLASS)) {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n          break;\r\n        } else {\r\n          tn.discard(state);\r\n        }\r\n        flags |= CommonFlags.ABSTRACT;\r\n        // fall through\r\n      }\r\n      case Token.CLASS:\r\n      case Token.INTERFACE: {\r\n        tn.next();\r\n        statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.NAMESPACE: {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          tn.discard(state);\r\n          statement = this.parseNamespace(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        } else {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n        }\r\n        break;\r\n      }\r\n      case Token.IMPORT: {\r\n        tn.next();\r\n        flags |= CommonFlags.IMPORT;\r\n        if (flags & CommonFlags.EXPORT) {\r\n          statement = this.parseExportImport(tn, startPos);\r\n        } else {\r\n          statement = this.parseImport(tn);\r\n        }\r\n        break;\r\n      }\r\n      case Token.TYPE: { // also identifier\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          tn.discard(state);\r\n          statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        } else {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n\r\n        // handle plain exports\r\n        if (flags & CommonFlags.EXPORT) {\r\n          statement = this.parseExport(tn, flags, startPos);\r\n\r\n        // handle non-declaration statements\r\n        } else {\r\n          if (exportEnd) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(exportStart, exportEnd), \"export\"\r\n            ); // recoverable\r\n          }\r\n          if (declareEnd) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(declareStart, declareEnd), \"declare\"\r\n            ); // recoverable\r\n          }\r\n          if (!namespace) {\r\n            statement = this.parseStatement(tn, true);\r\n          } // TODO: else?\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    // check for decorators that weren't consumed\r\n    if (decorators) {\r\n      for (let i = 0, k = decorators.length; i < k; ++i) {\r\n        this.error(\r\n          DiagnosticCode.Decorators_are_not_valid_here,\r\n          decorators[i].range\r\n        );\r\n      }\r\n    }\r\n    return statement;\r\n  }\r\n\r\n  /** Obtains the next file to parse. */\r\n  nextFile(): string | null {\r\n    var backlog = this.backlog;\r\n    return backlog.length ? backlog.shift() : null;\r\n  }\r\n\r\n  /** Finishes parsing and returns the program. */\r\n  finish(): Program {\r\n    if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n    this.backlog = [];\r\n    this.seenlog.clear();\r\n    this.donelog.clear();\r\n    return this.program;\r\n  }\r\n\r\n  /** Parses a type. */\r\n  parseType(\r\n    tn: Tokenizer,\r\n    acceptParenthesized: bool = true,\r\n    suppressErrors: bool = false\r\n  ): CommonTypeNode | null {\r\n\r\n    // NOTE: this parses our limited subset\r\n    var token = tn.next();\r\n    var startPos = tn.tokenPos;\r\n\r\n    var type: CommonTypeNode;\r\n\r\n    // '(' ...\r\n    if (token == Token.OPENPAREN) {\r\n\r\n      // '(' FunctionSignature ')' '|' 'null'?\r\n      let isNullableSignature = tn.skip(Token.OPENPAREN);\r\n      // FunctionSignature?\r\n      let signature = this.tryParseSignature(tn);\r\n      if (signature) {\r\n        if (isNullableSignature) {\r\n          if (!tn.skip(Token.CLOSEPAREN)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \")\"\r\n            );\r\n            return null;\r\n          }\r\n          if (!tn.skip(Token.BAR)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"|\"\r\n            );\r\n            return null;\r\n          }\r\n          if (!tn.skip(Token.NULL)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"null\"\r\n            );\r\n          }\r\n          signature.isNullable = true;\r\n        }\r\n        return signature;\r\n      } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\r\n        this.error(\r\n          DiagnosticCode.Unexpected_token,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n\r\n      // Type (',' Type)* ')'\r\n      if (acceptParenthesized) {\r\n        let innerType = this.parseType(tn, false, suppressErrors);\r\n        if (!innerType) return null;\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \"}\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n        type = innerType;\r\n        type.range.start = startPos;\r\n        type.range.end = tn.pos;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Unexpected_token,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n\r\n    // 'void'\r\n    } else if (token == Token.VOID) {\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // 'this'\r\n    } else if (token == Token.THIS) {\r\n      type = Node.createType(\r\n        Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // 'true'\r\n    } else if (token == Token.TRUE || token == Token.FALSE) {\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // StringLiteral\r\n    } else if (token == Token.STRINGLITERAL) {\r\n      tn.readString();\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // Identifier\r\n    } else if (token == Token.IDENTIFIER) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let parameters = new Array<TypeNode>();\r\n      let nullable = false;\r\n\r\n      // Name<T>\r\n      if (tn.skip(Token.LESSTHAN)) {\r\n        do {\r\n          let parameter = this.parseType(tn, true, suppressErrors);\r\n          if (!parameter) return null;\r\n          parameters.push(<TypeNode>parameter);\r\n        } while (tn.skip(Token.COMMA));\r\n        if (!tn.skip(Token.GREATERTHAN)) {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \">\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      // ... | null\r\n      if (tn.skip(Token.BAR)) {\r\n        if (tn.skip(Token.NULL)) {\r\n          nullable = true;\r\n        } else {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \"null\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n    } else {\r\n      if (!suppressErrors) {\r\n        this.error(\r\n          DiagnosticCode.Identifier_expected,\r\n          tn.range()\r\n        );\r\n      }\r\n      return null;\r\n    }\r\n    // ... [][]\r\n    while (tn.skip(Token.OPENBRACKET)) {\r\n      let bracketStart = tn.tokenPos;\r\n      if (!tn.skip(Token.CLOSEBRACKET)) {\r\n        if (!suppressErrors) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"]\"\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      let bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n      // ...[] | null\r\n      let nullable = false;\r\n      if (tn.skip(Token.BAR)) {\r\n        if (tn.skip(Token.NULL)) {\r\n          nullable = true;\r\n        } else {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"null\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"Array\", bracketRange),\r\n        [ type ],\r\n        nullable,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      if (nullable) break;\r\n    }\r\n\r\n    return type;\r\n  }\r\n\r\n  // Indicates whether tryParseSignature determined that it is handling a Signature\r\n  private tryParseSignatureIsSignature: bool = false;\r\n\r\n  /** Parses a function signature, as used in type declarations. */\r\n  tryParseSignature(\r\n    tn: Tokenizer\r\n  ): SignatureNode | null {\r\n\r\n    // at '(': ('...'? Identifier '?'? ':' Type (','  '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\r\n\r\n    var state = tn.mark();\r\n    var startPos = tn.tokenPos;\r\n    var parameters: ParameterNode[] | null = null;\r\n    var thisType: TypeNode | null = null;\r\n    var isSignature: bool = false;\r\n\r\n    if (tn.skip(Token.CLOSEPAREN)) {\r\n      isSignature = true;\r\n      tn.discard(state);\r\n      parameters = [];\r\n\r\n    } else {\r\n      isSignature = false; // not yet known\r\n      do {\r\n        let kind = ParameterKind.DEFAULT;\r\n        if (tn.skip(Token.DOT_DOT_DOT)) {\r\n          isSignature = true;\r\n          tn.discard(state);\r\n          kind = ParameterKind.REST;\r\n        }\r\n        if (tn.skip(Token.THIS)) {\r\n          if (tn.skip(Token.COLON)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            let t = this.parseType(tn, false);\r\n            if (!t) return null;\r\n            if (t.kind != NodeKind.TYPE) {\r\n              this.error(\r\n                DiagnosticCode.Operation_not_supported,\r\n                t.range\r\n              );\r\n              this.tryParseSignatureIsSignature = true;\r\n              return null;\r\n            }\r\n            thisType = <TypeNode>t;\r\n          } else {\r\n            tn.reset(state);\r\n            this.tryParseSignatureIsSignature = false;\r\n            return null;\r\n          }\r\n        } else if (tn.skipIdentifier()) {\r\n          let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\r\n          if (tn.skip(Token.QUESTION)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            if (kind == ParameterKind.REST) {\r\n              this.error(\r\n                DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n                tn.range()\r\n              ); // recoverable\r\n            } else {\r\n              kind = ParameterKind.OPTIONAL;\r\n            }\r\n          }\r\n          if (tn.skip(Token.COLON)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            let type = this.parseType(tn); // not suppressing errors because known\r\n            if (!type) {\r\n              this.tryParseSignatureIsSignature = isSignature;\r\n              return null;\r\n            }\r\n            let param = new ParameterNode();\r\n            param.parameterKind = kind;\r\n            param.name = name;\r\n            param.type = type;\r\n            if (!parameters) parameters = [ param ];\r\n            else parameters.push(param);\r\n          } else {\r\n            if (isSignature) {\r\n              this.error(\r\n                DiagnosticCode.Type_expected,\r\n                tn.range()\r\n              ); // recoverable\r\n            }\r\n          }\r\n        } else {\r\n          if (isSignature) {\r\n            this.error(\r\n              DiagnosticCode.Identifier_expected,\r\n              tn.range()\r\n            );\r\n          } else {\r\n            tn.reset(state);\r\n          }\r\n          this.tryParseSignatureIsSignature = isSignature;\r\n          return null;\r\n        }\r\n      } while (tn.skip(Token.COMMA));\r\n      if (!tn.skip(Token.CLOSEPAREN)) {\r\n        if (isSignature) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n        this.tryParseSignatureIsSignature = isSignature;\r\n        return null;\r\n      }\r\n    }\r\n\r\n    var returnType: CommonTypeNode | null;\r\n    if (tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n      isSignature = true;\r\n      tn.discard(state);\r\n      returnType = this.parseType(tn);\r\n      if (!returnType) {\r\n        this.tryParseSignatureIsSignature = isSignature;\r\n        return null;\r\n      }\r\n    } else {\r\n      if (isSignature) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=>\"\r\n        );\r\n      } else {\r\n        tn.reset(state);\r\n      }\r\n      this.tryParseSignatureIsSignature = isSignature;\r\n      return null;\r\n    }\r\n    this.tryParseSignatureIsSignature = true;\r\n    return Node.createSignature(\r\n      parameters || [],\r\n      returnType,\r\n      thisType,\r\n      false,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n  }\r\n\r\n  // statements\r\n\r\n  parseDecorator(\r\n    tn: Tokenizer\r\n  ): DecoratorNode | null {\r\n\r\n    // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skipIdentifier()) {\r\n      let name = tn.readIdentifier();\r\n      let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n      while (tn.skip(Token.DOT)) {\r\n        if (tn.skipIdentifier()) {\r\n          name = tn.readIdentifier();\r\n          expression = Node.createPropertyAccessExpression(\r\n            expression,\r\n            Node.createIdentifierExpression(name, tn.range()),\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      let args: Expression[] | null;\r\n      if (tn.skip(Token.OPENPAREN)) {\r\n        args = this.parseArguments(tn);\r\n        if (args) {\r\n          return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n        }\r\n      } else {\r\n        return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseVariable(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): VariableStatement | null {\r\n\r\n    // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n    var members = new Array<VariableDeclaration>();\r\n    do {\r\n      let member = this.parseVariableDeclaration(tn, flags, decorators);\r\n      if (!member) return null;\r\n      members.push(<VariableDeclaration>member);\r\n    } while (tn.skip(Token.COMMA));\r\n\r\n    var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseVariableDeclaration(\r\n    tn: Tokenizer,\r\n    parentFlags: CommonFlags,\r\n    parentDecorators: DecoratorNode[] | null\r\n  ): VariableDeclaration | null {\r\n\r\n    // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var flags = parentFlags;\r\n\r\n    var type: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      type = this.parseType(tn);\r\n    }\r\n\r\n    var initializer: Expression | null = null;\r\n    if (tn.skip(Token.EQUALS)) {\r\n      if (flags & CommonFlags.AMBIENT) {\r\n        this.error(\r\n          DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!initializer) return null;\r\n    } else {\r\n      if (flags & CommonFlags.CONST) {\r\n        if (!(flags & CommonFlags.AMBIENT)) {\r\n          this.error(\r\n            DiagnosticCode._const_declarations_must_be_initialized,\r\n            identifier.range\r\n          ); // recoverable\r\n        }\r\n      } else if (!type) { // neither type nor initializer\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          tn.range(tn.pos)\r\n        ); // recoverable\r\n      }\r\n    }\r\n    return Node.createVariableDeclaration(\r\n      identifier,\r\n      type,\r\n      initializer,\r\n      parentDecorators,\r\n      flags,\r\n      Range.join(identifier.range, tn.range())\r\n    );\r\n  }\r\n\r\n  parseEnum(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): EnumDeclaration | null {\r\n\r\n    // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n    if (tn.next() != Token.IDENTIFIER) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    if (tn.next() != Token.OPENBRACE) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n    var members = new Array<EnumValueDeclaration>();\r\n    while (!tn.skip(Token.CLOSEBRACE)) {\r\n      let member = this.parseEnumValue(tn, CommonFlags.NONE);\r\n      if (!member) return null;\r\n      members.push(<EnumValueDeclaration>member);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEBRACE)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"}\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    var ret = Node.createEnumDeclaration(\r\n      identifier,\r\n      members,\r\n      decorators,\r\n      flags,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseEnumValue(\r\n    tn: Tokenizer,\r\n    parentFlags: CommonFlags\r\n  ): EnumValueDeclaration | null {\r\n\r\n    // before: Identifier ('=' Expression)?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var value: Expression | null = null;\r\n    if (tn.skip(Token.EQUALS)) {\r\n      value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!value) return null;\r\n    }\r\n    return Node.createEnumValueDeclaration(\r\n      identifier,\r\n      value,\r\n      parentFlags,\r\n      Range.join(identifier.range, tn.range())\r\n    );\r\n  }\r\n\r\n  parseReturn(\r\n    tn: Tokenizer\r\n  ): ReturnStatement | null {\r\n\r\n    // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n    var expr: Expression | null = null;\r\n    if (\r\n      tn.peek(true) != Token.SEMICOLON &&\r\n      tn.nextToken != Token.CLOSEBRACE &&\r\n      !tn.nextTokenOnNewLine\r\n    ) {\r\n      if (!(expr = this.parseExpression(tn))) return null;\r\n    }\r\n\r\n    var ret = Node.createReturnStatement(expr, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseTypeParameters(\r\n    tn: Tokenizer\r\n  ): TypeParameterNode[] | null {\r\n\r\n    // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n    var typeParameters = new Array<TypeParameterNode>();\r\n    while (!tn.skip(Token.GREATERTHAN)) {\r\n      let typeParameter = this.parseTypeParameter(tn);\r\n      if (!typeParameter) return null;\r\n      typeParameters.push(<TypeParameterNode>typeParameter);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.GREATERTHAN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \">\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    if (typeParameters.length === 0) {\r\n      this.error(\r\n        DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n        tn.range()\r\n      ); // recoverable\r\n    }\r\n    return typeParameters;\r\n  }\r\n\r\n  parseTypeParameter(\r\n    tn: Tokenizer\r\n  ): TypeParameterNode | null {\r\n\r\n    // before: Identifier ('extends' Type)?\r\n\r\n    if (tn.next() == Token.IDENTIFIER) {\r\n      let identifier = Node.createIdentifierExpression(\r\n        tn.readIdentifier(),\r\n        tn.range()\r\n      );\r\n      let extendsType: TypeNode | null = null;\r\n      if (tn.skip(Token.EXTENDS)) {\r\n        let t = this.parseType(tn);\r\n        if (!t) return null;\r\n        if (t.kind != NodeKind.TYPE) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            t.range\r\n          );\r\n          return null;\r\n        }\r\n        extendsType = <TypeNode>t;\r\n      }\r\n      return Node.createTypeParameter(\r\n        identifier,\r\n        extendsType,\r\n        Range.join(identifier.range, tn.range())\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private parseParametersThis: TypeNode | null = null;\r\n\r\n  parseParameters(\r\n    tn: Tokenizer,\r\n    isConstructor: bool = false\r\n  ): ParameterNode[] | null {\r\n\r\n    // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n    var parameters = new Array<ParameterNode>();\r\n    var seenRest: ParameterNode | null = null;\r\n    var seenOptional = false;\r\n    var reportedRest = false;\r\n    var thisType: CommonTypeNode | null = null;\r\n\r\n    // check if there is a leading `this` parameter\r\n    this.parseParametersThis = null;\r\n    if (tn.skip(Token.THIS)) {\r\n      if (tn.skip(Token.COLON)) {\r\n        thisType = this.parseType(tn); // reports\r\n        if (!thisType) return null;\r\n        if (thisType.kind == NodeKind.TYPE) {\r\n          this.parseParametersThis = <TypeNode>thisType;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            thisType.range\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n        return null;\r\n      }\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          return parameters;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n\r\n    while (!tn.skip(Token.CLOSEPAREN)) {\r\n      let param = this.parseParameter(tn, isConstructor); // reports\r\n      if (!param) return null;\r\n      if (seenRest && !reportedRest) {\r\n        this.error(\r\n          DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n          seenRest.name.range\r\n        );\r\n        reportedRest = true;\r\n      }\r\n      switch (param.parameterKind) {\r\n        default: {\r\n          if (seenOptional) {\r\n            this.error(\r\n              DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n              param.name.range\r\n            );\r\n          }\r\n          break;\r\n        }\r\n        case ParameterKind.OPTIONAL: {\r\n          seenOptional = true;\r\n          break;\r\n        }\r\n        case ParameterKind.REST: {\r\n          seenRest = param;\r\n          break;\r\n        }\r\n      }\r\n      parameters.push(param);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    return parameters;\r\n  }\r\n\r\n  parseParameter(\r\n    tn: Tokenizer,\r\n    isConstructor: bool = false\r\n  ): ParameterNode | null {\r\n\r\n    // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n    var isRest = false;\r\n    var isOptional = false;\r\n    var startRange: Range | null = null;\r\n    var accessFlags: CommonFlags = CommonFlags.NONE;\r\n    if (isConstructor) {\r\n      if (tn.skip(Token.PUBLIC)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PUBLIC;\r\n      } else if (tn.skip(Token.PROTECTED)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PROTECTED;\r\n      } else if (tn.skip(Token.PRIVATE)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PRIVATE;\r\n      }\r\n      if (tn.peek() == Token.READONLY) {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek() != Token.COLON) { // modifier\r\n          tn.discard(state);\r\n          if (!startRange) startRange = tn.range();\r\n          accessFlags |= CommonFlags.READONLY;\r\n        } else { // identifier\r\n          tn.reset(state);\r\n        }\r\n      }\r\n    }\r\n    if (tn.skip(Token.DOT_DOT_DOT)) {\r\n      if (accessFlags) {\r\n        this.error(\r\n          DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\r\n          tn.range()\r\n        );\r\n      } else {\r\n        startRange = tn.range();\r\n      }\r\n      isRest = true;\r\n    }\r\n    if (tn.skipIdentifier()) {\r\n      if (!isRest) startRange = tn.range();\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let type: CommonTypeNode | null = null;\r\n      if (isOptional = tn.skip(Token.QUESTION)) {\r\n        if (isRest) {\r\n          this.error(\r\n            DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n            identifier.range\r\n          );\r\n        }\r\n      }\r\n      if (tn.skip(Token.COLON)) {\r\n        type = this.parseType(tn);\r\n        if (!type) return null;\r\n      } else {\r\n        type = Node.createOmittedType(tn.range(tn.pos));\r\n      }\r\n      let initializer: Expression | null = null;\r\n      if (tn.skip(Token.EQUALS)) {\r\n        if (isRest) {\r\n          this.error(\r\n            DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n            identifier.range\r\n          );\r\n        }\r\n        if (isOptional) {\r\n          this.error(\r\n            DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n            identifier.range\r\n          );\r\n        } else {\r\n          isOptional = true;\r\n        }\r\n        initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n        if (!initializer) return null;\r\n      }\r\n      let param = Node.createParameter(\r\n        identifier,\r\n        type,\r\n        initializer,\r\n        isRest\r\n          ? ParameterKind.REST\r\n          : isOptional\r\n            ? ParameterKind.OPTIONAL\r\n            : ParameterKind.DEFAULT,\r\n        Range.join(<Range>startRange, tn.range())\r\n      );\r\n      param.flags |= accessFlags;\r\n      return param;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseFunction(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): FunctionDeclaration | null {\r\n\r\n    // at 'function':\r\n    //  Identifier\r\n    //  ('<' TypeParameters)?\r\n    //  '(' Parameters (':' Type)?\r\n    //  '{' Statement* '}'\r\n    //  ';'?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range(tn.pos)\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var signatureStart: i32 = -1;\r\n\r\n    var typeParameters: TypeParameterNode[] | null = null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      signatureStart = tn.tokenPos;\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      flags |= CommonFlags.GENERIC;\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENPAREN)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(tn.pos), \"(\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    if (signatureStart < 0) {\r\n      signatureStart = tn.tokenPos;\r\n    }\r\n\r\n    var parameters = this.parseParameters(tn);\r\n    if (!parameters) return null;\r\n    var thisType = this.parseParametersThis;\r\n\r\n    var isSetter = (flags & CommonFlags.SET) != 0;\r\n    if (isSetter) {\r\n      if (parameters.length != 1) {\r\n        this.error(\r\n          DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n      if (parameters.length && parameters[0].initializer) {\r\n        this.error(\r\n          DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    if (flags & CommonFlags.GET) {\r\n      if (parameters.length) {\r\n        this.error(\r\n          DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    var returnType: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      returnType = this.parseType(tn, true, isSetter);\r\n      if (!returnType) return null;\r\n    }\r\n\r\n    if (!returnType) {\r\n      returnType = Node.createOmittedType(\r\n        tn.range(tn.pos)\r\n      );\r\n      if (!isSetter) {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          returnType.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    var signature = Node.createSignature(\r\n      parameters,\r\n      returnType,\r\n      thisType,\r\n      false,\r\n      tn.range(signatureStart, tn.pos)\r\n    );\r\n\r\n    var body: Statement | null = null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      if (flags & CommonFlags.AMBIENT) {\r\n        this.error(\r\n          DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n\r\n      body = this.parseBlockStatement(tn, false);\r\n      if (!body) return null;\r\n    } else if (!(flags & CommonFlags.AMBIENT)) {\r\n      this.error(\r\n        DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n        tn.range(tn.pos)\r\n      );\r\n    }\r\n\r\n    var ret = Node.createFunctionDeclaration(\r\n      name,\r\n      typeParameters,\r\n      signature,\r\n      body,\r\n      decorators,\r\n      flags,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\r\n    var startPos = tn.tokenPos;\r\n    var name: IdentifierExpression;\r\n    var isArrow = false;\r\n\r\n    // either at 'function':\r\n    //  Identifier?\r\n    //  '(' Parameters (':' Type)?\r\n    //  Statement\r\n\r\n    if (tn.token == Token.FUNCTION) {\r\n      if (tn.skipIdentifier()) {\r\n        name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      } else { // empty name\r\n        name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n      }\r\n      if (!tn.skip(Token.OPENPAREN)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"(\"\r\n        );\r\n        return null;\r\n      }\r\n\r\n    // or at '(' of arrow function:\r\n    //  Parameters (':' Type)?\r\n    //  Statement\r\n\r\n    } else {\r\n      isArrow = true;\r\n      assert(tn.token == Token.OPENPAREN);\r\n      name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\r\n    }\r\n\r\n    // TODO: type parameters? doesn't seem worth it.\r\n\r\n    var signatureStart = tn.pos;\r\n    var parameters = this.parseParameters(tn);\r\n    if (!parameters) return null;\r\n\r\n    return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\r\n  }\r\n\r\n  private parseFunctionExpressionCommon(\r\n    tn: Tokenizer,\r\n    name: IdentifierExpression,\r\n    parameters: ParameterNode[],\r\n    isArrow: bool,\r\n    startPos: i32 = -1,\r\n    signatureStart: i32 = -1\r\n  ): FunctionExpression | null {\r\n    if (startPos < 0) startPos = name.range.start;\r\n    if (signatureStart < 0) signatureStart = startPos;\r\n\r\n    var returnType: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      returnType = this.parseType(tn);\r\n      if (!returnType) return null;\r\n    } else {\r\n      returnType = Node.createOmittedType(tn.range(tn.pos));\r\n      this.error(\r\n        DiagnosticCode.Type_expected,\r\n        returnType.range\r\n      ); // recoverable\r\n    }\r\n\r\n    if (isArrow) {\r\n      if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"=>\"\r\n        );\r\n        return null;\r\n      }\r\n    }\r\n\r\n    var signature = Node.createSignature(\r\n      parameters,\r\n      returnType,\r\n      null, // TODO?\r\n      false,\r\n      tn.range(signatureStart, tn.pos)\r\n    );\r\n\r\n    var body: Statement | null;\r\n    if (isArrow) {\r\n      body = this.parseStatement(tn, false);\r\n    } else {\r\n      if (!tn.skip(Token.OPENBRACE)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"{\"\r\n        );\r\n        return null;\r\n      }\r\n      body = this.parseBlockStatement(tn, false);\r\n    }\r\n    if (!body) return null;\r\n\r\n    var declaration = Node.createFunctionDeclaration(\r\n      name,\r\n      null,\r\n      signature,\r\n      body,\r\n      null,\r\n      isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    return Node.createFunctionExpression(declaration);\r\n  }\r\n\r\n  parseClassOrInterface(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): ClassDeclaration | null {\r\n\r\n    // at ('class' | 'interface'):\r\n    //   Identifier\r\n    //   ('<' TypeParameters)?\r\n    //   ('extends' Type)?\r\n    //   ('implements' Type (',' Type)*)?\r\n    //   '{' ClassMember* '}'\r\n\r\n    var isInterface = tn.token == Token.INTERFACE;\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var identifier = Node.createIdentifierExpression(\r\n      tn.readIdentifier(),\r\n      tn.range()\r\n    );\r\n\r\n    var typeParameters: TypeParameterNode[] | null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      flags |= CommonFlags.GENERIC;\r\n    } else {\r\n      typeParameters = [];\r\n    }\r\n\r\n    var extendsType: TypeNode | null = null;\r\n    if (tn.skip(Token.EXTENDS)) {\r\n      let t = this.parseType(tn);\r\n      if (!t) return null;\r\n      if (t.kind != NodeKind.TYPE) {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          t.range\r\n        );\r\n        return null;\r\n      }\r\n      extendsType = <TypeNode>t;\r\n    }\r\n\r\n    var implementsTypes: TypeNode[] | null = null;\r\n    if (tn.skip(Token.IMPLEMENTS)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      do {\r\n        let type = this.parseType(tn);\r\n        if (!type) return null;\r\n        if (!isInterface) {\r\n          if (!implementsTypes) implementsTypes = [];\r\n          implementsTypes.push(<TypeNode>type);\r\n        }\r\n      } while (tn.skip(Token.COMMA));\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENBRACE)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var members = new Array<DeclarationStatement>();\r\n    var declaration: ClassDeclaration;\r\n    if (isInterface) {\r\n      assert(!implementsTypes);\r\n      declaration = Node.createInterfaceDeclaration(\r\n        identifier,\r\n        typeParameters,\r\n        extendsType,\r\n        members,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n    } else {\r\n      declaration = Node.createClassDeclaration(\r\n        identifier,\r\n        typeParameters,\r\n        extendsType,\r\n        implementsTypes,\r\n        members,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n    }\r\n    if (!tn.skip(Token.CLOSEBRACE)) {\r\n      do {\r\n        let member = this.parseClassMember(tn, declaration);\r\n        if (!member) return null;\r\n        member.parent = declaration;\r\n        members.push(<DeclarationStatement>member);\r\n      } while (!tn.skip(Token.CLOSEBRACE));\r\n    }\r\n    return declaration;\r\n  }\r\n\r\n  parseClassExpression(tn: Tokenizer): ClassExpression | null {\r\n\r\n    // at 'class': Identifier? '{' ... '}'\r\n\r\n    var startPos = tn.tokenPos;\r\n    var name: IdentifierExpression;\r\n\r\n    if (tn.skipIdentifier()) {\r\n      name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    } else {\r\n      name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENBRACE)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(tn.pos), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var members = new Array<DeclarationStatement>();\r\n    var declaration = Node.createClassDeclaration(\r\n      name,\r\n      [],\r\n      null,\r\n      null,\r\n      members,\r\n      null,\r\n      CommonFlags.NONE,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    if (!tn.skip(Token.CLOSEBRACE)) {\r\n      do {\r\n        let member = this.parseClassMember(tn, declaration);\r\n        if (!member) return null;\r\n        member.parent = declaration;\r\n        members.push(<DeclarationStatement>member);\r\n      } while (!tn.skip(Token.CLOSEBRACE));\r\n    }\r\n    return Node.createClassExpression(declaration);\r\n  }\r\n\r\n  parseClassMember(\r\n    tn: Tokenizer,\r\n    parent: ClassDeclaration\r\n  ): DeclarationStatement | null {\r\n\r\n    // before:\r\n    //   ('public' | 'private' | 'protected')?\r\n    //   ('static' | 'abstract')?\r\n    //   'readonly'?\r\n    //   ('get' | 'set')?\r\n    //   Identifier ...\r\n\r\n    var startPos = tn.pos;\r\n    var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\r\n\r\n    var decorators = new Array<DecoratorNode>();\r\n    while (tn.skip(Token.AT)) {\r\n      let decorator = this.parseDecorator(tn);\r\n      if (!decorator) break;\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Decorators_are_not_valid_here,\r\n          decorator.range\r\n        );\r\n      }\r\n      decorators.push(<DecoratorNode>decorator);\r\n    }\r\n\r\n    // inherit ambient status\r\n    var flags = parent.flags & CommonFlags.AMBIENT;\r\n\r\n    // implemented methods are virtual\r\n    if (isInterface) flags |= CommonFlags.VIRTUAL;\r\n\r\n    if (tn.skip(Token.PUBLIC)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"public\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PUBLIC;\r\n    } else if (tn.skip(Token.PRIVATE)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"private\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PRIVATE;\r\n    } else if (tn.skip(Token.PROTECTED)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"protected\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PROTECTED;\r\n    }\r\n\r\n    var staticStart: i32 = 0;\r\n    var staticEnd: i32 = 0;\r\n    var abstractStart: i32 = 0;\r\n    var abstractEnd: i32 = 0;\r\n    if (tn.skip(Token.STATIC)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"static\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.STATIC;\r\n      staticStart = tn.tokenPos;\r\n      staticEnd = tn.pos;\r\n    } else {\r\n      flags |= CommonFlags.INSTANCE;\r\n      if (tn.skip(Token.ABSTRACT)) {\r\n        if (isInterface) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(), \"abstract\"\r\n          );\r\n        }\r\n        flags |= CommonFlags.ABSTRACT;\r\n        abstractStart = tn.tokenPos;\r\n        abstractEnd = tn.pos;\r\n      }\r\n      if (parent.flags & CommonFlags.GENERIC) {\r\n        flags |= CommonFlags.GENERIC_CONTEXT;\r\n      }\r\n    }\r\n\r\n    var readonlyStart: i32 = 0;\r\n    var readonlyEnd: i32 = 0;\r\n    if (tn.skip(Token.READONLY)) {\r\n      flags |= CommonFlags.READONLY;\r\n      readonlyStart = tn.tokenPos;\r\n      readonlyEnd = tn.pos;\r\n    }\r\n\r\n    // check if accessor: ('get' | 'set') ^\\n Identifier\r\n    var state = tn.mark();\r\n    var isConstructor = false;\r\n    var isGetter = false;\r\n    var getStart: i32 = 0;\r\n    var getEnd: i32 = 0;\r\n    var isSetter = false;\r\n    var setStart: i32 = 0;\r\n    var setEnd: i32 = 0;\r\n    if (!isInterface) {\r\n      if (tn.skip(Token.GET)) {\r\n        if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n          flags |= CommonFlags.GET;\r\n          isGetter = true;\r\n          setStart = tn.tokenPos;\r\n          setEnd = tn.pos;\r\n          if (flags & CommonFlags.READONLY) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n            ); // recoverable\r\n          }\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n      } else if (tn.skip(Token.SET)) {\r\n        if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n          flags |= CommonFlags.SET | CommonFlags.SET;\r\n          isSetter = true;\r\n          setStart = tn.tokenPos;\r\n          setEnd = tn.pos;\r\n          if (flags & CommonFlags.READONLY) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n            ); // recoverable\r\n          }\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n      } else if (tn.skip(Token.CONSTRUCTOR)) {\r\n        flags |= CommonFlags.CONSTRUCTOR;\r\n        isConstructor = true;\r\n        if (flags & CommonFlags.STATIC) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(staticStart, staticEnd), \"static\"\r\n          ); // recoverable\r\n        }\r\n        if (flags & CommonFlags.ABSTRACT) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(abstractStart, abstractEnd), \"abstract\"\r\n          ); // recoverable\r\n        }\r\n        if (flags & CommonFlags.READONLY) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n          ); // recoverable\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!isConstructor && !tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var name = isConstructor\r\n      ? Node.createConstructorExpression(tn.range())\r\n      : Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var typeParameters: TypeParameterNode[] | null = null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      let typeParametersStart = tn.tokenPos;\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      if (isConstructor) {\r\n        this.error(\r\n          DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n          tn.range(typeParametersStart, tn.pos)\r\n        ); // recoverable\r\n      } else if (isGetter || isSetter) {\r\n        this.error(\r\n          DiagnosticCode.An_accessor_cannot_have_type_parameters,\r\n          tn.range(typeParametersStart, tn.pos)\r\n        ); // recoverable\r\n      } else {\r\n        flags |= CommonFlags.GENERIC;\r\n      }\r\n    }\r\n\r\n    // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let signatureStart = tn.tokenPos;\r\n      let parameters = this.parseParameters(tn, isConstructor);\r\n      if (!parameters) return null;\r\n      let thisType = this.parseParametersThis;\r\n      if (isConstructor) {\r\n        for (let i = 0, k = parameters.length; i < k; ++i) {\r\n          let parameter = parameters[i];\r\n          if (parameter.isAny(\r\n            CommonFlags.PUBLIC |\r\n            CommonFlags.PROTECTED |\r\n            CommonFlags.PRIVATE |\r\n            CommonFlags.READONLY\r\n          )) {\r\n            let implicitFieldDeclaration = Node.createFieldDeclaration(\r\n              parameter.name,\r\n              parameter.type,\r\n              null, // initialized via parameter\r\n              null,\r\n              parameter.flags | CommonFlags.INSTANCE,\r\n              parameter.range\r\n            );\r\n            implicitFieldDeclaration.parameterIndex = i;\r\n            implicitFieldDeclaration.parent = parent;\r\n            parameter.implicitFieldDeclaration = implicitFieldDeclaration;\r\n            parent.members.push(implicitFieldDeclaration);\r\n          }\r\n        }\r\n      } else if (isGetter) {\r\n        if (parameters.length) {\r\n          this.error(\r\n            DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n            name.range\r\n          );\r\n        }\r\n      } else if (isSetter) {\r\n        if (parameters.length != 1) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n            name.range\r\n          );\r\n        }\r\n        if (parameters.length && parameters[0].initializer) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n            name.range\r\n          );\r\n        }\r\n      }\r\n\r\n      let returnType: CommonTypeNode | null = null;\r\n      if (tn.skip(Token.COLON)) {\r\n        if (name.kind == NodeKind.CONSTRUCTOR) {\r\n          this.error(\r\n            DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n            tn.range()\r\n          );\r\n        } else if (isSetter) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n            tn.range()\r\n          );\r\n        }\r\n        returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n        if (!returnType) return null;\r\n      } else {\r\n        returnType = Node.createOmittedType(tn.range(tn.pos));\r\n        if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\r\n          this.error(\r\n            DiagnosticCode.Type_expected,\r\n            returnType.range\r\n          ); // recoverable\r\n        }\r\n      }\r\n\r\n      let signature = Node.createSignature(\r\n        parameters,\r\n        returnType,\r\n        thisType,\r\n        false,\r\n        tn.range(signatureStart, tn.pos)\r\n      );\r\n\r\n      let body: Statement | null = null;\r\n      if (tn.skip(Token.OPENBRACE)) {\r\n        if (flags & CommonFlags.AMBIENT) {\r\n          this.error(\r\n            DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n            tn.range()\r\n          ); // recoverable\r\n        } else if (flags & CommonFlags.ABSTRACT) {\r\n          this.error(\r\n            DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\r\n            tn.range(), name.text\r\n          ); // recoverable\r\n        }\r\n        body = this.parseBlockStatement(tn, false);\r\n        if (!body) return null;\r\n      } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n\r\n      let retMethod = Node.createMethodDeclaration(\r\n        name,\r\n        typeParameters,\r\n        signature,\r\n        body,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return retMethod;\r\n\r\n    } else if (isConstructor) {\r\n      this.error(\r\n        DiagnosticCode.Constructor_implementation_is_missing,\r\n        name.range\r\n      );\r\n\r\n    } else if (isGetter || isSetter) {\r\n      this.error(\r\n        DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n        name.range\r\n      );\r\n\r\n    // field: (':' Type)? ('=' Expression)? ';'?\r\n    } else {\r\n      if (flags & CommonFlags.ABSTRACT) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(abstractStart, abstractEnd), \"abstract\"\r\n        ); // recoverable\r\n      }\r\n\r\n      if (flags & CommonFlags.GET) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(getStart, getEnd), \"get\"\r\n        ); // recoverable\r\n      }\r\n\r\n      if (flags & CommonFlags.SET) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(setStart, setEnd), \"set\"\r\n        ); // recoverable\r\n      }\r\n\r\n      let type: CommonTypeNode | null = null;\r\n      if (tn.skip(Token.COLON)) {\r\n        type = this.parseType(tn);\r\n        if (!type) return null;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      let initializer: Expression | null = null;\r\n      if (tn.skip(Token.EQUALS)) {\r\n        initializer = this.parseExpression(tn);\r\n        if (!initializer) return null;\r\n      }\r\n      let retField = Node.createFieldDeclaration(\r\n        name,\r\n        type,\r\n        initializer,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return retField;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseNamespace(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): NamespaceDeclaration | null {\r\n\r\n    // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      if (tn.skip(Token.OPENBRACE)) {\r\n        let members = new Array<Statement>();\r\n        let ns = Node.createNamespaceDeclaration(\r\n          identifier,\r\n          members,\r\n          decorators,\r\n          flags,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          let member = this.parseTopLevelStatement(tn, ns);\r\n          if (!member) return null;\r\n          member.parent = ns;\r\n          members.push(member);\r\n        }\r\n        tn.skip(Token.SEMICOLON);\r\n        return ns;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"{\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExport(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    startPos: i32\r\n  ): ExportStatement | null {\r\n\r\n    // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n    var path: StringLiteralExpression | null = null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      let members = new Array<ExportMember>();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n          let member = this.parseExportMember(tn);\r\n          if (!member) return null;\r\n          members.push(member);\r\n        if (!tn.skip(Token.COMMA)) {\r\n          if (tn.skip(Token.CLOSEBRACE)) {\r\n            break;\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"}\"\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n      }\r\n      if (tn.skip(Token.FROM)) {\r\n        if (tn.skip(Token.STRINGLITERAL)) {\r\n          path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\r\n      let internalPath = ret.internalPath;\r\n      if (internalPath !== null && !this.seenlog.has(internalPath)) {\r\n        this.backlog.push(internalPath);\r\n        this.seenlog.add(internalPath);\r\n      }\r\n      tn.skip(Token.SEMICOLON);\r\n      return ret;\r\n    } else if (tn.skip(Token.ASTERISK)) {\r\n      if (tn.skip(Token.FROM)) {\r\n        if (tn.skip(Token.STRINGLITERAL)) {\r\n          path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n          let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\r\n          let internalPath = assert(ret.internalPath);\r\n          let source = tn.source;\r\n          if (!source.exportPaths) source.exportPaths = new Set();\r\n          source.exportPaths.add(internalPath);\r\n          if (!this.seenlog.has(internalPath)) {\r\n            this.backlog.push(internalPath);\r\n            this.seenlog.add(internalPath);\r\n          }\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            tn.range()\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"from\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExportMember(\r\n    tn: Tokenizer\r\n  ): ExportMember | null {\r\n\r\n    // before: Identifier ('as' Identifier)?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let asIdentifier: IdentifierExpression | null = null;\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifierName()) {\r\n          asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      return Node.createExportMember(\r\n        identifier,\r\n        asIdentifier,\r\n        asIdentifier\r\n          ? Range.join(identifier.range, asIdentifier.range)\r\n          : identifier.range\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseImport(\r\n    tn: Tokenizer\r\n  ): ImportStatement | null {\r\n\r\n    // at 'import':\r\n    //  ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n    //  'from' StringLiteral ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var members: ImportDeclaration[] | null = null;\r\n    var namespaceName: IdentifierExpression | null = null;\r\n    var skipFrom = false;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      members = new Array();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n        let member = this.parseImportDeclaration(tn);\r\n        if (!member) return null;\r\n        members.push(member);\r\n        if (!tn.skip(Token.COMMA)) {\r\n          if (tn.skip(Token.CLOSEBRACE)) {\r\n            break;\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"}\"\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n      }\r\n    } else if (tn.skip(Token.ASTERISK)) {\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifier()) {\r\n          namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"as\"\r\n        );\r\n        return null;\r\n      }\r\n    } else {\r\n      skipFrom = true;\r\n    }\r\n\r\n    if (skipFrom || tn.skip(Token.FROM)) {\r\n      if (tn.skip(Token.STRINGLITERAL)) {\r\n        let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n        let ret: ImportStatement;\r\n        if (namespaceName) {\r\n          assert(!members);\r\n          ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n        } else {\r\n          ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n        }\r\n        let internalPath = ret.internalPath;\r\n        if (!this.seenlog.has(internalPath)) {\r\n          this.backlog.push(internalPath);\r\n          this.seenlog.add(internalPath);\r\n        }\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.String_literal_expected,\r\n          tn.range()\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"from\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseImportDeclaration(\r\n    tn: Tokenizer\r\n  ): ImportDeclaration | null {\r\n\r\n    // before: Identifier ('as' Identifier)?\r\n\r\n    if (tn.skipIdentifierName()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let asIdentifier: IdentifierExpression | null = null;\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifier()) {\r\n          asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      return Node.createImportDeclaration(\r\n        identifier,\r\n        asIdentifier,\r\n        asIdentifier\r\n          ? Range.join(identifier.range, asIdentifier.range)\r\n          : identifier.range\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExportImport(\r\n    tn: Tokenizer,\r\n    startPos: i32\r\n  ): ExportImportStatement | null {\r\n\r\n    // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      if (tn.skip(Token.EQUALS)) {\r\n        if (tn.skipIdentifier()) {\r\n          let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n          let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseStatement(\r\n    tn: Tokenizer,\r\n    topLevel: bool = false\r\n  ): Statement | null {\r\n\r\n    // at previous token\r\n\r\n    var state = tn.mark();\r\n    var token = tn.next();\r\n    var statement: Statement | null = null;\r\n    switch (token) {\r\n      case Token.BREAK: {\r\n        statement = this.parseBreak(tn);\r\n        break;\r\n      }\r\n      case Token.CONST: {\r\n        statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.CONTINUE: {\r\n        statement = this.parseContinue(tn);\r\n        break;\r\n      }\r\n      case Token.DO: {\r\n        statement = this.parseDoStatement(tn);\r\n        break;\r\n      }\r\n      case Token.FOR: {\r\n        statement = this.parseForStatement(tn);\r\n        break;\r\n      }\r\n      case Token.IF: {\r\n        statement = this.parseIfStatement(tn);\r\n        break;\r\n      }\r\n      case Token.LET: {\r\n        statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.VAR: {\r\n        statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.OPENBRACE: {\r\n        statement = this.parseBlockStatement(tn, topLevel);\r\n        break;\r\n      }\r\n      case Token.RETURN: {\r\n        if (topLevel) {\r\n          this.error(\r\n            DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n            tn.range()\r\n          ); // recoverable\r\n        }\r\n        statement = this.parseReturn(tn);\r\n        break;\r\n      }\r\n      case Token.SEMICOLON: {\r\n        return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n      }\r\n      case Token.SWITCH: {\r\n        statement = this.parseSwitchStatement(tn);\r\n        break;\r\n      }\r\n      case Token.THROW: {\r\n        statement = this.parseThrowStatement(tn);\r\n        break;\r\n      }\r\n      case Token.TRY: {\r\n        statement = this.parseTryStatement(tn);\r\n        break;\r\n      }\r\n      case Token.VOID: {\r\n        statement = this.parseVoidStatement(tn);\r\n        break;\r\n      }\r\n      case Token.WHILE: {\r\n        statement = this.parseWhileStatement(tn);\r\n        break;\r\n      }\r\n      case Token.TYPE: { // also identifier\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n          break;\r\n        }\r\n        // fall-through\r\n      }\r\n      default: {\r\n        tn.reset(state);\r\n        statement = this.parseExpressionStatement(tn);\r\n        break;\r\n      }\r\n    }\r\n    if (!statement) { // has been reported\r\n      tn.reset(state);\r\n      this.skipStatement(tn);\r\n    } else {\r\n      tn.discard(state);\r\n    }\r\n    return statement;\r\n  }\r\n\r\n  parseBlockStatement(\r\n    tn: Tokenizer,\r\n    topLevel: bool\r\n  ): BlockStatement | null {\r\n\r\n    // at '{': Statement* '}' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statements = new Array<Statement>();\r\n    while (!tn.skip(Token.CLOSEBRACE)) {\r\n      let state = tn.mark();\r\n      let statement = this.parseStatement(tn, topLevel);\r\n      if (!statement) {\r\n        tn.reset(state);\r\n        this.skipStatement(tn);\r\n      } else {\r\n        tn.discard(state);\r\n        statements.push(statement);\r\n      }\r\n    }\r\n    var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseBreak(\r\n    tn: Tokenizer\r\n  ): BreakStatement | null {\r\n\r\n    // at 'break': Identifier? ';'?\r\n\r\n    var identifier: IdentifierExpression | null = null;\r\n    if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n      tn.next(IdentifierHandling.PREFER);\r\n      identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    }\r\n    var ret = Node.createBreakStatement(identifier, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseContinue(\r\n    tn: Tokenizer\r\n  ): ContinueStatement | null {\r\n\r\n    // at 'continue': Identifier? ';'?\r\n\r\n    var identifier: IdentifierExpression | null = null;\r\n    if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n      tn.next(IdentifierHandling.PREFER);\r\n      identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    }\r\n    var ret = Node.createContinueStatement(identifier, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseDoStatement(\r\n    tn: Tokenizer\r\n  ): DoStatement | null {\r\n\r\n    // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statement = this.parseStatement(tn);\r\n    if (!statement) return null;\r\n\r\n    if (tn.skip(Token.WHILE)) {\r\n\r\n      if (tn.skip(Token.OPENPAREN)) {\r\n        let condition = this.parseExpression(tn);\r\n        if (!condition) return null;\r\n\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          let ret = Node.createDoStatement(<Statement>statement, <Expression>condition, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"(\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"while\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExpressionStatement(\r\n    tn: Tokenizer\r\n  ): ExpressionStatement | null {\r\n\r\n    // at previous token\r\n\r\n    var expr = this.parseExpression(tn);\r\n    if (!expr) return null;\r\n\r\n    var ret = Node.createExpressionStatement(expr);\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseForStatement(\r\n    tn: Tokenizer\r\n  ): ForStatement | null {\r\n\r\n    // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n    var startPos = tn.tokenPos;\r\n\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let initializer: Statement | null = null;\r\n\r\n      if (tn.skip(Token.CONST)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n      } else if (tn.skip(Token.LET)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n      } else if (tn.skip(Token.VAR)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n\r\n      } else if (!tn.skip(Token.SEMICOLON)) {\r\n        initializer = this.parseExpressionStatement(tn);\r\n        if (!initializer) return null;\r\n      }\r\n\r\n      if (tn.token == Token.SEMICOLON) {\r\n        let condition: ExpressionStatement | null = null;\r\n        if (!tn.skip(Token.SEMICOLON)) {\r\n          condition = this.parseExpressionStatement(tn);\r\n          if (!condition) return null;\r\n        }\r\n\r\n        if (tn.token == Token.SEMICOLON) {\r\n          let incrementor: Expression | null = null;\r\n          if (!tn.skip(Token.CLOSEPAREN)) {\r\n            incrementor = this.parseExpression(tn);\r\n            if (!incrementor) return null;\r\n\r\n            if (!tn.skip(Token.CLOSEPAREN)) {\r\n              this.error(\r\n                DiagnosticCode._0_expected,\r\n                tn.range(), \")\"\r\n              );\r\n              return null;\r\n            }\r\n          }\r\n\r\n          let statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n\r\n          return Node.createForStatement(\r\n            initializer,\r\n            condition\r\n              ? condition.expression\r\n              : null,\r\n            incrementor,\r\n            statement,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \";\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \";\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseIfStatement(\r\n    tn: Tokenizer\r\n  ): IfStatement | null {\r\n\r\n    // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let condition = this.parseExpression(tn);\r\n      if (!condition) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        let statement = this.parseStatement(tn);\r\n        if (!statement) return null;\r\n        let elseStatement: Statement | null = null;\r\n        if (tn.skip(Token.ELSE)) {\r\n          elseStatement = this.parseStatement(tn);\r\n          if (!elseStatement) return null;\r\n        }\r\n        return Node.createIfStatement(\r\n          condition,\r\n          statement,\r\n          elseStatement,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseSwitchStatement(\r\n    tn: Tokenizer\r\n  ): SwitchStatement | null {\r\n\r\n    // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let condition = this.parseExpression(tn);\r\n      if (!condition) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        if (tn.skip(Token.OPENBRACE)) {\r\n          let cases = new Array<SwitchCase>();\r\n          while (!tn.skip(Token.CLOSEBRACE)) {\r\n            let case_ = this.parseSwitchCase(tn);\r\n            if (!case_) return null;\r\n            cases.push(<SwitchCase>case_);\r\n          }\r\n          let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseSwitchCase(\r\n    tn: Tokenizer\r\n  ): SwitchCase | null {\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statements: Statement[],\r\n        statement: Statement | null;\r\n\r\n    // 'case' Expression ':' Statement*\r\n\r\n    if (tn.skip(Token.CASE)) {\r\n      let label = this.parseExpression(tn);\r\n      if (!label) return null;\r\n      if (tn.skip(Token.COLON)) {\r\n        statements = new Array<Statement>();\r\n        while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n          statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n          statements.push(statement);\r\n        }\r\n        return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n      }\r\n\r\n    // 'default' ':' Statement*\r\n\r\n    } else if (tn.skip(Token.DEFAULT)) {\r\n      if (tn.skip(Token.COLON)) {\r\n        statements = new Array<Statement>();\r\n        while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n          statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n          statements.push(statement);\r\n        }\r\n        return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._case_or_default_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseThrowStatement(\r\n    tn: Tokenizer\r\n  ): ThrowStatement | null {\r\n\r\n    // at 'throw': Expression ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var expression = this.parseExpression(tn);\r\n    if (!expression) return null;\r\n    var ret = Node.createThrowStatement(<Expression>expression, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseTryStatement(\r\n    tn: Tokenizer\r\n  ): TryStatement | null {\r\n\r\n    // at 'try':\r\n    //   '{' Statement* '}'\r\n    //   ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n    //   ('finally' '{' Statement* '}'? ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var stmt: Statement | null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      let statements = new Array<Statement>();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n        stmt = this.parseStatement(tn);\r\n        if (!stmt) return null;\r\n        statements.push(<Statement>stmt);\r\n      }\r\n      let catchVariable: IdentifierExpression | null = null;\r\n      let catchStatements: Statement[] | null = null;\r\n      let finallyStatements: Statement[] | null = null;\r\n      if (tn.skip(Token.CATCH)) {\r\n        if (!tn.skip(Token.OPENPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"(\"\r\n          );\r\n          return null;\r\n        }\r\n        if (!tn.skipIdentifier()) {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n        catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n        if (!tn.skip(Token.OPENBRACE)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n          return null;\r\n        }\r\n        catchStatements = [];\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          stmt = this.parseStatement(tn);\r\n          if (!stmt) return null;\r\n          catchStatements.push(<Statement>stmt);\r\n        }\r\n      }\r\n      if (tn.skip(Token.FINALLY)) {\r\n        if (!tn.skip(Token.OPENBRACE)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n          return null;\r\n        }\r\n        finallyStatements = [];\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          stmt = this.parseStatement(tn);\r\n          if (!stmt) return null;\r\n          finallyStatements.push(<Statement>stmt);\r\n        }\r\n      }\r\n      if (!(catchStatements || finallyStatements)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"catch\"\r\n        );\r\n        return null;\r\n      }\r\n      let ret = Node.createTryStatement(\r\n        statements,\r\n        catchVariable,\r\n        catchStatements,\r\n        finallyStatements,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return ret;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseTypeDeclaration(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): TypeDeclaration | null {\r\n\r\n    // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let typeParameters: TypeParameterNode[] | null = null;\r\n      if (tn.skip(Token.LESSTHAN)) {\r\n        typeParameters = this.parseTypeParameters(tn);\r\n        if (!typeParameters) return null;\r\n        flags |= CommonFlags.GENERIC;\r\n      }\r\n      if (tn.skip(Token.EQUALS)) {\r\n        let type = this.parseType(tn);\r\n        if (!type) return null;\r\n        let ret = Node.createTypeDeclaration(\r\n          name,\r\n          typeParameters,\r\n          type,\r\n          decorators,\r\n          flags,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseVoidStatement(\r\n    tn: Tokenizer\r\n  ): VoidStatement | null {\r\n\r\n    // at 'void': Expression ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var expression = this.parseExpression(tn, Precedence.GROUPING);\r\n    if (!expression) return null;\r\n    var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseWhileStatement(\r\n    tn: Tokenizer\r\n  ): WhileStatement | null {\r\n\r\n    // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let expression = this.parseExpression(tn);\r\n      if (!expression) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        let statement = this.parseStatement(tn);\r\n        if (!statement) return null;\r\n        let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // expressions\r\n  // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n  parseExpressionStart(\r\n    tn: Tokenizer\r\n  ): Expression | null {\r\n\r\n    var token = tn.next(IdentifierHandling.PREFER);\r\n    var startPos = tn.tokenPos;\r\n    var precedence = determinePrecedenceStart(token);\r\n    if (precedence != Precedence.NONE) {\r\n      let operand: Expression | null;\r\n\r\n      // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n      // NewExpression\r\n      if (token == Token.NEW) {\r\n        operand = this.parseExpression(tn, Precedence.CALL);\r\n        if (!operand) return null;\r\n        if (operand.kind == NodeKind.CALL) {\r\n          return Node.createNewExpression(\r\n            (<CallExpression>operand).expression,\r\n            (<CallExpression>operand).typeArguments,\r\n            (<CallExpression>operand).arguments,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            tn.range()\r\n          );\r\n        }\r\n        return null;\r\n      } else {\r\n        operand = this.parseExpression(tn, precedence);\r\n        if (!operand) return null;\r\n      }\r\n\r\n      // UnaryPrefixExpression\r\n      if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n        if (\r\n          operand.kind != NodeKind.IDENTIFIER &&\r\n          operand.kind != NodeKind.ELEMENTACCESS &&\r\n          operand.kind != NodeKind.PROPERTYACCESS\r\n        ) {\r\n          this.error(\r\n            DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n            operand.range\r\n          );\r\n        }\r\n      }\r\n      return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n    }\r\n\r\n    var expr: Expression | null = null;\r\n    switch (token) {\r\n\r\n      case Token.NULL: return Node.createNullExpression(tn.range());\r\n      case Token.TRUE: return Node.createTrueExpression(tn.range());\r\n      case Token.FALSE: return Node.createFalseExpression(tn.range());\r\n\r\n      // ParenthesizedExpression\r\n      // FunctionExpression\r\n      case Token.OPENPAREN: {\r\n\r\n        // determine whether this is a function expression\r\n        if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\r\n          return this.parseFunctionExpressionCommon(\r\n            tn,\r\n            Node.createEmptyIdentifierExpression(tn.range(startPos)),\r\n            [],\r\n            true\r\n          );\r\n        }\r\n        let state = tn.mark();\r\n        let again = true;\r\n        do {\r\n          switch (tn.next(IdentifierHandling.PREFER)) {\r\n\r\n            // function expression\r\n            case Token.DOT_DOT_DOT: {\r\n              tn.reset(state);\r\n              return this.parseFunctionExpression(tn);\r\n            }\r\n            // can be both\r\n            case Token.IDENTIFIER: {\r\n              tn.readIdentifier();\r\n              switch (tn.next()) {\r\n\r\n                // if we got here, check for arrow\r\n                case Token.CLOSEPAREN: {\r\n                  if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n                    again = false;\r\n                    break;\r\n                  }\r\n                  // fall-through\r\n                }\r\n                // function expression\r\n                case Token.COLON: {    // type annotation\r\n                  tn.reset(state);\r\n                  return this.parseFunctionExpression(tn);\r\n                }\r\n                // can be both\r\n                case Token.QUESTION:   // optional parameter or ternary\r\n                case Token.COMMA: {\r\n                  break; // continue\r\n                }\r\n                // parenthesized expression\r\n                // case Token.EQUALS:  // missing type annotation for simplicity\r\n                default: {\r\n                  again = false;\r\n                  break;\r\n                }\r\n              }\r\n              break;\r\n            }\r\n            // parenthesized expression\r\n            default: {\r\n              again = false;\r\n              break;\r\n            }\r\n          }\r\n        } while (again);\r\n        tn.reset(state);\r\n\r\n        // parse parenthesized\r\n        expr = this.parseExpression(tn);\r\n        if (!expr) return null;\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n        return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n      }\r\n      // ArrayLiteralExpression\r\n      case Token.OPENBRACKET: {\r\n        let elementExpressions = new Array<Expression | null>();\r\n        while (!tn.skip(Token.CLOSEBRACKET)) {\r\n          if (tn.peek() == Token.COMMA) {\r\n            expr = null; // omitted\r\n          } else {\r\n            expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n            if (!expr) return null;\r\n          }\r\n          elementExpressions.push(expr);\r\n          if (!tn.skip(Token.COMMA)) {\r\n            if (tn.skip(Token.CLOSEBRACKET)) {\r\n              break;\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode._0_expected,\r\n                tn.range(), \"]\"\r\n              );\r\n              return null;\r\n            }\r\n          }\r\n        }\r\n        return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n      }\r\n      // AssertionExpression (unary prefix)\r\n      case Token.LESSTHAN: {\r\n        let toType = this.parseType(tn);\r\n        if (!toType) return null;\r\n        if (!tn.skip(Token.GREATERTHAN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \">\"\r\n          );\r\n          return null;\r\n        }\r\n        expr = this.parseExpression(tn, Precedence.CALL);\r\n        if (!expr) return null;\r\n        return Node.createAssertionExpression(\r\n          AssertionKind.PREFIX,\r\n          expr,\r\n          toType,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      }\r\n      case Token.IDENTIFIER: {\r\n        return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.THIS: {\r\n        return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.CONSTRUCTOR: {\r\n        return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.SUPER: {\r\n        return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.STRINGLITERAL: {\r\n        return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.INTEGERLITERAL: {\r\n        return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.FLOATLITERAL: {\r\n        return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n      }\r\n      // RegexpLiteralExpression\r\n      // note that this also continues on invalid ones so the surrounding AST remains intact\r\n      case Token.SLASH: {\r\n        let regexpPattern = tn.readRegexpPattern(); // also reports\r\n        if (!tn.skip(Token.SLASH)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"/\"\r\n          );\r\n          return null;\r\n        }\r\n        return Node.createRegexpLiteralExpression(\r\n          regexpPattern,\r\n          tn.readRegexpFlags(), // also reports\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      }\r\n      case Token.FUNCTION: {\r\n        return this.parseFunctionExpression(tn);\r\n      }\r\n      case Token.CLASS: {\r\n        return this.parseClassExpression(tn);\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Expression_expected,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n    }\r\n  }\r\n\r\n  tryParseTypeArgumentsBeforeArguments(\r\n    tn: Tokenizer\r\n  ): CommonTypeNode[] | null {\r\n\r\n    // at '<': Type (',' Type)* '>' '('\r\n\r\n    var state = tn.mark();\r\n    if (!tn.skip(Token.LESSTHAN)) return null;\r\n    var typeArguments = new Array<CommonTypeNode>();\r\n    do {\r\n      if (tn.peek() === Token.GREATERTHAN) {\r\n        break;\r\n      }\r\n      let type = this.parseType(tn, true, true);\r\n      if (!type) {\r\n        tn.reset(state);\r\n        return null;\r\n      }\r\n      typeArguments.push(type);\r\n    } while (tn.skip(Token.COMMA));\r\n    if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n      return typeArguments;\r\n    }\r\n    tn.reset(state);\r\n    return null;\r\n  }\r\n\r\n  parseArguments(\r\n    tn: Tokenizer\r\n  ): Expression[] | null {\r\n\r\n    // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n    var args = new Array<Expression>();\r\n    while (!tn.skip(Token.CLOSEPAREN)) {\r\n      let expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!expr) return null;\r\n      args.push(expr);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    return args;\r\n  }\r\n\r\n  parseExpression(\r\n    tn: Tokenizer,\r\n    precedence: Precedence = Precedence.COMMA\r\n  ): Expression | null {\r\n    assert(precedence != Precedence.NONE);\r\n\r\n    var expr = this.parseExpressionStart(tn);\r\n    if (!expr) return null;\r\n    var startPos = expr.range.start;\r\n\r\n    // CallExpression?\r\n    if (nodeIsCallable(expr.kind)) {\r\n      let typeArguments: CommonTypeNode[] | null = null;\r\n      while (\r\n        tn.skip(Token.OPENPAREN)\r\n        ||\r\n        nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\r\n      ) {\r\n        let args = this.parseArguments(tn);\r\n        if (!args) return null;\r\n        expr = Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos)); // is again callable\r\n      }\r\n    }\r\n\r\n    var token: Token;\r\n    var next: Expression | null = null;\r\n    var nextPrecedence: Precedence;\r\n    while (\r\n      (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n    ) { // precedence climbing\r\n      tn.next();\r\n      switch (token) {\r\n        // AssertionExpression\r\n        case Token.AS: {\r\n          let toType = this.parseType(tn); // reports\r\n          if (!toType) return null;\r\n          expr = Node.createAssertionExpression(\r\n            AssertionKind.AS,\r\n            expr,\r\n            toType,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // InstanceOfExpression\r\n        case Token.INSTANCEOF: {\r\n          let isType = this.parseType(tn); // reports\r\n          if (!isType) return null;\r\n          expr = Node.createInstanceOfExpression(\r\n            expr,\r\n            isType,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // ElementAccessExpression\r\n        case Token.OPENBRACKET: {\r\n          next = this.parseExpression(tn); // reports\r\n          if (!next) return null;\r\n          if (!tn.skip(Token.CLOSEBRACKET)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"]\"\r\n            );\r\n            return null;\r\n          }\r\n          expr = Node.createElementAccessExpression(\r\n            expr,\r\n            next,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // UnaryPostfixExpression\r\n        case Token.PLUS_PLUS:\r\n        case Token.MINUS_MINUS: {\r\n          if (\r\n            expr.kind != NodeKind.IDENTIFIER &&\r\n            expr.kind != NodeKind.ELEMENTACCESS &&\r\n            expr.kind != NodeKind.PROPERTYACCESS\r\n          ) {\r\n            this.error(\r\n              DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n              expr.range\r\n            );\r\n          }\r\n          expr = Node.createUnaryPostfixExpression(\r\n            token,\r\n            expr,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // TernaryExpression\r\n        case Token.QUESTION: {\r\n          let ifThen = this.parseExpression(tn);\r\n          if (!ifThen) return null;\r\n          if (!tn.skip(Token.COLON)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \":\"\r\n            );\r\n            return null;\r\n          }\r\n          let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\r\n            ? Precedence.COMMA + 1\r\n            : Precedence.COMMA\r\n          );\r\n          if (!ifElse) return null;\r\n          expr = Node.createTernaryExpression(\r\n            expr,\r\n            ifThen,\r\n            ifElse,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // CommaExpression\r\n        case Token.COMMA: {\r\n          let commaExprs: Expression[] = [ expr ];\r\n          do {\r\n            expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n            if (!expr) return null;\r\n            commaExprs.push(expr);\r\n          } while (tn.skip(Token.COMMA));\r\n          expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n          break;\r\n        }\r\n        default: {\r\n          next = this.parseExpression(tn,\r\n            isRightAssociative(token)\r\n              ? nextPrecedence\r\n              : nextPrecedence + 1\r\n          );\r\n          if (!next) return null;\r\n\r\n          // PropertyAccessExpression\r\n          if (token == Token.DOT) {\r\n            if (next.kind == NodeKind.IDENTIFIER) {\r\n              expr = Node.createPropertyAccessExpression(\r\n                expr,\r\n                <IdentifierExpression>next,\r\n                tn.range(startPos, tn.pos)\r\n              );\r\n            } else if (next.kind == NodeKind.CALL) { // join\r\n              let propertyCall = <CallExpression>next;\r\n              if (propertyCall.expression.kind == NodeKind.IDENTIFIER) {\r\n                propertyCall.expression = Node.createPropertyAccessExpression(\r\n                  expr,\r\n                  <IdentifierExpression>propertyCall.expression,\r\n                  tn.range(startPos, tn.pos)\r\n                );\r\n              } else {\r\n                this.error(\r\n                  DiagnosticCode.Identifier_expected,\r\n                  propertyCall.expression.range\r\n                );\r\n                return null;\r\n              }\r\n              expr = propertyCall;\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Identifier_expected,\r\n                next.range\r\n              );\r\n              return null;\r\n            }\r\n\r\n          // BinaryExpression\r\n          } else {\r\n            expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n  skipStatement(tn: Tokenizer): void {\r\n    tn.peek(true);\r\n    if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\r\n    do {\r\n      let nextToken = tn.peek(true);\r\n      if (\r\n        nextToken == Token.ENDOFFILE ||   // next step should handle this\r\n        nextToken == Token.SEMICOLON      // end of the statement for sure\r\n      ) {\r\n        tn.next();\r\n        break;\r\n      }\r\n      if (tn.nextTokenOnNewLine) break;   // end of the statement maybe\r\n      switch (tn.next()) {\r\n        case Token.IDENTIFIER: {\r\n          tn.readIdentifier();\r\n          break;\r\n        }\r\n        case Token.STRINGLITERAL: {\r\n          tn.readString();\r\n          break;\r\n        }\r\n        case Token.INTEGERLITERAL: {\r\n          tn.readInteger();\r\n          break;\r\n        }\r\n        case Token.FLOATLITERAL: {\r\n          tn.readFloat();\r\n          break;\r\n        }\r\n      }\r\n    } while (true);\r\n  }\r\n\r\n  /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n  skipBlock(tn: Tokenizer): void {\r\n    // at '{': ... '}'\r\n    var depth = 1;\r\n    var again = true;\r\n    do {\r\n      switch (tn.next()) {\r\n        case Token.ENDOFFILE: {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"}\"\r\n          );\r\n          again = false;\r\n          break;\r\n        }\r\n        case Token.OPENBRACE: {\r\n          ++depth;\r\n          break;\r\n        }\r\n        case Token.CLOSEBRACE: {\r\n          --depth;\r\n          if (!depth) again = false;\r\n          break;\r\n        }\r\n        case Token.IDENTIFIER: {\r\n          tn.readIdentifier();\r\n          break;\r\n        }\r\n        case Token.STRINGLITERAL: {\r\n          tn.readString();\r\n          break;\r\n        }\r\n        case Token.INTEGERLITERAL: {\r\n          tn.readInteger();\r\n          break;\r\n        }\r\n        case Token.FLOATLITERAL: {\r\n          tn.readFloat();\r\n          break;\r\n        }\r\n      }\r\n    } while (again);\r\n  }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n  NONE,\r\n  COMMA,\r\n  SPREAD,\r\n  YIELD,\r\n  ASSIGNMENT,\r\n  CONDITIONAL,\r\n  LOGICAL_OR,\r\n  LOGICAL_AND,\r\n  BITWISE_OR,\r\n  BITWISE_XOR,\r\n  BITWISE_AND,\r\n  EQUALITY,\r\n  RELATIONAL,\r\n  SHIFT,\r\n  ADDITIVE,\r\n  MULTIPLICATIVE,\r\n  EXPONENTIATED,\r\n  UNARY_PREFIX,\r\n  UNARY_POSTFIX,\r\n  CALL,\r\n  MEMBERACCESS,\r\n  GROUPING\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): Precedence {\r\n  switch (kind) {\r\n    case Token.DOT_DOT_DOT: return Precedence.SPREAD;\r\n    case Token.YIELD: return Precedence.YIELD;\r\n    case Token.EXCLAMATION:\r\n    case Token.TILDE:\r\n    case Token.PLUS:\r\n    case Token.MINUS:\r\n    case Token.PLUS_PLUS:\r\n    case Token.MINUS_MINUS:\r\n    case Token.TYPEOF:\r\n    case Token.VOID:\r\n    case Token.DELETE: return Precedence.UNARY_PREFIX;\r\n    case Token.NEW: return Precedence.MEMBERACCESS;\r\n  }\r\n  return Precedence.NONE;\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): Precedence {\r\n  switch (kind) {\r\n    case Token.COMMA: return Precedence.COMMA;\r\n    case Token.EQUALS:\r\n    case Token.PLUS_EQUALS:\r\n    case Token.MINUS_EQUALS:\r\n    case Token.ASTERISK_ASTERISK_EQUALS:\r\n    case Token.ASTERISK_EQUALS:\r\n    case Token.SLASH_EQUALS:\r\n    case Token.PERCENT_EQUALS:\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.AMPERSAND_EQUALS:\r\n    case Token.CARET_EQUALS:\r\n    case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\r\n    case Token.QUESTION: return Precedence.CONDITIONAL;\r\n    case Token.BAR_BAR: return Precedence.LOGICAL_OR;\r\n    case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\r\n    case Token.BAR: return Precedence.BITWISE_OR;\r\n    case Token.CARET: return Precedence.BITWISE_XOR;\r\n    case Token.AMPERSAND: return Precedence.BITWISE_AND;\r\n    case Token.EQUALS_EQUALS:\r\n    case Token.EXCLAMATION_EQUALS:\r\n    case Token.EQUALS_EQUALS_EQUALS:\r\n    case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\r\n    case Token.AS:\r\n    case Token.IN:\r\n    case Token.INSTANCEOF:\r\n    case Token.LESSTHAN:\r\n    case Token.GREATERTHAN:\r\n    case Token.LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\r\n    case Token.LESSTHAN_LESSTHAN:\r\n    case Token.GREATERTHAN_GREATERTHAN:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\r\n    case Token.PLUS:\r\n    case Token.MINUS: return Precedence.ADDITIVE;\r\n    case Token.ASTERISK:\r\n    case Token.SLASH:\r\n    case Token.PERCENT: return Precedence.MULTIPLICATIVE;\r\n    case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\r\n    case Token.PLUS_PLUS:\r\n    case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\r\n    case Token.DOT:\r\n    case Token.NEW:\r\n    case Token.OPENBRACKET: return Precedence.MEMBERACCESS;\r\n  }\r\n  return Precedence.NONE;\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n  switch (kind) {\r\n    case Token.EQUALS:\r\n    case Token.PLUS_EQUALS:\r\n    case Token.MINUS_EQUALS:\r\n    case Token.ASTERISK_ASTERISK_EQUALS:\r\n    case Token.ASTERISK_EQUALS:\r\n    case Token.SLASH_EQUALS:\r\n    case Token.PERCENT_EQUALS:\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.AMPERSAND_EQUALS:\r\n    case Token.CARET_EQUALS:\r\n    case Token.BAR_EQUALS:\r\n    case Token.QUESTION:\r\n    case Token.ASTERISK_ASTERISK: return true;\r\n    default: return false;\r\n  }\r\n}\r\n","/**\r\n * Definition builders for WebIDL and TypeScript.\r\n * @module definitions\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program,\r\n  Element,\r\n  ElementKind,\r\n  Global,\r\n  Enum,\r\n  EnumValue,\r\n  Field,\r\n  Function,\r\n  FunctionPrototype,\r\n  Class,\r\n  ClassPrototype,\r\n  Namespace,\r\n  ConstantValueKind,\r\n  Interface,\r\n  Property\r\n} from \"./program\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n  indent\r\n} from \"./util\";\r\n\r\n/** Walker base class. */\r\nabstract class ExportsWalker {\r\n\r\n  /** Program reference. */\r\n  program: Program;\r\n  /** Whether to include private members */\r\n  includePrivate: bool;\r\n  /** Elements still to do. */\r\n  todo: Element[] = [];\r\n  /** Already seen elements. */\r\n  seen: Set<Element> = new Set();\r\n\r\n  /** Constructs a new Element walker. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    this.program = program;\r\n    this.includePrivate;\r\n  }\r\n\r\n  /** Walks all exports and calls the respective handlers. */\r\n  walk(): void {\r\n    for (let element of this.program.moduleLevelExports.values()) this.visitElement(element);\r\n    var todo = this.todo;\r\n    for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\r\n  }\r\n\r\n  /** Visits an element.*/\r\n  visitElement(element: Element): void {\r\n    if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\r\n    if (this.seen.has(element)) return;\r\n    this.seen.add(element);\r\n    switch (element.kind) {\r\n      case ElementKind.GLOBAL: {\r\n        if (element.is(CommonFlags.COMPILED)) this.visitGlobal(<Global>element);\r\n        break;\r\n      }\r\n      case ElementKind.ENUM: {\r\n        if (element.is(CommonFlags.COMPILED)) this.visitEnum(<Enum>element);\r\n        break;\r\n      }\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        this.visitFunctionInstances(<FunctionPrototype>element);\r\n        break;\r\n      }\r\n      case ElementKind.CLASS_PROTOTYPE: {\r\n        this.visitClassInstances(<ClassPrototype>element);\r\n        break;\r\n      }\r\n      case ElementKind.FIELD: {\r\n        if ((<Field>element).is(CommonFlags.COMPILED)) this.visitField(<Field>element);\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let prop = <Property>element;\r\n        let getter = prop.getterPrototype;\r\n        if (getter) this.visitFunctionInstances(getter);\r\n        let setter = prop.setterPrototype;\r\n        if (setter) this.visitFunctionInstances(setter);\r\n        break;\r\n      }\r\n      case ElementKind.NAMESPACE: {\r\n        if (hasCompiledMember(element)) this.visitNamespace(element);\r\n        break;\r\n      }\r\n      default: assert(false);\r\n    }\r\n  }\r\n\r\n  private visitFunctionInstances(element: FunctionPrototype): void {\r\n    for (let instance of element.instances.values()) {\r\n      if (instance.is(CommonFlags.COMPILED)) this.visitFunction(<Function>instance);\r\n    }\r\n  }\r\n\r\n  private visitClassInstances(element: ClassPrototype): void {\r\n    for (let instance of element.instances.values()) {\r\n      if (instance.is(CommonFlags.COMPILED)) this.visitClass(<Class>instance);\r\n    }\r\n  }\r\n\r\n  abstract visitGlobal(element: Global): void;\r\n  abstract visitEnum(element: Enum): void;\r\n  abstract visitFunction(element: Function): void;\r\n  abstract visitClass(element: Class): void;\r\n  abstract visitInterface(element: Interface): void;\r\n  abstract visitField(element: Field): void;\r\n  abstract visitNamespace(element: Element): void;\r\n}\r\n\r\n/** A WebIDL definitions builder. */\r\nexport class IDLBuilder extends ExportsWalker {\r\n\r\n  /** Builds WebIDL definitions for the specified program. */\r\n  static build(program: Program): string {\r\n    return new IDLBuilder(program).build();\r\n  }\r\n\r\n  private sb: string[] = [];\r\n  private indentLevel: i32 = 0;\r\n\r\n  /** Constructs a new WebIDL builder. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    super(program, includePrivate);\r\n  }\r\n\r\n  visitGlobal(element: Global): void {\r\n    var sb = this.sb;\r\n    var isConst = element.is(CommonFlags.INLINED);\r\n    indent(sb, this.indentLevel);\r\n    if (isConst) sb.push(\"const \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\" \");\r\n    sb.push(element.simpleName);\r\n    if (isConst) {\r\n      switch (element.constantValueKind) {\r\n        case ConstantValueKind.INTEGER: {\r\n          sb.push(\" = \");\r\n          sb.push(i64_to_string(element.constantIntegerValue));\r\n          break;\r\n        }\r\n        case ConstantValueKind.FLOAT: {\r\n          sb.push(\" = \");\r\n          sb.push(element.constantFloatValue.toString());\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n    sb.push(\";\\n\");\r\n  }\r\n\r\n  visitEnum(element: Enum): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      for (let [name, member] of members) {\r\n        if (member.kind == ElementKind.ENUMVALUE) {\r\n          let isConst = (<EnumValue>member).is(CommonFlags.INLINED);\r\n          indent(sb, this.indentLevel);\r\n          if (isConst) sb.push(\"const \");\r\n          else sb.push(\"readonly \");\r\n          sb.push(\"unsigned long \");\r\n          sb.push(name);\r\n          if (isConst) {\r\n            sb.push(\" = \");\r\n            sb.push((<EnumValue>member).constantValue.toString(10));\r\n          }\r\n          sb.push(\";\\n\");\r\n        }\r\n      }\r\n      for (let member of members.values()) {\r\n        if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\r\n      }\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitFunction(element: Function): void {\r\n    var sb = this.sb;\r\n    var signature = element.signature;\r\n    indent(sb, this.indentLevel);\r\n    sb.push(this.typeToString(signature.returnType));\r\n    sb.push(\" \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\"(\");\r\n    var parameters = signature.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    // var requiredParameters = signature.requiredParameters;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      if (i) sb.push(\", \");\r\n      // if (i >= requiredParameters) sb.push(\"optional \");\r\n      sb.push(this.typeToString(parameters[i]));\r\n      sb.push(\" \");\r\n      sb.push(signature.getParameterName(i));\r\n    }\r\n    sb.push(\");\\n\");\r\n    var members = element.members;\r\n    if (members && members.size) {\r\n      indent(sb, this.indentLevel);\r\n      sb.push(\"interface \");\r\n      sb.push(element.simpleName);\r\n      sb.push(\" {\\n\");\r\n      for (let member of members.values()) this.visitElement(member);\r\n      indent(sb, --this.indentLevel);\r\n      sb.push(\"}\\n\");\r\n    }\r\n  }\r\n\r\n  visitClass(element: Class): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    // TODO\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitInterface(element: Interface): void {\r\n    this.visitClass(element);\r\n  }\r\n\r\n  visitField(element: Field): void {\r\n    // TODO\r\n  }\r\n\r\n  visitNamespace(element: Namespace): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      for (let member of members.values()) this.visitElement(member);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  typeToString(type: Type): string {\r\n    switch (type.kind) {\r\n      case TypeKind.I8: return \"byte\";\r\n      case TypeKind.I16: return \"short\";\r\n      case TypeKind.I32: return \"long\";\r\n      case TypeKind.I64: return \"long long\";\r\n      case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\r\n      case TypeKind.U8: return \"octet\";\r\n      case TypeKind.U16: return \"unsigned short\";\r\n      case TypeKind.U32: return \"unsigned long\";\r\n        // ^ TODO: function types\r\n      case TypeKind.U64: return \"unsigned long long\";\r\n      case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\r\n        // ^ TODO: class types\r\n      case TypeKind.BOOL: return \"boolean\";\r\n      case TypeKind.F32: return \"unrestricted float\";\r\n      case TypeKind.F64: return \"unrestricted double\";\r\n      case TypeKind.VOID: return \"void\";\r\n      default: {\r\n        assert(false);\r\n        return \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  build(): string {\r\n    var sb = this.sb;\r\n    sb.push(\"interface ASModule {\\n\");\r\n    ++this.indentLevel;\r\n    this.walk();\r\n    --this.indentLevel;\r\n    sb.push(\"}\\n\");\r\n    return sb.join(\"\");\r\n  }\r\n}\r\n\r\n/** A TypeScript definitions builder. */\r\nexport class TSDBuilder extends ExportsWalker {\r\n\r\n  /** Builds TypeScript definitions for the specified program. */\r\n  static build(program: Program): string {\r\n    return new TSDBuilder(program).build();\r\n  }\r\n\r\n  private sb: string[] = [];\r\n  private indentLevel: i32 = 0;\r\n\r\n  /** Constructs a new WebIDL builder. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    super(program, includePrivate);\r\n  }\r\n\r\n  visitGlobal(element: Global): void {\r\n    var sb = this.sb;\r\n    var isConst = element.is(CommonFlags.INLINED);\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.STATIC)) {\r\n      if (isConst) sb.push(\"static readonly \");\r\n      else sb.push(\"static \");\r\n    } else {\r\n      if (isConst) sb.push(\"const \");\r\n      else sb.push(\"var \");\r\n    }\r\n    sb.push(element.simpleName);\r\n    sb.push(\": \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\";\\n\");\r\n    this.visitNamespace(element);\r\n  }\r\n\r\n  visitEnum(element: Enum): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"enum \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      let numMembers = members.size;\r\n      for (let [name, member] of members) {\r\n        if (member.kind == ElementKind.ENUMVALUE) {\r\n          indent(sb, this.indentLevel);\r\n          sb.push(name);\r\n          if (member.is(CommonFlags.INLINED)) {\r\n            sb.push(\" = \");\r\n            sb.push((<EnumValue>member).constantValue.toString(10));\r\n          }\r\n          sb.push(\",\\n\");\r\n          --numMembers;\r\n        }\r\n      }\r\n      if (numMembers) this.visitNamespace(element);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitFunction(element: Function): void {\r\n    if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\r\n    var sb = this.sb;\r\n    var signature = element.signature;\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n    if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n    if (element.is(CommonFlags.GET)) {\r\n      sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\r\n      sb.push(\": \");\r\n      sb.push(this.typeToString(signature.returnType));\r\n      sb.push(\";\\n\");\r\n      return;\r\n    } else {\r\n      if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\r\n      sb.push(element.simpleName);\r\n    }\r\n    sb.push(\"(\");\r\n    var parameters = signature.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    // var requiredParameters = signature.requiredParameters;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      if (i) sb.push(\", \");\r\n      // if (i >= requiredParameters) sb.push(\"optional \");\r\n      sb.push(signature.getParameterName(i));\r\n      sb.push(\": \");\r\n      sb.push(this.typeToString(parameters[i]));\r\n    }\r\n    if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\r\n      sb.push(\")\");\r\n    } else {\r\n      sb.push(\"): \");\r\n      sb.push(this.typeToString(signature.returnType));\r\n    }\r\n    sb.push(\";\\n\");\r\n    this.visitNamespace(element);\r\n  }\r\n\r\n  visitClass(element: Class): void {\r\n    var sb = this.sb;\r\n    var isInterface = element.kind == ElementKind.INTERFACE;\r\n    indent(sb, this.indentLevel++);\r\n    if (isInterface) {\r\n      sb.push(\"interface \");\r\n    } else {\r\n      if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\r\n      sb.push(\"class \");\r\n    }\r\n    sb.push(element.simpleName);\r\n    var base = element.base;\r\n    if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\r\n      sb.push(\" extends \");\r\n      sb.push(base.simpleName); // TODO: fqn\r\n    }\r\n    sb.push(\" {\\n\");\r\n    var members = element.prototype.members; // static\r\n    if (members) {\r\n      for (let member of members.values()) {\r\n        this.visitElement(member);\r\n      }\r\n    }\r\n    var ctor = element.constructorInstance;\r\n    if (ctor) this.visitFunction(ctor);\r\n    members = element.members; // instance\r\n    if (members) {\r\n      for (let member of members.values()) this.visitElement(member);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitInterface(element: Interface): void {\r\n    this.visitClass(element);\r\n  }\r\n\r\n  visitField(element: Field): void {\r\n    if (element.is(CommonFlags.PRIVATE)) return;\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n    if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n    if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\": \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\";\\n\");\r\n  }\r\n\r\n  visitNamespace(element: Element): void {\r\n    var members = element.members;\r\n    if (members && members.size) {\r\n      let sb = this.sb;\r\n      indent(sb, this.indentLevel++);\r\n      sb.push(\"namespace \");\r\n      sb.push(element.simpleName);\r\n      sb.push(\" {\\n\");\r\n      for (let member of members.values()) this.visitElement(member);\r\n      indent(sb, --this.indentLevel);\r\n      sb.push(\"}\\n\");\r\n    }\r\n  }\r\n\r\n  typeToString(type: Type): string {\r\n    switch (type.kind) {\r\n      case TypeKind.I8: return \"i8\";\r\n      case TypeKind.I16: return \"i16\";\r\n      case TypeKind.I32: return \"i32\";\r\n      case TypeKind.I64: return \"I64\";\r\n      case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\r\n      case TypeKind.U8: return \"u8\";\r\n      case TypeKind.U16: return \"u16\";\r\n      case TypeKind.U32: return \"u32\";\r\n        // ^ TODO: function types\r\n      case TypeKind.U64: return \"U64\";\r\n      case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\r\n        // ^ TODO: class types\r\n      case TypeKind.BOOL: return \"bool\";\r\n      case TypeKind.F32: return \"f32\";\r\n      case TypeKind.F64: return \"f64\";\r\n      case TypeKind.VOID: return \"void\";\r\n      default: {\r\n        assert(false);\r\n        return \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  build(): string {\r\n    var sb = this.sb;\r\n    sb.push(\"declare module ASModule {\\n\");\r\n    sb.push(\"  type i8 = number;\\n\");\r\n    sb.push(\"  type i16 = number;\\n\");\r\n    sb.push(\"  type i32 = number;\\n\");\r\n    sb.push(\"  type u8 = number;\\n\");\r\n    sb.push(\"  type u16 = number;\\n\");\r\n    sb.push(\"  type u32 = number;\\n\");\r\n    sb.push(\"  type f32 = number;\\n\");\r\n    sb.push(\"  type f64 = number;\\n\");\r\n    sb.push(\"  type bool = any;\\n\");\r\n    ++this.indentLevel;\r\n    this.walk();\r\n    --this.indentLevel;\r\n    sb.push(\"}\\n\");\r\n    sb.push(\"export default ASModule;\\n\");\r\n    return this.sb.join(\"\");\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\n/** Tests if a namespace-like element has at least one compiled member. */\r\nfunction hasCompiledMember(element: Element): bool {\r\n  var members = element.members;\r\n  if (members) {\r\n    for (let member of members.values()) {\r\n      switch (member.kind) {\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          for (let instance of (<FunctionPrototype>member).instances.values()) {\r\n            if (instance.is(CommonFlags.COMPILED)) return true;\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          for (let instance of (<ClassPrototype>member).instances.values()) {\r\n            if (instance.is(CommonFlags.COMPILED)) return true;\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n","/**\r\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\r\n * @module decompiler\r\n *//***/\r\n\r\nimport {\r\n  Module,\r\n  NativeType,\r\n  ExpressionId,\r\n  UnaryOp,\r\n  BinaryOp,\r\n  HostOp,\r\n  FunctionRef,\r\n  ExpressionRef,\r\n  Index,\r\n  getFunctionName,\r\n  getFunctionBody,\r\n  getFunctionParamCount,\r\n  getFunctionParamType,\r\n  getFunctionResultType,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getBlockName,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getIfCondition,\r\n  getIfTrue,\r\n  getIfFalse,\r\n  getLoopName,\r\n  getLoopBody,\r\n  getBreakName,\r\n  getBreakCondition,\r\n  getGetLocalIndex,\r\n  getSetLocalIndex,\r\n  getSetLocalValue,\r\n  getLoadOffset,\r\n  getLoadPtr,\r\n  getStoreOffset,\r\n  getStorePtr,\r\n  getStoreValue,\r\n  getConstValueI32,\r\n  getConstValueI64Low,\r\n  getConstValueI64High,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getUnaryOp,\r\n  getUnaryValue,\r\n  getBinaryOp,\r\n  getBinaryLeft,\r\n  getBinaryRight,\r\n  getSelectThen,\r\n  getSelectElse,\r\n  getSelectCondition,\r\n  getDropValue,\r\n  getReturnValue,\r\n  getHostOp,\r\n  getHostOperand\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n  static decompile(module: Module): string {\r\n    var decompiler = new Decompiler();\r\n    decompiler.decompile(module);\r\n    return decompiler.finish();\r\n  }\r\n\r\n  text: string[] = [];\r\n  functionId: i32 = 0;\r\n\r\n  constructor() { }\r\n\r\n  /** Decompiles a module to an AST that can then be serialized. */\r\n  decompile(module: Module): void {\r\n    throw new Error(\"not implemented\");\r\n  }\r\n\r\n  decompileFunction(func: FunctionRef): void {\r\n    var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\r\n    var body = getFunctionBody(func);\r\n    this.push(\"function \");\r\n    this.push(name);\r\n    this.push(\"(\");\r\n     for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\r\n      if (i > 0) this.push(\", \");\r\n      this.push(\"$\");\r\n      this.push(i.toString(10));\r\n      this.push(\": \");\r\n      this.push(nativeTypeToType(getFunctionParamType(func, i)));\r\n    }\r\n    this.push(\"): \");\r\n    this.push(nativeTypeToType(getFunctionResultType(func)));\r\n    this.push(\" \");\r\n    if (getExpressionId(body) != ExpressionId.Block) {\r\n      this.push(\"{\\n\");\r\n    }\r\n    this.decompileExpression(body);\r\n    if (getExpressionId(body) != ExpressionId.Block) {\r\n      this.push(\"\\n}\\n\");\r\n    }\r\n    ++this.functionId;\r\n  }\r\n\r\n  decompileExpression(expr: ExpressionRef): void {\r\n    var id = getExpressionId(expr);\r\n    var type = getExpressionType(expr);\r\n\r\n    var nested: ExpressionRef;\r\n    var string: string | null;\r\n    var i: Index, k: Index;\r\n\r\n    switch (id) {\r\n      case ExpressionId.Block: { // TODO: magic\r\n        if ((string = getBlockName(expr)) != null) {\r\n          this.push(string);\r\n          this.push(\": \");\r\n        }\r\n        this.push(\"{\\n\");\r\n        k = getBlockChildCount(expr);\r\n        for (i = 0; i < k; ++i) {\r\n          this.decompileExpression(getBlockChild(expr, i));\r\n        }\r\n        this.push(\"}\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.If: {\r\n        if (type == NativeType.None) {\r\n          this.push(\"if (\");\r\n          this.decompileExpression(getIfCondition(expr));\r\n          this.push(\") \");\r\n          this.decompileExpression(getIfTrue(expr));\r\n          if (nested = getIfFalse(expr)) {\r\n            this.push(\" else \");\r\n            this.decompileExpression(nested);\r\n          }\r\n        } else {\r\n          this.decompileExpression(getIfCondition(expr));\r\n          this.push(\" ? \");\r\n          this.decompileExpression(getIfTrue(expr));\r\n          this.push(\" : \");\r\n          this.decompileExpression(getIfFalse(expr));\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Loop: {\r\n        if ((string = getLoopName(expr)) != null) {\r\n          this.push(string);\r\n          this.push(\": \");\r\n        }\r\n        this.push(\"do \");\r\n        this.decompileExpression(getLoopBody(expr));\r\n        this.push(\"while (0);\\n\");\r\n      }\r\n      case ExpressionId.Break: {\r\n        if (nested = getBreakCondition(expr)) {\r\n          this.push(\"if (\");\r\n          this.decompileExpression(nested);\r\n          this.push(\") \");\r\n        }\r\n        if ((string = getBreakName(expr)) != null) {\r\n          this.push(\"break \");\r\n          this.push(string);\r\n          this.push(\";\\n\");\r\n        } else {\r\n          this.push(\"break;\\n\");\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Switch:\r\n      case ExpressionId.Call:\r\n      case ExpressionId.CallImport:\r\n      case ExpressionId.CallIndirect: {\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case ExpressionId.GetLocal: {\r\n        this.push(\"$\");\r\n        this.push(getGetLocalIndex(expr).toString(10));\r\n        return;\r\n      }\r\n      case ExpressionId.SetLocal: {\r\n        this.push(\"$\");\r\n        this.push(getSetLocalIndex(expr).toString(10));\r\n        this.push(\" = \");\r\n        this.decompileExpression(getSetLocalValue(expr));\r\n        return;\r\n      }\r\n      case ExpressionId.GetGlobal:\r\n      case ExpressionId.SetGlobal: {\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case ExpressionId.Load: {\r\n        this.push(\"load<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.push(getLoadOffset(expr).toString(10));\r\n        this.push(\" + \");\r\n        this.decompileExpression(getLoadPtr(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Store: {\r\n        this.push(\"store<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.push(getStoreOffset(expr).toString(10));\r\n        this.push(\" + \");\r\n        this.decompileExpression(getStorePtr(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getStoreValue(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Const: {\r\n        switch (type) {\r\n          case NativeType.I32: {\r\n            this.push(getConstValueI32(expr).toString(10));\r\n            return;\r\n          }\r\n          case NativeType.I64: {\r\n            this.push(\r\n              i64_to_string(\r\n                i64_new(\r\n                  getConstValueI64Low(expr),\r\n                  getConstValueI64High(expr)\r\n                )\r\n              )\r\n            );\r\n            return;\r\n          }\r\n          case NativeType.F32: {\r\n            this.push(getConstValueF32(expr).toString(10));\r\n            return;\r\n          }\r\n          case NativeType.F64: {\r\n            this.push(getConstValueF64(expr).toString(10));\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Unary: {\r\n        switch (getUnaryOp(expr)) {\r\n          case UnaryOp.ClzI32: {\r\n            this.push(\"clz<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CtzI32: {\r\n            this.push(\"ctz<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.PopcntI32: {\r\n            this.push(\"popcnt<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NegF32:\r\n          case UnaryOp.NegF64: {\r\n            this.push(\"-\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.AbsF32: {\r\n            this.push(\"abs<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CeilF32: {\r\n            this.push(\"ceil<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.FloorF32: {\r\n            this.push(\"floor<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32: {\r\n            this.push(\"trunc<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NearestF32: {\r\n            this.push(\"nearest<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.SqrtF32: {\r\n            this.push(\"sqrt<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.EqzI32:\r\n          case UnaryOp.EqzI64: {\r\n            this.push(\"!\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ClzI64: {\r\n            this.push(\"clz<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CtzI64: {\r\n            this.push(\"ctz<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.PopcntI64: {\r\n            this.push(\"popcnt<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.AbsF64: {\r\n            this.push(\"abs<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CeilF64: {\r\n            this.push(\"ceil<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.FloorF64: {\r\n            this.push(\"floor<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64: {\r\n            this.push(\"trunc<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NearestF64: {\r\n            this.push(\"nearest<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.SqrtF64: {\r\n            this.push(\"sqrt<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ExtendI32: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ExtendU32: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.WrapI64: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToI32: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToI64: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToU32: {\r\n            this.push(\"<i32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToU64: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToI32: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToI64: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToU32: {\r\n            this.push(\"<i32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToU64: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretF32: {\r\n            this.push(\"reinterpret<f32,i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretF64: {\r\n            this.push(\"reinterpret<f64,i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI32ToF32: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI32ToF64: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU32ToF32: {\r\n            this.push(\"<f32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU32ToF64: {\r\n            this.push(\"<f64><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI64ToF32: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI64ToF64: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU64ToF32: {\r\n            this.push(\"<f32><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU64ToF64: {\r\n            this.push(\"<f64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.PromoteF32: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.DemoteF64: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretI32: {\r\n            this.push(\"reinterpret<i32,f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretI64: {\r\n            this.push(\"reinterpret<i64,f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Binary: { // TODO: precedence\r\n        switch (getBinaryOp(expr)) {\r\n          case BinaryOp.AddI32:\r\n          case BinaryOp.AddI64:\r\n          case BinaryOp.AddF32:\r\n          case BinaryOp.AddF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" + \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.SubI32:\r\n          case BinaryOp.SubI64:\r\n          case BinaryOp.SubF32:\r\n          case BinaryOp.SubF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" - \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.MulI32:\r\n          case BinaryOp.MulI64:\r\n          case BinaryOp.MulF32:\r\n          case BinaryOp.MulF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" * \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivI32:\r\n          case BinaryOp.DivI64:\r\n          case BinaryOp.DivF32:\r\n          case BinaryOp.DivF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivU32: {\r\n            this.push(\"<i32>(<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RemI32:\r\n          case BinaryOp.RemI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" % \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RemU32: {\r\n            this.push(\"<i32>(<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.AndI32:\r\n          case BinaryOp.AndI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" & \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.OrI32:\r\n          case BinaryOp.OrI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" | \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.XorI32:\r\n          case BinaryOp.XorI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" ^ \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShlI32:\r\n          case BinaryOp.ShlI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" << \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShrU32:\r\n          case BinaryOp.ShrU64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >>> \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShrI32:\r\n          case BinaryOp.ShrI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >> \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RotlI32: {\r\n            this.push(\"rotl<i32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RotrI32: {\r\n            this.push(\"rotr<i32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.EqI32:\r\n          case BinaryOp.EqI64:\r\n          case BinaryOp.EqF32:\r\n          case BinaryOp.EqF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" == \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.NeI32:\r\n          case BinaryOp.NeI64:\r\n          case BinaryOp.NeF32:\r\n          case BinaryOp.NeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" != \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LtI32:\r\n          case BinaryOp.LtI64:\r\n          case BinaryOp.LtF32:\r\n          case BinaryOp.LtF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LtU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeI32:\r\n          case BinaryOp.LeI64:\r\n          case BinaryOp.LeF32:\r\n          case BinaryOp.LeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtI32:\r\n          case BinaryOp.GtI64:\r\n          case BinaryOp.GtF32:\r\n          case BinaryOp.GtF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeI32:\r\n          case BinaryOp.GeI64:\r\n          case BinaryOp.GeF32:\r\n          case BinaryOp.GeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RemU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" % <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RotlI64: {\r\n            this.push(\"rotl<i64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RotrI64: {\r\n            this.push(\"rotr<i64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.LtU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.CopysignF32: {\r\n            this.push(\"copysign<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MinF32: {\r\n            this.push(\"min<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MaxF32: {\r\n            this.push(\"max<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.CopysignF64: {\r\n            this.push(\"copysign<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MinF64: {\r\n            this.push(\"min<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MaxF64: {\r\n            this.push(\"max<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Select: {\r\n        this.push(\"select<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.decompileExpression(getSelectThen(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getSelectElse(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getSelectCondition(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Drop: {\r\n        this.decompileExpression(getDropValue(expr));\r\n        this.push(\";\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.Return: {\r\n        if (nested = getReturnValue(expr)) {\r\n          this.push(\"return \");\r\n          this.decompileExpression(nested);\r\n          this.push(\";\\n\");\r\n        } else {\r\n          this.push(\"return;\\n\");\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Host: {\r\n        switch (getHostOp(expr)) {\r\n          case HostOp.CurrentMemory: {\r\n            this.push(\"current_memory()\");\r\n            return;\r\n          }\r\n          case HostOp.GrowMemory: {\r\n            this.push(\"grow_memory(\");\r\n            this.decompileExpression(getHostOperand(expr, 0));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Nop: {\r\n        this.push(\";\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.Unreachable: {\r\n        this.push(\"unreachable()\");\r\n        return;\r\n      }\r\n      case ExpressionId.AtomicCmpxchg:\r\n      case ExpressionId.AtomicRMW:\r\n      case ExpressionId.AtomicWait:\r\n      case ExpressionId.AtomicWake:\r\n    }\r\n    throw new Error(\"not implemented\");\r\n  }\r\n\r\n  private push(text: string): void {\r\n    // mostly here so we can add debugging if necessary\r\n    this.text.push(text);\r\n  }\r\n\r\n  finish(): string {\r\n    var ret = this.text.join(\"\");\r\n    this.text = [];\r\n    return ret;\r\n  }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n  switch (type) {\r\n    case NativeType.None: return \"void\";\r\n    case NativeType.I32: return \"i32\";\r\n    case NativeType.I64: return \"i64\";\r\n    case NativeType.F32: return \"f32\";\r\n    case NativeType.F64: return \"f64\";\r\n    case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n    case NativeType.Auto: throw new Error(\"auto type\");\r\n    default: throw new Error(\"unexpected type\");\r\n  }\r\n}\r\n","/**\r\n * Low-level C-like compiler API.\r\n * @module index\r\n *//***/\r\n\r\nimport {\r\n  Compiler,\r\n  Options,\r\n  Target,\r\n  Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n  IDLBuilder,\r\n  TSDBuilder\r\n} from \"./definitions\";\r\n\r\nimport {\r\n  DiagnosticMessage,\r\n  DiagnosticCategory,\r\n  formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Module\r\n} from \"./module\";\r\n\r\nimport {\r\n  Parser\r\n} from \"./parser\";\r\n\r\nimport {\r\n  Program\r\n} from \"./program\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n  parser: Parser | null = null\r\n): Parser {\r\n  if (!parser) parser = new Parser();\r\n  parser.parseFile(text, path, isEntry);\r\n  return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n  return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n  var program = parser.program;\r\n  return program.diagnosticsOffset < program.diagnostics.length\r\n    ? program.diagnostics[program.diagnosticsOffset++]\r\n    : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n  return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n  options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n  options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n  options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `importMemory` option. */\r\nexport function setImportMemory(options: Options, importMemory: bool): void {\r\n  options.importMemory = importMemory;\r\n}\r\n\r\n/** Sets the `importTable` option. */\r\nexport function setImportTable(options: Options, importTable: bool): void {\r\n  options.importTable = importTable;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n  options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n  options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Sets a 'globalAliases' value. */\r\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\r\n  var globalAliases = options.globalAliases;\r\n  if (!globalAliases) options.globalAliases = globalAliases = new Map();\r\n  globalAliases.set(name, alias);\r\n}\r\n\r\n/** Sign extension operations. */\r\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\r\n/** Mutable global imports and exports. */\r\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\r\n\r\n/** Enables a specific feature. */\r\nexport function enableFeature(options: Options, feature: Feature): void {\r\n  options.features |= feature;\r\n}\r\n\r\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\r\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\r\n  options.optimizeLevelHint = optimizeLevel;\r\n  options.shrinkLevelHint = shrinkLevel;\r\n}\r\n\r\n/** Finishes parsing. */\r\nexport function finishParsing(parser: Parser): Program {\r\n  return parser.finish();\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compileProgram(program: Program, options: Options | null = null): Module {\r\n  return new Compiler(program, options).compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompileModule(module: Module): string {\r\n  var decompiler = new Decompiler();\r\n  decompiler.decompile(module);\r\n  return decompiler.finish();\r\n}\r\n\r\n/** Builds WebIDL definitions for the specified program. */\r\nexport function buildIDL(program: Program): string {\r\n  return IDLBuilder.build(program);\r\n}\r\n\r\n/** Builds TypeScript definitions for the specified program. */\r\nexport function buildTSD(program: Program): string {\r\n  return TSDBuilder.build(program);\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./common\";\r\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n  wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n    0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n  ])), {}).exports;\r\n} catch (e) {\r\n  // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n *  See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n    /**\r\n     * The low 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.low = low | 0;\r\n\r\n    /**\r\n     * The high 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.high = high | 0;\r\n\r\n    /**\r\n     * Whether unsigned or not.\r\n     * @type {boolean}\r\n     */\r\n    this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations.  For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative).  Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n    return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n    var obj, cachedObj, cache;\r\n    if (unsigned) {\r\n        value >>>= 0;\r\n        if (cache = (0 <= value && value < 256)) {\r\n            cachedObj = UINT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n        if (cache)\r\n            UINT_CACHE[value] = obj;\r\n        return obj;\r\n    } else {\r\n        value |= 0;\r\n        if (cache = (-128 <= value && value < 128)) {\r\n            cachedObj = INT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n        if (cache)\r\n            INT_CACHE[value] = obj;\r\n        return obj;\r\n    }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n    if (isNaN(value))\r\n        return unsigned ? UZERO : ZERO;\r\n    if (unsigned) {\r\n        if (value < 0)\r\n            return UZERO;\r\n        if (value >= TWO_PWR_64_DBL)\r\n            return MAX_UNSIGNED_VALUE;\r\n    } else {\r\n        if (value <= -TWO_PWR_63_DBL)\r\n            return MIN_VALUE;\r\n        if (value + 1 >= TWO_PWR_63_DBL)\r\n            return MAX_VALUE;\r\n    }\r\n    if (value < 0)\r\n        return fromNumber(-value, unsigned).neg();\r\n    return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n    return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n *  assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n    if (str.length === 0)\r\n        throw Error('empty string');\r\n    if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n        return ZERO;\r\n    if (typeof unsigned === 'number') {\r\n        // For goog.math.long compatibility\r\n        radix = unsigned,\r\n        unsigned = false;\r\n    } else {\r\n        unsigned = !! unsigned;\r\n    }\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n\r\n    var p;\r\n    if ((p = str.indexOf('-')) > 0)\r\n        throw Error('interior hyphen');\r\n    else if (p === 0) {\r\n        return fromString(str.substring(1), unsigned, radix).neg();\r\n    }\r\n\r\n    // Do several (8) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n    var result = ZERO;\r\n    for (var i = 0; i < str.length; i += 8) {\r\n        var size = Math.min(8, str.length - i),\r\n            value = parseInt(str.substring(i, i + size), radix);\r\n        if (size < 8) {\r\n            var power = fromNumber(pow_dbl(radix, size));\r\n            result = result.mul(power).add(fromNumber(value));\r\n        } else {\r\n            result = result.mul(radixToPower);\r\n            result = result.add(fromNumber(value));\r\n        }\r\n    }\r\n    result.unsigned = unsigned;\r\n    return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n    if (typeof val === 'number')\r\n        return fromNumber(val, unsigned);\r\n    if (typeof val === 'string')\r\n        return fromString(val, unsigned);\r\n    // Throws for non-objects, converts non-instanceof Long:\r\n    return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n    return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n    if (this.unsigned)\r\n        return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n    return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n    if (this.isZero())\r\n        return '0';\r\n    if (this.isNegative()) { // Unsigned Longs are never negative\r\n        if (this.eq(MIN_VALUE)) {\r\n            // We need to change the Long value before it can be negated, so we remove\r\n            // the bottom-most digit in this base and then recurse to do the rest.\r\n            var radixLong = fromNumber(radix),\r\n                div = this.div(radixLong),\r\n                rem1 = div.mul(radixLong).sub(this);\r\n            return div.toString(radix) + rem1.toInt().toString(radix);\r\n        } else\r\n            return '-' + this.neg().toString(radix);\r\n    }\r\n\r\n    // Do several (6) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n        rem = this;\r\n    var result = '';\r\n    while (true) {\r\n        var remDiv = rem.div(radixToPower),\r\n            intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n            digits = intval.toString(radix);\r\n        rem = remDiv;\r\n        if (rem.isZero())\r\n            return digits + result;\r\n        else {\r\n            while (digits.length < 6)\r\n                digits = '0' + digits;\r\n            result = '' + digits + result;\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n    return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n    return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n    return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n    return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n    if (this.isNegative()) // Unsigned Longs are never negative\r\n        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n    var val = this.high != 0 ? this.high : this.low;\r\n    for (var bit = 31; bit > 0; bit--)\r\n        if ((val & (1 << bit)) != 0)\r\n            break;\r\n    return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n    return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n    return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n    return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n    return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n    return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n        return false;\r\n    return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n    return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n    return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n    return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.eq(other))\r\n        return 0;\r\n    var thisNeg = this.isNegative(),\r\n        otherNeg = other.isNegative();\r\n    if (thisNeg && !otherNeg)\r\n        return -1;\r\n    if (!thisNeg && otherNeg)\r\n        return 1;\r\n    // At this point the sign bits are the same\r\n    if (!this.unsigned)\r\n        return this.sub(other).isNegative() ? -1 : 1;\r\n    // Both are positive if at least one is unsigned\r\n    return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n    if (!this.unsigned && this.eq(MIN_VALUE))\r\n        return MIN_VALUE;\r\n    return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n    if (!isLong(addend))\r\n        addend = fromValue(addend);\r\n\r\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = addend.high >>> 16;\r\n    var b32 = addend.high & 0xFFFF;\r\n    var b16 = addend.low >>> 16;\r\n    var b00 = addend.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 + b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 + b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 + b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 + b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n    if (!isLong(subtrahend))\r\n        subtrahend = fromValue(subtrahend);\r\n    return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n    if (this.isZero())\r\n        return ZERO;\r\n    if (!isLong(multiplier))\r\n        multiplier = fromValue(multiplier);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = wasm.mul(this.low,\r\n                           this.high,\r\n                           multiplier.low,\r\n                           multiplier.high);\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (multiplier.isZero())\r\n        return ZERO;\r\n    if (this.eq(MIN_VALUE))\r\n        return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n    if (multiplier.eq(MIN_VALUE))\r\n        return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n    if (this.isNegative()) {\r\n        if (multiplier.isNegative())\r\n            return this.neg().mul(multiplier.neg());\r\n        else\r\n            return this.neg().mul(multiplier).neg();\r\n    } else if (multiplier.isNegative())\r\n        return this.mul(multiplier.neg()).neg();\r\n\r\n    // If both longs are small, use float multiplication\r\n    if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n    // We can skip products that would overflow.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = multiplier.high >>> 16;\r\n    var b32 = multiplier.high & 0xFFFF;\r\n    var b16 = multiplier.low >>> 16;\r\n    var b00 = multiplier.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 * b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 * b00;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c16 += a00 * b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 * b00;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a16 * b16;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a00 * b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n *  unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n    if (divisor.isZero())\r\n        throw Error('division by zero');\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        // guard against signed division overflow: the largest\r\n        // negative number / -1 would be 1 larger than the largest\r\n        // positive number, due to two's complement.\r\n        if (!this.unsigned &&\r\n            this.high === -0x80000000 &&\r\n            divisor.low === -1 && divisor.high === -1) {\r\n            // be consistent with non-wasm code path\r\n            return this;\r\n        }\r\n        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (this.isZero())\r\n        return this.unsigned ? UZERO : ZERO;\r\n    var approx, rem, res;\r\n    if (!this.unsigned) {\r\n        // This section is only relevant for signed longs and is derived from the\r\n        // closure library as a whole.\r\n        if (this.eq(MIN_VALUE)) {\r\n            if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n                return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\r\n            else if (divisor.eq(MIN_VALUE))\r\n                return ONE;\r\n            else {\r\n                // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n                var halfThis = this.shr(1);\r\n                approx = halfThis.div(divisor).shl(1);\r\n                if (approx.eq(ZERO)) {\r\n                    return divisor.isNegative() ? ONE : NEG_ONE;\r\n                } else {\r\n                    rem = this.sub(divisor.mul(approx));\r\n                    res = approx.add(rem.div(divisor));\r\n                    return res;\r\n                }\r\n            }\r\n        } else if (divisor.eq(MIN_VALUE))\r\n            return this.unsigned ? UZERO : ZERO;\r\n        if (this.isNegative()) {\r\n            if (divisor.isNegative())\r\n                return this.neg().div(divisor.neg());\r\n            return this.neg().div(divisor).neg();\r\n        } else if (divisor.isNegative())\r\n            return this.div(divisor.neg()).neg();\r\n        res = ZERO;\r\n    } else {\r\n        // The algorithm below has not been made for unsigned longs. It's therefore\r\n        // required to take special care of the MSB prior to running it.\r\n        if (!divisor.unsigned)\r\n            divisor = divisor.toUnsigned();\r\n        if (divisor.gt(this))\r\n            return UZERO;\r\n        if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n            return UONE;\r\n        res = UZERO;\r\n    }\r\n\r\n    // Repeat the following until the remainder is less than other:  find a\r\n    // floating-point that approximates remainder / other *from below*, add this\r\n    // into the result, and subtract it from the remainder.  It is critical that\r\n    // the approximate value is less than or equal to the real value so that the\r\n    // remainder never becomes negative.\r\n    rem = this;\r\n    while (rem.gte(divisor)) {\r\n        // Approximate the result of division. This may be a little greater or\r\n        // smaller than the actual value.\r\n        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n        // We will tweak the approximate result by changing it in the 48-th digit or\r\n        // the smallest non-fractional digit, whichever is larger.\r\n        var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n            delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n        // Decrease the approximation until it is smaller than the remainder.  Note\r\n        // that if it is too large, the product overflows and is negative.\r\n            approxRes = fromNumber(approx),\r\n            approxRem = approxRes.mul(divisor);\r\n        while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n            approx -= delta;\r\n            approxRes = fromNumber(approx, this.unsigned);\r\n            approxRem = approxRes.mul(divisor);\r\n        }\r\n\r\n        // We know the answer can't be zero... and actually, zero would cause\r\n        // infinite recursion since we would make no progress.\r\n        if (approxRes.isZero())\r\n            approxRes = ONE;\r\n\r\n        res = res.add(approxRes);\r\n        rem = rem.sub(approxRem);\r\n    }\r\n    return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n    return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n    else\r\n        return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n    else\r\n        return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    numBits &= 63;\r\n    if (numBits === 0)\r\n        return this;\r\n    else {\r\n        var high = this.high;\r\n        if (numBits < 32) {\r\n            var low = this.low;\r\n            return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n        } else if (numBits === 32)\r\n            return fromBits(high, 0, this.unsigned);\r\n        else\r\n            return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n    }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n    if (!this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n    if (this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.<number>} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n    return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.<number>} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        lo        & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo >>> 16 & 0xff,\r\n        lo >>> 24       ,\r\n        hi        & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi >>> 16 & 0xff,\r\n        hi >>> 24\r\n    ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.<number>} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        hi >>> 24       ,\r\n        hi >>> 16 & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi        & 0xff,\r\n        lo >>> 24       ,\r\n        lo >>> 16 & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo        & 0xff\r\n    ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.<number>} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n    return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.<number>} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[0]       |\r\n        bytes[1] <<  8 |\r\n        bytes[2] << 16 |\r\n        bytes[3] << 24,\r\n        bytes[4]       |\r\n        bytes[5] <<  8 |\r\n        bytes[6] << 16 |\r\n        bytes[7] << 24,\r\n        unsigned\r\n    );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.<number>} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[4] << 24 |\r\n        bytes[5] << 16 |\r\n        bytes[6] <<  8 |\r\n        bytes[7],\r\n        bytes[0] << 24 |\r\n        bytes[1] << 16 |\r\n        bytes[2] <<  8 |\r\n        bytes[3],\r\n        unsigned\r\n    );\r\n};\r\n","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_zero = Long.ZERO;\r\n\r\nglobal.i64_one = Long.ONE;\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n  return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n  return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n  return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n  return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n  return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n  return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n  return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n  return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n  return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n  return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n  return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n  return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n  return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n  return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n  return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n  return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n  return value.not();\r\n};\r\n\r\nglobal.i64_eq = function(left, right) {\r\n  return left.eq(right);\r\n};\r\n\r\nglobal.i64_ne = function(left, right) {\r\n  return left.ne(right);\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n  assert(alignment && (alignment & (alignment - 1)) == 0);\r\n  var mask = Long.fromInt(alignment - 1);\r\n  return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n  return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n      || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n  return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n      || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n  return (value.high === 0 && value.low >= 0)\r\n      || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n  return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n  return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n  return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n  return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n  return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n  return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n  return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n  return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n  return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n","const F64 = new Float64Array(1);\r\nconst F32 = new Float32Array(F64.buffer);\r\nconst I32 = new Int32Array(F64.buffer);\r\n\r\nglobal.f32_as_i32 = function(value) {\r\n  F32[0] = value;\r\n  return I32[0];\r\n};\r\n\r\nglobal.i32_as_f32 = function(value) {\r\n  I32[0] = value;\r\n  return F32[0];\r\n};\r\n\r\nglobal.f64_as_i64 = function(value) {\r\n  F64[0] = value;\r\n  return i64_new(I32[0], I32[1]);\r\n};\r\n\r\nglobal.i64_as_f64 = function(value) {\r\n  I32[0] = i64_low(value);\r\n  I32[1] = i64_high(value);\r\n  return F64[0];\r\n};\r\n","/** @module util *//***/\r\n\r\n/** Reads a 32-bit integer from the specified buffer. */\r\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\r\n  return buffer[offset    ]\r\n       | buffer[offset + 1] << 8\r\n       | buffer[offset + 2] << 16\r\n       | buffer[offset + 3] << 24;\r\n}\r\n\r\n/** Writes a 32-bit integer to the specified buffer. */\r\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\r\n  buffer[offset    ] = value;\r\n  buffer[offset + 1] = value >>> 8;\r\n  buffer[offset + 2] = value >>> 16;\r\n  buffer[offset + 3] = value >>> 24;\r\n}\r\n\r\n/** Reads a 64-bit integer from the specified buffer. */\r\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\r\n  var lo = readI32(buffer, offset);\r\n  var hi = readI32(buffer, offset + 4);\r\n  return i64_new(lo, hi);\r\n}\r\n\r\n/** Writes a 64-bit integer to the specified buffer. */\r\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\r\n  writeI32(i64_low(value), buffer, offset);\r\n  writeI32(i64_high(value), buffer, offset + 4);\r\n}\r\n\r\n/** Reads a 32-bit float from the specified buffer. */\r\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\r\n  return i32_as_f32(readI32(buffer, offset));\r\n}\r\n\r\n/** Writes a 32-bit float to the specified buffer. */\r\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\r\n  writeI32(f32_as_i32(value), buffer, offset);\r\n}\r\n\r\n/** Reads a 64-bit float from the specified buffer. */\r\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\r\n  return i64_as_f64(readI64(buffer, offset));\r\n}\r\n\r\n/** Writes a 64-bit float to the specified buffer. */\r\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\r\n  var valueI64 = f64_as_i64(value);\r\n  writeI32(i64_low(valueI64), buffer, offset);\r\n  writeI32(i64_high(valueI64), buffer, offset + 4);\r\n}\r\n","/** @module util *//***/\r\n\r\nconst indentX1 = \"  \";\r\nconst indentX2 = \"    \";\r\nconst indentX4 = \"        \";\r\n\r\n/** Creates an indentation matching the number of specified levels. */\r\nexport function indent(sb: string[], level: i32): void {\r\n  while (level >= 4) {\r\n    sb.push(indentX4);\r\n    level -= 4;\r\n  }\r\n  if (level >= 2) {\r\n    sb.push(indentX2);\r\n    level -= 2;\r\n  }\r\n  if (level) {\r\n    sb.push(indentX1);\r\n  }\r\n}\r\n","/** @module util *//***/\r\n\r\nimport {\r\n  CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalizePath(path: string): string {\r\n  var pos = 0;\r\n  var len = path.length;\r\n\r\n  // trim leading './'\r\n  while (pos + 1 < len &&\r\n    path.charCodeAt(pos) == CharCode.DOT &&\r\n    path.charCodeAt(pos + 1) == separator\r\n  ) {\r\n    pos += 2;\r\n  }\r\n\r\n  if (pos > 0 || len < path.length) {\r\n    path = path.substring(pos, len);\r\n    len -= pos;\r\n    pos = 0;\r\n  }\r\n\r\n  var atEnd: bool;\r\n  while (pos + 1 < len) {\r\n    atEnd = false;\r\n\r\n    // we are only interested in '/.' sequences ...\r\n    if (\r\n      path.charCodeAt(pos) == separator &&\r\n      path.charCodeAt(pos + 1) == CharCode.DOT\r\n    ) {\r\n      // '/.' ( '/' | $ )\r\n      atEnd = pos + 2 == len;\r\n      if (atEnd ||\r\n        pos + 2 < len &&\r\n        path.charCodeAt(pos + 2) == separator\r\n      ) {\r\n        path = atEnd\r\n          ? path.substring(0, pos)\r\n          : path.substring(0, pos) + path.substring(pos + 2);\r\n        len -= 2;\r\n        continue;\r\n      }\r\n\r\n      // '/.' ( './' | '.' $ )\r\n      atEnd = pos + 3 == len;\r\n      if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n        pos + 3 < len &&\r\n        path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n        path.charCodeAt(pos + 3) == separator\r\n      ) {\r\n        // find preceeding '/'\r\n        let ipos = pos;\r\n        while (--ipos >= 0) {\r\n          if (path.charCodeAt(ipos) == separator) {\r\n            if (pos - ipos != 3 ||\r\n              path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n              path.charCodeAt(ipos + 2) != CharCode.DOT\r\n            ) { // exclude '..' itself\r\n              path = atEnd\r\n                ? path.substring(0, ipos)\r\n                : path.substring(0, ipos) + path.substring(pos + 3);\r\n              len -= pos + 3 - ipos;\r\n              pos = ipos - 1; // incremented again at end of loop\r\n            }\r\n            break;\r\n          }\r\n        }\r\n\r\n        // if there's no preceeding '/', trim start if non-empty\r\n        if (ipos < 0 && pos > 0) {\r\n          if (pos != 2 ||\r\n            path.charCodeAt(0) != CharCode.DOT ||\r\n            path.charCodeAt(1) != CharCode.DOT\r\n          ) { // exclude '..' itself\r\n            path = path.substring(pos + 4);\r\n            len = path.length;\r\n            continue;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    pos++;\r\n  }\r\n  return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolvePath(normalizedPath: string, origin: string): string {\r\n  if (normalizedPath.startsWith(\"std/\")) {\r\n    return normalizedPath;\r\n  }\r\n  return normalizePath(\r\n    dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n  );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n  var pos = normalizedPath.length;\r\n  while (--pos > 0) {\r\n    if (normalizedPath.charCodeAt(pos) == separator) {\r\n      return normalizedPath.substring(0, pos);\r\n    }\r\n  }\r\n  return \".\";\r\n}\r\n","/** @module util *//***/\r\n\r\n/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n  NULL = 0,\r\n  LINEFEED = 0x0A,\r\n  CARRIAGERETURN = 0x0D,\r\n  LINESEPARATOR = 0x2028,\r\n  PARAGRAPHSEPARATOR = 0x2029,\r\n  NEXTLINE = 0x0085,\r\n\r\n  SPACE = 0x20,\r\n  NONBREAKINGSPACE = 0xA0,\r\n  ENQUAD = 0x2000,\r\n  EMQUAD = 0x2001,\r\n  ENSPACE = 0x2002,\r\n  EMSPACE = 0x2003,\r\n  THREEPEREMSPACE = 0x2004,\r\n  FOURPEREMSPACE = 0x2005,\r\n  SIXPEREMSPACE = 0x2006,\r\n  FIGURESPACE = 0x2007,\r\n  PUNCTUATIONSPACE = 0x2008,\r\n  THINSPACE = 0x2009,\r\n  HAIRSPACE = 0x200A,\r\n  ZEROWIDTHSPACE = 0x200B,\r\n  NARROWNOBREAKSPACE = 0x202F,\r\n  IDEOGRAPHICSPACE = 0x3000,\r\n  MATHEMATICALSPACE = 0x205F,\r\n  OGHAM = 0x1680,\r\n\r\n  _ = 0x5F,\r\n\r\n  _0 = 0x30,\r\n  _1 = 0x31,\r\n  _2 = 0x32,\r\n  _3 = 0x33,\r\n  _4 = 0x34,\r\n  _5 = 0x35,\r\n  _6 = 0x36,\r\n  _7 = 0x37,\r\n  _8 = 0x38,\r\n  _9 = 0x39,\r\n\r\n  a = 0x61,\r\n  b = 0x62,\r\n  c = 0x63,\r\n  d = 0x64,\r\n  e = 0x65,\r\n  f = 0x66,\r\n  g = 0x67,\r\n  h = 0x68,\r\n  i = 0x69,\r\n  j = 0x6A,\r\n  k = 0x6B,\r\n  l = 0x6C,\r\n  m = 0x6D,\r\n  n = 0x6E,\r\n  o = 0x6F,\r\n  p = 0x70,\r\n  q = 0x71,\r\n  r = 0x72,\r\n  s = 0x73,\r\n  t = 0x74,\r\n  u = 0x75,\r\n  v = 0x76,\r\n  w = 0x77,\r\n  x = 0x78,\r\n  y = 0x79,\r\n  z = 0x7A,\r\n\r\n  A = 0x41,\r\n  B = 0x42,\r\n  C = 0x43,\r\n  D = 0x44,\r\n  E = 0x45,\r\n  F = 0x46,\r\n  G = 0x47,\r\n  H = 0x48,\r\n  I = 0x49,\r\n  J = 0x4A,\r\n  K = 0x4B,\r\n  L = 0x4C,\r\n  M = 0x4D,\r\n  N = 0x4E,\r\n  O = 0x4F,\r\n  P = 0x50,\r\n  Q = 0x51,\r\n  R = 0x52,\r\n  S = 0x53,\r\n  T = 0x54,\r\n  U = 0x55,\r\n  V = 0x56,\r\n  W = 0x57,\r\n  X = 0x58,\r\n  Y = 0x59,\r\n  Z = 0x5a,\r\n\r\n  AMPERSAND = 0x26,\r\n  ASTERISK = 0x2A,\r\n  AT = 0x40,\r\n  BACKSLASH = 0x5C,\r\n  BACKTICK = 0x60,\r\n  BAR = 0x7C,\r\n  CARET = 0x5E,\r\n  CLOSEBRACE = 0x7D,\r\n  CLOSEBRACKET = 0x5D,\r\n  CLOSEPAREN = 0x29,\r\n  COLON = 0x3A,\r\n  COMMA = 0x2C,\r\n  DOLLAR = 0x24,\r\n  DOT = 0x2E,\r\n  DOUBLEQUOTE = 0x22,\r\n  EQUALS = 0x3D,\r\n  EXCLAMATION = 0x21,\r\n  GREATERTHAN = 0x3E,\r\n  HASH = 0x23,\r\n  LESSTHAN = 0x3C,\r\n  MINUS = 0x2D,\r\n  OPENBRACE = 0x7B,\r\n  OPENBRACKET = 0x5B,\r\n  OPENPAREN = 0x28,\r\n  PERCENT = 0x25,\r\n  PLUS = 0x2B,\r\n  QUESTION = 0x3F,\r\n  SEMICOLON = 0x3B,\r\n  SINGLEQUOTE = 0x27,\r\n  SLASH = 0x2F,\r\n  TILDE = 0x7E,\r\n\r\n  BACKSPACE = 0x08,\r\n  FORMFEED = 0x0C,\r\n  BYTEORDERMARK = 0xFEFF,\r\n  TAB = 0x09,\r\n  VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n  switch (c) {\r\n    case CharCode.LINEFEED:\r\n    case CharCode.CARRIAGERETURN:\r\n    case CharCode.LINESEPARATOR:\r\n    case CharCode.PARAGRAPHSEPARATOR: {\r\n      return true;\r\n    }\r\n    default: {\r\n      return false;\r\n    }\r\n  }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n  switch (c) {\r\n    case CharCode.SPACE:\r\n    case CharCode.TAB:\r\n    case CharCode.VERTICALTAB:\r\n    case CharCode.FORMFEED:\r\n    case CharCode.NONBREAKINGSPACE:\r\n    case CharCode.NEXTLINE:\r\n    case CharCode.OGHAM:\r\n    case CharCode.NARROWNOBREAKSPACE:\r\n    case CharCode.MATHEMATICALSPACE:\r\n    case CharCode.IDEOGRAPHICSPACE:\r\n    case CharCode.BYTEORDERMARK: {\r\n      return true;\r\n    }\r\n    default: {\r\n      return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n    }\r\n  }\r\n}\r\n\r\n/** Tests if the specified character code is a valid decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n  return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is a valid octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n  return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n  return c >= CharCode.A && c <= CharCode.Z\r\n      || c >= CharCode.a && c <= CharCode.z\r\n      || c == CharCode.DOLLAR\r\n      || c == CharCode._\r\n      || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n  return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n  return c >= CharCode.A && c <= CharCode.Z\r\n      || c >= CharCode.a && c <= CharCode.z\r\n      || c >= CharCode._0 && c <= CharCode._9\r\n      || c == CharCode.DOLLAR\r\n      || c == CharCode._\r\n      || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n  170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n  740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n  908, 908, 910, 929, 931,\r\n  1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n  1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n  1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n  1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n  2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n  2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n  2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n  2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n  2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n  2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n  2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n  2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n  2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n  2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n  3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n  3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n  3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n  3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n  3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n  3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n  3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n  3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n  4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n  4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n  4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n  4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n  5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n  5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n  6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n  6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n  6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n  7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n  7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n  8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n  8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n  8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n  8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n  8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n  11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n  11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n  11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n  11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n  12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n  12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n  19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n  42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n  42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n  43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n  43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n  43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n  43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n  43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n  43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n  55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n  64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n  64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n  65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n  65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n  170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n  740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n  908, 908, 910, 929, 931,\r\n  1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n  1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n  1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n  1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n  2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n  2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n  2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n  2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n  2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n  2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n  2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n  2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n  2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n  2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n  2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n  2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n  3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n  3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n  3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n  3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n  3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n  3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n  3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n  3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n  3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n  3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n  3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n  3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n  3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n  4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n  4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n  4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n  4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n  5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n  5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n  6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n  6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n  6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n  6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n  7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n  7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n  8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n  8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n  8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n  8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n  8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n  8521, 8526, 8526, 8544, 8584,\r\n  11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n  11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n  11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n  11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n  12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n  12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n  13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n  42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n  42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n  43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n  43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n  43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n  43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n  43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n  55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n  64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n  64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n  65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n  65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n  65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n  if (code < map[0]) return false;\r\n\r\n  var lo = 0;\r\n  var hi = map.length;\r\n  var mid: i32;\r\n\r\n  while (lo + 1 < hi) {\r\n    mid = lo + (hi - lo) / 2;\r\n    mid -= mid % 2;\r\n    if (map[mid] <= code && code <= map[mid + 1]) {\r\n      return true;\r\n    }\r\n    if (code < map[mid]) {\r\n      hi = mid;\r\n    } else {\r\n      lo = mid + 2;\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n  return code < 0 || code > 0xffff ? false\r\n       : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n  return code < 0 || code > 0xffff ? false\r\n       : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n","/**\r\n * Built-in elements providing WebAssembly core functionality.\r\n * @module builtins\r\n *//***/\r\n\r\n import {\r\n  Compiler,\r\n  ConversionKind,\r\n  WrapMode\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Expression,\r\n  LiteralKind,\r\n  LiteralExpression,\r\n  StringLiteralExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n  BinaryOp,\r\n  UnaryOp,\r\n  HostOp,\r\n  NativeType,\r\n  ExpressionRef,\r\n  ExpressionId,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getConstValueI64High,\r\n  getConstValueI64Low,\r\n  getConstValueI32\r\n} from \"./module\";\r\n\r\nimport {\r\n  ElementKind,\r\n  FunctionPrototype,\r\n  Class,\r\n  Field,\r\n  OperatorKind,\r\n  FlowFlags\r\n} from \"./program\";\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n  compiler: Compiler,\r\n  prototype: FunctionPrototype,\r\n  typeArguments: Type[] | null,\r\n  operands: Expression[],\r\n  contextualType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var module = compiler.module;\r\n\r\n  var arg0: ExpressionRef,\r\n      arg1: ExpressionRef,\r\n      arg2: ExpressionRef,\r\n      ret: ExpressionRef;\r\n\r\n  // NOTE that some implementations below make use of the select expression where straight-forward.\r\n  // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n  // search: createSelect\r\n\r\n  switch (prototype.internalName) {\r\n\r\n    // types\r\n\r\n    case \"isInteger\": { // isInteger<T!>() / isInteger<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isFloat\": { // isFloat<T!>() / isFloat<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.FLOAT)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isSigned\": { // isSigned<T!>() / isSigned<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.SIGNED)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isReference\": { // isReference<T!>() / isReference<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      compiler.currentType = Type.bool;\r\n      return type.is(TypeFlags.REFERENCE)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isString\": { // isString<T!>() / isString<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      let classType = type.classReference;\r\n      if (classType) {\r\n        let stringInstance = compiler.program.stringInstance;\r\n        if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\r\n      }\r\n      return module.createI32(0);\r\n    }\r\n    case \"isArray\": { // isArray<T!>() / isArray<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      let classType = type.classReference;\r\n      return classType != null && classType.lookupOverload(OperatorKind.INDEXED_GET) != null\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n\r\n    // math\r\n\r\n    case \"clz\": { // clz<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.ClzI64\r\n              : UnaryOp.ClzI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"ctz\": { // ctz<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.CtzI64\r\n              : UnaryOp.CtzI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"popcnt\": { // popcnt<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.PopcntI64\r\n              : UnaryOp.PopcntI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"rotl\": { // rotl<T?>(value: T, shift: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = compiler.ensureSmallIntegerWrap(\r\n            module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n            compiler.currentType\r\n          );\r\n          // fall-through\r\n        }\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createBinary(\r\n            compiler.options.isWasm64\r\n              ? BinaryOp.RotlI64\r\n              : BinaryOp.RotlI32,\r\n            arg0,\r\n            arg1\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret; // possibly overflows\r\n    }\r\n    case \"rotr\": { // rotr<T?>(value: T, shift: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = compiler.ensureSmallIntegerWrap(\r\n            module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n            compiler.currentType\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createBinary(\r\n            compiler.options.isWasm64\r\n              ? BinaryOp.RotrI64\r\n              : BinaryOp.RotrI32,\r\n            arg0,\r\n            arg1\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret; // possibly overflowws\r\n    }\r\n    case \"abs\": { // abs<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          // possibly overflows, e.g. abs<i8>(-128) == 128\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\r\n          ret = module.createSelect( // x > 0 ? x : 0-x\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(BinaryOp.SubI32, // ifFalse\r\n              module.createI32(0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32)\r\n            ),\r\n            module.createBinary(BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              module.createI32(0)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              compiler.options.usizeType.toNativeZero(module),\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n            ),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\r\n              compiler.options.usizeType.toNativeZero(module)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(BinaryOp.SubI64,\r\n              module.createI64(0, 0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I64),\r\n            ),\r\n            module.createBinary(BinaryOp.GtI64,\r\n              module.createGetLocal(tempLocal.index, NativeType.I64),\r\n              module.createI64(0, 0)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.U64:\r\n        case TypeKind.BOOL: {\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"max\": { // max<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.BOOL: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtU32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtI64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtU64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtU64\r\n                : BinaryOp.GtU32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"min\": { // min<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtI32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.BOOL: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtU32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtI64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtU64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.LtI64\r\n                : BinaryOp.LtI32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.LtU64\r\n                : BinaryOp.LtU32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"ceil\": { // ceil<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"floor\": { // floor<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"copysign\": { // copysign<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"nearest\": { // nearest<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"reinterpret\": { // reinterpret<T!>(value: *) -> T\r\n      if (operands.length != 1) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      switch (typeArguments[0].kind) {\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (typeArguments[0].is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            compiler.currentType = typeArguments[0];\r\n            return module.createUnreachable();\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          arg0 = compiler.compileExpression(\r\n            operands[0],\r\n            compiler.options.isWasm64\r\n              ? Type.f64\r\n              : Type.f32,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.ReinterpretF64\r\n              : UnaryOp.ReinterpretF32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n          break;\r\n        }\r\n        default: { // small integers and void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      compiler.currentType = typeArguments[0];\r\n      return ret;\r\n    }\r\n    case \"sqrt\": { // sqrt<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n          break;\r\n        }\r\n        // case TypeKind.VOID:\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"trunc\": { // trunc<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments && typeArguments.length) {\r\n        compiler.currentType = typeArguments[0];\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        // TODO: truncate to contextual type directly (if not void etc.)?\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n\r\n    // memory access\r\n\r\n    case \"load\": { // load<T!>(offset: usize, constantOffset?: usize) -> *\r\n      if (operands.length < 1 || operands.length > 2) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        if (operands.length < 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"1\", operands.length.toString(10)\r\n          );\r\n        } else {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n      if (offset < 0) { // reported in evaluateConstantOffset\r\n        return module.createUnreachable();\r\n      }\r\n      compiler.currentType = typeArguments[0];\r\n      return module.createLoad(\r\n        typeArguments[0].byteSize,\r\n        typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n        arg0,\r\n        typeArguments[0].is(TypeFlags.INTEGER) &&\r\n        contextualType.is(TypeFlags.INTEGER) &&\r\n        contextualType.size > typeArguments[0].size\r\n          ? (compiler.currentType = contextualType).toNativeType()\r\n          : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n        offset\r\n      );\r\n    }\r\n    case \"store\": { // store<T!>(offset: usize, value: *, constantOffset?: usize) -> void\r\n      compiler.currentType = Type.void;\r\n      if (operands.length < 2 || operands.length > 3) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        if (operands.length < 2) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        } else {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"3\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        typeArguments[0],\r\n        typeArguments[0].is(TypeFlags.INTEGER)\r\n          ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n          : ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      let type: Type;\r\n      if (\r\n        typeArguments[0].is(TypeFlags.INTEGER) &&\r\n        (\r\n          !compiler.currentType.is(TypeFlags.INTEGER) ||    // float to int\r\n          compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n        )\r\n      ) {\r\n        arg1 = compiler.convertExpression(\r\n          arg1,\r\n          compiler.currentType, typeArguments[0],\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE, // still clears garbage bits\r\n          operands[1]\r\n        );\r\n        type = typeArguments[0];\r\n      } else {\r\n        type = compiler.currentType;\r\n      }\r\n      let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n      if (offset < 0) { // reported in evaluateConstantOffset\r\n        return module.createUnreachable();\r\n      }\r\n      compiler.currentType = Type.void;\r\n      return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n    }\r\n    case \"sizeof\": { // sizeof<T!>() -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length != 0) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n      }\r\n      let byteSize = (<Type[]>typeArguments)[0].byteSize;\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          ret = module.createI32(byteSize);\r\n        } else {\r\n          ret = module.createI64(byteSize, 0);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          ret = module.createI64(byteSize, 0);\r\n        } else {\r\n          ret = module.createI32(byteSize);\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"alignof\": { // alignof<T!>() -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length != 0) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let byteSize = (<Type[]>typeArguments)[0].byteSize;\r\n      let alignLog2: i32;\r\n      switch (byteSize) {\r\n        case 1: { alignLog2 = 0; break; }\r\n        case 2: { alignLog2 = 1; break; }\r\n        case 4: { alignLog2 = 2; break; }\r\n        case 8: { alignLog2 = 3; break; }\r\n        default: { assert(false); return module.createUnreachable(); }\r\n      }\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          ret = module.createI32(alignLog2);\r\n        } else {\r\n          ret = module.createI64(alignLog2, 0);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          ret = module.createI64(alignLog2, 0);\r\n        } else {\r\n          ret = module.createI32(alignLog2);\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"offsetof\": { // offsetof<T!>(fieldName?: string) -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length > 1) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let classType = typeArguments[0].classReference;\r\n      if (!classType) {\r\n        compiler.error( // TODO: better error\r\n          DiagnosticCode.Operation_not_supported,\r\n          reportNode.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let offset: i32;\r\n      if (operands.length) {\r\n        if (\r\n          operands[0].kind != NodeKind.LITERAL ||\r\n          (<LiteralExpression>operands[0]).literalKind != LiteralKind.STRING\r\n        ) {\r\n          compiler.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            operands[0].range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let fieldName = (<StringLiteralExpression>operands[0]).value;\r\n        let field = classType.members ? classType.members.get(fieldName) : null;\r\n        if (!(field && field.kind == ElementKind.FIELD)) {\r\n          compiler.error(\r\n            DiagnosticCode.Type_0_has_no_property_1,\r\n            operands[0].range, classType.internalName, fieldName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        offset = (<Field>field).memoryOffset;\r\n      } else {\r\n        offset = classType.currentMemoryOffset;\r\n      }\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          return module.createI32(offset);\r\n        } else {\r\n          return module.createI64(offset);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          return module.createI64(offset);\r\n        } else {\r\n          return module.createI32(offset);\r\n        }\r\n      }\r\n    }\r\n\r\n    // control flow\r\n\r\n    case \"select\": { // select<T?>(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n      if (operands.length != 3) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n      }\r\n      let type = compiler.currentType;\r\n      arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      arg2 = compiler.makeIsTrueish(\r\n        compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\r\n        compiler.currentType\r\n      );\r\n      compiler.currentType = type;\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = module.createSelect(arg0, arg1, arg2);\r\n          break;\r\n        }\r\n        default: { // any other value type\r\n          ret = module.createSelect(arg0, arg1, arg2);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"unreachable\": { // unreachable() -> *\r\n      if (operands.length != 0) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createUnreachable();\r\n    }\r\n\r\n    // host operations\r\n\r\n    case \"current_memory\": { // current_memory() -> i32\r\n      compiler.currentType = Type.i32;\r\n      if (operands.length != 0) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createHost(HostOp.CurrentMemory);\r\n    }\r\n    case \"grow_memory\": { // grow_memory(pages: i32) -> i32\r\n      compiler.currentType = Type.i32;\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        arg0 = module.createUnreachable();\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n    }\r\n    // see: https://github.com/WebAssembly/bulk-memory-operations\r\n    case \"move_memory\": { // move_memory(dest: usize, src: usize: n: usize) -> void\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 3) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg2 = compiler.compileExpression(\r\n        operands[2],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = Type.void;\r\n      throw new Error(\"not implemented\");\r\n      // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n    }\r\n    case \"set_memory\": { // set_memory(dest: usize, value: u8, n: usize) -> void\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 3) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        Type.u32,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg2 = compiler.compileExpression(\r\n        operands[2],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = Type.void;\r\n      throw new Error(\"not implemented\");\r\n      // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n    }\r\n\r\n    // other\r\n\r\n    case \"changetype\": { // changetype<T!>(value: *) -> T\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = typeArguments[0];\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpressionRetainType(\r\n        operands[0],\r\n        typeArguments[0],\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = typeArguments[0];\r\n      if (compiler.currentType.size != typeArguments[0].size) {\r\n        compiler.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          reportNode.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n      //  compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n      return arg0; // any usize to any usize\r\n    }\r\n    case \"assert\": { // assert<T?>(isTrueish: T, message?: string) -> T with T != null\r\n      if (operands.length < 1 || operands.length > 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        if (operands.length < 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"1\", operands.length.toString(10)\r\n          );\r\n        } else if (operands.length > 2) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n        if (typeArguments.length != 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\r\n      }\r\n\r\n      let type = compiler.currentType;\r\n      compiler.currentType = type.nonNullableType;\r\n\r\n      // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n      if (compiler.options.noAssert) {\r\n        if (contextualType == Type.void) {\r\n          compiler.currentType = Type.void;\r\n          return module.createNop();\r\n        }\r\n        return arg0;\r\n      }\r\n\r\n      let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n      compiler.currentType = type.nonNullableType;\r\n\r\n      if (contextualType == Type.void) { // simplify if dropped anyway\r\n        switch (compiler.currentType.kind) {\r\n          default: { // any integer up to 32-bits incl. bool\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI32,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI64,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE:\r\n          case TypeKind.USIZE: {\r\n            ret = module.createIf(\r\n              module.createUnary(\r\n                compiler.options.isWasm64\r\n                  ? UnaryOp.EqzI64\r\n                  : UnaryOp.EqzI32,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n          case TypeKind.F32: {\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF32,\r\n                arg0,\r\n                module.createF32(0)\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF64,\r\n                arg0,\r\n                module.createF64(0)\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = abort;\r\n            break;\r\n          }\r\n        }\r\n        compiler.currentType = Type.void;\r\n      } else {\r\n        switch (compiler.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            let flow = compiler.currentFunction.flow;\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(\r\n              compiler.currentType,\r\n              !flow.canOverflow(arg0, compiler.currentType)\r\n            );\r\n            ret = module.createIf(\r\n              module.createTeeLocal(tempLocal.index, arg0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32:\r\n          default: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\r\n            ret = module.createIf(\r\n              module.createTeeLocal(tempLocal.index, arg0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI64,\r\n                module.createTeeLocal(tempLocal.index, arg0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.I64)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE:\r\n          case TypeKind.USIZE: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n            ret = module.createIf(\r\n              module.createUnary(\r\n                compiler.options.isWasm64\r\n                  ? UnaryOp.EqzI64\r\n                  : UnaryOp.EqzI32,\r\n                module.createTeeLocal(tempLocal.index, arg0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF32,\r\n                module.createTeeLocal(tempLocal.index, arg0),\r\n                module.createF32(0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.F32)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF64,\r\n                module.createTeeLocal(tempLocal.index, arg0),\r\n                module.createF64(0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.F64)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = abort;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"unchecked\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let flow = compiler.currentFunction.flow;\r\n      flow.set(FlowFlags.UNCHECKED_CONTEXT);\r\n      ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\r\n      flow.unset(FlowFlags.UNCHECKED_CONTEXT);\r\n      return ret;\r\n    }\r\n    case \"call_indirect\": { // call_indirect<T?>(target: Function | u32, ...args: *[]) -> T\r\n      if (operands.length < 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let returnType: Type;\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        returnType = typeArguments[0];\r\n      } else {\r\n        returnType = contextualType;\r\n      }\r\n      arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n      if (compiler.currentType.kind != TypeKind.U32) {\r\n        compiler.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          operands[0].range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let numOperands = operands.length - 1;\r\n      let operandExprs = new Array<ExpressionRef>(numOperands);\r\n      let signatureParts = new Array<string>(numOperands + 1);\r\n      let nativeReturnType = returnType.toNativeType();\r\n      let nativeParamTypes = new Array<NativeType>(numOperands);\r\n      for (let i = 0; i < numOperands; ++i) {\r\n        operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\r\n        let operandType = compiler.currentType;\r\n        signatureParts[i] = operandType.toSignatureString();\r\n        nativeParamTypes[i] = operandType.toNativeType();\r\n      }\r\n      signatureParts[numOperands] = returnType.toSignatureString();\r\n      let typeName = signatureParts.join(\"\");\r\n      let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\r\n      if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\r\n      compiler.currentType = returnType;\r\n      // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\r\n      // thus must be used with care. it exists because it *might* be useful in specific scenarios.\r\n      return module.createCallIndirect(arg0, operandExprs, typeName);\r\n    }\r\n\r\n    // conversions\r\n\r\n    case \"i8\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i8;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i8,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i16\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i16;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i16,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"isize\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = compiler.options.isWasm64\r\n          ? Type.isize64\r\n          : Type.isize32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.isWasm64\r\n          ? Type.isize64\r\n          : Type.isize32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u8\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u8;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u8,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u16\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u16;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u16,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"usize\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = compiler.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"bool\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.bool;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.bool,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"f32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.f32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.f32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"f64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.f64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.f64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n  }\r\n  var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\r\n  if (expr) {\r\n    if (typeArguments && typeArguments.length) {\r\n      compiler.error(\r\n        DiagnosticCode.Type_0_is_not_generic,\r\n        reportNode.range, prototype.internalName\r\n      );\r\n    }\r\n    return expr;\r\n  }\r\n  compiler.error(\r\n    DiagnosticCode.Operation_not_supported,\r\n    reportNode.range\r\n  );\r\n  return module.createUnreachable();\r\n}\r\n\r\n/** Defers an inline-assembler-like call to a built-in function. */\r\nfunction deferASMCall(\r\n  compiler: Compiler,\r\n  prototype: FunctionPrototype,\r\n  operands: Expression[],\r\n  contextualType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  switch (prototype.internalName) {\r\n\r\n    // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\r\n    //   add, sub, mul, div_s, div_u, rem_s, rem_u\r\n    //   and, or, xor, shl, shr_u, shr_s\r\n    //   eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\r\n\r\n    case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\r\n    case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\r\n    case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\r\n    case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\r\n\r\n    case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n    case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n    case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n    case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n    case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n    case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n    case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n    case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n    case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n    case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n    case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n    case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n    case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n    case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n    case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n    case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n    case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n    case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n  }\r\n  return 0;\r\n}\r\n\r\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\r\nfunction deferASM(\r\n  name: string,\r\n  compiler: Compiler,\r\n  typeArgument: Type,\r\n  operands: Expression[],\r\n  valueType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var prototype = assert(compiler.program.elementsLookup.get(name));\r\n  assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n  return compileCall(compiler, <FunctionPrototype>prototype, [ typeArgument ], operands, valueType, reportNode);\r\n}\r\n\r\n/** Evaluates the constant type of a type argument *or* expression. */\r\nfunction evaluateConstantType(\r\n  compiler: Compiler,\r\n  typeArguments: Type[] | null,\r\n  operands: Expression[],\r\n  reportNode: Node\r\n): Type | null {\r\n  if (operands.length == 0) { // requires type argument\r\n    if (!typeArguments || typeArguments.length != 1) {\r\n      compiler.error(\r\n        DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n        reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n      );\r\n      return null;\r\n    }\r\n    return typeArguments[0];\r\n  }\r\n  if (operands.length == 1) { // optional type argument\r\n    if (typeArguments) {\r\n      if (typeArguments.length == 1) {\r\n        compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        if (typeArguments.length) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return null;\r\n        }\r\n        compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n      }\r\n    } else {\r\n      compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n    }\r\n    return compiler.currentType;\r\n  }\r\n  if (typeArguments && typeArguments.length > 1) {\r\n    compiler.error(\r\n      DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n      reportNode.range, \"1\", typeArguments.length.toString(10)\r\n    );\r\n  }\r\n  compiler.error(\r\n    DiagnosticCode.Expected_0_arguments_but_got_1,\r\n    reportNode.range, \"1\", operands.length.toString(10)\r\n  );\r\n  return null;\r\n}\r\n\r\n/** Evaluates a `constantOffset` argument.*/\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n  var expr: ExpressionRef;\r\n  var value: i32;\r\n  if (compiler.options.isWasm64) {\r\n    expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    if (\r\n      getExpressionId(expr) != ExpressionId.Const ||\r\n      getExpressionType(expr) != NativeType.I64 ||\r\n      getConstValueI64High(expr) != 0 ||\r\n      (value = getConstValueI64Low(expr)) < 0\r\n    ) {\r\n      compiler.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      value = -1;\r\n    }\r\n  } else {\r\n    expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    if (\r\n      getExpressionId(expr) != ExpressionId.Const ||\r\n      getExpressionType(expr) != NativeType.I32 ||\r\n      (value = getConstValueI32(expr)) < 0\r\n    ) {\r\n      compiler.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      value = -1;\r\n    }\r\n  }\r\n  return value;\r\n}\r\n\r\nconst allocateInternalName = \"allocate_memory\";\r\n\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nexport function compileAllocate(\r\n  compiler: Compiler,\r\n  classInstance: Class,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var program = compiler.program;\r\n  assert(classInstance.program == program);\r\n  var module = compiler.module;\r\n  var options = compiler.options;\r\n\r\n  var allocatePrototype = program.elementsLookup.get(allocateInternalName);\r\n  if (!allocatePrototype) {\r\n    program.error(\r\n      DiagnosticCode.Cannot_find_name_0,\r\n      reportNode.range, allocateInternalName\r\n    );\r\n    program.info(\r\n      DiagnosticCode.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf,\r\n      reportNode.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n  if (allocatePrototype.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n    program.error(\r\n      DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n      reportNode.range, allocatePrototype.internalName\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  var allocateInstance = (<FunctionPrototype>allocatePrototype).resolve(); // reports\r\n  if (!(allocateInstance && compiler.compileFunction(allocateInstance))) return module.createUnreachable();\r\n\r\n  compiler.currentType = classInstance.type;\r\n  return module.createCall(\r\n    allocateInstance.internalName, [\r\n      options.isWasm64\r\n        ? module.createI64(classInstance.currentMemoryOffset)\r\n        : module.createI32(classInstance.currentMemoryOffset)\r\n    ],\r\n    options.nativeSizeType\r\n  );\r\n}\r\n\r\nconst abortInternalName = \"abort\";\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n  compiler: Compiler,\r\n  message: Expression | null,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var program = compiler.program;\r\n  var module = compiler.module;\r\n\r\n  var stringType = program.typesLookup.get(\"string\"); // might be intended\r\n  if (!stringType) return module.createUnreachable();\r\n\r\n  var abortPrototype = program.elementsLookup.get(abortInternalName); // might be intended\r\n  if (!abortPrototype || abortPrototype.kind != ElementKind.FUNCTION_PROTOTYPE) return module.createUnreachable();\r\n\r\n  var abortInstance = (<FunctionPrototype>abortPrototype).resolve(); // reports\r\n  if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\r\n\r\n  var messageArg = message != null\r\n    ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n    : stringType.toNativeZero(module);\r\n\r\n  var filenameArg = compiler.compileStaticString(reportNode.range.source.normalizedPath);\r\n\r\n  compiler.currentType = Type.void;\r\n  return module.createBlock(null, [\r\n    module.createCallImport(\r\n      abortInstance.internalName, [\r\n        messageArg,\r\n        filenameArg,\r\n        module.createI32(reportNode.range.line),\r\n        module.createI32(reportNode.range.column)\r\n      ],\r\n      NativeType.None\r\n    ),\r\n    module.createUnreachable()\r\n  ]);\r\n}\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__23__;","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\n\r\nfor (var key in binaryen)\r\n  if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n    global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n  if (!size) return 0; // should be safe in our case\r\n  return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n  if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n  return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n  binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n  return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = require(\"../../module\").Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n  var previousPrint = binaryen.print;\r\n  var ret = \"\";\r\n  binaryen.print = function(x) { ret += x + \"\\n\" };\r\n  _BinaryenModulePrint(this.ref);\r\n  binaryen.print = previousPrint;\r\n  return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n  var previousPrint = binaryen.print;\r\n  var ret = \"\";\r\n  binaryen.print = function(x) { ret += x + \"\\n\" };\r\n  _BinaryenModulePrintAsmjs(this.ref);\r\n  binaryen.print = previousPrint;\r\n  return ret;\r\n};\r\n","module.exports = globalScope => {\r\n  var HEAP = new Uint8Array(0);\r\n  var HEAP_OFFSET = 0;\r\n\r\n  globalScope[\"allocate_memory\"] = function allocate_memory(size) {\r\n    if (!(size >>>= 0)) return 0;\r\n\r\n    if (HEAP_OFFSET + size > HEAP.length) {\r\n      var oldHeap = HEAP;\r\n      HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\r\n      HEAP.set(oldHeap);\r\n    }\r\n\r\n    var ptr = HEAP_OFFSET;\r\n    if ((HEAP_OFFSET += size) & 7)\r\n      HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\r\n\r\n    return ptr;\r\n  };\r\n\r\n  globalScope[\"free_memory\"] = function free_memory(ptr) {\r\n    // TODO\r\n  };\r\n\r\n  globalScope[\"move_memory\"] = function move_memory(dest, src, size) {\r\n    HEAP.copyWithin(dest, src, src + size);\r\n  };\r\n\r\n  globalScope[\"store\"] = function store(ptr, value, offset) {\r\n    HEAP[ptr + (offset | 0)] = value;\r\n  };\r\n\r\n  globalScope[\"load\"] = function load(ptr, offset) {\r\n    return HEAP[ptr + (offset | 0)];\r\n  };\r\n};\r\n","/** @module std/portable *//***/\r\n\r\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nglobalScope.ASC_TARGET = 0;\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n  \"MIN_VALUE\": { value: -128, writable: false },\r\n  \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n  \"MIN_VALUE\": { value: -32768, writable: false },\r\n  \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n  \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n  \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n  \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n  \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n  \"MIN_POSITIVE_VALUE\": { value: Math.fround(1.175494351e-38), writable: false },\r\n  \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n  \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n  \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n  \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n  \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n  \"MIN_POSITIVE_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\r\n  \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n  \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n  \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"ctz\"] = function ctz(value) {\r\n  var c = Math.clz32(value & -value);\r\n  return value ? 31 - c : c;\r\n};\r\n\r\nglobalScope[\"popcnt\"] = function popcnt(value) {\r\n  value -= value >>> 1 & 0x55555555;\r\n  value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\r\n  return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\r\n};\r\n\r\nglobalScope[\"rotl\"] = function rotl(value, shift) {\r\n  shift &= 31;\r\n  return (value << shift) | (value >>> (32 - shift));\r\n};\r\n\r\nglobalScope[\"rotr\"] = function rotr(value, shift) {\r\n  shift &= 31;\r\n  return (value >>> shift) | (value << (32 - shift));\r\n};\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\n// Adopt code from https://github.com/rfk/wasm-polyfill\r\nglobalScope[\"nearest\"] = function nearest(value) {\r\n  if (Math.abs(value - Math.trunc(value)) === 0.5) {\r\n    return 2.0 * Math.round(value * 0.5);\r\n  }\r\n  return Math.round(value);\r\n};\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n  return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"copysign\"] = function copysign(x, y) {\r\n  return Math.abs(x) * Math.sign(y);\r\n};\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n  var a = value >> 8 & 0x00FF00FF;\r\n  var b = (value & 0x00FF00FF) << 8;\r\n  value = a | b;\r\n  a = value >> 16 & 0x0000FFFF;\r\n  b = (value & 0x0000FFFF) << 16;\r\n  return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n  return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n  if (Error.captureStackTrace) {\r\n    Error.captureStackTrace(this, UnreachableError);\r\n  } else {\r\n    this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n  }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n  throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n  this.message = message || \"assertion failed\";\r\n  if (Error.captureStackTrace) {\r\n    Error.captureStackTrace(this, AssertionError);\r\n  } else {\r\n    this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n  }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n  if (isTrueish) return isTrueish;\r\n  throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n  return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n  return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n  return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n  return String.fromCodePoint.apply(String, arr);\r\n};\r\n\r\nglobalScope[\"isInteger\"] = Number.isInteger;\r\n\r\nglobalScope[\"isFloat\"] = function isFloat(arg) {\r\n  return typeof arg === \"number\";\r\n};\r\n\r\nglobalScope[\"isReference\"] = function isClass(arg) {\r\n  return typeof arg === \"object\" || typeof arg === \"string\";\r\n};\r\n\r\nglobalScope[\"isString\"] = function isString(arg) {\r\n  return typeof arg === \"string\" || arg instanceof String;\r\n};\r\n\r\nglobalScope[\"isArray\"] = Array.isArray;\r\n\r\nglobalScope[\"unchecked\"] = function(expr) {\r\n  return expr;\r\n};\r\n\r\nglobalScope[\"fmod\"] = function fmod(x, y) {\r\n  return x % y;\r\n};\r\n\r\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\r\n  return Math.fround(x % y);\r\n};\r\n\r\nglobalScope[\"JSMath\"] = Math;\r\n\r\nrequire(\"./memory\")(globalScope);\r\n","/**\r\n * JavaScript glue code.\r\n * @module glue/js\r\n * @preferred\r\n *//***/\r\n\r\n/// <reference path=\"./node.d.ts\" />\r\n\r\nimport \"../../../std/portable/index\";\r\nimport \"./binaryen\";\r\nimport \"./float\";\r\nimport \"./i64\";\r\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://assemblyscript/webpack/universalModuleDefinition","webpack://assemblyscript/webpack/bootstrap","webpack://assemblyscript/./src/common.ts","webpack://assemblyscript/./src/diagnostics.ts","webpack://assemblyscript/./src/ast.ts","webpack://assemblyscript/./src/util/index.ts","webpack://assemblyscript/./src/module.ts","webpack://assemblyscript/./src/program.ts","webpack://assemblyscript/./src/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","webpack://assemblyscript/./src/diagnosticMessages.generated.ts","webpack://assemblyscript/./src/compiler.ts","webpack://assemblyscript/./src/parser.ts","webpack://assemblyscript/./src/definitions.ts","webpack://assemblyscript/./src/decompiler.ts","webpack://assemblyscript/./src/index.ts","webpack://assemblyscript/./node_modules/long/src/long.js","webpack://assemblyscript/./src/glue/js/i64.js","webpack://assemblyscript/./src/glue/js/float.js","webpack://assemblyscript/./src/resolver.ts","webpack://assemblyscript/./src/util/binary.ts","webpack://assemblyscript/./src/util/text.ts","webpack://assemblyscript/./src/util/path.ts","webpack://assemblyscript/./src/util/charcode.ts","webpack://assemblyscript/./src/builtins.ts","webpack://assemblyscript/external \"binaryen\"","webpack://assemblyscript/./src/glue/js/binaryen.js","webpack://assemblyscript/./std/portable/memory.js","webpack://assemblyscript/./std/portable/index.js","webpack://assemblyscript/./src/glue/js/index.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__24__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","CommonFlags","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","INNER_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","FILESPACE_PREFIX","DiagnosticCategory","diagnosticMessages_generated_1","util_1","diagnosticMessages_generated_2","diagnosticCategoryToString","category","INFO","WARNING","ERROR","assert","diagnosticCategoryToColor","COLOR_BLUE","COLOR_YELLOW","COLOR_RED","DiagnosticCode","diagnosticCodeToString","COLOR_RESET","DiagnosticMessage","code","message","range","arg0","arg1","arg2","replace","createInfo","createWarning","createError","withRange","toString","source","normalizedPath","line","column","formatDiagnosticContext","useColors","text","len","length","start","end","isLineBreak","charCodeAt","sb","substring","push","join","formatDiagnosticMessage","showContext","DiagnosticEmitter","diagnostics","Array","emitDiagnostic","info","warning","error","common_1","tokenizer_1","Token","Range","NodeKind","nodeIsConstantValue","kind","LITERAL","NULL","TRUE","FALSE","nodeIsCallable","IDENTIFIER","CALL","ELEMENTACCESS","PROPERTYACCESS","nodeIsGenericCallable","Node","parent","flags","NONE","is","flag","isAny","set","createType","typeArguments","isNullable","type","TypeNode","setParent","createOmittedType","createIdentifierExpression","createTypeParameter","extendsType","elem","TypeParameterNode","createParameter","initializer","ParameterNode","parameterKind","createSignature","parameters","returnType","explicitThisType","sig","SignatureNode","createDecorator","args","stmt","DecoratorNode","arguments","decoratorKind","decoratorNameToKind","createComment","node","CommentNode","commentKind","expr","IdentifierExpression","createEmptyIdentifierExpression","createArrayLiteralExpression","elements","ArrayLiteralExpression","elementExpressions","nodes","k","setParentIfNotNull","createAssertionExpression","assertionKind","expression","toType","AssertionExpression","createBinaryExpression","operator","left","right","BinaryExpression","createCallExpression","typeArgs","CallExpression","createClassExpression","declaration","ClassExpression","createCommaExpression","expressions","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","element","ElementAccessExpression","elementExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createFunctionExpression","FunctionExpression","ARROW","createInstanceOfExpression","isType","InstanceOfExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","condition","ifThen","ifElse","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","operand","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","statements","BlockStatement","createBreakStatement","label","BreakStatement","createClassDeclaration","identifier","typeParameters","implementsTypes","members","decorators","ClassDeclaration","createContinueStatement","ContinueStatement","createDoStatement","statement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","values","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","path","ExportStatement","normalizePath","startsWith","resolvePath","internalPath","mangleInternalPath","createExportImportStatement","externalName","ExportImportStatement","createExportMember","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","ifTrue","ifFalse","IfStatement","createImportStatement","decls","ImportStatement","declarations","namespaceName","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","incrementor","ForStatement","createFunctionDeclaration","signature","body","FunctionDeclaration","createMethodDeclaration","MethodDeclaration","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","cases","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","alias","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createVoidStatement","VoidStatement","createWhileStatement","WhileStatement","CommonTypeNode","_super","__extends","_this","apply","TYPE","TYPEPARAMETER","ParameterKind","PARAMETER","implicitFieldDeclaration","DecoratorKind","SIGNATURE","nameStr","EXTERNAL","GLOBAL","INLINE","OPERATOR","SEALED","UNMANAGED","propStr","OPERATOR_BINARY","OPERATOR_PREFIX","OPERATOR_POSTFIX","CUSTOM","DECORATOR","CommentKind","COMMENT","Expression","LiteralKind","LiteralExpression","literalKind","ARRAY","AssertionKind","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","PARENTHESIZED","REGEXP","TERNARY","STRING","SUPER","THIS","UnaryExpression","UNARYPOSTFIX","UNARYPREFIX","isLastStatement","BLOCK","FUNCTIONDECLARATION","METHODDECLARATION","SourceKind","Statement","Source","SOURCE","tokenizer","debugInfoIndex","exportPaths","sourceKind","pos","lastIndexOf","simplePath","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","mangleInternalName","VARIABLE","NAMESPACEDECLARATION","EXPORT","isTopLevelExport","CLASSDECLARATION","STATIC","needsExplicitExport","member","VariableLikeDeclarationStatement","BREAK","CONTINUE","DO","EMPTY","ENUMDECLARATION","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","EXPRESSION","FIELDDECLARATION","parameterIndex","FOR","IF","IMPORTDECLARATION","IMPORT","INTERFACEDECLARATION","RETURN","SWITCHCASE","SWITCH","THROW","TRY","TYPEDECLARATION","VARIABLEDECLARATION","VOID","WHILE","asGlobal","endsWith","findDecorator","decorator","__export","NativeType","ExpressionId","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeUnreachable","_BinaryenTypeAuto","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallImportId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","_BinaryenExtendS8Int32","_BinaryenExtendS16Int32","_BinaryenExtendS8Int64","_BinaryenExtendS16Int64","_BinaryenExtendS32Int64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenPageSize","_BinaryenCurrentMemory","_BinaryenGrowMemory","_BinaryenHasFeature","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","MemorySegment","buffer","offset","segment","Module","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","ref","_BinaryenModuleCreate","cachedByValue","allocate_memory","createFrom","cArr","allocU8Array","_BinaryenModuleRead","free_memory","changetype","addFunctionType","result","paramTypes","cStr","allocString","allocI32Array","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","removeFunctionType","_BinaryenRemoveFunctionType","createI32","out","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createUnary","op","_BinaryenUnary","createBinary","_BinaryenBinary","createHost","operands","allocPtrArray","_BinaryenHost","createGetLocal","index","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","bytes","signed","ptr","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","children","None","_BinaryenBlock","createBreak","_BinaryenBreak","createDrop","_BinaryenDrop","createLoop","_BinaryenLoop","createIf","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","numNames","strs","_BinaryenSwitch","createCall","target","_BinaryenCall","createCallImport","_BinaryenCallImport","createCallIndirect","typeName","_BinaryenCallIndirect","createUnreachable","_BinaryenUnreachable","addGlobal","mutable","_BinaryenAddGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addTemporaryFunction","tempName","typeRef","removeTemporaryFunction","addFunctionExport","internalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","removeImport","_BinaryenRemoveImport","setMemory","initial","maximum","segments","exportName","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","precomputeFunction","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","readInt","binaryBytes","ret","BinaryModule","output","Uint8Array","load","readBuffer","sourceMap","readString","toText","Error","toAsmjs","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","i32","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","_BinaryenExpressionGetType","I32","_BinaryenConstGetValueI32","I64","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","F32","_BinaryenConstGetValueF32","F64","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","Binary","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","setDebugLocation","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","MAX_MEMORY_WASM32","MAX_MEMORY_WASM64","getExpressionId","getExpressionType","getConstValueI32","getConstValueI64Low","getConstValueI64High","getConstValueF32","getConstValueF64","getGetLocalIndex","getSetLocalIndex","_BinaryenSetLocalGetIndex","getSetLocalValue","_BinaryenSetLocalGetValue","isTeeLocal","_BinaryenSetLocalIsTee","getBinaryOp","getBinaryLeft","getBinaryRight","getUnaryOp","getUnaryValue","getLoadBytes","getLoadOffset","getLoadPtr","isLoadSigned","getStoreBytes","_BinaryenStoreGetBytes","getStoreOffset","_BinaryenStoreGetOffset","getStorePtr","_BinaryenStoreGetPtr","getStoreValue","_BinaryenStoreGetValue","getBlockName","_BinaryenBlockGetName","getBlockChildCount","_BinaryenBlockGetNumChildren","getBlockChild","_BinaryenBlockGetChild","getIfCondition","_BinaryenIfGetCondition","getIfTrue","_BinaryenIfGetIfTrue","getIfFalse","_BinaryenIfGetIfFalse","getLoopName","_BinaryenLoopGetName","getLoopBody","_BinaryenLoopGetBody","getBreakName","_BinaryenBreakGetName","getBreakCondition","_BinaryenBreakGetCondition","getSelectThen","_BinaryenSelectGetIfTrue","getSelectElse","_BinaryenSelectGetIfFalse","getSelectCondition","_BinaryenSelectGetCondition","getDropValue","_BinaryenDropGetValue","getReturnValue","_BinaryenReturnGetValue","getCallTarget","_BinaryenCallGetTarget","getHostOp","_BinaryenHostGetOp","getHostOperandCount","_BinaryenHostGetNumOperands","getHostOperand","_BinaryenHostGetOperand","getHostName","_BinaryenHostGetNameOperand","getFunctionBody","_BinaryenFunctionGetBody","getFunctionName","_BinaryenFunctionGetName","getFunctionParamCount","_BinaryenFunctionGetNumParams","getFunctionParamType","_BinaryenFunctionGetParam","getFunctionResultType","_BinaryenFunctionGetResult","relooper","_RelooperCreate","addBlock","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","u8s","numValues","idx","store","i32s","val","ptrs","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","OperatorKind","diagnostics_1","types_1","ast_1","module_1","resolver_1","QueuedImport","QueuedExport","TypeAlias","operatorKindFromDecorator","arg","INDEXED_GET","INDEXED_SET","UNCHECKED_INDEXED_GET","UNCHECKED_INDEXED_SET","ADD","SUB","MUL","POW","DIV","REM","BITWISE_AND","BITWISE_OR","BITWISE_XOR","EQ","NE","GT","GE","BITWISE_SHR","BITWISE_SHR_U","LT","LE","BITWISE_SHL","PLUS","PREFIX_INC","MINUS","PREFIX_DEC","NOT","BITWISE_NOT","POSTFIX_INC","POSTFIX_DEC","INVALID","ElementKind","DecoratorFlags","noTypesYet","Map","Program","diagnosticsOffset","elementsLookup","instancesLookup","typesLookup","typeAliases","fileLevelExports","moduleLevelExports","arrayPrototype","stringInstance","mainFunction","resolver","Resolver","sources","getSource","lookupSourceByPath","normalizedPathWithoutExtension","tmp","initialize","options","Type","i8","i16","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","setConstantInteger","i64_new","isWasm64","noTreeShaking","noAssert","memoryBase","optimizeLevelHint","shrinkLevelHint","hasFeature","queuedImports","queuedExports","queuedExtends","queuedImplements","filespace","Filespace","currentFilespace","j","initializeClass","initializeEnum","initializeExports","initializeFunction","initializeImports","initializeInterface","initializeNamespace","initializeTypeAlias","initializeVariables","queuedImport","tryLocateImport","localName","splice","externalNameAlt","Module_0_has_no_exported_member_1","queuedExports_1","__values","queuedExports_1_1","next","done","_c","__read","queuedExport","currentExport","isReExport","setExportAndCheckLibrary","Cannot_find_name_0","derivedPrototype","derivedDeclaration","derivedType","baseElement","resolveIdentifier","CLASS_PROTOTYPE","basePrototype","A_class_may_only_extend_another_class","globalAliases","globalAliases_1","globalAliases_1_1","_d","stringPrototype","resolveClass","has","Duplicate_identifier_0","programLevelInternalName","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","Global","withConstantIntegerValue","setConstantFloat","withConstantFloatValue","queuedNamedExports","checkDecorators","acceptedFlags","presentFlags","decoratorKindToFlag","Duplicate_decorator","Decorator_0_is_not_valid_here","checkGlobal","parentNode","hasDecorator","BUILTIN","isLibrary","namespace","fileLevelInternalName","simpleName","ClassPrototype","numImplementsTypes","Unmanaged_classes_cannot_implement_interfaces","Operation_not_supported","MODULE_EXPORT","Export_declaration_conflicts_with_exported_declaration_of_0","isEntry","memberDeclarations","memberDeclaration","initializeField","GET","SET","initializeAccessor","initializeMethod","classPrototype","isInterface","INTERFACE_PROTOTYPE","staticField","ABSTRACT","instanceMembers","instanceField","FieldPrototype","decoratorFlags","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperatorOverloads","numArgs","firstArg","overloads","overloadPrototypes","Duplicate_function_implementation","operatorKind","String_literal_expected","Expected_0_arguments_but_got_1","internalPropertyName","propertyElement","isGetter","isNew","PROPERTY","getterPrototype","setterPrototype","Property","baseName","staticName","staticPrototype","instanceName","instancePrototype","Enum","initializeEnumValue","enm","EnumValue","initializeExport","prefix","FILESPACE","referencedName","referencedElement","seen","Set","add","initializeImport","indexPart","InterfacePrototype","parentNamespace","Namespace","existingExport","Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local","global_1","Element","program","NAMESPACE","ENUM","ENUMVALUE","constantValue","ConstantValueKind","VariableLikeElement","constantValueKind","constantIntegerValue","CONST","INLINED","constantFloatValue","Parameter","Local","LOCAL","scopedGlobal","instances","classTypeArguments","Function","contextualTypeArguments","localsByName","localsByIndex","additionalLocals","breakContext","debugLocations","functionTableIndex","trampoline","outerScope","nextBreakId","breakStack","nextInlineId","tempI32s","tempI64s","tempF32s","tempF64s","DECLARE","localIndex","INSTANCE","local","thisType","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","_b","inheritedName","inheritedType","parameterTypes","parameterType","parameterName","getParameterName","flow","Flow","addLocal","getTempLocal","wrapped","temps","toNativeType","pop","setLocalWrapped","freeTempLocal","getAndFreeTempLocal","enterBreakContext","id","leaveBreakContext","finalize","debugLocation","debugInfoRef","FunctionTarget","FUNCTION_TARGET","toSignatureString","asFunction","FIELD_PROTOTYPE","Field","FIELD","memoryOffset","Class","base","currentMemoryOffset","constructorInstance","asClass","inheritedTypeArguments_2","inheritedTypeArguments_2_1","baseType","isAssignableTo","current","lookupOverload","unchecked","uncheckedOverload","instance","overload","Interface","INTERFACE","FlowFlags","scopedLocals","currentFunction","parentFlow","continueLabel","breakLabel","returnLabel","wrappedLocals","wrappedLocalsExt","unset","fork","branch","slice","free","scopedLocal","SCOPED","addScopedLocal","existingLocal","addScopedLocalAlias","scopedAlias","getScopedLocal","isLocalWrapped","map","ext","i64_ne","i64_and","i64_shl","i64_one","i64_zero","off","i64_or","i64_not","inherit","other","inheritConditional","inheritMutual","leftExt","rightExt","thisExt","minLength","min","canOverflow","canConversionOverflow","SetLocal","EqI32","EqI64","EqF32","EqF64","NeI32","NeI64","NeF32","NeF64","LtI32","LtU32","LtI64","LtU64","LtF32","LtF64","LeI32","LeU32","LeI64","LeU64","LeF32","LeF64","GtI32","GtU32","GtI64","GtU64","GtF32","GtF64","GeI32","GeU32","GeI64","GeU64","GeF32","GeF64","MulI32","AndI32","computeSmallIntegerMask","ShlI32","shift","size","ShrI32","ShrU32","DivU32","RemI32","RemU32","EqzI32","EqzI64","ClzI32","CtzI32","PopcntI32","MIN_VALUE","fromType","Block","last","If","Select","Call","Unreachable","fromSize","byteSize","toSize","TypeKind","TypeFlags","cachedNullableType","ceil","classReference","signatureReference","nonNullableType","isize64","isize32","usize64","usize32","computeSmallIntegerShift","targetType","classType","asNullable","signednessIsRelevant","currentClass","targetClass","targetFunction","commonCompatible","signednessIsImportant","kindOnly","toNativeZero","toNativeOne","toNativeNegOne","typesToNativeTypes","types","numTypes","typesToString","Signature","cachedFunctionTarget","parameterNames","requiredParameters","hasRest","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","IdentifierHandling","tokenFromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","IS","KEYOF","LET","MODULE","OF","PACKAGE","PRIVATE","PROTECTED","PUBLIC","READONLY","TYPEOF","VAR","WITH","YIELD","tokenIsAlsoIdentifier","token","operatorTokenToString","DOT_DOT_DOT","LESSTHAN","GREATERTHAN","LESSTHAN_EQUALS","GREATERTHAN_EQUALS","EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS_EQUALS_EQUALS","EXCLAMATION_EQUALS_EQUALS","ASTERISK_ASTERISK","ASTERISK","SLASH","PERCENT","PLUS_PLUS","MINUS_MINUS","LESSTHAN_LESSTHAN","GREATERTHAN_GREATERTHAN","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND","BAR","CARET","EXCLAMATION","TILDE","AMPERSAND_AMPERSAND","BAR_BAR","EQUALS","PLUS_EQUALS","MINUS_EQUALS","ASTERISK_EQUALS","ASTERISK_ASTERISK_EQUALS","SLASH_EQUALS","PERCENT_EQUALS","LESSTHAN_LESSTHAN_EQUALS","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","AMPERSAND_EQUALS","BAR_EQUALS","CARET_EQUALS","a","b","Tokenizer","tokenPos","nextToken","nextTokenPos","nextTokenOnNewLine","onComment","identifierHandling","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","isDecimalDigit","FLOATLITERAL","DOT","commentStartPos","LINE","TRIPLE","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordToken","ALWAYS","PREFER","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skipIdentifier","skip","skipIdentifierName","mark","state","reusableState","State","discard","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","sepEnd","i64_add","i64_mul","Numeric_separators_are_not_allowed_here","Multiple_consecutive_numeric_separators_are_not_permitted","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","readDecimalFloat","parseFloat","readHexFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","builtins_1","program_1","Options","WASM32","importMemory","importTable","features","feature","Feature","ConversionKind","WrapMode","mangleImportName_moduleName","mangleImportName_elementName","Compiler","currentOuterFunction","currentEnum","currentType","memorySegments","stringSegments","functionTable","argcVar","argcSet","f32ModInstance","f64ModInstance","f32PowInstance","f64PowInstance","max","compile","startFunctionInstance","startFunctionBody","compileSource","funcRef","ensureFunctionType","i64_align","numPages","i64_shr_u","functionTableSize","functionTableExported","entries","compileSourceByPath","reportNode","File_0_not_found","COMPILED","isGeneric","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFunction","compileStatement","compileGlobalDeclaration","compileGlobal","global","initExpr","resolvedType","resolveType","Type_expected","atEnd","compileExpressionRetainType","Type_0_is_not_assignable_to_type_1","nativeType","isConstant","MODULE_IMPORT","mangleImportName","initializeInStart","compileInlineConstant","compileExpression","precomputeExpressionRef","Compiling_constant_with_non_constant_initializer_as_mutable","mangleExportName","isTopLevel","compileEnum","previousValue","initInStart","valueDeclaration","AddI32","Cannot_export_a_mutable_global","compileFunctionUsingTypeArguments","resolveFunctionInclTypeArguments","compileFunction","resultType","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","nativeSizeType","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","ensureTrampoline","ensureArgcSet","compileInterfaceDeclaration","compileNamespace","compileClassUsingTypeArguments","internalExportName","functionInstance","functionDeclaration","globalDeclaration","alternativeReportNode","resolveClassInclTypeArguments","compileClass","staticMembers","setter","ctorInstance","_e","_f","getterName","setterName","addMemorySegment","alignment","ensureFunctionTableEntry","TRAMPOLINE","compileBlockStatement","compileBreakStatement","compileContinueStatement","compileDoStatement","compileEmptyStatement","compileExpressionStatement","compileForStatement","compileIfStatement","compileReturnStatement","compileSwitchStatement","compileThrowStatement","compileTryStatement","compileVoidStatement","compileWhileStatement","addDebugLocation","numStatements","Nop","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","condExpr","makeIsTrueish","terminated","repeatLabel","alwaysTrue","condPre","incrExpr","bodyExpr","usesContinue","breakBlock","repeatBlock","GENERIC_CONTEXT","condExprPrecomp","ifTrueFlow","ifTrueExpr","ifFalseExpr","ifFalseFlow","numCases","context","tempLocal","tempLocalIndex","breaks","breakIndex","defaultIndex","currentBlock","alwaysReturns","alwaysReturnsWrapped","alwaysThrows","alwaysAllocates","isLast","nextLabel","count","compileAbort","isKnownGlobal","numDeclarations","initializers","isInlined","_const_declarations_must_be_initialized","compileAssignmentWithValue","contextualType","retainType","mask","conversionKind","wrapMode","compileAssertionExpression","compileBinaryExpression","compileCallExpression","compileCommaExpression","compileElementAccessExpression","compileFunctionExpression","compileIdentifierExpression","compileInstanceOfExpression","compileLiteralExpression","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","compileTernaryExpression","compileUnaryPostfixExpression","compileUnaryPrefixExpression","convertExpression","ensureSmallIntegerWrap","precomputeExpression","Conversion_from_type_0_to_1_requires_an_explicit_cast","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","leftExpr","leftType","rightExpr","rightType","commonType","compound","compileBinaryOverload","Operator_0_cannot_be_applied_to_types_1_and_2","compileAssignment","AddI64","AddF32","AddF64","SubI32","SubI64","SubF32","SubF64","MulI64","MulF32","MulF64","resolveFunction","makeCallDirect","DivI32","DivI64","DivU64","DivF32","DivF64","RemI64","RemU64","intType","ShlI64","The_0_operator_cannot_be_applied_to_type_1","ShrI64","ShrU64","AndI64","OrI32","OrI64","XorI32","XorI64","compileUnaryOverload","operatorInstance","valueExpr","argumentExpressions","thisArg","compileCallDirect","valueExpression","resolveExpression","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","resolvedElementExpression","isUnchecked","indexedSet","Index_signature_in_type_0_only_permits_reading","Index_signature_is_missing_in_type_0","valueWithCorrectType","tee","thisExpression","resolvedThisExpression","thisExpr","setterInstance","getterInstance","nativeReturnType","indexedGet","elementExpr","tempLocalTarget","tempLocalElement","indexArg","compileCallExpressionBuiltin","Type_0_is_not_generic","inferredTypes","numTypeParameters","numParameterTypes","numArguments","argumentExprs","typeNode","argumentExpression","inferredType","concreteType","resolvedTypeArguments","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","compileCallIndirect","typeArgumentNodes","resolveTypeArguments","compileCall","checkCallSignature","hasThis","minimum","Expected_at_least_0_arguments_but_got_1","inline","compileCallInlineUnchecked","numArgumentsInclThis","previousFlow","thisLocal","paramExpr","argumentLocal","bodyStatement","original","originalSignature","originalName","originalParameterTypes","originalParameterDeclarations","commonReturnType","commonThisType","isInstance","minArguments","minOperands","maxArguments","maxOperands","numOptional","forwardedOperands","operandIndex","trampolineSignature","trampolineName","ofN","Optional_parameter_must_have_an_initializer","ensureArgcVar","numOperands","isCallImport","parameterNodes","allOptionalsAreConstant","makeCallIndirect","numExpressions","exprs","resolveElementAccess","retainConstantType","scopedThis","_this_cannot_be_referenced_in_current_location","superType","_super_can_only_be_referenced_in_a_derived_class","localType","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileArrayLiteral","floatValue","intValue","i64_sub","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStaticString","stringValue","stringSegment","stringLength","stringBuffer","stringOffset","stringType","elementType","isStatic","arrayInstance","arrayType","elementCount","nativeElementType","byteLength","Int32Array","Float32Array","Float64Array","usizeTypeSize","arraySize","bufferTotalSize","clz","data","writeI64","writeI32","writeF32","writeF64","nativeArrayType","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","Property_0_does_not_exist_on_type_1","ifThenFlow","ifThenExpr","ifThenType","ifElseFlow","ifElseExpr","ifElseType","getValue","nativeOne","setValue","NegF32","NegF64","makeIsFalseish","ExtendI8ToI32","ExtendI16ToI32","compileAllocate","field","fieldType","nativeFieldType","fieldDeclaration","parentElement","builtinsFile","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","indexOf","tn","parseTopLevelStatement","startPos","parseDecorator","skipStatement","exportStart","exportEnd","contextIsAmbient","A_declare_modifier_cannot_be_used_in_an_already_ambient_context","first","parseEnum","parseVariable","parseFunction","parseStatement","parseClassOrInterface","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","Decorators_are_not_valid_here","nextFile","clear","parseType","acceptParenthesized","suppressErrors","isNullableSignature","tryParseSignature","Unexpected_token","innerType","Identifier_expected","nullable","parameter","bracketStart","bracketRange","isSignature","REST","A_rest_parameter_cannot_be_optional","OPTIONAL","param","parseArguments","parseVariableDeclaration","parentFlags","parentDecorators","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","parseEnumValue","parseReturn","parseTypeParameters","typeParameter","parseTypeParameter","Type_parameter_list_cannot_be_empty","parseParameters","seenRest","seenOptional","reportedRest","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","isRest","isOptional","startRange","accessFlags","A_parameter_property_cannot_be_declared_using_a_rest_parameter","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","signatureStart","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseBlockStatement","parseFunctionExpression","isArrow","parseFunctionExpressionCommon","Interface_declaration_cannot_have_implements_clause","parseClassMember","parseClassExpression","VIRTUAL","staticStart","staticEnd","abstractStart","abstractEnd","readonlyStart","readonlyEnd","setEnd","typeParametersStart","Type_parameters_cannot_appear_on_a_constructor_declaration","An_accessor_cannot_have_type_parameters","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","Method_0_cannot_have_an_implementation_because_it_is_marked_abstract","retMethod","Constructor_implementation_is_missing","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseVoidStatement","parseWhileStatement","parseExpressionStatement","elseStatement","case_","parseSwitchCase","_case_or_default_expected","parseExpressionStart","precedence","determinePrecedenceStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","again","PREFIX","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","nextPrecedence","determinePrecedence","commaExprs","isRightAssociative","propertyCall","skipBlock","depth","Precedence","ExportsWalker","includePrivate","todo","walk","visitElement","visitGlobal","visitEnum","visitFunctionInstances","visitClassInstances","visitField","prop","hasCompiledMember","_g","_h","_j","visitNamespace","visitFunction","visitClass","IDLBuilder","indentLevel","build","isConst","indent","typeToString","i64_to_string","members_1","members_1_1","visitInterface","TSDBuilder","numMembers","members_2","members_2_1","ctor","Decompiler","functionId","decompile","decompiler","decompileFunction","nativeTypeToType","decompileExpression","nested","string","Loop","Break","Switch","CallImport","CallIndirect","SetGlobal","Store","AbsF32","CeilF32","FloorF32","TruncF32","NearestF32","SqrtF32","ClzI64","CtzI64","PopcntI64","AbsF64","CeilF64","FloorF64","TruncF64","NearestF64","SqrtF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","RotlI32","RotrI32","RotlI64","RotrI64","CopysignF32","MinF32","MaxF32","CopysignF64","MinF64","MaxF64","Drop","Return","Host","CurrentMemory","GrowMemory","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","Auto","decompiler_1","definitions_1","formatDiagnostic","parser_1","parser","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setImportMemory","setImportTable","setSourceMap","setMemoryBase","setGlobalAlias","FEATURE_SIGN_EXTENSION","FEATURE_MUTABLE_GLOBAL","enableFeature","setOptimizeLevelHints","optimizeLevel","shrinkLevel","finishParsing","compileProgram","decompileModule","buildIDL","buildTSD","Long","wasm","WebAssembly","Instance","low","high","unsigned","isLong","obj","__isLong__","INT_CACHE","UINT_CACHE","fromInt","cachedObj","cache","fromBits","fromNumber","isNaN","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","Math","pow","fromString","radix","RangeError","radixToPower","parseInt","power","mul","fromValue","TWO_PWR_16_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","toInt","toNumber","isZero","isNegative","eq","radixLong","div","rem1","sub","rem","remDiv","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","notEquals","neq","ne","lessThan","comp","lt","lessThanOrEqual","lte","le","greaterThan","gt","greaterThanOrEqual","gte","ge","compare","thisNeg","otherNeg","negate","not","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","b00","divide","divisor","approx","res","div_u","div_s","toUnsigned","shru","shr","shl","floor","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","mod","and","or","xor","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toSigned","toBytes","toBytesLE","toBytesBE","hi","lo","fromBytes","fromBytesLE","fromBytesBE","i64_div","i64_div_u","i64_rem","i64_rem_u","i64_xor","i64_shr","i64_eq","minSafeF32","MIN_SAFE_INTEGER","maxSafeF32","MAX_SAFE_INTEGER","minSafeF64","maxSafeF64","fround","f32_as_i32","i32_as_f32","f64_as_i64","i64_as_f64","ReportMode","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","parameterTypeNodes","parameterTypeNode","returnTypeNode","parameterCount","argumentCount","Expected_0_type_arguments_but_got_1","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classTypeParameters","numClassTypeParameters","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","baseClassType","Class_0_is_sealed_and_cannot_be_extended","Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa","inheritedMember","constructorPartial","baseField","fieldInstance","instanceProperty","partialGetterPrototype","partialSetterPrototype","_k","_l","_m","overloadPrototype","operatorPartial","typeParameterNodes","readI32","readI64","readF32","readF64","valueI64","indentX1","indentX2","indentX4","separator","ipos","dirname","origin","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","mid","compiler","evaluateConstantType","tempLocal0","tempLocal1","evaluateConstantOffset","alignLog2","fieldName","Type_0_has_no_property_1","abort","operandExprs","signatureParts","nativeParamTypes","operandType","deferASM","deferASMCall","typeArgument","valueType","allocateInternalName","allocatePrototype","An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf","allocateInstance","abortInternalName","abortPrototype","abortInstance","messageArg","filenameArg","binaryen","Binaryen","_malloc","_free","move_memory","dest","src","_memmove","HEAPU8","previousPrint","print","x","_BinaryenModulePrint","_BinaryenModulePrintAsmjs","globalScope","HEAP","HEAP_OFFSET","oldHeap","copyWithin","UnreachableError","captureStackTrace","stack","AssertionError","ASC_TARGET","defineProperties","writable","MIN_POSITIVE_VALUE","EPSILON","clz32","abs","trunc","round","sqrt","y","sign","isTrueish","undefined","fromCodePoint","Number","isInteger","isArray"],"mappings":"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KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCE,GACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAA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","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__24__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 29);\n","/**\r\n * Common constants.\r\n * @module common\r\n *//***/\r\n\r\n/** Indicates traits of a {@link Node} or {@link Element}. */\r\nexport enum CommonFlags {\r\n  /** No flags set. */\r\n  NONE = 0,\r\n\r\n  // Basic modifiers\r\n\r\n  /** Has an `import` modifier. */\r\n  IMPORT = 1 << 0,\r\n  /** Has an `export` modifier. */\r\n  EXPORT = 1 << 1,\r\n  /** Has a `declare` modifier. */\r\n  DECLARE = 1 << 2,\r\n  /** Has a `const` modifier. */\r\n  CONST = 1 << 3,\r\n  /** Has a `let` modifier. */\r\n  LET = 1 << 4,\r\n  /** Has a `static` modifier. */\r\n  STATIC = 1 << 5,\r\n  /** Has a `readonly` modifier. */\r\n  READONLY = 1 << 6,\r\n  /** Has an `abstract` modifier. */\r\n  ABSTRACT = 1 << 7,\r\n  /** Has a `public` modifier. */\r\n  PUBLIC = 1 << 8,\r\n  /** Has a `private` modifier. */\r\n  PRIVATE = 1 << 9,\r\n  /** Has a `protected` modifier. */\r\n  PROTECTED = 1 << 10,\r\n  /** Has a `get` modifier. */\r\n  GET = 1 << 11,\r\n  /** Has a `set` modifier. */\r\n  SET = 1 << 12,\r\n\r\n  // Extended modifiers usually derived from basic modifiers\r\n\r\n  /** Is ambient, that is either declared or nested in a declared element. */\r\n  AMBIENT = 1 << 13,\r\n  /** Is generic. */\r\n  GENERIC = 1 << 14,\r\n  /** Is part of a generic context. */\r\n  GENERIC_CONTEXT = 1 << 15,\r\n  /** Is an instance member. */\r\n  INSTANCE = 1 << 16,\r\n  /** Is a constructor. */\r\n  CONSTRUCTOR = 1 << 17,\r\n  /** Is an arrow function. */\r\n  ARROW = 1 << 18,\r\n  /** Is a module export. */\r\n  MODULE_EXPORT = 1 << 19,\r\n  /** Is a module import. */\r\n  MODULE_IMPORT = 1 << 20,\r\n\r\n  // Compilation states\r\n\r\n  /** Is a builtin. */\r\n  BUILTIN = 1 << 21,\r\n  /** Is compiled. */\r\n  COMPILED = 1 << 22,\r\n  /** Has a constant value and is therefore inlined. */\r\n  INLINED = 1 << 23,\r\n  /** Is scoped. */\r\n  SCOPED = 1 << 24,\r\n  /** Is a trampoline. */\r\n  TRAMPOLINE = 1 << 25,\r\n  /** Is a virtual method. */\r\n  VIRTUAL = 1 << 26,\r\n  /** Is the main function. */\r\n  MAIN = 1 << 27\r\n}\r\n\r\n/** Path delimiter inserted between file system levels. */\r\nexport const PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexport const PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexport const GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexport const SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexport const INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexport const STATIC_DELIMITER = \".\";\r\n/** Delimiter used between a function and its inner elements. */\r\nexport const INNER_DELIMITER = \"~\";\r\n/** Substitution used to indicate a library directory. */\r\nexport const LIBRARY_SUBST = \"~lib\";\r\n/** Library directory prefix. */\r\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\r\n/** Prefix used to indicate a filespace element. */\r\nexport const FILESPACE_PREFIX = \"file:\";\r\n","/**\r\n * Shared diagnostic handling inherited by the parser and the compiler.\r\n * @module diagnostics\r\n * @preferred\r\n *//***/\r\n\r\nimport {\r\n  Range\r\n} from \"./ast\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nimport {\r\n  isLineBreak\r\n} from \"./util\";\r\n\r\nexport {\r\n  DiagnosticCode,\r\n  diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\n/** Indicates the category of a {@link DiagnosticMessage}. */\r\nexport enum DiagnosticCategory {\r\n  /** Informatory message. */\r\n  INFO,\r\n  /** Warning message. */\r\n  WARNING,\r\n  /** Error message. */\r\n  ERROR\r\n}\r\n\r\n/** Returns the string representation of the specified diagnostic category. */\r\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\r\n  switch (category) {\r\n    case DiagnosticCategory.INFO: return \"INFO\";\r\n    case DiagnosticCategory.WARNING: return \"WARNING\";\r\n    case DiagnosticCategory.ERROR: return \"ERROR\";\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\n/** ANSI escape sequence for blue foreground. */\r\nexport const COLOR_BLUE: string = \"\\u001b[96m\";\r\n/** ANSI escape sequence for yellow foreground. */\r\nexport const COLOR_YELLOW: string = \"\\u001b[93m\";\r\n/** ANSI escape sequence for red foreground. */\r\nexport const COLOR_RED: string = \"\\u001b[91m\";\r\n/** ANSI escape sequence to reset the foreground color. */\r\nexport const COLOR_RESET: string = \"\\u001b[0m\";\r\n\r\n/** Returns the ANSI escape sequence for the specified category. */\r\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\r\n  switch (category) {\r\n    case DiagnosticCategory.INFO: return COLOR_BLUE;\r\n    case DiagnosticCategory.WARNING: return COLOR_YELLOW;\r\n    case DiagnosticCategory.ERROR: return COLOR_RED;\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\n/** Represents a diagnostic message. */\r\nexport class DiagnosticMessage {\r\n\r\n  /** Message code. */\r\n  code: i32;\r\n  /** Message category. */\r\n  category: DiagnosticCategory;\r\n  /** Message text. */\r\n  message: string;\r\n  /** Respective source range, if any. */\r\n  range: Range | null = null;\r\n\r\n  /** Constructs a new diagnostic message. */\r\n  private constructor(code: i32, category: DiagnosticCategory, message: string) {\r\n    this.code = code;\r\n    this.category = category;\r\n    this.message = message;\r\n  }\r\n\r\n  /** Creates a new diagnostic message of the specified category. */\r\n  static create(\r\n    code: DiagnosticCode,\r\n    category: DiagnosticCategory,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): DiagnosticMessage {\r\n    var message = diagnosticCodeToString(code);\r\n    if (arg0 != null) message = message.replace(\"{0}\", arg0);\r\n    if (arg1 != null) message = message.replace(\"{1}\", arg1);\r\n    if (arg2 != null) message = message.replace(\"{2}\", arg2);\r\n    return new DiagnosticMessage(code, category, message);\r\n  }\r\n\r\n  /** Creates a new informatory diagnostic message. */\r\n  static createInfo(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n  }\r\n\r\n  /** Creates a new warning diagnostic message. */\r\n  static createWarning(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n  }\r\n\r\n  /** Creates a new error diagnostic message. */\r\n  static createError(\r\n    code: DiagnosticCode,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null\r\n  ): DiagnosticMessage {\r\n    return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n  }\r\n\r\n  /** Adds a source range to this message. */\r\n  withRange(range: Range): this {\r\n    this.range = range;\r\n    return this;\r\n  }\r\n\r\n  /** Converts this message to a string. */\r\n  toString(): string {\r\n    if (this.range) {\r\n      return (\r\n        diagnosticCategoryToString(this.category) +\r\n        \" \" +\r\n        this.code.toString(10) +\r\n        \": \\\"\" +\r\n        this.message +\r\n        \"\\\" in \" +\r\n        this.range.source.normalizedPath +\r\n        \":\" +\r\n        this.range.line.toString(10) +\r\n        \":\" +\r\n        this.range.column.toString(10)\r\n      );\r\n    }\r\n    return (\r\n      diagnosticCategoryToString(this.category) +\r\n      \" \" +\r\n      this.code.toString(10) +\r\n      \": \" +\r\n      this.message\r\n    );\r\n  }\r\n}\r\n\r\n/** Formats a diagnostic message, optionally with terminal colors and source context. */\r\nexport function formatDiagnosticMessage(\r\n  message: DiagnosticMessage,\r\n  useColors: bool = false,\r\n  showContext: bool = false\r\n): string {\r\n\r\n  // general information\r\n  var sb: string[] = [];\r\n  if (useColors) sb.push(diagnosticCategoryToColor(message.category));\r\n  sb.push(diagnosticCategoryToString(message.category));\r\n  if (useColors) sb.push(COLOR_RESET);\r\n  sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n  sb.push(message.code.toString(10));\r\n  sb.push(\": \");\r\n  sb.push(message.message);\r\n\r\n  // include range information if available\r\n  if (message.range) {\r\n\r\n    // include context information if requested\r\n    let range = message.range;\r\n    if (showContext) {\r\n      sb.push(\"\\n\");\r\n      sb.push(formatDiagnosticContext(message.range, useColors));\r\n    }\r\n\r\n    sb.push(\"\\n\");\r\n    sb.push(\" in \");\r\n    sb.push(range.source.normalizedPath);\r\n    sb.push(\"(\");\r\n    sb.push(range.line.toString(10));\r\n    sb.push(\",\");\r\n    sb.push(range.column.toString(10));\r\n    sb.push(\")\");\r\n  }\r\n  return sb.join(\"\");\r\n}\r\n\r\n/** Formats the diagnostic context for the specified range, optionally with terminal colors. */\r\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\r\n  var text = range.source.text;\r\n  var len = text.length;\r\n  var start = range.start;\r\n  var end = range.end;\r\n  while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\r\n  while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\r\n  var sb: string[] = [\r\n    \"\\n \",\r\n    text.substring(start, end),\r\n    \"\\n \"\r\n  ];\r\n  while (start < range.start) {\r\n    sb.push(\" \");\r\n    start++;\r\n  }\r\n  if (useColors) sb.push(COLOR_RED);\r\n  if (range.start == range.end) {\r\n    sb.push(\"^\");\r\n  } else {\r\n    while (start++ < range.end) sb.push(\"~\");\r\n  }\r\n  if (useColors) sb.push(COLOR_RESET);\r\n  return sb.join(\"\");\r\n}\r\n\r\n/** Base class of all diagnostic emitters. */\r\nexport abstract class DiagnosticEmitter {\r\n\r\n  /** Diagnostic messages emitted so far. */\r\n  diagnostics: DiagnosticMessage[];\r\n\r\n  /** Initializes this diagnostic emitter. */\r\n  protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n    this.diagnostics = diagnostics ? <DiagnosticMessage[]>diagnostics : new Array();\r\n  }\r\n\r\n  /** Emits a diagnostic message of the specified category. */\r\n  emitDiagnostic(\r\n    code: DiagnosticCode,\r\n    category: DiagnosticCategory,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\r\n    this.diagnostics.push(message);\r\n    // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n    // console.log(<string>new Error(\"stack\").stack);\r\n  }\r\n\r\n  /** Emits an informatory diagnostic message. */\r\n  info(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\r\n  }\r\n\r\n  /** Emits a warning diagnostic message. */\r\n  warning(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\r\n  }\r\n\r\n  /** Emits an error diagnostic message. */\r\n  error(\r\n    code: DiagnosticCode,\r\n    range: Range,\r\n    arg0: string | null = null,\r\n    arg1: string | null = null,\r\n    arg2: string | null = null\r\n  ): void {\r\n    this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\r\n  }\r\n}\r\n","/**\r\n * Abstract syntax tree representing a source file once parsed.\r\n * @module ast\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Token,\r\n  Tokenizer,\r\n  Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  normalizePath,\r\n  resolvePath,\r\n  CharCode\r\n} from \"./util\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n  SOURCE,\r\n\r\n  // types\r\n  TYPE,\r\n  TYPEPARAMETER,\r\n  PARAMETER,\r\n  SIGNATURE,\r\n\r\n  // expressions\r\n  IDENTIFIER,\r\n  ASSERTION,\r\n  BINARY,\r\n  CALL,\r\n  CLASS,\r\n  COMMA,\r\n  ELEMENTACCESS,\r\n  FALSE,\r\n  FUNCTION,\r\n  INSTANCEOF,\r\n  LITERAL,\r\n  NEW,\r\n  NULL,\r\n  PARENTHESIZED,\r\n  PROPERTYACCESS,\r\n  TERNARY,\r\n  SUPER,\r\n  THIS,\r\n  TRUE,\r\n  CONSTRUCTOR,\r\n  UNARYPOSTFIX,\r\n  UNARYPREFIX,\r\n\r\n  // statements\r\n  BLOCK,\r\n  BREAK,\r\n  CONTINUE,\r\n  DO,\r\n  EMPTY,\r\n  EXPORT,\r\n  EXPORTIMPORT,\r\n  EXPRESSION,\r\n  FOR,\r\n  IF,\r\n  IMPORT,\r\n  RETURN,\r\n  SWITCH,\r\n  THROW,\r\n  TRY,\r\n  VARIABLE,\r\n  VOID,\r\n  WHILE,\r\n\r\n  // declaration statements\r\n  CLASSDECLARATION,\r\n  ENUMDECLARATION,\r\n  ENUMVALUEDECLARATION,\r\n  FIELDDECLARATION,\r\n  FUNCTIONDECLARATION,\r\n  IMPORTDECLARATION,\r\n  INTERFACEDECLARATION,\r\n  METHODDECLARATION,\r\n  NAMESPACEDECLARATION,\r\n  TYPEDECLARATION,\r\n  VARIABLEDECLARATION,\r\n\r\n  // special\r\n  DECORATOR,\r\n  EXPORTMEMBER,\r\n  SWITCHCASE,\r\n  COMMENT\r\n}\r\n\r\n/** Checks if a node represents a constant value. */\r\nexport function nodeIsConstantValue(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.LITERAL:\r\n    case NodeKind.NULL:\r\n    case NodeKind.TRUE:\r\n    case NodeKind.FALSE: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Checks if a node might be callable. */\r\nexport function nodeIsCallable(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.IDENTIFIER:\r\n    case NodeKind.CALL:\r\n    case NodeKind.ELEMENTACCESS:\r\n    case NodeKind.PROPERTYACCESS: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Checks if a node might be callable with generic arguments. */\r\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\r\n  switch (kind) {\r\n    case NodeKind.IDENTIFIER:\r\n    case NodeKind.PROPERTYACCESS: return true;\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n  /** Node kind indicator. */\r\n  kind: NodeKind;\r\n  /** Source range. */\r\n  range: Range;\r\n  /** Parent node. */\r\n  parent: Node | null = null;\r\n  /** Common flags indicating specific traits. */\r\n  flags: CommonFlags = CommonFlags.NONE;\r\n\r\n  /** Tests if this node has the specified flag or flags. */\r\n  is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this node has one of the specified flags. */\r\n  isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n  /** Sets a specific flag or flags. */\r\n  set(flag: CommonFlags): void { this.flags |= flag; }\r\n\r\n  // types\r\n\r\n  static createType(\r\n    name: IdentifierExpression,\r\n    typeArguments: CommonTypeNode[] | null,\r\n    isNullable: bool,\r\n    range: Range\r\n  ): TypeNode {\r\n    var type = new TypeNode();\r\n    type.range = range;\r\n    type.name = name; name.parent = type;\r\n    type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\r\n    type.isNullable = isNullable;\r\n    return type;\r\n  }\r\n\r\n  static createOmittedType(\r\n    range: Range\r\n  ): TypeNode {\r\n    return Node.createType(\r\n      Node.createIdentifierExpression(\"\", range),\r\n      null,\r\n      false,\r\n      range\r\n    );\r\n  }\r\n\r\n  static createTypeParameter(\r\n    name: IdentifierExpression,\r\n    extendsType: TypeNode | null,\r\n    range: Range\r\n  ): TypeParameterNode {\r\n    var elem = new TypeParameterNode();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n    return elem;\r\n  }\r\n\r\n  static createParameter(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode,\r\n    initializer: Expression | null,\r\n    kind: ParameterKind,\r\n    range: Range\r\n  ): ParameterNode {\r\n    var elem = new ParameterNode();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    elem.type = type; if (type) type.parent = elem;\r\n    elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n    elem.parameterKind = kind;\r\n    return elem;\r\n  }\r\n\r\n  static createSignature(\r\n    parameters: ParameterNode[],\r\n    returnType: CommonTypeNode,\r\n    explicitThisType: TypeNode | null,\r\n    isNullable: bool,\r\n    range: Range\r\n  ): SignatureNode {\r\n    var sig = new SignatureNode();\r\n    sig.range = range;\r\n    sig.parameters = parameters; setParent(parameters, sig);\r\n    sig.returnType = returnType; returnType.parent = sig;\r\n    sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\r\n    sig.isNullable = isNullable;\r\n    return sig;\r\n  }\r\n\r\n  // special\r\n\r\n  static createDecorator(\r\n    name: Expression,\r\n    args: Expression[] | null,\r\n    range: Range\r\n  ): DecoratorNode {\r\n    var stmt = new DecoratorNode();\r\n    stmt.range = range;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.arguments = args; if (args) setParent(args, stmt);\r\n    stmt.decoratorKind = decoratorNameToKind(name);\r\n    return stmt;\r\n  }\r\n\r\n  static createComment(\r\n    text: string,\r\n    kind: CommentKind,\r\n    range: Range\r\n  ): CommentNode {\r\n    var node = new CommentNode();\r\n    node.range = range;\r\n    node.commentKind = kind;\r\n    node.text = text;\r\n    return node;\r\n  }\r\n\r\n  // expressions\r\n\r\n  static createIdentifierExpression(\r\n    name: string,\r\n    range: Range\r\n  ): IdentifierExpression {\r\n    var expr = new IdentifierExpression();\r\n    expr.range = range;\r\n    expr.text = name;\r\n    return expr;\r\n  }\r\n\r\n  static createEmptyIdentifierExpression(\r\n    range: Range\r\n  ): IdentifierExpression {\r\n    var expr = new IdentifierExpression();\r\n    expr.range = range;\r\n    expr.text = \"\";\r\n    return expr;\r\n  }\r\n\r\n  static createArrayLiteralExpression(\r\n    elements: (Expression | null)[],\r\n    range: Range\r\n  ): ArrayLiteralExpression {\r\n    var expr = new ArrayLiteralExpression();\r\n    expr.range = range;\r\n    expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createAssertionExpression(\r\n    assertionKind: AssertionKind,\r\n    expression: Expression,\r\n    toType: CommonTypeNode,\r\n    range: Range\r\n  ): AssertionExpression {\r\n    var expr = new AssertionExpression();\r\n    expr.range = range;\r\n    expr.assertionKind = assertionKind;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.toType = toType; toType.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createBinaryExpression(\r\n    operator: Token,\r\n    left: Expression,\r\n    right: Expression,\r\n    range: Range\r\n  ): BinaryExpression {\r\n    var expr = new BinaryExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.left = left; left.parent = expr;\r\n    expr.right = right; right.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createCallExpression(\r\n    expression: Expression,\r\n    typeArgs: CommonTypeNode[] | null,\r\n    args: Expression[],\r\n    range: Range\r\n  ): CallExpression {\r\n    var expr = new CallExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n    expr.arguments = args; setParent(args, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createClassExpression(\r\n    declaration: ClassDeclaration\r\n  ): ClassExpression {\r\n    var expr = new ClassExpression();\r\n    expr.range = declaration.range;\r\n    expr.declaration = declaration;\r\n    return expr;\r\n  }\r\n\r\n  static createCommaExpression(\r\n    expressions: Expression[],\r\n    range: Range\r\n  ): CommaExpression {\r\n    var expr = new CommaExpression();\r\n    expr.range = range;\r\n    expr.expressions = expressions; setParent(expressions, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createConstructorExpression(\r\n    range: Range\r\n  ): ConstructorExpression {\r\n    var expr = new ConstructorExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createElementAccessExpression(\r\n    expression: Expression,\r\n    element: Expression,\r\n    range: Range\r\n  ): ElementAccessExpression {\r\n    var expr = new ElementAccessExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.elementExpression = element; element.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createFalseExpression(\r\n    range: Range\r\n  ): FalseExpression {\r\n    var expr = new FalseExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createFloatLiteralExpression(\r\n    value: f64,\r\n    range: Range\r\n  ): FloatLiteralExpression {\r\n    var expr = new FloatLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createFunctionExpression(\r\n    declaration: FunctionDeclaration\r\n  ): FunctionExpression {\r\n    var expr = new FunctionExpression();\r\n    expr.flags = declaration.flags & CommonFlags.ARROW;\r\n    expr.range = declaration.range;\r\n    expr.declaration = declaration;\r\n    return expr;\r\n  }\r\n\r\n  static createInstanceOfExpression(\r\n    expression: Expression,\r\n    isType: CommonTypeNode,\r\n    range: Range\r\n  ): InstanceOfExpression {\r\n    var expr = new InstanceOfExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.isType = isType; isType.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createIntegerLiteralExpression(\r\n    value: I64,\r\n    range: Range\r\n  ): IntegerLiteralExpression {\r\n    var expr = new IntegerLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createNewExpression(\r\n    expression: Expression,\r\n    typeArgs: CommonTypeNode[] | null,\r\n    args: Expression[],\r\n    range: Range\r\n  ): NewExpression {\r\n    var expr = new NewExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n    expr.arguments = args; setParent(args, expr);\r\n    return expr;\r\n  }\r\n\r\n  static createNullExpression(\r\n    range: Range\r\n  ): NullExpression {\r\n    var expr = new NullExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createParenthesizedExpression(\r\n    expression: Expression,\r\n    range: Range\r\n  ): ParenthesizedExpression {\r\n    var expr = new ParenthesizedExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createPropertyAccessExpression(\r\n    expression: Expression,\r\n    property: IdentifierExpression,\r\n    range: Range\r\n  ): PropertyAccessExpression {\r\n    var expr = new PropertyAccessExpression();\r\n    expr.range = range;\r\n    expr.expression = expression; expression.parent = expr;\r\n    expr.property = property; property.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createRegexpLiteralExpression(\r\n    pattern: string,\r\n    flags: string,\r\n    range: Range\r\n  ): RegexpLiteralExpression {\r\n    var expr = new RegexpLiteralExpression();\r\n    expr.range = range;\r\n    expr.pattern = pattern;\r\n    expr.patternFlags = flags;\r\n    return expr;\r\n  }\r\n\r\n  static createTernaryExpression(\r\n    condition: Expression,\r\n    ifThen: Expression,\r\n    ifElse: Expression,\r\n    range: Range\r\n  ): TernaryExpression {\r\n    var expr = new TernaryExpression();\r\n    expr.range = range;\r\n    expr.condition = condition; condition.parent = expr;\r\n    expr.ifThen = ifThen; ifThen.parent = expr;\r\n    expr.ifElse = ifElse; ifElse.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createStringLiteralExpression(\r\n    value: string,\r\n    range: Range\r\n  ): StringLiteralExpression {\r\n    var expr = new StringLiteralExpression();\r\n    expr.range = range;\r\n    expr.value = value;\r\n    return expr;\r\n  }\r\n\r\n  static createSuperExpression(\r\n    range: Range\r\n  ): SuperExpression {\r\n    var expr = new SuperExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createThisExpression(\r\n    range: Range\r\n  ): ThisExpression {\r\n    var expr = new ThisExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createTrueExpression(\r\n    range: Range\r\n  ): TrueExpression {\r\n    var expr = new TrueExpression();\r\n    expr.range = range;\r\n    return expr;\r\n  }\r\n\r\n  static createUnaryPostfixExpression(\r\n    operator: Token,\r\n    operand: Expression,\r\n    range: Range\r\n  ): UnaryPostfixExpression {\r\n    var expr = new UnaryPostfixExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.operand = operand; operand.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  static createUnaryPrefixExpression(\r\n    operator: Token,\r\n    operand: Expression,\r\n    range: Range\r\n  ): UnaryPrefixExpression {\r\n    var expr = new UnaryPrefixExpression();\r\n    expr.range = range;\r\n    expr.operator = operator;\r\n    expr.operand = operand; operand.parent = expr;\r\n    return expr;\r\n  }\r\n\r\n  // statements\r\n\r\n  static createBlockStatement(\r\n    statements: Statement[],\r\n    range: Range\r\n  ): BlockStatement {\r\n    var stmt = new BlockStatement();\r\n    stmt.range = range;\r\n    stmt.statements = statements; setParent(statements, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createBreakStatement(\r\n    label: IdentifierExpression | null,\r\n    range: Range\r\n  ): BreakStatement {\r\n    var stmt = new BreakStatement();\r\n    stmt.range = range;\r\n    stmt.label = label; if (label) label.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createClassDeclaration(\r\n    identifier: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[],\r\n    extendsType: TypeNode | null, // can't be a function\r\n    implementsTypes: TypeNode[] | null, // can't be functions\r\n    members: DeclarationStatement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): ClassDeclaration {\r\n    var stmt = new ClassDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = identifier; identifier.parent = stmt;\r\n    stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n    stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n    stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createContinueStatement(\r\n    label: IdentifierExpression | null,\r\n    range: Range\r\n  ): ContinueStatement {\r\n    var stmt = new ContinueStatement();\r\n    stmt.range = range;\r\n    stmt.label = label; if (label) label.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createDoStatement(\r\n    statement: Statement,\r\n    condition: Expression,\r\n    range: Range\r\n  ): DoStatement {\r\n    var stmt = new DoStatement();\r\n    stmt.range = range;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createEmptyStatement(\r\n    range: Range\r\n  ): EmptyStatement {\r\n    var stmt = new EmptyStatement();\r\n    stmt.range = range;\r\n    return stmt;\r\n  }\r\n\r\n  static createEnumDeclaration(\r\n    name: IdentifierExpression,\r\n    members: EnumValueDeclaration[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): EnumDeclaration {\r\n    var stmt = new EnumDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.values = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createEnumValueDeclaration(\r\n    name: IdentifierExpression,\r\n    value: Expression | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): EnumValueDeclaration {\r\n    var stmt = new EnumValueDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.value = value; if (value) value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createExportStatement(\r\n    members: ExportMember[] | null,\r\n    path: StringLiteralExpression | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): ExportStatement {\r\n    var stmt = new ExportStatement();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.members = members; if (members) setParent(members, stmt);\r\n    stmt.path = path;\r\n    if (path) {\r\n      let normalizedPath = normalizePath(path.value);\r\n      if (path.value.startsWith(\".\")) { // relative\r\n        stmt.normalizedPath = resolvePath(\r\n          normalizedPath,\r\n          range.source.normalizedPath\r\n        );\r\n      } else { // absolute\r\n        stmt.normalizedPath = normalizedPath;\r\n      }\r\n      stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    } else {\r\n      stmt.normalizedPath = null;\r\n      stmt.internalPath = null;\r\n    }\r\n    return stmt;\r\n  }\r\n\r\n  static createExportImportStatement(\r\n    name: IdentifierExpression,\r\n    externalName: IdentifierExpression,\r\n    range: Range\r\n  ): ExportImportStatement {\r\n    var stmt = new ExportImportStatement();\r\n    stmt.range = range;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.externalName = externalName; externalName.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createExportMember(\r\n    name: IdentifierExpression,\r\n    externalName: IdentifierExpression | null,\r\n    range: Range\r\n  ): ExportMember {\r\n    var elem = new ExportMember();\r\n    elem.range = range;\r\n    elem.name = name; name.parent = elem;\r\n    if (!externalName) {\r\n      externalName = name;\r\n    } else {\r\n      externalName.parent = elem;\r\n    }\r\n    elem.externalName = externalName;\r\n    return elem;\r\n  }\r\n\r\n  static createExpressionStatement(\r\n    expression: Expression\r\n  ): ExpressionStatement {\r\n    var stmt = new ExpressionStatement();\r\n    stmt.range = expression.range;\r\n    stmt.expression = expression; expression.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createIfStatement(\r\n    condition: Expression,\r\n    ifTrue: Statement,\r\n    ifFalse: Statement | null,\r\n    range: Range\r\n  ): IfStatement {\r\n    var stmt = new IfStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n    stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createImportStatement(\r\n    decls: ImportDeclaration[] | null,\r\n    path: StringLiteralExpression,\r\n    range: Range\r\n  ): ImportStatement {\r\n    var stmt = new ImportStatement();\r\n    stmt.range = range;\r\n    stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n    stmt.namespaceName = null;\r\n    stmt.path = path;\r\n    var normalizedPath = normalizePath(path.value);\r\n    if (path.value.startsWith(\".\")) { // relative in project\r\n      stmt.normalizedPath = resolvePath(\r\n        normalizedPath,\r\n        range.source.normalizedPath\r\n      );\r\n    } else { // absolute in library\r\n      if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\r\n        normalizedPath = LIBRARY_PREFIX + normalizedPath;\r\n      }\r\n      stmt.normalizedPath = normalizedPath;\r\n    }\r\n    stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    return stmt;\r\n  }\r\n\r\n  static createImportStatementWithWildcard(\r\n    identifier: IdentifierExpression,\r\n    path: StringLiteralExpression,\r\n    range: Range\r\n  ): ImportStatement {\r\n    var stmt = new ImportStatement();\r\n    stmt.range = range;\r\n    stmt.declarations = null;\r\n    stmt.namespaceName = identifier;\r\n    stmt.path = path;\r\n    stmt.normalizedPath = resolvePath(\r\n      normalizePath(path.value),\r\n      range.source.normalizedPath\r\n    );\r\n    stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n    return stmt;\r\n  }\r\n\r\n  static createImportDeclaration(\r\n    externalName: IdentifierExpression,\r\n    name: IdentifierExpression | null,\r\n    range: Range\r\n  ): ImportDeclaration {\r\n    var elem = new ImportDeclaration();\r\n    elem.range = range;\r\n    elem.externalName = externalName; externalName.parent = elem;\r\n    if (!name) {\r\n      name = externalName;\r\n    } else {\r\n      name.parent = elem;\r\n    }\r\n    elem.name = name;\r\n    return elem;\r\n  }\r\n\r\n  static createInterfaceDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[],\r\n    extendsType: TypeNode | null, // can't be a function\r\n    members: DeclarationStatement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): InterfaceDeclaration {\r\n    var stmt = new InterfaceDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createFieldDeclaration(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode | null,\r\n    initializer: Expression | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): FieldDeclaration {\r\n    var stmt = new FieldDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.type = type; if (type) type.parent = stmt;\r\n    stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createForStatement(\r\n    initializer: Statement | null,\r\n    condition: Expression | null,\r\n    incrementor: Expression | null,\r\n    statement: Statement,\r\n    range: Range\r\n  ): ForStatement {\r\n    var stmt = new ForStatement();\r\n    stmt.range = range;\r\n    stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n    stmt.condition = condition; if (condition) condition.parent = stmt;\r\n    stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createFunctionDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    signature: SignatureNode,\r\n    body: Statement | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): FunctionDeclaration {\r\n    var stmt = new FunctionDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.signature = signature; signature.parent = stmt;\r\n    stmt.body = body; if (body) body.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createMethodDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    signature: SignatureNode,\r\n    body: Statement | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): MethodDeclaration {\r\n    var stmt = new MethodDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.signature = signature; signature.parent = stmt;\r\n    stmt.body = body; if (body) body.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createNamespaceDeclaration(\r\n    name: IdentifierExpression,\r\n    members: Statement[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): NamespaceDeclaration {\r\n    var stmt = new NamespaceDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.members = members; setParent(members, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createReturnStatement(\r\n    value: Expression | null,\r\n    range: Range\r\n  ): ReturnStatement {\r\n    var stmt = new ReturnStatement();\r\n    stmt.range = range;\r\n    stmt.value = value; if (value) value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createSwitchStatement(\r\n    condition: Expression,\r\n    cases: SwitchCase[],\r\n    range: Range\r\n  ): SwitchStatement {\r\n    var stmt = new SwitchStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.cases = cases; setParent(cases, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createSwitchCase(\r\n    label: Expression | null,\r\n    statements: Statement[],\r\n    range: Range\r\n  ): SwitchCase {\r\n    var elem = new SwitchCase();\r\n    elem.range = range;\r\n    elem.label = label; if (label) label.parent = elem;\r\n    elem.statements = statements; setParent(statements, elem);\r\n    return elem;\r\n  }\r\n\r\n  static createThrowStatement(\r\n    value: Expression,\r\n    range: Range\r\n  ): ThrowStatement {\r\n    var stmt = new ThrowStatement();\r\n    stmt.range = range;\r\n    stmt.value = value; value.parent = stmt;\r\n    return stmt;\r\n  }\r\n\r\n  static createTryStatement(\r\n    statements: Statement[],\r\n    catchVariable: IdentifierExpression | null,\r\n    catchStatements: Statement[] | null,\r\n    finallyStatements: Statement[] | null,\r\n    range: Range\r\n  ): TryStatement {\r\n    var stmt = new TryStatement();\r\n    stmt.range = range;\r\n    stmt.statements = statements; setParent(statements, stmt);\r\n    stmt.catchVariable = catchVariable;\r\n    if (catchVariable) catchVariable.parent = stmt;\r\n    stmt.catchStatements = catchStatements;\r\n    if (catchStatements) setParent(catchStatements, stmt);\r\n    stmt.finallyStatements = finallyStatements;\r\n    if (finallyStatements) setParent(finallyStatements, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createTypeDeclaration(\r\n    name: IdentifierExpression,\r\n    typeParameters: TypeParameterNode[] | null,\r\n    alias: CommonTypeNode,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): TypeDeclaration {\r\n    var stmt = new TypeDeclaration();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.name = name; name.parent = stmt;\r\n    stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n    stmt.type = alias; alias.parent = stmt;\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createVariableStatement(\r\n    declarations: VariableDeclaration[],\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): VariableStatement {\r\n    var stmt = new VariableStatement();\r\n    stmt.range = range;\r\n    stmt.flags = flags;\r\n    stmt.declarations = declarations; setParent(declarations, stmt);\r\n    stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n    return stmt;\r\n  }\r\n\r\n  static createVariableDeclaration(\r\n    name: IdentifierExpression,\r\n    type: CommonTypeNode | null,\r\n    initializer: Expression | null,\r\n    decorators: DecoratorNode[] | null,\r\n    flags: CommonFlags,\r\n    range: Range\r\n  ): VariableDeclaration {\r\n    var elem = new VariableDeclaration();\r\n    elem.range = range;\r\n    elem.flags = flags;\r\n    elem.name = name; name.parent = elem;\r\n    elem.type = type; if (type) type.parent = elem;\r\n    elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n    elem.decorators = decorators; // inherited\r\n    return elem;\r\n  }\r\n\r\n  static createVoidStatement(\r\n    expression: Expression,\r\n    range: Range\r\n  ): VoidStatement {\r\n    var stmt = new VoidStatement();\r\n    stmt.range = range;\r\n    stmt.expression = expression;\r\n    return stmt;\r\n  }\r\n\r\n  static createWhileStatement(\r\n    condition: Expression,\r\n    statement: Statement,\r\n    range: Range\r\n  ): WhileStatement {\r\n    var stmt = new WhileStatement();\r\n    stmt.range = range;\r\n    stmt.condition = condition; condition.parent = stmt;\r\n    stmt.statement = statement; statement.parent = stmt;\r\n    return stmt;\r\n  }\r\n}\r\n\r\n// types\r\n\r\nexport abstract class CommonTypeNode extends Node {\r\n  // kind varies\r\n\r\n  /** Whether nullable or not. */\r\n  isNullable: bool;\r\n}\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends CommonTypeNode {\r\n  kind = NodeKind.TYPE;\r\n\r\n  /** Identifier reference. */\r\n  name: IdentifierExpression;\r\n  /** Type argument references. */\r\n  typeArguments: CommonTypeNode[] | null;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameterNode extends Node {\r\n  kind = NodeKind.TYPEPARAMETER;\r\n\r\n  /** Identifier reference. */\r\n  name: IdentifierExpression;\r\n  /** Extended type reference, if any. */\r\n  extendsType: TypeNode | null; // can't be a function\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n  /** No specific flags. */\r\n  DEFAULT,\r\n  /** Is an optional parameter. */\r\n  OPTIONAL,\r\n  /** Is a rest parameter. */\r\n  REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class ParameterNode extends Node {\r\n  kind = NodeKind.PARAMETER;\r\n\r\n  /** Parameter kind. */\r\n  parameterKind: ParameterKind;\r\n  /** Parameter name. */\r\n  name: IdentifierExpression;\r\n  /** Parameter type. */\r\n  type: CommonTypeNode;\r\n  /** Initializer expression, if present. */\r\n  initializer: Expression | null;\r\n  /** Implicit field declaration, if applicable. */\r\n  implicitFieldDeclaration: FieldDeclaration | null = null;\r\n}\r\n\r\n/** Represents a function signature. */\r\nexport class SignatureNode extends CommonTypeNode {\r\n  kind = NodeKind.SIGNATURE;\r\n\r\n  /** Accepted parameters. */\r\n  parameters: ParameterNode[];\r\n  /** Return type. */\r\n  returnType: CommonTypeNode;\r\n  /** Explicitly provided this type, if any. */\r\n  explicitThisType: TypeNode | null; // can't be a function\r\n}\r\n\r\n// special\r\n\r\n/** Built-in decorator kinds. */\r\nexport enum DecoratorKind {\r\n  CUSTOM,\r\n  GLOBAL,\r\n  OPERATOR,\r\n  OPERATOR_BINARY,\r\n  OPERATOR_PREFIX,\r\n  OPERATOR_POSTFIX,\r\n  UNMANAGED,\r\n  SEALED,\r\n  INLINE,\r\n  EXTERNAL\r\n}\r\n\r\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\r\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\r\n  // @global, @inline, @operator, @sealed, @unmanaged\r\n  if (name.kind == NodeKind.IDENTIFIER) {\r\n    let nameStr = (<IdentifierExpression>name).text;\r\n    assert(nameStr.length);\r\n    switch (nameStr.charCodeAt(0)) {\r\n      case CharCode.e: {\r\n        if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\r\n        break;\r\n      }\r\n      case CharCode.g: {\r\n        if (nameStr == \"global\") return DecoratorKind.GLOBAL;\r\n        break;\r\n      }\r\n      case CharCode.i: {\r\n        if (nameStr == \"inline\") return DecoratorKind.INLINE;\r\n        break;\r\n      }\r\n      case CharCode.o: {\r\n        if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\r\n        break;\r\n      }\r\n      case CharCode.s: {\r\n        if (nameStr == \"sealed\") return DecoratorKind.SEALED;\r\n        break;\r\n      }\r\n      case CharCode.u: {\r\n        if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\r\n        break;\r\n      }\r\n    }\r\n  } else if (\r\n    name.kind == NodeKind.PROPERTYACCESS &&\r\n    (<PropertyAccessExpression>name).expression.kind == NodeKind.IDENTIFIER\r\n  ) {\r\n    let nameStr = (<IdentifierExpression>(<PropertyAccessExpression>name).expression).text;\r\n    assert(nameStr.length);\r\n    let propStr = (<PropertyAccessExpression>name).property.text;\r\n    assert(propStr.length);\r\n    // @operator.binary, @operator.prefix, @operator.postfix\r\n    if (nameStr == \"operator\") {\r\n      switch (propStr.charCodeAt(0)) {\r\n        case CharCode.b: {\r\n          if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\r\n          break;\r\n        }\r\n        case CharCode.p: {\r\n          switch (propStr) {\r\n            case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\r\n            case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return DecoratorKind.CUSTOM;\r\n}\r\n\r\n/** Represents a decorator. */\r\nexport class DecoratorNode extends Node {\r\n  kind = NodeKind.DECORATOR;\r\n\r\n  /** Built-in kind, if applicable. */\r\n  decoratorKind: DecoratorKind;\r\n  /** Name expression. */\r\n  name: Expression;\r\n  /** Argument expressions. */\r\n  arguments: Expression[] | null;\r\n}\r\n\r\n/** Comment kinds. */\r\nexport enum CommentKind {\r\n  /** Line comment. */\r\n  LINE,\r\n  /** Triple-slash comment. */\r\n  TRIPLE,\r\n  /** Block comment. */\r\n  BLOCK\r\n}\r\n\r\n/** Represents a comment. */\r\nexport class CommentNode extends Node {\r\n  kind = NodeKind.COMMENT;\r\n\r\n  /** Comment kind. */\r\n  commentKind: CommentKind;\r\n  /** Comment text. */\r\n  text: string;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n  kind = NodeKind.IDENTIFIER;\r\n\r\n  /** Textual name. */\r\n  text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport enum LiteralKind {\r\n  FLOAT,\r\n  INTEGER,\r\n  STRING,\r\n  REGEXP,\r\n  ARRAY,\r\n  OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n  kind = NodeKind.LITERAL;\r\n\r\n  /** Specific literal kind. */\r\n  literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.ARRAY;\r\n\r\n  /** Nested element expressions. */\r\n  elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport enum AssertionKind {\r\n  PREFIX,\r\n  AS\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n  kind = NodeKind.ASSERTION;\r\n\r\n  /** Specific kind of this assertion. */\r\n  assertionKind: AssertionKind;\r\n  /** Expression being asserted. */\r\n  expression: Expression;\r\n  /** Target type. */\r\n  toType: CommonTypeNode;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n  kind = NodeKind.BINARY;\r\n\r\n  /** Operator token. */\r\n  operator: Token;\r\n  /** Left-hand side expression */\r\n  left: Expression;\r\n  /** Right-hand side expression. */\r\n  right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n  kind = NodeKind.CALL;\r\n\r\n  /** Called expression. Usually an identifier or property access expression. */\r\n  expression: Expression;\r\n  /** Provided type arguments. */\r\n  typeArguments: CommonTypeNode[] | null;\r\n  /** Provided arguments. */\r\n  arguments: Expression[];\r\n}\r\n\r\n/** Represents a class expression using the 'class' keyword. */\r\nexport class ClassExpression extends Expression {\r\n  kind = NodeKind.CLASS;\r\n\r\n  /** Inline class declaration. */\r\n  declaration: ClassDeclaration;\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n  kind = NodeKind.COMMA;\r\n\r\n  /** Sequential expressions. */\r\n  expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n  kind = NodeKind.CONSTRUCTOR;\r\n  text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n  kind = NodeKind.ELEMENTACCESS;\r\n\r\n  /** Expression being accessed. */\r\n  expression: Expression;\r\n  /** Element of the expression being accessed. */\r\n  elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.FLOAT;\r\n\r\n  /** Float value. */\r\n  value: f64;\r\n}\r\n\r\n/** Represents a function expression using the 'function' keyword. */\r\nexport class FunctionExpression extends Expression {\r\n  kind = NodeKind.FUNCTION;\r\n\r\n  /** Inline function declaration. */\r\n  declaration: FunctionDeclaration;\r\n}\r\n\r\n/** Represents an `instanceof` expression. */\r\nexport class InstanceOfExpression extends Expression {\r\n  kind = NodeKind.INSTANCEOF;\r\n\r\n  /** Expression being asserted. */\r\n  expression: Expression;\r\n  /** Type to test for. */\r\n  isType: CommonTypeNode;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.INTEGER;\r\n\r\n  /** Integer value. */\r\n  value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n  kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n  kind = NodeKind.NULL;\r\n  text = \"null\";\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n  kind = NodeKind.PARENTHESIZED;\r\n\r\n  /** Expression in parenthesis. */\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n  kind = NodeKind.PROPERTYACCESS;\r\n\r\n  /** Expression being accessed. */\r\n  expression: Expression;\r\n  /** Property of the expression being accessed. */\r\n  property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.REGEXP;\r\n\r\n  /** Regular expression pattern. */\r\n  pattern: string;\r\n  /** Regular expression flags. */\r\n  patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n  kind = NodeKind.TERNARY;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Expression executed when condition is `true`. */\r\n  ifThen: Expression;\r\n  /** Expression executed when condition is `false`. */\r\n  ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n  literalKind = LiteralKind.STRING;\r\n\r\n  /** String value without quotes. */\r\n  value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n  kind = NodeKind.SUPER;\r\n  text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n  kind = NodeKind.THIS;\r\n  text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n  kind = NodeKind.TRUE;\r\n  text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n  kind = NodeKind.FALSE;\r\n  text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n  /** Operator token. */\r\n  operator: Token;\r\n  /** Operand expression. */\r\n  operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n  kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n  kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\nexport function isLastStatement(statement: Statement): bool {\r\n  var parent = assert(statement.parent);\r\n  if (parent.kind == NodeKind.BLOCK) {\r\n    let statements = (<BlockStatement>parent).statements;\r\n    if (statements[statements.length - 1] === statement) {\r\n      switch (assert(parent.parent).kind) {\r\n        case NodeKind.FUNCTIONDECLARATION:\r\n        case NodeKind.METHODDECLARATION: return true;\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n  /** Default source. Usually imported from an entry file. */\r\n  DEFAULT,\r\n  /** Entry file. */\r\n  ENTRY,\r\n  /** Library file. */\r\n  LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n  kind = NodeKind.SOURCE;\r\n  parent = null;\r\n\r\n  /** Source kind. */\r\n  sourceKind: SourceKind;\r\n  /** Normalized path. */\r\n  normalizedPath: string;\r\n  /** Path used internally. */\r\n  internalPath: string;\r\n  /** Simple path (last part without extension). */\r\n  simplePath: string;\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n  /** Full source text. */\r\n  text: string;\r\n  /** Tokenizer reference. */\r\n  tokenizer: Tokenizer | null = null;\r\n  /** Source map index. */\r\n  debugInfoIndex: i32 = -1;\r\n  /** Re-exported sources. */\r\n  exportPaths: Set<string> | null = null;\r\n\r\n  /** Constructs a new source node. */\r\n  constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n    super();\r\n    this.sourceKind = kind;\r\n    this.normalizedPath = normalizedPath;\r\n    var internalPath = mangleInternalPath(this.normalizedPath);\r\n    this.internalPath = internalPath;\r\n    var pos = internalPath.lastIndexOf(PATH_DELIMITER);\r\n    this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\r\n    this.statements = new Array();\r\n    this.range = new Range(this, 0, text.length);\r\n    this.text = text;\r\n  }\r\n\r\n  /** Tests if this source is an entry file. */\r\n  get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n  /** Tests if this source is a stdlib file. */\r\n  get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n  /** Simple name being declared. */\r\n  name: IdentifierExpression;\r\n  /** Array of decorators. */\r\n  decorators: DecoratorNode[] | null = null;\r\n\r\n  protected cachedProgramLevelInternalName: string | null = null;\r\n  protected cachedFileLevelInternalName: string | null = null;\r\n\r\n  /** Gets the mangled program-level internal name of this declaration. */\r\n  get programLevelInternalName(): string {\r\n    if (!this.cachedProgramLevelInternalName) {\r\n      this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n    }\r\n    return this.cachedProgramLevelInternalName;\r\n  }\r\n\r\n  /** Gets the mangled file-level internal name of this declaration. */\r\n  get fileLevelInternalName(): string {\r\n    if (!this.cachedFileLevelInternalName) {\r\n      this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n    }\r\n    return this.cachedFileLevelInternalName;\r\n  }\r\n\r\n  /** Tests if this is a top-level declaration within its source file. */\r\n  get isTopLevel(): bool {\r\n    var parent = this.parent;\r\n    if (!parent) {\r\n      return false;\r\n    }\r\n    if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n      return false;\r\n    }\r\n    return parent.kind == NodeKind.SOURCE;\r\n  }\r\n\r\n  /** Tests if this declaration is a top-level export within its source file. */\r\n  get isTopLevelExport(): bool {\r\n    var parent = this.parent;\r\n    if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n      return false;\r\n    }\r\n    if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n      return this.is(CommonFlags.EXPORT) && (<NamespaceDeclaration>parent).isTopLevelExport;\r\n    }\r\n    if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n      return this.is(CommonFlags.STATIC) && (<ClassDeclaration>parent).isTopLevelExport;\r\n    }\r\n    return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\r\n  }\r\n\r\n  /** Tests if this declaration needs an explicit export. */\r\n  needsExplicitExport(member: ExportMember): bool {\r\n    // This is necessary because module-level exports are automatically created\r\n    // for top level declarations of all sorts. This function essentially tests\r\n    // that there isn't a otherwise duplicate top-level export already.\r\n    return (\r\n      member.name.text != member.externalName.text || // if aliased\r\n      this.range.source != member.range.source ||     // if a re-export\r\n      !this.isTopLevelExport                          // if not top-level\r\n    );\r\n  }\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n  /** Variable type. */\r\n  type: CommonTypeNode | null;\r\n  /** Variable initializer. */\r\n  initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n  kind = NodeKind.BLOCK;\r\n\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n  kind = NodeKind.BREAK;\r\n\r\n  /** Target label, if applicable. */\r\n  label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.CLASSDECLARATION;\r\n\r\n  /** Accepted type parameters. */\r\n  typeParameters: TypeParameterNode[];\r\n  /** Base class type being extended, if any. */\r\n  extendsType: TypeNode | null; // can't be a function\r\n  /** Interface types being implemented, if any. */\r\n  implementsTypes: TypeNode[] | null; // can't be functions\r\n  /** Class member declarations. */\r\n  members: DeclarationStatement[];\r\n\r\n  get isGeneric(): bool {\r\n    var typeParameters = this.typeParameters;\r\n    return typeParameters != null && typeParameters.length > 0;\r\n  }\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n  kind = NodeKind.CONTINUE;\r\n\r\n  /** Target label, if applicable. */\r\n  label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n  kind = NodeKind.DO;\r\n\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n  /** Condition when to repeat. */\r\n  condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n  kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.ENUMDECLARATION;\r\n\r\n  /** Enum value declarations. */\r\n  values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.ENUMVALUEDECLARATION;\r\n  // name is inherited\r\n\r\n  /** Value expression. */\r\n  value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n  kind = NodeKind.EXPORTIMPORT;\r\n\r\n  /** Identifier being imported. */\r\n  name: IdentifierExpression;\r\n  /** Identifier being exported. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n  kind = NodeKind.EXPORTMEMBER;\r\n\r\n  /** Identifier being exported. */\r\n  name: IdentifierExpression;\r\n  /** Identifier seen when imported again. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n  kind = NodeKind.EXPORT;\r\n\r\n  /** Array of members if a set of named exports, or `null` if a filespace export. */\r\n  members: ExportMember[] | null;\r\n  /** Path being exported from, if applicable. */\r\n  path: StringLiteralExpression | null;\r\n  /** Normalized path, if `path` is set. */\r\n  normalizedPath: string | null;\r\n  /** Mangled internal path being referenced, if `path` is set. */\r\n  internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n  kind = NodeKind.EXPRESSION;\r\n\r\n  /** Expression being used as a statement.*/\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n  kind = NodeKind.FIELDDECLARATION;\r\n\r\n  /** Parameter index within the constructor, if applicable. */\r\n  parameterIndex: i32 = -1;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n  kind = NodeKind.FOR;\r\n\r\n  /**\r\n   * Initializer statement, if present.\r\n   * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n   */\r\n  initializer: Statement | null;\r\n  /** Condition expression, if present. */\r\n  condition: Expression | null;\r\n  /** Incrementor expression, if present. */\r\n  incrementor: Expression | null;\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n  /** Type parameters, if any. */\r\n  typeParameters: TypeParameterNode[] | null;\r\n  /** Function signature. */\r\n  signature: SignatureNode;\r\n  /** Body statement. Usually a block. */\r\n  body: Statement | null;\r\n\r\n  get isGeneric(): bool {\r\n    var typeParameters = this.typeParameters;\r\n    return typeParameters != null && typeParameters.length > 0;\r\n  }\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n  kind = NodeKind.IF;\r\n\r\n  /** Condition. */\r\n  condition: Expression;\r\n  /** Statement executed when condition is `true`. */\r\n  ifTrue: Statement;\r\n  /** Statement executed when condition is `false`. */\r\n  ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.IMPORTDECLARATION;\r\n\r\n  /** Identifier being imported. */\r\n  externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n  kind = NodeKind.IMPORT;\r\n\r\n  /** Array of member declarations or `null` if an asterisk import. */\r\n  declarations: ImportDeclaration[] | null;\r\n  /** Name of the local namespace, if an asterisk import. */\r\n  namespaceName: IdentifierExpression | null;\r\n  /** Path being imported from. */\r\n  path: StringLiteralExpression;\r\n  /** Normalized path. */\r\n  normalizedPath: string;\r\n  /** Mangled internal path being referenced. */\r\n  internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n  kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n  kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n  /** Array of namespace members. */\r\n  members: Statement[];\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n  kind = NodeKind.RETURN;\r\n\r\n  /** Value expression being returned, if present. */\r\n  value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n  kind = NodeKind.SWITCHCASE;\r\n\r\n  /** Label expression. `null` indicates the default case. */\r\n  label: Expression | null;\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n  kind = NodeKind.SWITCH;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Contained cases. */\r\n  cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n  kind = NodeKind.THROW;\r\n\r\n  /** Value expression being thrown. */\r\n  value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n  kind = NodeKind.TRY;\r\n\r\n  /** Contained statements. */\r\n  statements: Statement[];\r\n  /** Exception variable name, if a `catch` clause is present. */\r\n  catchVariable: IdentifierExpression | null;\r\n  /** Statements being executed on catch, if a `catch` clause is present. */\r\n  catchStatements: Statement[] | null;\r\n  /** Statements being executed afterwards, if a `finally` clause is present. */\r\n  finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n  kind = NodeKind.TYPEDECLARATION;\r\n\r\n  /** Type parameters, if any. */\r\n  typeParameters: TypeParameterNode[] | null;\r\n  /** Type being aliased. */\r\n  type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n  kind = NodeKind.VARIABLEDECLARATION;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n  kind = NodeKind.VARIABLE;\r\n\r\n  /** Array of decorators. */\r\n  decorators: DecoratorNode[] | null;\r\n  /** Array of member declarations. */\r\n  declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a void statement dropping an expression's value. */\r\nexport class VoidStatement extends Statement {\r\n  kind = NodeKind.VOID;\r\n\r\n  /** Expression being dropped. */\r\n  expression: Expression;\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n  kind = NodeKind.WHILE;\r\n\r\n  /** Condition expression. */\r\n  condition: Expression;\r\n  /** Statement being looped over. */\r\n  statement: Statement;\r\n}\r\n\r\n/** Finds the first decorator matching the specified kind. */\r\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\r\n  if (decorators) {\r\n    for (let i = 0, k = decorators.length; i < k; ++i) {\r\n      let decorator = decorators[i];\r\n      if (decorator.decoratorKind == kind) return decorator;\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n  var name = declaration.name.text;\r\n  var parent = declaration.parent;\r\n  if (!parent) return name;\r\n  if (\r\n    declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n    parent.kind == NodeKind.VARIABLE\r\n  ) { // skip over\r\n    if (!(parent = parent.parent)) return name;\r\n  }\r\n  if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n    return mangleInternalName(<ClassDeclaration>parent, asGlobal) + (\r\n      declaration.is(CommonFlags.STATIC)\r\n        ? STATIC_DELIMITER\r\n        : INSTANCE_DELIMITER\r\n    ) + name;\r\n  }\r\n  if (\r\n    parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n    parent.kind == NodeKind.ENUMDECLARATION\r\n  ) {\r\n    return mangleInternalName(<DeclarationStatement>parent, asGlobal) +\r\n           STATIC_DELIMITER + name;\r\n  }\r\n  return asGlobal\r\n    ? name\r\n    : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n  if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n  return path;\r\n}\r\n\r\n// Helpers\r\n\r\n/** Sets the parent node on an array of nodes. */\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n  for (let i = 0, k = nodes.length; i < k; ++i) {\r\n    nodes[i].parent = parent;\r\n  }\r\n}\r\n\r\n/** Sets the parent node on an array of nullable nodes. */\r\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\r\n  for (let i = 0, k = nodes.length; i < k; ++i) {\r\n    let node = nodes[i];\r\n    if (node) node.parent = parent;\r\n  }\r\n}\r\n","/**\r\n * Various compiler utilities.\r\n * @module util\r\n * @preferred\r\n *//***/\r\n\r\nexport * from \"./charcode\";\r\nexport * from \"./path\";\r\nexport * from \"./text\";\r\nexport * from \"./binary\";\r\n","/**\r\n * A thin wrapper around Binaryen's C-API.\r\n * @module module\r\n *//***/\r\n\r\nimport {\r\n  Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n  None = _BinaryenTypeNone(),\r\n  I32 = _BinaryenTypeInt32(),\r\n  I64 = _BinaryenTypeInt64(),\r\n  F32 = _BinaryenTypeFloat32(),\r\n  F64 =  _BinaryenTypeFloat64(),\r\n  Unreachable = _BinaryenTypeUnreachable(),\r\n  Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n  Invalid = _BinaryenInvalidId(),\r\n  Block = _BinaryenBlockId(),\r\n  If = _BinaryenIfId(),\r\n  Loop = _BinaryenLoopId(),\r\n  Break = _BinaryenBreakId(),\r\n  Switch = _BinaryenSwitchId(),\r\n  Call = _BinaryenCallId(),\r\n  CallImport = _BinaryenCallImportId(),\r\n  CallIndirect = _BinaryenCallIndirectId(),\r\n  GetLocal = _BinaryenGetLocalId(),\r\n  SetLocal = _BinaryenSetLocalId(),\r\n  GetGlobal = _BinaryenGetGlobalId(),\r\n  SetGlobal = _BinaryenSetGlobalId(),\r\n  Load = _BinaryenLoadId(),\r\n  Store = _BinaryenStoreId(),\r\n  Const = _BinaryenConstId(),\r\n  Unary = _BinaryenUnaryId(),\r\n  Binary = _BinaryenBinaryId(),\r\n  Select = _BinaryenSelectId(),\r\n  Drop = _BinaryenDropId(),\r\n  Return = _BinaryenReturnId(),\r\n  Host = _BinaryenHostId(),\r\n  Nop = _BinaryenNopId(),\r\n  Unreachable = _BinaryenUnreachableId(),\r\n  AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n  AtomicRMW = _BinaryenAtomicRMWId(),\r\n  AtomicWait = _BinaryenAtomicWaitId(),\r\n  AtomicWake = _BinaryenAtomicWakeId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n  ClzI32 = _BinaryenClzInt32(),\r\n  CtzI32 = _BinaryenCtzInt32(),\r\n  PopcntI32 = _BinaryenPopcntInt32(),\r\n  NegF32 = _BinaryenNegFloat32(),\r\n  AbsF32 = _BinaryenAbsFloat32(),\r\n  CeilF32 = _BinaryenCeilFloat32(),\r\n  FloorF32 = _BinaryenFloorFloat32(),\r\n  TruncF32 = _BinaryenTruncFloat32(),\r\n  NearestF32 = _BinaryenNearestFloat32(),\r\n  SqrtF32 = _BinaryenSqrtFloat32(),\r\n  EqzI32 = _BinaryenEqZInt32(),\r\n  ClzI64 = _BinaryenClzInt64(),\r\n  CtzI64 = _BinaryenCtzInt64(),\r\n  PopcntI64 = _BinaryenPopcntInt64(),\r\n  NegF64 = _BinaryenNegFloat64(),\r\n  AbsF64 = _BinaryenAbsFloat64(),\r\n  CeilF64 = _BinaryenCeilFloat64(),\r\n  FloorF64 = _BinaryenFloorFloat64(),\r\n  TruncF64 = _BinaryenTruncFloat64(),\r\n  NearestF64 = _BinaryenNearestFloat64(),\r\n  SqrtF64 = _BinaryenSqrtFloat64(),\r\n  EqzI64 = _BinaryenEqZInt64(),\r\n  ExtendI32 = _BinaryenExtendSInt32(),\r\n  ExtendU32 = _BinaryenExtendUInt32(),\r\n  WrapI64 = _BinaryenWrapInt64(),\r\n  TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n  TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n  TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n  TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n  TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n  TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n  TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n  TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n  ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n  ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n  ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n  ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n  ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n  ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n  ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n  ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n  ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n  ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n  PromoteF32 = _BinaryenPromoteFloat32(),\r\n  DemoteF64 = _BinaryenDemoteFloat64(),\r\n  ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n  ReinterpretI64 = _BinaryenReinterpretInt64(),\r\n\r\n  // see: https://github.com/WebAssembly/sign-extension-ops\r\n  ExtendI8ToI32 = _BinaryenExtendS8Int32(),\r\n  ExtendI16ToI32 = _BinaryenExtendS16Int32(),\r\n  ExtendI8ToI64 = _BinaryenExtendS8Int64(),\r\n  ExtendI16ToI64 = _BinaryenExtendS16Int64(),\r\n  ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n  // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n  // TruncF32ToI32Sat\r\n  // TruncF32ToU32Sat\r\n  // TruncF64ToI32Sat\r\n  // TruncF64ToU32Sat\r\n  // TruncF32ToI64Sat\r\n  // TruncF32ToU64Sat\r\n  // TruncF64ToI64Sat\r\n  // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n  AddI32 = _BinaryenAddInt32(),\r\n  SubI32 = _BinaryenSubInt32(),\r\n  MulI32 = _BinaryenMulInt32(),\r\n  DivI32 = _BinaryenDivSInt32(),\r\n  DivU32 = _BinaryenDivUInt32(),\r\n  RemI32 = _BinaryenRemSInt32(),\r\n  RemU32 = _BinaryenRemUInt32(),\r\n  AndI32 = _BinaryenAndInt32(),\r\n  OrI32 = _BinaryenOrInt32(),\r\n  XorI32 = _BinaryenXorInt32(),\r\n  ShlI32 = _BinaryenShlInt32(),\r\n  ShrU32 = _BinaryenShrUInt32(),\r\n  ShrI32 = _BinaryenShrSInt32(),\r\n  RotlI32 = _BinaryenRotLInt32(),\r\n  RotrI32 = _BinaryenRotRInt32(),\r\n  EqI32 = _BinaryenEqInt32(),\r\n  NeI32 = _BinaryenNeInt32(),\r\n  LtI32 = _BinaryenLtSInt32(),\r\n  LtU32 = _BinaryenLtUInt32(),\r\n  LeI32 = _BinaryenLeSInt32(),\r\n  LeU32 = _BinaryenLeUInt32(),\r\n  GtI32 = _BinaryenGtSInt32(),\r\n  GtU32 = _BinaryenGtUInt32(),\r\n  GeI32 = _BinaryenGeSInt32(),\r\n  GeU32 = _BinaryenGeUInt32(),\r\n  AddI64 = _BinaryenAddInt64(),\r\n  SubI64 = _BinaryenSubInt64(),\r\n  MulI64 = _BinaryenMulInt64(),\r\n  DivI64 = _BinaryenDivSInt64(),\r\n  DivU64 = _BinaryenDivUInt64(),\r\n  RemI64 = _BinaryenRemSInt64(),\r\n  RemU64 = _BinaryenRemUInt64(),\r\n  AndI64 = _BinaryenAndInt64(),\r\n  OrI64 = _BinaryenOrInt64(),\r\n  XorI64 = _BinaryenXorInt64(),\r\n  ShlI64 = _BinaryenShlInt64(),\r\n  ShrU64 = _BinaryenShrUInt64(),\r\n  ShrI64 = _BinaryenShrSInt64(),\r\n  RotlI64 = _BinaryenRotLInt64(),\r\n  RotrI64 = _BinaryenRotRInt64(),\r\n  EqI64 = _BinaryenEqInt64(),\r\n  NeI64 = _BinaryenNeInt64(),\r\n  LtI64 = _BinaryenLtSInt64(),\r\n  LtU64 = _BinaryenLtUInt64(),\r\n  LeI64 = _BinaryenLeSInt64(),\r\n  LeU64 = _BinaryenLeUInt64(),\r\n  GtI64 = _BinaryenGtSInt64(),\r\n  GtU64 = _BinaryenGtUInt64(),\r\n  GeI64 = _BinaryenGeSInt64(),\r\n  GeU64 = _BinaryenGeUInt64(),\r\n  AddF32 = _BinaryenAddFloat32(),\r\n  SubF32 = _BinaryenSubFloat32(),\r\n  MulF32 = _BinaryenMulFloat32(),\r\n  DivF32 = _BinaryenDivFloat32(),\r\n  CopysignF32 = _BinaryenCopySignFloat32(),\r\n  MinF32 = _BinaryenMinFloat32(),\r\n  MaxF32 = _BinaryenMaxFloat32(),\r\n  EqF32 = _BinaryenEqFloat32(),\r\n  NeF32 = _BinaryenNeFloat32(),\r\n  LtF32 = _BinaryenLtFloat32(),\r\n  LeF32 = _BinaryenLeFloat32(),\r\n  GtF32 = _BinaryenGtFloat32(),\r\n  GeF32 = _BinaryenGeFloat32(),\r\n  AddF64 = _BinaryenAddFloat64(),\r\n  SubF64 = _BinaryenSubFloat64(),\r\n  MulF64 = _BinaryenMulFloat64(),\r\n  DivF64 = _BinaryenDivFloat64(),\r\n  CopysignF64 = _BinaryenCopySignFloat64(),\r\n  MinF64 = _BinaryenMinFloat64(),\r\n  MaxF64 = _BinaryenMaxFloat64(),\r\n  EqF64 = _BinaryenEqFloat64(),\r\n  NeF64 = _BinaryenNeFloat64(),\r\n  LtF64 = _BinaryenLtFloat64(),\r\n  LeF64 = _BinaryenLeFloat64(),\r\n  GtF64 = _BinaryenGtFloat64(),\r\n  GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n  PageSize = _BinaryenPageSize(),\r\n  CurrentMemory = _BinaryenCurrentMemory(),\r\n  GrowMemory = _BinaryenGrowMemory(),\r\n  HasFeature = _BinaryenHasFeature(),\r\n\r\n  // see: https://github.com/WebAssembly/bulk-memory-operations\r\n  // MoveMemory\r\n  // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n  Add = _BinaryenAtomicRMWAdd(),\r\n  Sub = _BinaryenAtomicRMWSub(),\r\n  And = _BinaryenAtomicRMWAnd(),\r\n  Or = _BinaryenAtomicRMWOr(),\r\n  Xor = _BinaryenAtomicRMWXor(),\r\n  Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n  buffer: Uint8Array;\r\n  offset: I64;\r\n\r\n  static create(buffer: Uint8Array, offset: I64): MemorySegment {\r\n    var segment = new MemorySegment();\r\n    segment.buffer = buffer;\r\n    segment.offset = offset;\r\n    return segment;\r\n  }\r\n}\r\n\r\nexport class Module {\r\n\r\n  ref: ModuleRef;\r\n\r\n  private cachedByValue: usize;\r\n\r\n  /** Maximum number of pages when targeting WASM32. */\r\n  static readonly MAX_MEMORY_WASM32: Index = 0xffff;\r\n\r\n  /** Maximum number of pages when targeting WASM64. */\r\n  static readonly MAX_MEMORY_WASM64: Index = 0xffff; // TODO\r\n\r\n  static create(): Module {\r\n    var module = new Module();\r\n    module.ref = _BinaryenModuleCreate();\r\n    module.cachedByValue = allocate_memory(16);\r\n    return module;\r\n  }\r\n\r\n  static createFrom(buffer: Uint8Array): Module {\r\n    var cArr = allocU8Array(buffer);\r\n    try {\r\n      let module = new Module();\r\n      module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n      module.cachedByValue = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n      return module;\r\n    } finally {\r\n      free_memory(changetype<usize>(cArr));\r\n    }\r\n  }\r\n\r\n  private constructor() { }\r\n\r\n  // types\r\n\r\n  addFunctionType(\r\n    name: string,\r\n    result: NativeType,\r\n    paramTypes: NativeType[] | null\r\n  ): FunctionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  getFunctionTypeBySignature(\r\n    result: NativeType,\r\n    paramTypes: NativeType[] | null\r\n  ): FunctionTypeRef {\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  removeFunctionType(name: string): void {\r\n    var cStr = allocString(name);\r\n    try {\r\n      _BinaryenRemoveFunctionType(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  // constants\r\n\r\n  createI32(value: i32): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralInt32(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createF32(value: f32): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralFloat32(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  createF64(value: f64): ExpressionRef {\r\n    var out = this.cachedByValue;\r\n    _BinaryenLiteralFloat64(out, value);\r\n    return _BinaryenConst(this.ref, out);\r\n  }\r\n\r\n  // expressions\r\n\r\n  createUnary(\r\n    op: UnaryOp,\r\n    expr: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenUnary(this.ref, op, expr);\r\n  }\r\n\r\n  createBinary(\r\n    op: BinaryOp,\r\n    left: ExpressionRef,\r\n    right: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenBinary(this.ref, op, left, right);\r\n  }\r\n\r\n  createHost(\r\n    op: HostOp,\r\n    name: string | null = null,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (<ExpressionRef[]>operands).length : 0);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createGetLocal(\r\n    index: i32,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenGetLocal(this.ref, index, type);\r\n  }\r\n\r\n  createTeeLocal(\r\n    index: i32,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenTeeLocal(this.ref, index, value);\r\n  }\r\n\r\n  createGetGlobal(\r\n    name: string,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenGetGlobal(this.ref, cStr, type);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createLoad(\r\n    bytes: Index,\r\n    signed: bool,\r\n    ptr: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n  }\r\n\r\n  createStore(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n  }\r\n\r\n  createAtomicLoad(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n  }\r\n\r\n  createAtomicStore(\r\n    bytes: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType,\r\n    offset: Index = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n  }\r\n\r\n  createAtomicRMW(\r\n    op: AtomicRMWOp,\r\n    bytes: Index,\r\n    offset: Index,\r\n    ptr: ExpressionRef,\r\n    value: ExpressionRef,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n  }\r\n\r\n  createAtomicCmpxchg(\r\n    bytes: Index,\r\n    offset: Index,\r\n    ptr: ExpressionRef,\r\n    expected: ExpressionRef,\r\n    replacement: ExpressionRef,\r\n    type: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n  }\r\n\r\n  createAtomicWait(\r\n    ptr: ExpressionRef,\r\n    expected: ExpressionRef,\r\n    timeout: ExpressionRef,\r\n    expectedType: NativeType\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n  }\r\n\r\n  createAtomicWake(\r\n    ptr: ExpressionRef,\r\n    wakeCount: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n  }\r\n\r\n  // statements\r\n\r\n  createSetLocal(\r\n    index: Index,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenSetLocal(this.ref, index, value);\r\n  }\r\n\r\n  createSetGlobal(\r\n    name: string,\r\n    value: ExpressionRef\r\n  ): ExpressionRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenSetGlobal(this.ref, cStr, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createBlock(\r\n    label: string | null,\r\n    children: ExpressionRef[],\r\n    type: NativeType = NativeType.None\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    var cArr = allocPtrArray(children);\r\n    try {\r\n      return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createBreak(\r\n    label: string | null,\r\n    condition: ExpressionRef = 0,\r\n    value: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    try {\r\n      return _BinaryenBreak(this.ref, cStr, condition, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createDrop(\r\n    expression: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenDrop(this.ref, expression);\r\n  }\r\n\r\n  createLoop(\r\n    label: string | null,\r\n    body: ExpressionRef\r\n  ): ExpressionRef {\r\n    var cStr = allocString(label);\r\n    try {\r\n      return _BinaryenLoop(this.ref, cStr, body);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createIf(\r\n    condition: ExpressionRef,\r\n    ifTrue: ExpressionRef,\r\n    ifFalse: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n  }\r\n\r\n  createNop(): ExpressionRef {\r\n    return _BinaryenNop(this.ref);\r\n  }\r\n\r\n  createReturn(\r\n    expression: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    return _BinaryenReturn(this.ref, expression);\r\n  }\r\n\r\n  createSelect(\r\n    ifTrue: ExpressionRef,\r\n    ifFalse: ExpressionRef,\r\n    condition: ExpressionRef\r\n  ): ExpressionRef {\r\n    return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n  }\r\n\r\n  createSwitch(\r\n    names: string[],\r\n    defaultName: string | null,\r\n    condition: ExpressionRef,\r\n    value: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numNames = names.length;\r\n    var strs = new Array<usize>(numNames);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      strs[i] = allocString(names[i]);\r\n    }\r\n    var cArr = allocI32Array(strs);\r\n    var cStr = allocString(defaultName);\r\n    try {\r\n      return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\r\n    } finally {\r\n      free_memory(cStr);\r\n      free_memory(cArr);\r\n      for (let i = numNames - 1; i >= 0; --i) free_memory(strs[i]);\r\n    }\r\n  }\r\n\r\n  createCall(\r\n    target: string,\r\n    operands: ExpressionRef[] | null,\r\n    returnType: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(target);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createCallImport(\r\n    target: string,\r\n    operands: ExpressionRef[] | null,\r\n    returnType: NativeType\r\n  ): ExpressionRef {\r\n    var cStr = allocString(target);\r\n    var cArr = allocPtrArray(operands);\r\n    try {\r\n      return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  createCallIndirect(\r\n    index: ExpressionRef,\r\n    operands: ExpressionRef[] | null,\r\n    typeName: string\r\n  ): ExpressionRef {\r\n    var cArr = allocPtrArray(operands);\r\n    var cStr = allocString(typeName);\r\n    try {\r\n      return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  createUnreachable(): ExpressionRef {\r\n    return _BinaryenUnreachable(this.ref);\r\n  }\r\n\r\n  // meta\r\n\r\n  addGlobal(\r\n    name: string,\r\n    type: NativeType,\r\n    mutable: bool,\r\n    initializer: ExpressionRef\r\n  ): GlobalRef {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  addFunction(\r\n    name: string,\r\n    type: FunctionTypeRef,\r\n    varTypes: NativeType[] | null,\r\n    body: ExpressionRef\r\n  ): FunctionRef {\r\n    var cStr = allocString(name);\r\n    var cArr = allocI32Array(varTypes);\r\n    try {\r\n      return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\r\n    } finally {\r\n      free_memory(cArr);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  removeFunction(name: string): void {\r\n    var cStr = allocString(name);\r\n    try {\r\n      _BinaryenRemoveFunction(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  private cachedTemporaryName: usize = 0;\r\n  private hasTemporaryFunction: bool = false;\r\n\r\n  addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\r\n    this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\r\n    var tempName = this.cachedTemporaryName;\r\n    if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\r\n    var cArr = allocI32Array(paramTypes);\r\n    try {\r\n      let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\r\n      return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  removeTemporaryFunction(): void {\r\n    this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\r\n    var tempName = assert(this.cachedTemporaryName);\r\n    _BinaryenRemoveFunction(this.ref, tempName);\r\n    _BinaryenRemoveFunctionType(this.ref, tempName);\r\n  }\r\n\r\n  addFunctionExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addTableExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addMemoryExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addGlobalExport(\r\n    internalName: string,\r\n    externalName: string\r\n  ): ExportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalName);\r\n    try {\r\n      return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n    } finally {\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  removeExport(externalName: string): void {\r\n    var cStr = allocString(externalName);\r\n    try {\r\n      _BinaryenRemoveExport(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  addFunctionImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string,\r\n    functionType: FunctionTypeRef\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addTableImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addMemoryImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  addGlobalImport(\r\n    internalName: string,\r\n    externalModuleName: string,\r\n    externalBaseName: string,\r\n    globalType: NativeType\r\n  ): ImportRef {\r\n    var cStr1 = allocString(internalName);\r\n    var cStr2 = allocString(externalModuleName);\r\n    var cStr3 = allocString(externalBaseName);\r\n    try {\r\n      return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n    } finally {\r\n      free_memory(cStr3);\r\n      free_memory(cStr2);\r\n      free_memory(cStr1);\r\n    }\r\n  }\r\n\r\n  removeImport(internalName: string): void {\r\n    var cStr = allocString(internalName);\r\n    try {\r\n      _BinaryenRemoveImport(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  setMemory(\r\n    initial: Index,\r\n    maximum: Index,\r\n    segments: MemorySegment[],\r\n    target: Target,\r\n    exportName: string | null = null\r\n  ): void {\r\n    var cStr = allocString(exportName);\r\n    var k = segments.length;\r\n    var segs = new Array<usize>(k);\r\n    var offs = new Array<ExpressionRef>(k);\r\n    var sizs = new Array<Index>(k);\r\n    for (let i = 0; i < k; ++i) {\r\n      let buffer = segments[i].buffer;\r\n      let offset = segments[i].offset;\r\n      segs[i] = allocU8Array(buffer);\r\n      offs[i] = target == Target.WASM64\r\n        ? this.createI64(i64_low(offset), i64_high(offset))\r\n        : this.createI32(i64_low(offset));\r\n      sizs[i] = buffer.length;\r\n    }\r\n    var cArr1 = allocI32Array(segs);\r\n    var cArr2 = allocI32Array(offs);\r\n    var cArr3 = allocI32Array(sizs);\r\n    try {\r\n      _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n    } finally {\r\n      free_memory(cArr3);\r\n      free_memory(cArr2);\r\n      free_memory(cArr1);\r\n      for (let i = k - 1; i >= 0; --i) free_memory(segs[i]);\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  setFunctionTable(funcs: FunctionRef[]): void {\r\n    var cArr = allocPtrArray(funcs);\r\n    try {\r\n      _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  setStart(func: FunctionRef): void {\r\n    _BinaryenSetStart(this.ref, func);\r\n  }\r\n\r\n  setOptimizeLevel(level: i32 = 2): void {\r\n    _BinaryenSetOptimizeLevel(level);\r\n  }\r\n\r\n  setShrinkLevel(level: i32 = 1): void {\r\n    _BinaryenSetShrinkLevel(level);\r\n  }\r\n\r\n  setDebugInfo(on: bool = false): void {\r\n    _BinaryenSetDebugInfo(on);\r\n  }\r\n\r\n  optimize(func: FunctionRef = 0): void {\r\n    if (func) {\r\n      _BinaryenFunctionOptimize(func, this.ref);\r\n    } else {\r\n      _BinaryenModuleOptimize(this.ref);\r\n    }\r\n  }\r\n\r\n  runPasses(passes: string[], func: FunctionRef = 0): void {\r\n    var numNames = passes.length;\r\n    var names = new Array<usize>(numNames);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      names[i] = allocString(passes[i]);\r\n    }\r\n    var cArr = allocI32Array(names);\r\n    try {\r\n      if (func) {\r\n        _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\r\n      } else {\r\n        _BinaryenModuleRunPasses(this.ref, cArr, numNames);\r\n      }\r\n    } finally {\r\n      free_memory(cArr);\r\n      for (let i = numNames; i >= 0; --i) {\r\n        free_memory(names[i]);\r\n      }\r\n    }\r\n  }\r\n\r\n  private cachedPrecomputeName: usize = 0;\r\n  private cachedPrecomputeNames: usize = 0;\r\n\r\n  precomputeFunction(func: FunctionRef): void {\r\n    var names = this.cachedPrecomputeNames;\r\n    if (!names) {\r\n      let name = allocString(\"precompute\");\r\n      this.cachedPrecomputeName = name;\r\n      this.cachedPrecomputeNames = names = allocI32Array([ name ]);\r\n    }\r\n    _BinaryenFunctionRunPasses(func, this.ref, names, 1);\r\n  }\r\n\r\n  validate(): bool {\r\n    return _BinaryenModuleValidate(this.ref) == 1;\r\n  }\r\n\r\n  interpret(): void {\r\n    _BinaryenModuleInterpret(this.ref);\r\n  }\r\n\r\n  toBinary(sourceMapUrl: string | null): BinaryModule {\r\n    var out = this.cachedByValue;\r\n    var cStr = allocString(sourceMapUrl);\r\n    var binaryPtr: usize = 0;\r\n    var sourceMapPtr: usize = 0;\r\n    try {\r\n      _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n      binaryPtr = readInt(out);\r\n      let binaryBytes = readInt(out + 4);\r\n      sourceMapPtr = readInt(out + 4 * 2);\r\n      let ret = new BinaryModule();\r\n      ret.output = readBuffer(binaryPtr, binaryBytes);\r\n      ret.sourceMap = readString(sourceMapPtr);\r\n      return ret;\r\n    } finally {\r\n      if (cStr) free_memory(cStr);\r\n      if (binaryPtr) free_memory(binaryPtr);\r\n      if (sourceMapPtr) free_memory(sourceMapPtr);\r\n    }\r\n  }\r\n\r\n  toText(): string {\r\n    throw new Error(\"not implemented\"); // JS glue overrides this\r\n  }\r\n\r\n  toAsmjs(): string {\r\n    throw new Error(\"not implemented\"); // JS glue overrides this\r\n  }\r\n\r\n  dispose(): void {\r\n    assert(this.ref);\r\n    free_memory(this.cachedByValue);\r\n    free_memory(this.cachedTemporaryName);\r\n    free_memory(this.cachedPrecomputeName);\r\n    free_memory(this.cachedPrecomputeNames);\r\n    _BinaryenModuleDispose(this.ref);\r\n    this.ref = 0;\r\n  }\r\n\r\n  createRelooper(): Relooper {\r\n    return Relooper.create(this);\r\n  }\r\n\r\n  cloneExpression(\r\n    expr: ExpressionRef,\r\n    noSideEffects: bool = false,\r\n    maxDepth: i32 = i32.MAX_VALUE\r\n  ): ExpressionRef { // currently supports side effect free expressions only\r\n    if (maxDepth < 0) return 0;\r\n    maxDepth -= 1;\r\n\r\n    var nested1: ExpressionRef,\r\n        nested2: ExpressionRef;\r\n\r\n        switch (_BinaryenExpressionGetId(expr)) {\r\n      case ExpressionId.Const: {\r\n        switch (_BinaryenExpressionGetType(expr)) {\r\n          case NativeType.I32: {\r\n            return this.createI32(_BinaryenConstGetValueI32(expr));\r\n          }\r\n          case NativeType.I64: {\r\n            return this.createI64(\r\n              _BinaryenConstGetValueI64Low(expr),\r\n              _BinaryenConstGetValueI64High(expr)\r\n            );\r\n          }\r\n          case NativeType.F32: {\r\n            return this.createF32(_BinaryenConstGetValueF32(expr));\r\n          }\r\n          case NativeType.F64: {\r\n            return this.createF64(_BinaryenConstGetValueF64(expr));\r\n          }\r\n          default: {\r\n            throw new Error(\"concrete type expected\");\r\n          }\r\n        }\r\n      }\r\n      case ExpressionId.GetLocal: {\r\n        return _BinaryenGetLocal(this.ref,\r\n          _BinaryenGetLocalGetIndex(expr),\r\n          _BinaryenExpressionGetType(expr)\r\n        );\r\n      }\r\n      case ExpressionId.GetGlobal: {\r\n        let globalName = _BinaryenGetGlobalGetName(expr);\r\n        if (!globalName) break;\r\n        return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n      }\r\n      case ExpressionId.Load: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return (\r\n          _BinaryenLoadIsAtomic(expr)\r\n            ? _BinaryenAtomicLoad(this.ref,\r\n                _BinaryenLoadGetBytes(expr),\r\n                _BinaryenLoadGetOffset(expr),\r\n                _BinaryenExpressionGetType(expr),\r\n                nested1\r\n              )\r\n            : _BinaryenLoad(this.ref,\r\n                _BinaryenLoadGetBytes(expr),\r\n                _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n                _BinaryenLoadGetOffset(expr),\r\n                _BinaryenLoadGetAlign(expr),\r\n                _BinaryenExpressionGetType(expr),\r\n                nested1\r\n              )\r\n        );\r\n      }\r\n      case ExpressionId.Unary: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n      }\r\n      case ExpressionId.Binary: {\r\n        if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n          break;\r\n        }\r\n        return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n      }\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  // source map generation\r\n\r\n  addDebugInfoFile(name: string): Index {\r\n    var cStr = allocString(name);\r\n    try {\r\n      return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n    } finally {\r\n      free_memory(cStr);\r\n    }\r\n  }\r\n\r\n  getDebugInfoFile(index: Index): string | null {\r\n    return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n  }\r\n\r\n  setDebugLocation(\r\n    func: FunctionRef,\r\n    expr: ExpressionRef,\r\n    fileIndex: Index,\r\n    lineNumber: Index,\r\n    columnNumber: Index\r\n  ): void {\r\n    _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n  }\r\n}\r\n\r\n// expressions\r\n\r\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\r\n  return _BinaryenExpressionGetId(expr);\r\n}\r\n\r\nexport function getExpressionType(expr: ExpressionRef): NativeType {\r\n  return _BinaryenExpressionGetType(expr);\r\n}\r\n\r\nexport function getConstValueI32(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI32(expr);\r\n}\r\n\r\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI64Low(expr);\r\n}\r\n\r\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\r\n  return _BinaryenConstGetValueI64High(expr);\r\n}\r\n\r\nexport function getConstValueF32(expr: ExpressionRef): f32 {\r\n  return _BinaryenConstGetValueF32(expr);\r\n}\r\n\r\nexport function getConstValueF64(expr: ExpressionRef): f32 {\r\n  return _BinaryenConstGetValueF64(expr);\r\n}\r\n\r\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\r\n  return _BinaryenGetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\r\n  return _BinaryenSetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSetLocalGetValue(expr);\r\n}\r\n\r\nexport function isTeeLocal(expr: ExpressionRef): bool {\r\n  return _BinaryenSetLocalIsTee(expr);\r\n}\r\n\r\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\r\n  return _BinaryenBinaryGetOp(expr);\r\n}\r\n\r\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBinaryGetLeft(expr);\r\n}\r\n\r\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBinaryGetRight(expr);\r\n}\r\n\r\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\r\n  return _BinaryenUnaryGetOp(expr);\r\n}\r\n\r\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenUnaryGetValue(expr);\r\n}\r\n\r\nexport function getLoadBytes(expr: ExpressionRef): u32 {\r\n  return _BinaryenLoadGetBytes(expr);\r\n}\r\n\r\nexport function getLoadOffset(expr: ExpressionRef): u32 {\r\n  return _BinaryenLoadGetOffset(expr);\r\n}\r\n\r\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenLoadGetPtr(expr);\r\n}\r\n\r\nexport function isLoadSigned(expr: ExpressionRef): bool {\r\n  return _BinaryenLoadIsSigned(expr);\r\n}\r\n\r\nexport function getStoreBytes(expr: ExpressionRef): u32 {\r\n  return _BinaryenStoreGetBytes(expr);\r\n}\r\n\r\nexport function getStoreOffset(expr: ExpressionRef): u32 {\r\n  return _BinaryenStoreGetOffset(expr);\r\n}\r\n\r\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenStoreGetPtr(expr);\r\n}\r\n\r\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenStoreGetValue(expr);\r\n}\r\n\r\nexport function getBlockName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenBlockGetName(expr));\r\n}\r\n\r\nexport function getBlockChildCount(expr: ExpressionRef): Index {\r\n  return _BinaryenBlockGetNumChildren(expr);\r\n}\r\n\r\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\r\n  return _BinaryenBlockGetChild(expr, index);\r\n}\r\n\r\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetCondition(expr);\r\n}\r\n\r\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetIfTrue(expr);\r\n}\r\n\r\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenIfGetIfFalse(expr);\r\n}\r\n\r\nexport function getLoopName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenLoopGetName(expr));\r\n}\r\n\r\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenLoopGetBody(expr);\r\n}\r\n\r\nexport function getBreakName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenBreakGetName(expr));\r\n}\r\n\r\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenBreakGetCondition(expr);\r\n}\r\n\r\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetIfTrue(expr);\r\n}\r\n\r\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetIfFalse(expr);\r\n}\r\n\r\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenSelectGetCondition(expr);\r\n}\r\n\r\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenDropGetValue(expr);\r\n}\r\n\r\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenReturnGetValue(expr);\r\n}\r\n\r\nexport function getCallTarget(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenCallGetTarget(expr));\r\n}\r\n\r\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\r\n  return _BinaryenHostGetOp(expr);\r\n}\r\n\r\nexport function getHostOperandCount(expr: ExpressionRef): Index {\r\n  return _BinaryenHostGetNumOperands(expr);\r\n}\r\n\r\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\r\n  return _BinaryenHostGetOperand(expr, index);\r\n}\r\n\r\nexport function getHostName(expr: ExpressionRef): string | null {\r\n  return readString(_BinaryenHostGetNameOperand(expr));\r\n}\r\n\r\n// functions\r\n\r\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\r\n  return _BinaryenFunctionGetBody(func);\r\n}\r\n\r\nexport function getFunctionName(func: FunctionRef): string | null {\r\n  return readString(_BinaryenFunctionGetName(func));\r\n}\r\n\r\nexport function getFunctionParamCount(func: FunctionRef): Index {\r\n  return _BinaryenFunctionGetNumParams(func);\r\n}\r\n\r\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\r\n  return _BinaryenFunctionGetParam(func, index);\r\n}\r\n\r\nexport function getFunctionResultType(func: FunctionRef): NativeType {\r\n  return _BinaryenFunctionGetResult(func);\r\n}\r\n\r\nexport class Relooper {\r\n\r\n  module: Module;\r\n  ref: RelooperRef;\r\n\r\n  static create(module: Module): Relooper {\r\n    var relooper = new Relooper();\r\n    relooper.module = module;\r\n    relooper.ref = _RelooperCreate();\r\n    return relooper;\r\n  }\r\n\r\n  private constructor() {}\r\n\r\n  addBlock(code: ExpressionRef): RelooperBlockRef {\r\n    return _RelooperAddBlock(this.ref, code);\r\n  }\r\n\r\n  addBranch(from: RelooperBlockRef, to: RelooperBlockRef, condition: ExpressionRef = 0, code: ExpressionRef = 0): void {\r\n    _RelooperAddBranch(from, to, condition, code);\r\n  }\r\n\r\n  addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n    return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n  }\r\n\r\n  addBranchForSwitch(from: RelooperBlockRef, to: RelooperBlockRef, indexes: i32[], code: ExpressionRef = 0): void {\r\n    var cArr = allocI32Array(indexes);\r\n    try {\r\n      _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n    } finally {\r\n      free_memory(cArr);\r\n    }\r\n  }\r\n\r\n  renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n    return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n  }\r\n}\r\n\r\n// export function hasSideEffects(expr: ExpressionRef): bool {\r\n//   switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\r\n//     case ExpressionId.GetLocal:\r\n//     case ExpressionId.GetGlobal:\r\n//     case ExpressionId.Const:\r\n//     case ExpressionId.Nop:\r\n//     case ExpressionId.Unreachable: {\r\n//       return false;\r\n//     }\r\n//     case ExpressionId.Block: {\r\n//       for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\r\n//         if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\r\n//       }\r\n//       return false;\r\n//     }\r\n//     case ExpressionId.If: {\r\n//       return hasSideEffects(_BinaryenIfGetCondition(expr))\r\n//           || hasSideEffects(_BinaryenIfGetIfTrue(expr))\r\n//           || hasSideEffects(_BinaryenIfGetIfFalse(expr));\r\n//     }\r\n//     case ExpressionId.Unary: {\r\n//       return hasSideEffects(_BinaryenUnaryGetValue(expr));\r\n//     }\r\n//     case ExpressionId.Binary: {\r\n//       return hasSideEffects(_BinaryenBinaryGetLeft(expr))\r\n//           || hasSideEffects(_BinaryenBinaryGetRight(expr));\r\n//     }\r\n//     case ExpressionId.Drop: {\r\n//       return hasSideEffects(_BinaryenDropGetValue(expr));\r\n//     }\r\n//     case ExpressionId.Select: {\r\n//       return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\r\n//           || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\r\n//           || hasSideEffects(_BinaryenSelectGetCondition(expr));\r\n//     }\r\n//   }\r\n//   return true;\r\n// }\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n  if (!u8s) return 0;\r\n  var numValues = u8s.length;\r\n  var ptr = allocate_memory(numValues);\r\n  var idx = ptr;\r\n  for (let i = 0; i < numValues; ++i) {\r\n    store<u8>(idx++, u8s[i]);\r\n  }\r\n  return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n  if (!i32s) return 0;\r\n  var ptr = allocate_memory(i32s.length << 2);\r\n  var idx = ptr;\r\n  for (let i = 0, k = i32s.length; i < k; ++i) {\r\n    let val = i32s[i];\r\n    // store<i32>(idx, val) is not portable\r\n    store<u8>(idx    , ( val         & 0xff) as u8);\r\n    store<u8>(idx + 1, ((val >>   8) & 0xff) as u8);\r\n    store<u8>(idx + 2, ((val >>  16) & 0xff) as u8);\r\n    store<u8>(idx + 3, ( val >>> 24        ) as u8);\r\n    idx += 4;\r\n  }\r\n  return ptr;\r\n}\r\n\r\nfunction allocPtrArray(ptrs: usize[] | null): usize {\r\n  return allocI32Array(ptrs); // TODO: WASM64 one day\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n  var len = 0;\r\n  for (let i = 0, k = str.length; i < k; ++i) {\r\n    let u = str.charCodeAt(i);\r\n    if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n      u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n    }\r\n    if (u <= 0x7F) {\r\n      ++len;\r\n    } else if (u <= 0x7FF) {\r\n      len += 2;\r\n    } else if (u <= 0xFFFF) {\r\n      len += 3;\r\n    } else if (u <= 0x1FFFFF) {\r\n      len += 4;\r\n    } else if (u <= 0x3FFFFFF) {\r\n      len += 5;\r\n    } else {\r\n      len += 6;\r\n    }\r\n  }\r\n  return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n  if (str == null) return 0;\r\n  var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n  // the following is based on Emscripten's stringToUTF8Array\r\n  var idx = ptr;\r\n  for (let i = 0, k = str.length; i < k; ++i) {\r\n    let u = str.charCodeAt(i);\r\n    if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n      u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n    }\r\n    if (u <= 0x7F) {\r\n      store<u8>(idx++, u as u8);\r\n    } else if (u <= 0x7FF) {\r\n      store<u8>(idx++, (0xC0 |  (u >>> 6)       ) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0xFFFF) {\r\n      store<u8>(idx++, (0xE0 |  (u >>> 12)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0x1FFFFF) {\r\n      store<u8>(idx++, (0xF0 |  (u >>> 18)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else if (u <= 0x3FFFFFF) {\r\n      store<u8>(idx++, (0xF8 |  (u >>> 24)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    } else {\r\n      store<u8>(idx++, (0xFC |  (u >>> 30)      ) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ((u >>>  6) & 63)) as u8);\r\n      store<u8>(idx++, (0x80 | ( u         & 63)) as u8);\r\n    }\r\n  }\r\n  store<u8>(idx, 0);\r\n  return ptr;\r\n}\r\n\r\nfunction readInt(ptr: usize): i32 {\r\n  return (\r\n     load<u8>(ptr    )        |\r\n    (load<u8>(ptr + 1) <<  8) |\r\n    (load<u8>(ptr + 2) << 16) |\r\n    (load<u8>(ptr + 3) << 24)\r\n  );\r\n}\r\n\r\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\r\n  var ret = new Uint8Array(length);\r\n  for (let i: usize = 0; i < length; ++i) {\r\n    ret[i] = load<u8>(ptr + i);\r\n  }\r\n  return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n  if (!ptr) return null;\r\n  var arr = new Array<i32>();\r\n  // the following is based on Emscripten's UTF8ArrayToString\r\n  var cp: u32;\r\n  var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n  while (cp = load<u8>(ptr++)) {\r\n    if (!(cp & 0x80)) {\r\n      arr.push(cp);\r\n      continue;\r\n    }\r\n    u1 = load<u8>(ptr++) & 63;\r\n    if ((cp & 0xE0) == 0xC0) {\r\n      arr.push(((cp & 31) << 6) | u1);\r\n      continue;\r\n    }\r\n    u2 = load<u8>(ptr++) & 63;\r\n    if ((cp & 0xF0) == 0xE0) {\r\n      cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n    } else {\r\n      u3 = load<u8>(ptr++) & 63;\r\n      if ((cp & 0xF8) == 0xF0) {\r\n        cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n      } else {\r\n        u4 = load<u8>(ptr++) & 63;\r\n        if ((cp & 0xFC) == 0xF8) {\r\n          cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n        } else {\r\n          u5 = load<u8>(ptr++) & 63;\r\n          cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n        }\r\n      }\r\n    }\r\n    arr.push(cp);\r\n    // if (cp < 0x10000) {\r\n    //   arr.push(cp);\r\n    // } else {\r\n    //   var ch = cp - 0x10000;\r\n    //   arr.push(0xD800 | (ch >> 10));\r\n    //   arr.push(0xDC00 | (ch & 0x3FF));\r\n    // }\r\n  }\r\n  // return String.fromCharCodes(arr);\r\n  return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nexport class BinaryModule {\r\n  /** WebAssembly binary. */\r\n  output: Uint8Array;\r\n  /** Source map, if generated. */\r\n  sourceMap: string | null;\r\n}\r\n","/**\r\n * AssemblyScript's intermediate representation describing a program's elements.\r\n * @module program\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  LIBRARY_PREFIX,\r\n  GETTER_PREFIX,\r\n  SETTER_PREFIX,\r\n  FILESPACE_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Options,\r\n  Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticMessage,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags,\r\n  Signature\r\n} from \"./types\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Source,\r\n  Range,\r\n  CommonTypeNode,\r\n  TypeParameterNode,\r\n  DecoratorNode,\r\n  DecoratorKind,\r\n\r\n  Expression,\r\n  IdentifierExpression,\r\n  LiteralExpression,\r\n  LiteralKind,\r\n  StringLiteralExpression,\r\n\r\n  ClassDeclaration,\r\n  DeclarationStatement,\r\n  EnumDeclaration,\r\n  EnumValueDeclaration,\r\n  ExportMember,\r\n  ExportStatement,\r\n  FieldDeclaration,\r\n  FunctionDeclaration,\r\n  ImportDeclaration,\r\n  ImportStatement,\r\n  InterfaceDeclaration,\r\n  MethodDeclaration,\r\n  NamespaceDeclaration,\r\n  TypeDeclaration,\r\n  VariableDeclaration,\r\n  VariableLikeDeclarationStatement,\r\n  VariableStatement,\r\n\r\n  decoratorNameToKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Module,\r\n  NativeType,\r\n  FunctionRef,\r\n  ExpressionRef,\r\n  ExpressionId,\r\n  BinaryOp,\r\n  UnaryOp,\r\n\r\n  getExpressionId,\r\n  getGetLocalIndex,\r\n  isTeeLocal,\r\n  getSetLocalValue,\r\n  getBinaryOp,\r\n  getConstValueI32,\r\n  getBinaryLeft,\r\n  getBinaryRight,\r\n  getUnaryOp,\r\n  getExpressionType,\r\n  getLoadBytes,\r\n  isLoadSigned,\r\n  getIfTrue,\r\n  getIfFalse,\r\n  getSelectThen,\r\n  getSelectElse,\r\n  getCallTarget,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getBlockName,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getConstValueI64Low\r\n} from \"./module\";\r\n\r\nimport {\r\n  CharCode\r\n} from \"./util\";\r\n\r\nimport {\r\n  Resolver\r\n} from \"./resolver\";\r\n\r\n/** Represents a yet unresolved import. */\r\nclass QueuedImport {\r\n  localName: string;\r\n  externalName: string;\r\n  externalNameAlt: string;\r\n  declaration: ImportDeclaration | null; // not set if a filespace\r\n}\r\n\r\n/** Represents a yet unresolved export. */\r\nclass QueuedExport {\r\n  externalName: string;\r\n  isReExport: bool;\r\n  member: ExportMember;\r\n}\r\n\r\n/** Represents a type alias. */\r\nclass TypeAlias {\r\n  typeParameters: TypeParameterNode[] | null;\r\n  type: CommonTypeNode;\r\n}\r\n\r\n/** Represents the kind of an operator overload. */\r\nexport enum OperatorKind {\r\n  INVALID,\r\n\r\n  // indexed access\r\n  INDEXED_GET,            // a[]\r\n  INDEXED_SET,            // a[]=b\r\n  UNCHECKED_INDEXED_GET,  // unchecked(a[])\r\n  UNCHECKED_INDEXED_SET,  // unchecked(a[]=b)\r\n\r\n  // binary\r\n  ADD,                    // a + b\r\n  SUB,                    // a - b\r\n  MUL,                    // a * b\r\n  DIV,                    // a / b\r\n  REM,                    // a % b\r\n  POW,                    // a ** b\r\n  BITWISE_AND,            // a & b\r\n  BITWISE_OR,             // a | b\r\n  BITWISE_XOR,            // a ^ b\r\n  BITWISE_SHL,            // a << b\r\n  BITWISE_SHR,            // a >> b\r\n  BITWISE_SHR_U,          // a >>> b\r\n  EQ,                     // a == b\r\n  NE,                     // a != b\r\n  GT,                     // a > b\r\n  GE,                     // a >= b\r\n  LT,                     // a < b\r\n  LE,                     // a <= b\r\n\r\n  // unary prefix\r\n  PLUS,                   // +a\r\n  MINUS,                  // -a\r\n  NOT,                    // !a\r\n  BITWISE_NOT,            // ~a\r\n  PREFIX_INC,             // ++a\r\n  PREFIX_DEC,             // --a\r\n\r\n  // unary postfix\r\n  POSTFIX_INC,            // a++\r\n  POSTFIX_DEC             // a--\r\n\r\n  // not overridable:\r\n  // IDENTITY             // a === b\r\n  // LOGICAL_AND          // a && b\r\n  // LOGICAL_OR           // a || b\r\n}\r\n\r\n/** Returns the operator kind represented by the specified decorator and string argument. */\r\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\r\n  assert(arg.length);\r\n  switch (decoratorKind) {\r\n    case DecoratorKind.OPERATOR:\r\n    case DecoratorKind.OPERATOR_BINARY: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.OPENBRACKET: {\r\n          if (arg == \"[]\") return OperatorKind.INDEXED_GET;\r\n          if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\r\n          break;\r\n        }\r\n        case CharCode.OPENBRACE: {\r\n          if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\r\n          if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\r\n          break;\r\n        }\r\n        case CharCode.PLUS: {\r\n          if (arg == \"+\") return OperatorKind.ADD;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"-\") return OperatorKind.SUB;\r\n          break;\r\n        }\r\n        case CharCode.ASTERISK: {\r\n          if (arg == \"*\") return OperatorKind.MUL;\r\n          if (arg == \"**\") return OperatorKind.POW;\r\n          break;\r\n        }\r\n        case CharCode.SLASH: {\r\n          if (arg == \"/\") return OperatorKind.DIV;\r\n          break;\r\n        }\r\n        case CharCode.PERCENT: {\r\n          if (arg == \"%\") return OperatorKind.REM;\r\n          break;\r\n        }\r\n        case CharCode.AMPERSAND: {\r\n          if (arg == \"&\") return OperatorKind.BITWISE_AND;\r\n          break;\r\n        }\r\n        case CharCode.BAR: {\r\n          if (arg == \"|\") return OperatorKind.BITWISE_OR;\r\n          break;\r\n        }\r\n        case CharCode.CARET: {\r\n          if (arg == \"^\") return OperatorKind.BITWISE_XOR;\r\n          break;\r\n        }\r\n        case CharCode.EQUALS: {\r\n          if (arg == \"==\") return OperatorKind.EQ;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          if (arg == \"!=\") return OperatorKind.NE;\r\n          break;\r\n        }\r\n        case CharCode.GREATERTHAN: {\r\n          if (arg == \">\") return OperatorKind.GT;\r\n          if (arg == \">=\") return OperatorKind.GE;\r\n          if (arg == \">>\") return OperatorKind.BITWISE_SHR;\r\n          if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\r\n          break;\r\n        }\r\n        case CharCode.LESSTHAN: {\r\n          if (arg == \"<\") return OperatorKind.LT;\r\n          if (arg == \"<=\") return OperatorKind.LE;\r\n          if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n    case DecoratorKind.OPERATOR_PREFIX: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.PLUS: {\r\n          if (arg == \"+\") return OperatorKind.PLUS;\r\n          if (arg == \"++\") return OperatorKind.PREFIX_INC;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"-\") return OperatorKind.MINUS;\r\n          if (arg == \"--\") return OperatorKind.PREFIX_DEC;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          if (arg == \"!\") return OperatorKind.NOT;\r\n          break;\r\n        }\r\n        case CharCode.TILDE: {\r\n          if (arg == \"~\") return OperatorKind.BITWISE_NOT;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n    case DecoratorKind.OPERATOR_POSTFIX: {\r\n      switch (arg.charCodeAt(0)) {\r\n        case CharCode.PLUS: {\r\n          if (arg == \"++\") return OperatorKind.POSTFIX_INC;\r\n          break;\r\n        }\r\n        case CharCode.MINUS: {\r\n          if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\r\n          break;\r\n        }\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return OperatorKind.INVALID;\r\n}\r\n\r\nconst noTypesYet = new Map<string,Type>();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n  /** Array of source files. */\r\n  sources: Source[];\r\n  /** Resolver instance. */\r\n  resolver: Resolver;\r\n  /** Diagnostic offset used where successively obtaining the next diagnostic. */\r\n  diagnosticsOffset: i32 = 0;\r\n  /** Compiler options. */\r\n  options: Options;\r\n\r\n  /** Elements by internal name. */\r\n  elementsLookup: Map<string,Element> = new Map();\r\n  /** Class and function instances by internal name. */\r\n  instancesLookup: Map<string,Element> = new Map();\r\n  /** Types by internal name. */\r\n  typesLookup: Map<string,Type> = noTypesYet;\r\n  /** Declared type aliases. */\r\n  typeAliases: Map<string,TypeAlias> = new Map();\r\n  /** File-level exports by exported name. */\r\n  fileLevelExports: Map<string,Element> = new Map();\r\n  /** Module-level exports by exported name. */\r\n  moduleLevelExports: Map<string,Element> = new Map();\r\n\r\n  /** Array prototype reference. */\r\n  arrayPrototype: ClassPrototype | null = null;\r\n  /** String instance reference. */\r\n  stringInstance: Class | null = null;\r\n  /** Start function reference. */\r\n  startFunction: FunctionPrototype;\r\n  /** Main function reference, if present. */\r\n  mainFunction: FunctionPrototype | null = null;\r\n\r\n  /** Currently processing filespace. */\r\n  currentFilespace: Filespace;\r\n\r\n  /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n  constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n    super(diagnostics);\r\n    this.resolver = new Resolver(this);\r\n    this.sources = [];\r\n  }\r\n\r\n  /** Gets a source by its exact path. */\r\n  getSource(normalizedPath: string): Source | null {\r\n    var sources = this.sources;\r\n    for (let i = 0, k = sources.length; i < k; ++i) {\r\n      let source = sources[i];\r\n      if (source.normalizedPath == normalizedPath) return source;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Looks up the source for the specified possibly ambiguous path. */\r\n  lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\r\n    var tmp: string;\r\n    return (\r\n      this.getSource(normalizedPathWithoutExtension + \".ts\") ||\r\n      this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\r\n      this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\r\n      this.getSource( tmp                                                    + \"/index.ts\")\r\n    );\r\n  }\r\n\r\n  /** Initializes the program and its elements prior to compilation. */\r\n  initialize(options: Options): void {\r\n    this.options = options;\r\n\r\n    // add built-in types\r\n    this.typesLookup = new Map([\r\n      [\"i8\", Type.i8],\r\n      [\"i16\", Type.i16],\r\n      [\"i32\", Type.i32],\r\n      [\"i64\", Type.i64],\r\n      [\"isize\", options.isizeType],\r\n      [\"u8\", Type.u8],\r\n      [\"u16\", Type.u16],\r\n      [\"u32\", Type.u32],\r\n      [\"u64\", Type.u64],\r\n      [\"usize\", options.usizeType],\r\n      [\"bool\", Type.bool],\r\n      [\"f32\", Type.f32],\r\n      [\"f64\", Type.f64],\r\n      [\"void\", Type.void],\r\n      [\"number\", Type.f64],\r\n      [\"boolean\", Type.bool]\r\n    ]);\r\n\r\n    // add compiler hints\r\n    this.setConstantInteger(\"ASC_TARGET\", Type.i32,\r\n      i64_new(options.isWasm64 ? 2 : 1));\r\n    this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\r\n      i64_new(options.noTreeShaking ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\r\n      i64_new(options.noAssert ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\r\n      i64_new(options.memoryBase, 0));\r\n    this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\r\n      i64_new(options.optimizeLevelHint, 0));\r\n    this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\r\n      i64_new(options.shrinkLevelHint, 0));\r\n    this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\r\n      i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\r\n    this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\r\n      i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\r\n\r\n    // remember deferred elements\r\n    var queuedImports = new Array<QueuedImport>();\r\n    var queuedExports = new Map<string,QueuedExport>();\r\n    var queuedExtends = new Array<ClassPrototype>();\r\n    var queuedImplements = new Array<ClassPrototype>();\r\n\r\n    // build initial lookup maps of internal names to declarations\r\n    for (let i = 0, k = this.sources.length; i < k; ++i) {\r\n      let source = this.sources[i];\r\n\r\n      // create one filespace per source\r\n      let filespace = new Filespace(this, source);\r\n      this.elementsLookup.set(filespace.internalName, filespace);\r\n      this.currentFilespace = filespace;\r\n\r\n      // process this source's statements\r\n      let statements = source.statements;\r\n      for (let j = 0, l = statements.length; j < l; ++j) {\r\n        let statement = statements[j];\r\n        switch (statement.kind) {\r\n          case NodeKind.CLASSDECLARATION: {\r\n            this.initializeClass(<ClassDeclaration>statement, queuedExtends, queuedImplements);\r\n            break;\r\n          }\r\n          case NodeKind.ENUMDECLARATION: {\r\n            this.initializeEnum(<EnumDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.EXPORT: {\r\n            this.initializeExports(<ExportStatement>statement, queuedExports);\r\n            break;\r\n          }\r\n          case NodeKind.FUNCTIONDECLARATION: {\r\n            this.initializeFunction(<FunctionDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.IMPORT: {\r\n            this.initializeImports(<ImportStatement>statement, queuedExports, queuedImports);\r\n            break;\r\n          }\r\n          case NodeKind.INTERFACEDECLARATION: {\r\n            this.initializeInterface(<InterfaceDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.NAMESPACEDECLARATION: {\r\n            this.initializeNamespace(<NamespaceDeclaration>statement, queuedExtends, queuedImplements);\r\n            break;\r\n          }\r\n          case NodeKind.TYPEDECLARATION: {\r\n            this.initializeTypeAlias(<TypeDeclaration>statement);\r\n            break;\r\n          }\r\n          case NodeKind.VARIABLE: {\r\n            this.initializeVariables(<VariableStatement>statement);\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // queued imports should be resolvable now through traversing exports and queued exports\r\n    for (let i = 0; i < queuedImports.length;) {\r\n      let queuedImport = queuedImports[i];\r\n      let declaration = queuedImport.declaration;\r\n      if (declaration) { // named\r\n        let element = this.tryLocateImport(queuedImport.externalName, queuedExports);\r\n        if (element) {\r\n          this.elementsLookup.set(queuedImport.localName, element);\r\n          queuedImports.splice(i, 1);\r\n        } else {\r\n          if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {\r\n            this.elementsLookup.set(queuedImport.localName, element);\r\n            queuedImports.splice(i, 1);\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Module_0_has_no_exported_member_1,\r\n              declaration.range,\r\n              (<ImportStatement>declaration.parent).path.value,\r\n              declaration.externalName.text\r\n            );\r\n            ++i;\r\n          }\r\n        }\r\n      } else { // filespace\r\n        let element = this.elementsLookup.get(queuedImport.externalName);\r\n        if (element) {\r\n          this.elementsLookup.set(queuedImport.localName, element);\r\n          queuedImports.splice(i, 1);\r\n        } else {\r\n          if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\r\n            this.elementsLookup.set(queuedImport.localName, element);\r\n            queuedImports.splice(i, 1);\r\n          } else {\r\n            assert(false); // already reported by the parser not finding the file\r\n            ++i;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // queued exports should be resolvable now that imports are finalized\r\n    for (let [exportName, queuedExport] of queuedExports) {\r\n      let currentExport: QueuedExport | null = queuedExport; // nullable below\r\n      let element: Element | null;\r\n      do {\r\n        if (currentExport.isReExport) {\r\n          if (element = this.fileLevelExports.get(currentExport.externalName)) {\r\n            this.setExportAndCheckLibrary(\r\n              exportName,\r\n              element,\r\n              currentExport.member.externalName\r\n            );\r\n            break;\r\n          }\r\n          currentExport = queuedExports.get(currentExport.externalName);\r\n          if (!currentExport) {\r\n            this.error(\r\n              DiagnosticCode.Module_0_has_no_exported_member_1,\r\n              queuedExport.member.externalName.range,\r\n              (<StringLiteralExpression>(<ExportStatement>queuedExport.member.parent).path).value,\r\n              queuedExport.member.externalName.text\r\n            );\r\n          }\r\n        } else {\r\n          if (\r\n            // normal export\r\n            (element = this.elementsLookup.get(currentExport.externalName)) ||\r\n            // library re-export\r\n            (element = this.elementsLookup.get(currentExport.member.name.text))\r\n          ) {\r\n            this.setExportAndCheckLibrary(\r\n              exportName,\r\n              element,\r\n              currentExport.member.externalName\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Cannot_find_name_0,\r\n              queuedExport.member.range, queuedExport.member.name.text\r\n            );\r\n          }\r\n          break;\r\n        }\r\n      } while (currentExport);\r\n    }\r\n\r\n    // resolve base prototypes of derived classes\r\n    var resolver = this.resolver;\r\n    for (let i = 0, k = queuedExtends.length; i < k; ++i) {\r\n      let derivedPrototype = queuedExtends[i];\r\n      let derivedDeclaration = derivedPrototype.declaration;\r\n      let derivedType = assert(derivedDeclaration.extendsType);\r\n      let baseElement = resolver.resolveIdentifier(derivedType.name, null); // reports\r\n      if (!baseElement) continue;\r\n      if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\r\n        let basePrototype = <ClassPrototype>baseElement;\r\n        derivedPrototype.basePrototype = basePrototype;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.A_class_may_only_extend_another_class,\r\n          derivedType.range\r\n        );\r\n      }\r\n    }\r\n\r\n    // set up global aliases\r\n    var globalAliases = options.globalAliases;\r\n    if (globalAliases) {\r\n      for (let [alias, name] of globalAliases) {\r\n        if (!name.length) continue; // explicitly disabled\r\n        let element = this.elementsLookup.get(name);\r\n        if (element) this.elementsLookup.set(alias, element);\r\n        else throw new Error(\"element not found: \" + name);\r\n      }\r\n    }\r\n\r\n    // register 'Array'\r\n    var arrayPrototype = this.elementsLookup.get(\"Array\");\r\n    if (arrayPrototype) {\r\n      assert(arrayPrototype.kind == ElementKind.CLASS_PROTOTYPE);\r\n      this.arrayPrototype = <ClassPrototype>arrayPrototype;\r\n    }\r\n\r\n    // register 'String'\r\n    var stringPrototype = this.elementsLookup.get(\"String\");\r\n    if (stringPrototype) {\r\n      assert(stringPrototype.kind == ElementKind.CLASS_PROTOTYPE);\r\n      let stringInstance = resolver.resolveClass(<ClassPrototype>stringPrototype, null);\r\n      if (stringInstance) {\r\n        if (this.typesLookup.has(\"string\")) {\r\n          let declaration = (<ClassPrototype>stringPrototype).declaration;\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, declaration.programLevelInternalName\r\n          );\r\n        } else {\r\n          this.stringInstance = stringInstance;\r\n          this.typesLookup.set(\"string\", stringInstance.type);\r\n        }\r\n      }\r\n    }\r\n\r\n    // register 'start'\r\n    {\r\n      let element = <Element>assert(this.elementsLookup.get(\"start\"));\r\n      assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n      this.startFunction = <FunctionPrototype>element;\r\n    }\r\n\r\n    // register 'main' if present\r\n    if (this.moduleLevelExports.has(\"main\")) {\r\n      let element = <Element>this.moduleLevelExports.get(\"main\");\r\n      if (\r\n        element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n        !(<FunctionPrototype>element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\r\n      ) {\r\n        (<FunctionPrototype>element).set(CommonFlags.MAIN);\r\n        this.mainFunction = <FunctionPrototype>element;\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Sets a constant integer value. */\r\n  setConstantInteger(globalName: string, type: Type, value: I64): void {\r\n    assert(type.is(TypeFlags.INTEGER));\r\n    this.elementsLookup.set(globalName,\r\n      new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n        .withConstantIntegerValue(value)\r\n    );\r\n  }\r\n\r\n  /** Sets a constant float value. */\r\n  setConstantFloat(globalName: string, type: Type, value: f64): void {\r\n    assert(type.is(TypeFlags.FLOAT));\r\n    this.elementsLookup.set(globalName,\r\n      new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n        .withConstantFloatValue(value)\r\n    );\r\n  }\r\n\r\n  /** Tries to locate an import by traversing exports and queued exports. */\r\n  private tryLocateImport(\r\n    externalName: string,\r\n    queuedNamedExports: Map<string,QueuedExport>\r\n  ): Element | null {\r\n    var element: Element | null;\r\n    var fileLevelExports = this.fileLevelExports;\r\n    do {\r\n      if (element = fileLevelExports.get(externalName)) return element;\r\n      let queuedExport = queuedNamedExports.get(externalName);\r\n      if (!queuedExport) break;\r\n      if (queuedExport.isReExport) {\r\n        externalName = queuedExport.externalName;\r\n        continue;\r\n      }\r\n      return this.elementsLookup.get(queuedExport.externalName);\r\n    } while (true);\r\n    return null;\r\n  }\r\n\r\n  /** Checks that only supported decorators are present. */\r\n  private checkDecorators(\r\n    decorators: DecoratorNode[],\r\n    acceptedFlags: DecoratorFlags\r\n  ): DecoratorFlags {\r\n    var presentFlags = DecoratorFlags.NONE;\r\n    for (let i = 0, k = decorators.length; i < k; ++i) {\r\n      let decorator = decorators[i];\r\n      let kind = decoratorNameToKind(decorator.name);\r\n      let flag = decoratorKindToFlag(kind);\r\n      if (flag) {\r\n        if (!(acceptedFlags & flag)) {\r\n          this.error(\r\n            DiagnosticCode.Decorator_0_is_not_valid_here,\r\n            decorator.range, decorator.name.range.toString()\r\n          );\r\n        } else if (presentFlags & flag) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_decorator,\r\n            decorator.range, decorator.name.range.toString()\r\n          );\r\n        } else {\r\n          presentFlags |= flag;\r\n        }\r\n      }\r\n    }\r\n    return presentFlags;\r\n  }\r\n\r\n  /** Checks and sets up global options of an element. */\r\n  private checkGlobal(\r\n    element: Element,\r\n    declaration: DeclarationStatement\r\n  ): void {\r\n    var parentNode = declaration.parent;\r\n    // alias the element globally if it is ...\r\n    if (\r\n      // explicitly annotated with @global - or -\r\n      (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\r\n      // part of the special builtins library file - or -\r\n      (declaration.range.source.is(CommonFlags.BUILTIN)) ||\r\n      // exported from a top-level library file\r\n      (\r\n        declaration.range.source.isLibrary &&\r\n        element.is(CommonFlags.EXPORT) &&\r\n        (\r\n          assert(parentNode).kind == NodeKind.SOURCE ||\r\n          (\r\n            <Node>parentNode).kind == NodeKind.VARIABLE &&\r\n            assert((<Node>parentNode).parent).kind == NodeKind.SOURCE\r\n          )\r\n        )\r\n    ) {\r\n      let globalName = declaration.programLevelInternalName;\r\n      if (this.elementsLookup.has(globalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, element.internalName\r\n        );\r\n      } else {\r\n        this.elementsLookup.set(globalName, element);\r\n        // builtins can use the global name directly instead of being just an alias\r\n        if (element.is(CommonFlags.BUILTIN)) element.internalName = globalName;\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Initializes a class declaration. */\r\n  private initializeClass(\r\n    declaration: ClassDeclaration,\r\n    queuedExtends: ClassPrototype[],\r\n    queuedImplements: ClassPrototype[],\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var simpleName = declaration.name.text;\r\n    var prototype = new ClassPrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      decorators\r\n        ? this.checkDecorators(decorators,\r\n            DecoratorFlags.GLOBAL |\r\n            DecoratorFlags.SEALED |\r\n            DecoratorFlags.UNMANAGED\r\n          )\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    var implementsTypes = declaration.implementsTypes;\r\n    if (implementsTypes) {\r\n      let numImplementsTypes = implementsTypes.length;\r\n      if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n        if (numImplementsTypes) {\r\n          this.error(\r\n            DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\r\n            Range.join(\r\n              declaration.name.range,\r\n              implementsTypes[numImplementsTypes - 1].range\r\n            )\r\n          );\r\n        }\r\n\r\n      // remember classes that implement interfaces\r\n      } else if (numImplementsTypes) {\r\n        for (let i = 0; i < numImplementsTypes; ++i) {\r\n          this.warning( // TODO\r\n            DiagnosticCode.Operation_not_supported,\r\n            implementsTypes[i].range\r\n          );\r\n        }\r\n        queuedImplements.push(prototype);\r\n      }\r\n    }\r\n\r\n    // remember classes that extend another one\r\n    if (declaration.extendsType) queuedExtends.push(prototype);\r\n\r\n    // add as namespace member if applicable\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // otherwise add to file-level exports if exported\r\n    } else if (prototype.is(CommonFlags.EXPORT)) {\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    // initialize members\r\n    var memberDeclarations = declaration.members;\r\n    for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n      let memberDeclaration = memberDeclarations[i];\r\n      switch (memberDeclaration.kind) {\r\n        case NodeKind.FIELDDECLARATION: {\r\n          this.initializeField(<FieldDeclaration>memberDeclaration, prototype);\r\n          break;\r\n        }\r\n        case NodeKind.METHODDECLARATION: {\r\n          if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n            this.initializeAccessor(<MethodDeclaration>memberDeclaration, prototype);\r\n          } else {\r\n            this.initializeMethod(<MethodDeclaration>memberDeclaration, prototype);\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          assert(false); // should have been reported while parsing\r\n          return;\r\n        }\r\n      }\r\n    }\r\n\r\n    this.checkGlobal(prototype, declaration);\r\n  }\r\n\r\n  /** Initializes a field of a class or interface. */\r\n  private initializeField(\r\n    declaration: FieldDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var name = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var decorators = declaration.decorators;\r\n    var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n    // static fields become global variables\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      if (isInterface) {\r\n        // should have been reported while parsing\r\n        assert(false);\r\n      }\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      if (classPrototype.members) {\r\n        if (classPrototype.members.has(name)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.members = new Map();\r\n      }\r\n      let staticField = new Global(\r\n        this,\r\n        name,\r\n        internalName,\r\n        Type.void, // resolved later on\r\n        declaration,\r\n        decorators\r\n          ? this.checkDecorators(decorators, DecoratorFlags.NONE)\r\n          : DecoratorFlags.NONE\r\n      );\r\n      staticField.parent = classPrototype;\r\n      classPrototype.members.set(name, staticField);\r\n      this.elementsLookup.set(internalName, staticField);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        staticField.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance fields are remembered until resolved\r\n    } else {\r\n      if (isInterface) {\r\n        // should have been reported while parsing\r\n        assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\r\n      }\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(name)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      let instanceField = new FieldPrototype(\r\n        classPrototype,\r\n        name,\r\n        internalName,\r\n        declaration\r\n      );\r\n      if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);\r\n      classPrototype.instanceMembers.set(name, instanceField);\r\n    }\r\n  }\r\n\r\n  /** Initializes a method of a class or interface. */\r\n  private initializeMethod(\r\n    declaration: MethodDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var simpleName = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var prototype: FunctionPrototype | null = null;\r\n\r\n    var decorators = declaration.decorators;\r\n    var decoratorFlags = DecoratorFlags.NONE;\r\n    if (decorators) {\r\n      decoratorFlags = this.checkDecorators(decorators,\r\n        DecoratorFlags.OPERATOR_BINARY  |\r\n        DecoratorFlags.OPERATOR_PREFIX  |\r\n        DecoratorFlags.OPERATOR_POSTFIX |\r\n        DecoratorFlags.INLINE\r\n      );\r\n    }\r\n\r\n    // static methods become global functions\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n          internalName\r\n        );\r\n        return;\r\n      }\r\n      if (classPrototype.members) {\r\n        if (classPrototype.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.members = new Map();\r\n      }\r\n      prototype = new FunctionPrototype(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      classPrototype.members.set(simpleName, prototype);\r\n      this.elementsLookup.set(internalName, prototype);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance methods are remembered until resolved\r\n    } else {\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      prototype = new FunctionPrototype(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n      //   this.error( Unmanaged classes cannot declare abstract methods. );\r\n      // }\r\n      if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n        if (classPrototype.constructorPrototype) {\r\n          this.error(\r\n            DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n            declaration.name.range\r\n          );\r\n        } else {\r\n          prototype.set(CommonFlags.CONSTRUCTOR);\r\n          classPrototype.constructorPrototype = prototype;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers.set(simpleName, prototype);\r\n      }\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n\r\n    this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\r\n  }\r\n\r\n  private checkOperatorOverloads(\r\n    decorators: DecoratorNode[] | null,\r\n    prototype: FunctionPrototype,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    if (decorators) {\r\n      for (let i = 0, k = decorators.length; i < k; ++i) {\r\n        let decorator = decorators[i];\r\n        switch (decorator.decoratorKind) {\r\n          case DecoratorKind.OPERATOR:\r\n          case DecoratorKind.OPERATOR_BINARY:\r\n          case DecoratorKind.OPERATOR_PREFIX:\r\n          case DecoratorKind.OPERATOR_POSTFIX: {\r\n            let numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n            if (numArgs == 1) {\r\n              let firstArg = (<Expression[]>decorator.arguments)[0];\r\n              if (\r\n                firstArg.kind == NodeKind.LITERAL &&\r\n                (<LiteralExpression>firstArg).literalKind == LiteralKind.STRING\r\n              ) {\r\n                let kind = operatorKindFromDecorator(\r\n                  decorator.decoratorKind,\r\n                  (<StringLiteralExpression>firstArg).value\r\n                );\r\n                if (kind == OperatorKind.INVALID) {\r\n                  this.error(\r\n                    DiagnosticCode.Operation_not_supported,\r\n                    firstArg.range\r\n                  );\r\n                } else {\r\n                  let overloads = classPrototype.overloadPrototypes;\r\n                  if (overloads.has(kind)) {\r\n                    this.error(\r\n                      DiagnosticCode.Duplicate_function_implementation,\r\n                      firstArg.range\r\n                    );\r\n                  } else {\r\n                    prototype.operatorKind = kind;\r\n                    overloads.set(kind, prototype);\r\n                  }\r\n                }\r\n              } else {\r\n                this.error(\r\n                  DiagnosticCode.String_literal_expected,\r\n                  firstArg.range\r\n                );\r\n              }\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Expected_0_arguments_but_got_1,\r\n                decorator.range, \"1\", numArgs.toString(0)\r\n              );\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeAccessor(\r\n    declaration: MethodDeclaration,\r\n    classPrototype: ClassPrototype\r\n  ): void {\r\n    var simpleName = declaration.name.text;\r\n    var internalPropertyName = declaration.fileLevelInternalName;\r\n    var propertyElement = this.elementsLookup.get(internalPropertyName);\r\n    var isGetter = declaration.is(CommonFlags.GET);\r\n    var isNew = false;\r\n    if (propertyElement) {\r\n      if (\r\n        propertyElement.kind != ElementKind.PROPERTY ||\r\n        (isGetter\r\n          ? (<Property>propertyElement).getterPrototype\r\n          : (<Property>propertyElement).setterPrototype\r\n        ) != null\r\n      ) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalPropertyName\r\n        );\r\n        return;\r\n      }\r\n    } else {\r\n      propertyElement = new Property(\r\n        this,\r\n        simpleName,\r\n        internalPropertyName,\r\n        classPrototype\r\n      );\r\n      isNew = true;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var decoratorFlags = DecoratorFlags.NONE;\r\n    if (decorators) {\r\n      decoratorFlags = this.checkDecorators(decorators,\r\n        DecoratorFlags.INLINE\r\n      );\r\n    }\r\n\r\n    var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\r\n\r\n    // static accessors become global functions\r\n    if (declaration.is(CommonFlags.STATIC)) {\r\n      let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\r\n      if (this.elementsLookup.has(staticName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, staticName\r\n        );\r\n        return;\r\n      }\r\n      let staticPrototype = new FunctionPrototype(\r\n        this,\r\n        baseName,\r\n        staticName,\r\n        declaration,\r\n        null,\r\n        decoratorFlags\r\n      );\r\n      if (isGetter) {\r\n        (<Property>propertyElement).getterPrototype = staticPrototype;\r\n      } else {\r\n        (<Property>propertyElement).setterPrototype = staticPrototype;\r\n      }\r\n      if (isNew) {\r\n        if (classPrototype.members) {\r\n          if (classPrototype.members.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, staticName\r\n            );\r\n            return;\r\n          }\r\n        } else {\r\n          classPrototype.members = new Map();\r\n        }\r\n        classPrototype.members.set(simpleName, propertyElement); // check above\r\n      } else {\r\n        assert(classPrototype.members && classPrototype.members.has(simpleName));\r\n      }\r\n      this.elementsLookup.set(internalPropertyName, propertyElement);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n\r\n    // instance accessors are remembered until resolved\r\n    } else {\r\n      let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\r\n      if (classPrototype.instanceMembers) {\r\n        if (classPrototype.instanceMembers.has(baseName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalPropertyName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        classPrototype.instanceMembers = new Map();\r\n      }\r\n      let instancePrototype = new FunctionPrototype(\r\n        this,\r\n        baseName,\r\n        instanceName,\r\n        declaration,\r\n        classPrototype,\r\n        decoratorFlags\r\n      );\r\n      if (isGetter) {\r\n        (<Property>propertyElement).getterPrototype = instancePrototype;\r\n      } else {\r\n        (<Property>propertyElement).setterPrototype = instancePrototype;\r\n      }\r\n      classPrototype.instanceMembers.set(baseName, propertyElement);\r\n      this.elementsLookup.set(internalPropertyName, propertyElement);\r\n      if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n        propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n        instancePrototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeEnum(\r\n    declaration: EnumDeclaration,\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n    var simpleName = declaration.name.text;\r\n    var element = new Enum(this, simpleName, internalName, declaration);\r\n    element.parent = namespace;\r\n    this.elementsLookup.set(internalName, element);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, element);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\r\n        element.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (element.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, element);\r\n      this.currentFilespace.members.set(simpleName, element);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        element.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, element);\r\n      }\r\n    }\r\n\r\n    var values = declaration.values;\r\n    for (let i = 0, k = values.length; i < k; ++i) {\r\n      this.initializeEnumValue(values[i], element);\r\n    }\r\n\r\n    this.checkGlobal(element, declaration);\r\n  }\r\n\r\n  private initializeEnumValue(\r\n    declaration: EnumValueDeclaration,\r\n    enm: Enum\r\n  ): void {\r\n    var name = declaration.name.text;\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (enm.members) {\r\n      if (enm.members.has(name)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n    } else {\r\n      enm.members = new Map();\r\n    }\r\n    var value = new EnumValue(enm, this, name, internalName, declaration);\r\n    enm.members.set(name, value);\r\n    if (enm.is(CommonFlags.MODULE_EXPORT)) {\r\n      value.set(CommonFlags.MODULE_EXPORT);\r\n    }\r\n  }\r\n\r\n  private initializeExports(\r\n    statement: ExportStatement,\r\n    queuedExports: Map<string,QueuedExport>\r\n  ): void {\r\n    var members = statement.members;\r\n    if (members) { // named\r\n      for (let i = 0, k = members.length; i < k; ++i) {\r\n        this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n      }\r\n    } else { // TODO: filespace\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        statement.range\r\n      );\r\n    }\r\n  }\r\n\r\n  private setExportAndCheckLibrary(\r\n    internalName: string,\r\n    element: Element,\r\n    identifier: IdentifierExpression\r\n  ): void {\r\n    // add to file-level exports\r\n    this.fileLevelExports.set(internalName, element);\r\n\r\n    // add to filespace\r\n    var internalPath = identifier.range.source.internalPath;\r\n    var prefix = FILESPACE_PREFIX + internalPath;\r\n    var filespace = this.elementsLookup.get(prefix);\r\n    if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\r\n    assert(filespace.kind == ElementKind.FILESPACE);\r\n    var simpleName = identifier.text;\r\n    (<Filespace>filespace).members.set(simpleName, element);\r\n\r\n    // add global alias if from a library file\r\n    if (identifier.range.source.isLibrary) {\r\n      if (this.elementsLookup.has(simpleName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          identifier.range, simpleName\r\n        );\r\n      } else {\r\n        element.internalName = simpleName;\r\n        this.elementsLookup.set(simpleName, element);\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeExport(\r\n    member: ExportMember,\r\n    internalPath: string | null,\r\n    queuedExports: Map<string,QueuedExport>\r\n  ): void {\r\n    var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n    if (this.fileLevelExports.has(externalName)) {\r\n      this.error(\r\n        DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n        member.externalName.range, externalName\r\n      );\r\n      return;\r\n    }\r\n    var referencedName: string;\r\n    var referencedElement: Element | null;\r\n    var queuedExport: QueuedExport | null;\r\n\r\n    // export local element\r\n    if (internalPath == null) {\r\n      referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n      // resolve right away if the element exists\r\n      if (referencedElement = this.elementsLookup.get(referencedName)) {\r\n        this.setExportAndCheckLibrary(\r\n          externalName,\r\n          referencedElement,\r\n          member.externalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // otherwise queue it\r\n      if (queuedExports.has(externalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          member.externalName.range, externalName\r\n        );\r\n        return;\r\n      }\r\n      queuedExport = new QueuedExport();\r\n      queuedExport.isReExport = false;\r\n      queuedExport.externalName = referencedName; // -> here: local name\r\n      queuedExport.member = member;\r\n      queuedExports.set(externalName, queuedExport);\r\n\r\n    // export external element\r\n    } else {\r\n      referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n      // resolve right away if the export exists\r\n      referencedElement = this.elementsLookup.get(referencedName);\r\n      if (referencedElement) {\r\n        this.setExportAndCheckLibrary(\r\n          externalName,\r\n          referencedElement,\r\n          member.externalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // walk already known queued exports\r\n      let seen = new Set<QueuedExport>();\r\n      while (queuedExport = queuedExports.get(referencedName)) {\r\n        if (queuedExport.isReExport) {\r\n          referencedElement = this.fileLevelExports.get(queuedExport.externalName);\r\n          if (referencedElement) {\r\n            this.setExportAndCheckLibrary(\r\n              externalName,\r\n              referencedElement,\r\n              member.externalName\r\n            );\r\n            return;\r\n          }\r\n          referencedName = queuedExport.externalName;\r\n          if (seen.has(queuedExport)) break;\r\n          seen.add(queuedExport);\r\n        } else {\r\n          referencedElement = this.elementsLookup.get(queuedExport.externalName);\r\n          if (referencedElement) {\r\n            this.setExportAndCheckLibrary(\r\n              externalName,\r\n              referencedElement,\r\n              member.externalName\r\n            );\r\n            return;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n\r\n      // otherwise queue it\r\n      if (queuedExports.has(externalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          member.externalName.range, externalName\r\n        );\r\n        return;\r\n      }\r\n      queuedExport = new QueuedExport();\r\n      queuedExport.isReExport = true;\r\n      queuedExport.externalName = referencedName; // -> here: external name\r\n      queuedExport.member = member;\r\n      queuedExports.set(externalName, queuedExport);\r\n    }\r\n  }\r\n\r\n  private initializeFunction(\r\n    declaration: FunctionDeclaration,\r\n    namespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n    var simpleName = declaration.name.text;\r\n    var decorators = declaration.decorators;\r\n    var prototype = new FunctionPrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      null,\r\n      decorators\r\n        ? this.checkDecorators(decorators,\r\n            DecoratorFlags.GLOBAL |\r\n            DecoratorFlags.INLINE |\r\n            DecoratorFlags.EXTERNAL\r\n          )\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(simpleName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.parent = namespace;\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    this.checkGlobal(prototype, declaration);\r\n  }\r\n\r\n  private initializeImports(\r\n    statement: ImportStatement,\r\n    queuedExports: Map<string,QueuedExport>,\r\n    queuedImports: QueuedImport[]\r\n  ): void {\r\n    var declarations = statement.declarations;\r\n    if (declarations) {\r\n      for (let i = 0, k = declarations.length; i < k; ++i) {\r\n        this.initializeImport(\r\n          declarations[i],\r\n          statement.internalPath,\r\n          queuedExports, queuedImports\r\n        );\r\n      }\r\n    } else if (statement.namespaceName) { // import * as simpleName from \"file\"\r\n      let simpleName = statement.namespaceName.text;\r\n      let internalName = (\r\n        statement.range.source.internalPath +\r\n        PATH_DELIMITER +\r\n        simpleName\r\n      );\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          statement.namespaceName.range,\r\n          internalName\r\n        );\r\n        return;\r\n      }\r\n\r\n      // resolve right away if the exact filespace exists\r\n      let filespace = this.elementsLookup.get(statement.internalPath);\r\n      if (filespace) {\r\n        this.elementsLookup.set(internalName, filespace);\r\n        return;\r\n      }\r\n\r\n      // otherwise queue it\r\n      let queuedImport = new QueuedImport();\r\n      queuedImport.localName = internalName;\r\n      let externalName = FILESPACE_PREFIX + statement.internalPath;\r\n      queuedImport.externalName = externalName;\r\n      queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\r\n      queuedImport.declaration = null; // filespace\r\n      queuedImports.push(queuedImport);\r\n    }\r\n  }\r\n\r\n  private initializeImport(\r\n    declaration: ImportDeclaration,\r\n    internalPath: string,\r\n    queuedNamedExports: Map<string,QueuedExport>,\r\n    queuedImports: QueuedImport[]\r\n  ): void {\r\n    var localName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(localName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, localName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n    // resolve right away if the exact export exists\r\n    var element: Element | null;\r\n    if (element = this.fileLevelExports.get(externalName)) {\r\n      this.elementsLookup.set(localName, element);\r\n      return;\r\n    }\r\n\r\n    // otherwise queue it\r\n    const indexPart = PATH_DELIMITER + \"index\";\r\n    var queuedImport = new QueuedImport();\r\n    queuedImport.localName = localName;\r\n    if (internalPath.endsWith(indexPart)) {\r\n      queuedImport.externalName = externalName; // try exact first\r\n      queuedImport.externalNameAlt = (\r\n        internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n        declaration.externalName.text\r\n      );\r\n    } else {\r\n      queuedImport.externalName = externalName; // try exact first\r\n      queuedImport.externalNameAlt = (\r\n        internalPath +\r\n        indexPart +\r\n        PATH_DELIMITER +\r\n        declaration.externalName.text\r\n      );\r\n    }\r\n    queuedImport.declaration = declaration; // named\r\n    queuedImports.push(queuedImport);\r\n  }\r\n\r\n  private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    if (this.elementsLookup.has(internalName)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, internalName\r\n      );\r\n      return;\r\n    }\r\n\r\n    var decorators = declaration.decorators;\r\n    var simpleName = declaration.name.text;\r\n    var prototype = new InterfacePrototype(\r\n      this,\r\n      simpleName,\r\n      internalName,\r\n      declaration,\r\n      decorators\r\n        ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)\r\n        : DecoratorFlags.NONE\r\n    );\r\n    prototype.parent = namespace;\r\n    this.elementsLookup.set(internalName, prototype);\r\n\r\n    if (namespace) {\r\n      if (namespace.members) {\r\n        if (namespace.members.has(prototype.internalName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        namespace.members = new Map();\r\n      }\r\n      namespace.members.set(prototype.internalName, prototype);\r\n      if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n      if (this.fileLevelExports.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        return;\r\n      }\r\n      this.fileLevelExports.set(internalName, prototype);\r\n      this.currentFilespace.members.set(simpleName, prototype);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n          );\r\n          return;\r\n        }\r\n        prototype.set(CommonFlags.MODULE_EXPORT);\r\n        this.moduleLevelExports.set(simpleName, prototype);\r\n      }\r\n    }\r\n\r\n    var memberDeclarations = declaration.members;\r\n    for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n      let memberDeclaration = memberDeclarations[i];\r\n      switch (memberDeclaration.kind) {\r\n\r\n        case NodeKind.FIELDDECLARATION: {\r\n          this.initializeField(<FieldDeclaration>memberDeclaration, prototype);\r\n          break;\r\n        }\r\n        case NodeKind.METHODDECLARATION: {\r\n          if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n            this.initializeAccessor(<MethodDeclaration>memberDeclaration, prototype);\r\n          } else {\r\n            this.initializeMethod(<MethodDeclaration>memberDeclaration, prototype);\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          throw new Error(\"interface member expected\");\r\n        }\r\n      }\r\n    }\r\n\r\n    this.checkGlobal(prototype, declaration);\r\n  }\r\n\r\n  private initializeNamespace(\r\n    declaration: NamespaceDeclaration,\r\n    queuedExtends: ClassPrototype[],\r\n    queuedImplements: ClassPrototype[],\r\n    parentNamespace: Element | null = null\r\n  ): void {\r\n    var internalName = declaration.fileLevelInternalName;\r\n    var simpleName = declaration.name.text;\r\n    var namespace = this.elementsLookup.get(internalName);\r\n    if (!namespace) {\r\n      namespace = new Namespace(this, simpleName, internalName, declaration);\r\n      namespace.parent = parentNamespace;\r\n      this.elementsLookup.set(internalName, namespace);\r\n      this.checkGlobal(namespace, declaration);\r\n    }\r\n\r\n    if (parentNamespace) {\r\n      if (parentNamespace.members) {\r\n        if (parentNamespace.members.has(simpleName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n          return;\r\n        }\r\n      } else {\r\n        parentNamespace.members = new Map();\r\n      }\r\n      parentNamespace.members.set(simpleName, namespace);\r\n      if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\r\n        namespace.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\r\n      let existingExport = this.fileLevelExports.get(internalName);\r\n      if (existingExport) {\r\n        if (!existingExport.is(CommonFlags.EXPORT)) {\r\n          this.error(\r\n            DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\r\n            declaration.name.range, namespace.internalName\r\n          ); // recoverable\r\n        }\r\n        namespace = existingExport; // join\r\n      } else {\r\n        this.fileLevelExports.set(internalName, namespace);\r\n      }\r\n      this.currentFilespace.members.set(simpleName, namespace);\r\n      if (declaration.range.source.isEntry) {\r\n        if (this.moduleLevelExports.has(simpleName)) {\r\n          if (this.moduleLevelExports.get(simpleName) !== namespace) { // not merged\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n            );\r\n            return;\r\n          }\r\n        } else {\r\n          this.moduleLevelExports.set(simpleName, namespace);\r\n        }\r\n        namespace.set(CommonFlags.MODULE_EXPORT);\r\n      }\r\n    }\r\n\r\n    var members = declaration.members;\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      switch (members[i].kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          this.initializeClass(<ClassDeclaration>members[i], queuedExtends, queuedImplements, namespace);\r\n          break;\r\n        }\r\n        case NodeKind.ENUMDECLARATION: {\r\n          this.initializeEnum(<EnumDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          this.initializeFunction(<FunctionDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: {\r\n          this.initializeInterface(<InterfaceDeclaration>members[i], namespace);\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          this.initializeNamespace(<NamespaceDeclaration>members[i], queuedExtends, queuedImplements, namespace);\r\n          break;\r\n        }\r\n        case NodeKind.TYPEDECLARATION: {\r\n          // this.initializeTypeAlias(<TypeDeclaration>members[i], namespace);\r\n          // TODO: what about namespaced types?\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            members[i].range\r\n          );\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: {\r\n          this.initializeVariables(<VariableStatement>members[i], namespace);\r\n          break;\r\n        }\r\n        default: {\r\n          throw new Error(\"namespace member expected\");\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n    // type aliases are program globals\r\n    // TODO: what about namespaced types?\r\n    var name = declaration.name.text;\r\n    if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\r\n      this.error(\r\n        DiagnosticCode.Duplicate_identifier_0,\r\n        declaration.name.range, name\r\n      );\r\n      return;\r\n    }\r\n    var alias = new TypeAlias();\r\n    alias.typeParameters = declaration.typeParameters;\r\n    alias.type = declaration.type;\r\n    this.typeAliases.set(name, alias);\r\n  }\r\n\r\n  private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n    var declarations = statement.declarations;\r\n    for (let i = 0, k = declarations.length; i < k; ++i) {\r\n      let declaration = declarations[i];\r\n      let decorators = declaration.decorators;\r\n      let internalName = declaration.fileLevelInternalName;\r\n      if (this.elementsLookup.has(internalName)) {\r\n        this.error(\r\n          DiagnosticCode.Duplicate_identifier_0,\r\n          declaration.name.range, internalName\r\n        );\r\n        continue;\r\n      }\r\n      let simpleName = declaration.name.text;\r\n      let global = new Global(\r\n        this,\r\n        simpleName,\r\n        internalName,\r\n        Type.void, // resolved later on\r\n        declaration,\r\n        decorators\r\n          ? this.checkDecorators(decorators,\r\n              DecoratorFlags.GLOBAL |\r\n              DecoratorFlags.EXTERNAL\r\n            )\r\n          : DecoratorFlags.NONE\r\n      );\r\n      global.parent = namespace;\r\n      this.elementsLookup.set(internalName, global);\r\n\r\n      if (namespace) {\r\n        if (namespace.members) {\r\n          if (namespace.members.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, internalName\r\n            );\r\n            continue;\r\n          }\r\n        } else {\r\n          namespace.members = new Map();\r\n        }\r\n        namespace.members.set(simpleName, global);\r\n        if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\r\n          global.set(CommonFlags.MODULE_EXPORT);\r\n        }\r\n      } else if (global.is(CommonFlags.EXPORT)) { // no namespace\r\n        if (this.fileLevelExports.has(internalName)) {\r\n          this.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range, internalName\r\n          );\r\n        } else {\r\n          this.fileLevelExports.set(internalName, global);\r\n        }\r\n        this.currentFilespace.members.set(simpleName, global);\r\n        if (declaration.range.source.isEntry) {\r\n          if (this.moduleLevelExports.has(simpleName)) {\r\n            this.error(\r\n              DiagnosticCode.Duplicate_identifier_0,\r\n              declaration.name.range, (<Element>this.moduleLevelExports.get(simpleName)).internalName\r\n            );\r\n            continue;\r\n          }\r\n          global.set(CommonFlags.MODULE_EXPORT);\r\n          this.moduleLevelExports.set(simpleName, global);\r\n        }\r\n      }\r\n      this.checkGlobal(global, declaration);\r\n    }\r\n  }\r\n}\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n  /** A {@link Global}. */\r\n  GLOBAL,\r\n  /** A {@link Local}. */\r\n  LOCAL,\r\n  /** An {@link Enum}. */\r\n  ENUM,\r\n  /** An {@link EnumValue}. */\r\n  ENUMVALUE,\r\n  /** A {@link FunctionPrototype}. */\r\n  FUNCTION_PROTOTYPE,\r\n  /** A {@link Function}. */\r\n  FUNCTION,\r\n  /** A {@link FunctionTarget}. */\r\n  FUNCTION_TARGET,\r\n  /** A {@link ClassPrototype}. */\r\n  CLASS_PROTOTYPE,\r\n  /** A {@link Class}. */\r\n  CLASS,\r\n  /** An {@link InterfacePrototype}. */\r\n  INTERFACE_PROTOTYPE,\r\n  /** An {@link Interface}. */\r\n  INTERFACE,\r\n  /** A {@link FieldPrototype}. */\r\n  FIELD_PROTOTYPE,\r\n  /** A {@link Field}. */\r\n  FIELD,\r\n  /** A {@link Property}. */\r\n  PROPERTY,\r\n  /** A {@link Namespace}. */\r\n  NAMESPACE,\r\n  /** A {@link Filespace}. */\r\n  FILESPACE,\r\n}\r\n\r\nexport enum DecoratorFlags {\r\n  /** No flags set. */\r\n  NONE = 0,\r\n  /** Is a program global. */\r\n  GLOBAL = 1 << 0,\r\n  /** Is a binary operator overload. */\r\n  OPERATOR_BINARY = 1 << 1,\r\n  /** Is a unary prefix operator overload. */\r\n  OPERATOR_PREFIX = 1 << 2,\r\n  /** Is a unary postfix operator overload. */\r\n  OPERATOR_POSTFIX = 1 << 3,\r\n  /** Is an unmanaged class. */\r\n  UNMANAGED = 1 << 4,\r\n  /** Is a sealed class. */\r\n  SEALED = 1 << 5,\r\n  /** Is always inlined. */\r\n  INLINE = 1 << 6,\r\n  /** Is using a different external name. */\r\n  EXTERNAL = 1 << 7\r\n}\r\n\r\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\r\n  switch (kind) {\r\n    case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\r\n    case DecoratorKind.OPERATOR:\r\n    case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\r\n    case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\r\n    case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\r\n    case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\r\n    case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\r\n    case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\r\n    case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\r\n    default: return DecoratorFlags.NONE;\r\n  }\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n  /** Specific element kind. */\r\n  kind: ElementKind;\r\n  /** Containing {@link Program}. */\r\n  program: Program;\r\n  /** Simple name. */\r\n  simpleName: string;\r\n  /** Internal name referring to this element. */\r\n  internalName: string;\r\n  /** Common flags indicating specific traits. */\r\n  flags: CommonFlags = CommonFlags.NONE;\r\n  /** Decorator flags indicating annotated traits. */\r\n  decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\r\n  /** Namespaced member elements. */\r\n  members: Map<string,Element> | null = null;\r\n  /** Parent element, if applicable. */\r\n  parent: Element | null = null;\r\n\r\n  /** Constructs a new element, linking it to its containing {@link Program}. */\r\n  protected constructor(program: Program, simpleName: string, internalName: string) {\r\n    this.program = program;\r\n    this.simpleName = simpleName;\r\n    this.internalName = internalName;\r\n  }\r\n\r\n  /** Tests if this element has a specific flag or flags. */\r\n  is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this element has any of the specified flags. */\r\n  isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\r\n  /** Sets a specific flag or flags. */\r\n  set(flag: CommonFlags): void { this.flags |= flag; }\r\n  /** Tests if this element has a specific decorator flag or flags. */\r\n  hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\r\n}\r\n\r\n/** A filespace representing the implicit top-level namespace of a source. */\r\nexport class Filespace extends Element {\r\n\r\n  kind = ElementKind.FILESPACE;\r\n\r\n  /** File members (externally visible only). */\r\n  members: Map<string,Element>; // more specific\r\n\r\n  /** Constructs a new filespace. */\r\n  constructor(\r\n    program: Program,\r\n    source: Source\r\n  ) {\r\n    super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\r\n    this.members = new Map();\r\n  }\r\n}\r\n\r\n/** A namespace that differs from a filespace in being user-declared with a name. */\r\nexport class Namespace extends Element {\r\n\r\n  // All elements have namespace semantics. This is an explicitly declared one.\r\n  kind = ElementKind.NAMESPACE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: NamespaceDeclaration; // more specific\r\n\r\n  /** Constructs a new namespace. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: NamespaceDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n  kind = ElementKind.ENUM;\r\n\r\n  /** Declaration reference. */\r\n  declaration: EnumDeclaration;\r\n\r\n  /** Constructs a new enum. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: EnumDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n  kind = ElementKind.ENUMVALUE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: EnumValueDeclaration;\r\n  /** Constant value, if applicable. */\r\n  constantValue: i32 = 0;\r\n\r\n  constructor(\r\n    enm: Enum,\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: EnumValueDeclaration\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.parent = enm;\r\n    this.declaration = declaration;\r\n  }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n  NONE,\r\n  INTEGER,\r\n  FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n  // kind varies\r\n\r\n  /** Declaration reference. */\r\n  declaration: VariableLikeDeclarationStatement | null;\r\n  /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n  type: Type;\r\n  /** Constant value kind. */\r\n  constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n  /** Constant integer value, if applicable. */\r\n  constantIntegerValue: I64;\r\n  /** Constant float value, if applicable. */\r\n  constantFloatValue: f64;\r\n\r\n  protected constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.type = type;\r\n    this.declaration = declaration;\r\n  }\r\n\r\n  withConstantIntegerValue(value: I64): this {\r\n    this.constantValueKind = ConstantValueKind.INTEGER;\r\n    this.constantIntegerValue = value;\r\n    this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n    return this;\r\n  }\r\n\r\n  withConstantFloatValue(value: f64): this {\r\n    this.constantValueKind = ConstantValueKind.FLOAT;\r\n    this.constantFloatValue = value;\r\n    this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n    return this;\r\n  }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n  kind = ElementKind.GLOBAL;\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName, type, declaration);\r\n    this.flags = declaration ? declaration.flags : CommonFlags.NONE;\r\n    this.decoratorFlags = decoratorFlags;\r\n    this.type = type; // resolved later if `void`\r\n  }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n  // not an Element on its own\r\n\r\n  /** Parameter name. */\r\n  name: string;\r\n  /** Parameter type. */\r\n  type: Type;\r\n  /** Parameter initializer. */\r\n  initializer: Expression | null;\r\n\r\n  /** Constructs a new function parameter. */\r\n  constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n    this.name = name;\r\n    this.type = type;\r\n    this.initializer = initializer;\r\n  }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n  kind = ElementKind.LOCAL;\r\n\r\n  /** Local index. */\r\n  index: i32;\r\n  /** Respective scoped global, if any. */\r\n  scopedGlobal: Global | null = null;\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    index: i32,\r\n    type: Type,\r\n    declaration: VariableLikeDeclarationStatement | null = null\r\n  ) {\r\n    super(program, simpleName, simpleName, type, declaration);\r\n    this.index = index;\r\n  }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n  kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: FunctionDeclaration;\r\n  /** If an instance method, the class prototype reference. */\r\n  classPrototype: ClassPrototype | null;\r\n  /** Resolved instances. */\r\n  instances: Map<string,Function> = new Map();\r\n  /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\r\n  classTypeArguments: Type[] | null = null;\r\n  /** Operator kind, if an overload. */\r\n  operatorKind: OperatorKind = OperatorKind.INVALID;\r\n\r\n  /** Constructs a new function prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: FunctionDeclaration,\r\n    classPrototype: ClassPrototype | null = null,\r\n    decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n    this.classPrototype = classPrototype;\r\n    this.decoratorFlags = decoratorFlags;\r\n  }\r\n\r\n  toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n  kind = ElementKind.FUNCTION;\r\n\r\n  /** Prototype reference. */\r\n  prototype: FunctionPrototype;\r\n  /** Function signature. */\r\n  signature: Signature;\r\n  /** Map of locals by name. */\r\n  localsByName: Map<string,Local> = new Map();\r\n  /** Array of locals by index. */\r\n  localsByIndex: Local[] = [];\r\n  /** List of additional non-parameter locals. */\r\n  additionalLocals: Type[] = [];\r\n  /** Current break context label. */\r\n  breakContext: string | null = null;\r\n  /** Contextual type arguments. */\r\n  contextualTypeArguments: Map<string,Type> | null;\r\n  /** Current control flow. */\r\n  flow: Flow;\r\n  /** Remembered debug locations. */\r\n  debugLocations: Range[] = [];\r\n  /** Function reference, if compiled. */\r\n  ref: FunctionRef = 0;\r\n  /** Function table index, if any. */\r\n  functionTableIndex: i32 = -1;\r\n  /** Trampoline function for calling with omitted arguments. */\r\n  trampoline: Function | null = null;\r\n  /** The outer scope, if a function expression. */\r\n  outerScope: Flow | null = null;\r\n\r\n  private nextBreakId: i32 = 0;\r\n  private breakStack: i32[] | null = null;\r\n  nextInlineId: i32 = 0;\r\n\r\n  /** Constructs a new concrete function. */\r\n  constructor(\r\n    prototype: FunctionPrototype,\r\n    internalName: string,\r\n    signature: Signature,\r\n    parent: Element | null = null,\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ) {\r\n    super(prototype.program, prototype.simpleName, internalName);\r\n    this.prototype = prototype;\r\n    this.signature = signature;\r\n    this.parent = parent;\r\n    this.flags = prototype.flags;\r\n    this.decoratorFlags = prototype.decoratorFlags;\r\n    this.contextualTypeArguments = contextualTypeArguments;\r\n    if (!(prototype.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN) || prototype.is(CommonFlags.DECLARE))) {\r\n      let localIndex = 0;\r\n      if (parent && parent.kind == ElementKind.CLASS) {\r\n        assert(this.is(CommonFlags.INSTANCE));\r\n        let local = new Local(\r\n          prototype.program,\r\n          \"this\",\r\n          localIndex++,\r\n          assert(signature.thisType)\r\n        );\r\n        this.localsByName.set(\"this\", local);\r\n        this.localsByIndex[local.index] = local;\r\n        let inheritedTypeArguments = (<Class>parent).contextualTypeArguments;\r\n        if (inheritedTypeArguments) {\r\n          if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n          for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n            if (!this.contextualTypeArguments.has(inheritedName)) {\r\n              this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n            }\r\n          }\r\n        }\r\n      } else {\r\n        assert(!this.is(CommonFlags.INSTANCE)); // internal error\r\n      }\r\n      let parameterTypes = signature.parameterTypes;\r\n      for (let i = 0, k = parameterTypes.length; i < k; ++i) {\r\n        let parameterType = parameterTypes[i];\r\n        let parameterName = signature.getParameterName(i);\r\n        let local = new Local(\r\n          prototype.program,\r\n          parameterName,\r\n          localIndex++,\r\n          parameterType\r\n          // FIXME: declaration?\r\n        );\r\n        this.localsByName.set(parameterName, local);\r\n        this.localsByIndex[local.index] = local;\r\n      }\r\n    }\r\n    this.flow = Flow.create(this);\r\n  }\r\n\r\n  /** Adds a local of the specified type, with an optional name. */\r\n  addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\r\n    // if it has a name, check previously as this method will throw otherwise\r\n    var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\r\n    if (this.is(CommonFlags.INSTANCE)) ++localIndex;\r\n    var local = new Local(\r\n      this.prototype.program,\r\n      name\r\n        ? name\r\n        : \"var$\" + localIndex.toString(10),\r\n      localIndex,\r\n      type,\r\n      declaration\r\n    );\r\n    if (name) {\r\n      if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\r\n      this.localsByName.set(name, local);\r\n    }\r\n    this.localsByIndex[local.index] = local;\r\n    this.additionalLocals.push(type);\r\n    return local;\r\n  }\r\n\r\n  private tempI32s: Local[] | null = null;\r\n  private tempI64s: Local[] | null = null;\r\n  private tempF32s: Local[] | null = null;\r\n  private tempF64s: Local[] | null = null;\r\n\r\n  /** Gets a free temporary local of the specified type. */\r\n  getTempLocal(type: Type, wrapped: bool = false): Local {\r\n    var temps: Local[] | null;\r\n    switch (type.toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s;\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s;\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s;\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s;\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    var local: Local;\r\n    if (temps && temps.length) {\r\n      local = temps.pop();\r\n      local.type = type;\r\n      local.flags = CommonFlags.NONE;\r\n    } else {\r\n      local = this.addLocal(type);\r\n    }\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.flow.setLocalWrapped(local.index, wrapped);\r\n    }\r\n    return local;\r\n  }\r\n\r\n  /** Frees the temporary local for reuse. */\r\n  freeTempLocal(local: Local): void {\r\n    if (local.is(CommonFlags.INLINED)) return;\r\n    assert(local.index >= 0);\r\n    var temps: Local[];\r\n    assert(local.type != null); // internal error\r\n    switch ((<Type>local.type).toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s || (this.tempI32s = []);\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s || (this.tempI64s = []);\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s || (this.tempF32s = []);\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s || (this.tempF64s = []);\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    assert(local.index >= 0);\r\n    temps.push(local);\r\n  }\r\n\r\n  /** Gets and immediately frees a temporary local of the specified type. */\r\n  getAndFreeTempLocal(type: Type, wrapped: bool): Local {\r\n    var temps: Local[];\r\n    switch (type.toNativeType()) {\r\n      case NativeType.I32: {\r\n        temps = this.tempI32s || (this.tempI32s = []);\r\n        break;\r\n      }\r\n      case NativeType.I64: {\r\n        temps = this.tempI64s || (this.tempI64s = []);\r\n        break;\r\n      }\r\n      case NativeType.F32: {\r\n        temps = this.tempF32s || (this.tempF32s = []);\r\n        break;\r\n      }\r\n      case NativeType.F64: {\r\n        temps = this.tempF64s || (this.tempF64s = []);\r\n        break;\r\n      }\r\n      default: throw new Error(\"concrete type expected\");\r\n    }\r\n    var local: Local;\r\n    if (temps.length) {\r\n      local = temps[temps.length - 1];\r\n      local.type = type;\r\n    } else {\r\n      local = this.addLocal(type);\r\n      temps.push(local);\r\n    }\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.flow.setLocalWrapped(local.index, wrapped);\r\n    }\r\n    return local;\r\n  }\r\n\r\n  /** Enters a(nother) break context. */\r\n  enterBreakContext(): string {\r\n    var id = this.nextBreakId++;\r\n    if (!this.breakStack) this.breakStack = [ id ];\r\n    else this.breakStack.push(id);\r\n    return this.breakContext = id.toString(10);\r\n  }\r\n\r\n  /** Leaves the current break context. */\r\n  leaveBreakContext(): void {\r\n    assert(this.breakStack != null);\r\n    var length = (<i32[]>this.breakStack).length;\r\n    assert(length > 0);\r\n    (<i32[]>this.breakStack).pop();\r\n    if (length > 1) {\r\n      this.breakContext = (<i32[]>this.breakStack)[length - 2].toString(10);\r\n    } else {\r\n      this.breakContext = null;\r\n      this.breakStack = null;\r\n    }\r\n  }\r\n\r\n  /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n  finalize(module: Module, ref: FunctionRef): void {\r\n    this.ref = ref;\r\n    assert(!this.breakStack || !this.breakStack.length); // internal error\r\n    this.breakStack = null;\r\n    this.breakContext = null;\r\n    this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n    if (this.program.options.sourceMap) {\r\n      let debugLocations = this.debugLocations;\r\n      for (let i = 0, k = debugLocations.length; i < k; ++i) {\r\n        let debugLocation = debugLocations[i];\r\n        module.setDebugLocation(\r\n          ref,\r\n          debugLocation.debugInfoRef,\r\n          debugLocation.source.debugInfoIndex,\r\n          debugLocation.line,\r\n          debugLocation.column\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Returns the TypeScript representation of this function. */\r\n  toString(): string { return this.prototype.simpleName; }\r\n}\r\n\r\n/** A resolved function target, that is a function called indirectly by an index and signature. */\r\nexport class FunctionTarget extends Element {\r\n\r\n  kind = ElementKind.FUNCTION_TARGET;\r\n\r\n  /** Underlying signature. */\r\n  signature: Signature;\r\n  /** Function type. */\r\n  type: Type;\r\n\r\n  /** Constructs a new function target. */\r\n  constructor(program: Program, signature: Signature) {\r\n    super(program, \"\", \"\");\r\n    var simpleName = signature.toSignatureString();\r\n    this.simpleName = simpleName;\r\n    this.internalName = simpleName;\r\n    this.signature = signature;\r\n    this.type = Type.u32.asFunction(signature);\r\n  }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n  kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: FieldDeclaration;\r\n  /** Parent class prototype. */\r\n  classPrototype: ClassPrototype;\r\n\r\n  /** Constructs a new field prototype. */\r\n  constructor(\r\n    classPrototype: ClassPrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: FieldDeclaration\r\n  ) {\r\n    super(classPrototype.program, simpleName, internalName);\r\n    this.classPrototype = classPrototype;\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n  }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n  kind = ElementKind.FIELD;\r\n\r\n  /** Field prototype reference. */\r\n  prototype: FieldPrototype;\r\n  /** Field memory offset, if an instance field. */\r\n  memoryOffset: i32 = -1;\r\n\r\n  /** Constructs a new field. */\r\n  constructor(\r\n    prototype: FieldPrototype,\r\n    internalName: string,\r\n    type: Type,\r\n    declaration: FieldDeclaration,\r\n    parent: Class\r\n  ) {\r\n    super(prototype.program, prototype.simpleName, internalName, type, declaration);\r\n    this.prototype = prototype;\r\n    this.flags = prototype.flags;\r\n    this.type = type;\r\n    this.parent = parent;\r\n  }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n  kind = ElementKind.PROPERTY;\r\n\r\n  /** Parent class prototype. */\r\n  parent: ClassPrototype;\r\n  /** Getter prototype. */\r\n  getterPrototype: FunctionPrototype | null = null;\r\n  /** Setter prototype. */\r\n  setterPrototype: FunctionPrototype | null = null;\r\n\r\n  /** Constructs a new property prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    parent: ClassPrototype\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.parent = parent;\r\n  }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n  kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: ClassDeclaration;\r\n  /** Resolved instances. */\r\n  instances: Map<string,Class> = new Map();\r\n  /** Instance member prototypes. */\r\n  instanceMembers: Map<string,Element> | null = null;\r\n  /** Base class prototype, if applicable. */\r\n  basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n  /** Constructor prototype. */\r\n  constructorPrototype: FunctionPrototype | null = null;\r\n  /** Operator overload prototypes. */\r\n  overloadPrototypes: Map<OperatorKind, FunctionPrototype> = new Map();\r\n\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: ClassDeclaration,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName);\r\n    this.declaration = declaration;\r\n    this.flags = declaration.flags;\r\n    this.decoratorFlags = decoratorFlags;\r\n  }\r\n\r\n  toString(): string {\r\n    return this.simpleName;\r\n  }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n  kind = ElementKind.CLASS;\r\n\r\n  /** Prototype reference. */\r\n  prototype: ClassPrototype;\r\n  /** Resolved type arguments. */\r\n  typeArguments: Type[] | null;\r\n  /** Resolved class type. */\r\n  type: Type;\r\n  /** Base class, if applicable. */\r\n  base: Class | null;\r\n  /** Contextual type arguments for fields and methods. */\r\n  contextualTypeArguments: Map<string,Type> | null = null;\r\n  /** Current member memory offset. */\r\n  currentMemoryOffset: u32 = 0;\r\n  /** Constructor instance. */\r\n  constructorInstance: Function | null = null;\r\n  /** Operator overloads. */\r\n  overloads: Map<OperatorKind,Function> | null = null;\r\n\r\n  /** Constructs a new class. */\r\n  constructor(\r\n    prototype: ClassPrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    typeArguments: Type[] | null = null,\r\n    base: Class | null = null\r\n  ) {\r\n    super(prototype.program, simpleName, internalName);\r\n    this.prototype = prototype;\r\n    this.flags = prototype.flags;\r\n    this.decoratorFlags = prototype.decoratorFlags;\r\n    this.typeArguments = typeArguments;\r\n    this.type = prototype.program.options.usizeType.asClass(this);\r\n    this.base = base;\r\n\r\n    // inherit static members and contextual type arguments from base class\r\n    if (base) {\r\n      let inheritedTypeArguments = base.contextualTypeArguments;\r\n      if (inheritedTypeArguments) {\r\n        if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n        for (let [baseName, baseType] of inheritedTypeArguments) {\r\n          this.contextualTypeArguments.set(baseName, baseType);\r\n        }\r\n      }\r\n    }\r\n\r\n    // apply instance-specific contextual type arguments\r\n    var declaration = this.prototype.declaration;\r\n    var i: i32, k: i32;\r\n    if (declaration) { // irrelevant for built-ins\r\n      let typeParameters = declaration.typeParameters;\r\n      if (typeArguments) {\r\n        if ((k = typeArguments.length) != typeParameters.length) {\r\n          throw new Error(\"type argument count mismatch\");\r\n        }\r\n        if (k) {\r\n          if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n          for (i = 0; i < k; ++i) {\r\n            this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n          }\r\n        }\r\n      } else if (typeParameters.length) {\r\n        throw new Error(\"type argument count mismatch\");\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Tests if a value of this class type is assignable to a target of the specified class type. */\r\n  isAssignableTo(target: Class): bool {\r\n    var current: Class | null = this;\r\n    do if (current == target) return true;\r\n    while (current = current.base);\r\n    return false;\r\n  }\r\n\r\n  /** Looks up the operator overload of the specified kind. */\r\n  lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\r\n    if (unchecked) {\r\n      switch (kind) {\r\n        case OperatorKind.INDEXED_GET: {\r\n          let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\r\n          if (uncheckedOverload) return uncheckedOverload;\r\n          break;\r\n        }\r\n        case OperatorKind.INDEXED_SET: {\r\n          let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\r\n          if (uncheckedOverload) return uncheckedOverload;\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n    var instance: Class | null = this;\r\n    do {\r\n      let overloads = instance.overloads;\r\n      if (overloads) {\r\n        let overload = overloads.get(kind);\r\n        if (overload) return overload;\r\n      }\r\n    } while (instance = instance.base);\r\n    return null;\r\n  }\r\n\r\n  toString(): string {\r\n    return this.simpleName;\r\n  }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n  kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n  /** Declaration reference. */\r\n  declaration: InterfaceDeclaration; // more specific\r\n\r\n  /** Constructs a new interface prototype. */\r\n  constructor(\r\n    program: Program,\r\n    simpleName: string,\r\n    internalName: string,\r\n    declaration: InterfaceDeclaration,\r\n    decoratorFlags: DecoratorFlags\r\n  ) {\r\n    super(program, simpleName, internalName, declaration, decoratorFlags);\r\n  }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n  kind = ElementKind.INTERFACE;\r\n\r\n  /** Prototype reference. */\r\n  prototype: InterfacePrototype; // more specific\r\n  /** Base interface, if applcable. */\r\n  base: Interface | null; // more specific\r\n\r\n  /** Constructs a new interface. */\r\n  constructor(\r\n    prototype: InterfacePrototype,\r\n    simpleName: string,\r\n    internalName: string,\r\n    typeArguments: Type[] = [],\r\n    base: Interface | null = null\r\n  ) {\r\n    super(prototype, simpleName, internalName, typeArguments, base);\r\n  }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n  /** No specific conditions. */\r\n  NONE = 0,\r\n\r\n  // categorical\r\n\r\n  /** This branch always returns. */\r\n  RETURNS = 1 << 0,\r\n  /** This branch always returns a wrapped value. */\r\n  RETURNS_WRAPPED = 1 << 1,\r\n  /** This branch always throws. */\r\n  THROWS = 1 << 2,\r\n  /** This branch always breaks. */\r\n  BREAKS = 1 << 3,\r\n  /** This branch always continues. */\r\n  CONTINUES = 1 << 4,\r\n  /** This branch always allocates. Constructors only. */\r\n  ALLOCATES = 1 << 5,\r\n\r\n  // conditional\r\n\r\n  /** This branch conditionally returns in a child branch. */\r\n  CONDITIONALLY_RETURNS = 1 << 6,\r\n  /** This branch conditionally throws in a child branch. */\r\n  CONDITIONALLY_THROWS = 1 << 7,\r\n  /** This branch conditionally breaks in a child branch. */\r\n  CONDITIONALLY_BREAKS = 1 << 8,\r\n  /** This branch conditionally continues in a child branch. */\r\n  CONDITIONALLY_CONTINUES = 1 << 9,\r\n  /** This branch conditionally allocates in a child branch. Constructors only. */\r\n  CONDITIONALLY_ALLOCATES = 1 << 10,\r\n\r\n  // special\r\n\r\n  /** This branch is part of inlining a function. */\r\n  INLINE_CONTEXT = 1 << 11,\r\n  /** This branch explicitly requests no bounds checking. */\r\n  UNCHECKED_CONTEXT = 1 << 12,\r\n\r\n  // masks\r\n\r\n  /** Any terminating flag. */\r\n  ANY_TERMINATING = FlowFlags.RETURNS\r\n                  | FlowFlags.THROWS\r\n                  | FlowFlags.BREAKS\r\n                  | FlowFlags.CONTINUES,\r\n\r\n  /** Any categorical flag. */\r\n  ANY_CATEGORICAL = FlowFlags.RETURNS\r\n                  | FlowFlags.RETURNS_WRAPPED\r\n                  | FlowFlags.THROWS\r\n                  | FlowFlags.BREAKS\r\n                  | FlowFlags.CONTINUES\r\n                  | FlowFlags.ALLOCATES,\r\n\r\n  /** Any conditional flag. */\r\n  ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\r\n                  | FlowFlags.CONDITIONALLY_THROWS\r\n                  | FlowFlags.CONDITIONALLY_BREAKS\r\n                  | FlowFlags.CONDITIONALLY_CONTINUES\r\n                  | FlowFlags.CONDITIONALLY_ALLOCATES\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n  /** Parent flow. */\r\n  parent: Flow | null;\r\n  /** Flow flags indicating specific conditions. */\r\n  flags: FlowFlags;\r\n  /** Function this flow belongs to. */\r\n  currentFunction: Function;\r\n  /** The label we break to when encountering a continue statement. */\r\n  continueLabel: string | null;\r\n  /** The label we break to when encountering a break statement. */\r\n  breakLabel: string | null;\r\n  /** The label we break to when encountering a return statement, when inlining. */\r\n  returnLabel: string | null;\r\n  /** The current return type. */\r\n  returnType: Type;\r\n  /** The current contextual type arguments. */\r\n  contextualTypeArguments: Map<string,Type> | null;\r\n  /** Scoped local variables. */\r\n  scopedLocals: Map<string,Local> | null = null;\r\n  /** Local variable wrap states for the first 64 locals. */\r\n  wrappedLocals: I64;\r\n  /** Local variable wrap states for locals with index >= 64. */\r\n  wrappedLocalsExt: I64[] | null;\r\n\r\n  /** Creates the parent flow of the specified function. */\r\n  static create(currentFunction: Function): Flow {\r\n    var parentFlow = new Flow();\r\n    parentFlow.parent = null;\r\n    parentFlow.flags = FlowFlags.NONE;\r\n    parentFlow.currentFunction = currentFunction;\r\n    parentFlow.continueLabel = null;\r\n    parentFlow.breakLabel = null;\r\n    parentFlow.returnLabel = null;\r\n    parentFlow.returnType = currentFunction.signature.returnType;\r\n    parentFlow.contextualTypeArguments = currentFunction.contextualTypeArguments;\r\n    parentFlow.wrappedLocals = i64_new(0);\r\n    parentFlow.wrappedLocalsExt = null;\r\n    return parentFlow;\r\n  }\r\n\r\n  private constructor() { }\r\n\r\n  /** Tests if this flow has the specified flag or flags. */\r\n  is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n  /** Tests if this flow has one of the specified flags. */\r\n  isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\r\n  /** Sets the specified flag or flags. */\r\n  set(flag: FlowFlags): void { this.flags |= flag; }\r\n  /** Unsets the specified flag or flags. */\r\n  unset(flag: FlowFlags): void { this.flags &= ~flag; }\r\n\r\n  /** Forks this flow to a child flow. */\r\n  fork(): Flow {\r\n    var branch = new Flow();\r\n    branch.parent = this;\r\n    branch.flags = this.flags;\r\n    branch.currentFunction = this.currentFunction;\r\n    branch.continueLabel = this.continueLabel;\r\n    branch.breakLabel = this.breakLabel;\r\n    branch.returnLabel = this.returnLabel;\r\n    branch.returnType = this.returnType;\r\n    branch.contextualTypeArguments = this.contextualTypeArguments;\r\n    branch.wrappedLocals = this.wrappedLocals;\r\n    branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\r\n    return branch;\r\n  }\r\n\r\n  /** Frees this flow's scoped variables. */\r\n  free(): Flow {\r\n    var parent = assert(this.parent);\r\n    if (this.scopedLocals) { // free block-scoped locals\r\n      for (let scopedLocal of this.scopedLocals.values()) {\r\n        if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n          this.currentFunction.freeTempLocal(scopedLocal);\r\n        }\r\n      }\r\n      this.scopedLocals = null;\r\n    }\r\n    return parent;\r\n  }\r\n\r\n  /** Adds a new scoped local of the specified name. */\r\n  addScopedLocal(type: Type, name: string, wrapped: bool, declaration?: VariableDeclaration): Local {\r\n    var scopedLocal = this.currentFunction.getTempLocal(type, false);\r\n    if (!this.scopedLocals) this.scopedLocals = new Map();\r\n    else {\r\n      let existingLocal = this.scopedLocals.get(name);\r\n      if (existingLocal) {\r\n        if (declaration) {\r\n          this.currentFunction.program.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range\r\n          );\r\n        } else assert(false);\r\n        return existingLocal;\r\n      }\r\n    }\r\n    scopedLocal.set(CommonFlags.SCOPED);\r\n    this.scopedLocals.set(name, scopedLocal);\r\n    if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n      this.setLocalWrapped(scopedLocal.index, wrapped);\r\n    }\r\n    return scopedLocal;\r\n  }\r\n\r\n  /** Adds a new scoped alias for the specified local. */\r\n  addScopedLocalAlias(index: i32, type: Type, name: string): Local {\r\n    if (!this.scopedLocals) this.scopedLocals = new Map();\r\n    else {\r\n      let existingLocal = this.scopedLocals.get(name);\r\n      if (existingLocal) {\r\n        let declaration = existingLocal.declaration;\r\n        if (declaration) {\r\n          this.currentFunction.program.error(\r\n            DiagnosticCode.Duplicate_identifier_0,\r\n            declaration.name.range\r\n          );\r\n        } else assert(false);\r\n        return existingLocal;\r\n      }\r\n    }\r\n    assert(index < this.currentFunction.localsByIndex.length);\r\n    var scopedAlias = new Local( // not SCOPED as an indicator that it isn't automatically free'd\r\n      this.currentFunction.program,\r\n      name,\r\n      index,\r\n      type,\r\n      null\r\n    );\r\n    this.scopedLocals.set(name, scopedAlias);\r\n    return scopedAlias;\r\n  }\r\n\r\n  /** Gets the local of the specified name in the current scope. */\r\n  getScopedLocal(name: string): Local | null {\r\n    var local: Local | null;\r\n    var current: Flow | null = this;\r\n    do {\r\n      if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n        return local;\r\n      }\r\n    } while (current = current.parent);\r\n    return this.currentFunction.localsByName.get(name);\r\n  }\r\n\r\n  /** Tests if the local with the specified index is considered wrapped. */\r\n  isLocalWrapped(index: i32): bool {\r\n    var map: I64;\r\n    var ext: I64[] | null;\r\n    if (index < 64) {\r\n      if (index < 0) return true; // inlined constant\r\n      map = this.wrappedLocals;\r\n    } else if (ext = this.wrappedLocalsExt) {\r\n      let i = ((index - 64) / 64) | 0;\r\n      if (i >= ext.length) return false;\r\n      map = ext[i];\r\n      index -= (i + 1) * 64;\r\n    } else {\r\n      return false;\r\n    }\r\n    return i64_ne(\r\n      i64_and(\r\n        map,\r\n        i64_shl(\r\n          i64_one,\r\n          i64_new(index)\r\n        )\r\n      ),\r\n      i64_zero\r\n    );\r\n  }\r\n\r\n  /** Sets if the local with the specified index is considered wrapped. */\r\n  setLocalWrapped(index: i32, wrapped: bool): void {\r\n    var map: I64;\r\n    var off: i32 = -1;\r\n    if (index < 64) {\r\n      if (index < 0) return; // inlined constant\r\n      map = this.wrappedLocals;\r\n    } else {\r\n      let ext = this.wrappedLocalsExt;\r\n      off = ((index - 64) / 64) | 0;\r\n      if (!ext) {\r\n        this.wrappedLocalsExt = ext = new Array(off + 1);\r\n        ext.length = 0;\r\n      }\r\n      while (ext.length <= off) ext.push(i64_new(0));\r\n      map = ext[off];\r\n      index -= (off + 1) * 64;\r\n    }\r\n    map = wrapped\r\n      ? i64_or(\r\n          map,\r\n          i64_shl(\r\n            i64_one,\r\n            i64_new(index)\r\n          )\r\n        )\r\n      : i64_and(\r\n          map,\r\n          i64_not(\r\n            i64_shl(\r\n              i64_one,\r\n              i64_new(index)\r\n            )\r\n          )\r\n        );\r\n    if (off >= 0) (<I64[]>this.wrappedLocalsExt)[off] = map;\r\n    else this.wrappedLocals = map;\r\n  }\r\n\r\n  /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\r\n  inherit(other: Flow): void {\r\n    this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\r\n    this.wrappedLocals = other.wrappedLocals;\r\n    this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\r\n  }\r\n\r\n  /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\r\n  inheritConditional(other: Flow): void {\r\n    if (other.is(FlowFlags.RETURNS)) {\r\n      this.set(FlowFlags.CONDITIONALLY_RETURNS);\r\n    }\r\n    if (other.is(FlowFlags.THROWS)) {\r\n      this.set(FlowFlags.CONDITIONALLY_THROWS);\r\n    }\r\n    if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\r\n      this.set(FlowFlags.CONDITIONALLY_BREAKS);\r\n    }\r\n    if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\r\n      this.set(FlowFlags.CONDITIONALLY_CONTINUES);\r\n    }\r\n    if (other.is(FlowFlags.ALLOCATES)) {\r\n      this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\r\n    }\r\n  }\r\n\r\n  /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\r\n  inheritMutual(left: Flow, right: Flow): void {\r\n    // categorical flags set in both arms\r\n    this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\r\n\r\n    // conditional flags set in at least one arm\r\n    this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\r\n    this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\r\n\r\n    // locals wrapped in both arms\r\n    this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\r\n    var leftExt = left.wrappedLocalsExt;\r\n    var rightExt = right.wrappedLocalsExt;\r\n    if (leftExt != null && rightExt != null) {\r\n      let thisExt = this.wrappedLocalsExt;\r\n      let minLength = min(leftExt.length, rightExt.length);\r\n      if (minLength) {\r\n        if (!thisExt) thisExt = new Array(minLength);\r\n        else while (thisExt.length < minLength) thisExt.push(i64_new(0));\r\n        for (let i = 0; i < minLength; ++i) {\r\n          thisExt[i] = i64_and(\r\n            leftExt[i],\r\n            rightExt[i]\r\n          );\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\r\n   * expression might already have overflown and returns `false` only if the operation neglects\r\n   * any possibly combination of garbage bits being present.\r\n   */\r\n  canOverflow(expr: ExpressionRef, type: Type): bool {\r\n    // TODO: the following catches most common and a few uncommon cases, but there are additional\r\n    // opportunities here, obviously.\r\n    assert(type != Type.void);\r\n\r\n    // types other than i8, u8, i16, u16 and bool do not overflow\r\n    if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\r\n\r\n    var operand: ExpressionRef;\r\n    switch (getExpressionId(expr)) {\r\n\r\n      // overflows if the local isn't wrapped or the conversion does\r\n      case ExpressionId.GetLocal: {\r\n        let currentFunction = this.currentFunction;\r\n        let local = currentFunction.localsByIndex[getGetLocalIndex(expr)];\r\n        return !currentFunction.flow.isLocalWrapped(local.index)\r\n            || canConversionOverflow(local.type, type);\r\n      }\r\n\r\n      // overflows if the value does\r\n      case ExpressionId.SetLocal: {\r\n        assert(isTeeLocal(expr));\r\n        return this.canOverflow(getSetLocalValue(expr), type);\r\n      }\r\n\r\n      // never overflows because globals are wrapped on set\r\n      case ExpressionId.GetGlobal: return false;\r\n\r\n      case ExpressionId.Binary: {\r\n        switch (getBinaryOp(expr)) {\r\n\r\n          // comparisons do not overflow (result is 0 or 1)\r\n          case BinaryOp.EqI32:\r\n          case BinaryOp.EqI64:\r\n          case BinaryOp.EqF32:\r\n          case BinaryOp.EqF64:\r\n          case BinaryOp.NeI32:\r\n          case BinaryOp.NeI64:\r\n          case BinaryOp.NeF32:\r\n          case BinaryOp.NeF64:\r\n          case BinaryOp.LtI32:\r\n          case BinaryOp.LtU32:\r\n          case BinaryOp.LtI64:\r\n          case BinaryOp.LtU64:\r\n          case BinaryOp.LtF32:\r\n          case BinaryOp.LtF64:\r\n          case BinaryOp.LeI32:\r\n          case BinaryOp.LeU32:\r\n          case BinaryOp.LeI64:\r\n          case BinaryOp.LeU64:\r\n          case BinaryOp.LeF32:\r\n          case BinaryOp.LeF64:\r\n          case BinaryOp.GtI32:\r\n          case BinaryOp.GtU32:\r\n          case BinaryOp.GtI64:\r\n          case BinaryOp.GtU64:\r\n          case BinaryOp.GtF32:\r\n          case BinaryOp.GtF64:\r\n          case BinaryOp.GeI32:\r\n          case BinaryOp.GeU32:\r\n          case BinaryOp.GeI64:\r\n          case BinaryOp.GeU64:\r\n          case BinaryOp.GeF32:\r\n          case BinaryOp.GeF64: return false;\r\n\r\n          // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\r\n          case BinaryOp.MulI32: {\r\n            return !(\r\n              (\r\n                getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n                (\r\n                  getConstValueI32(operand) == 0 ||\r\n                  (\r\n                    getConstValueI32(operand) == 1 &&\r\n                    !this.canOverflow(getBinaryRight(expr), type)\r\n                  )\r\n                )\r\n              ) || (\r\n                getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                (\r\n                  getConstValueI32(operand) == 0 ||\r\n                  (\r\n                    getConstValueI32(operand) == 1 &&\r\n                    !this.canOverflow(getBinaryLeft(expr), type)\r\n                  )\r\n                )\r\n              )\r\n            );\r\n          }\r\n\r\n          // result won't overflow if one side is a constant less than this type's mask or one side\r\n          // is wrapped\r\n          case BinaryOp.AndI32: {\r\n            // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\r\n            // because signed value garbage bits must be guaranteed to be equal to the MSB.\r\n            return !(\r\n              (\r\n                (\r\n                  getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n                ) || !this.canOverflow(operand, type)\r\n              ) || (\r\n                (\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n                ) || !this.canOverflow(operand, type)\r\n              )\r\n            );\r\n          }\r\n\r\n          // overflows if the shift doesn't clear potential garbage bits\r\n          case BinaryOp.ShlI32: {\r\n            let shift = 32 - type.size;\r\n            return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\r\n                || getConstValueI32(operand) < shift;\r\n          }\r\n\r\n          // overflows if the value does and the shift doesn't clear potential garbage bits\r\n          case BinaryOp.ShrI32: {\r\n            let shift = 32 - type.size;\r\n            return this.canOverflow(getBinaryLeft(expr), type) && (\r\n              getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\r\n              getConstValueI32(operand) < shift\r\n            );\r\n          }\r\n\r\n          // overflows if the shift does not clear potential garbage bits. if an unsigned value is\r\n          // wrapped, it can't overflow.\r\n          case BinaryOp.ShrU32: {\r\n            let shift = 32 - type.size;\r\n            return type.is(TypeFlags.SIGNED)\r\n              ? !(\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) > shift // must clear MSB\r\n                )\r\n              : this.canOverflow(getBinaryLeft(expr), type) && !(\r\n                  getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n                  getConstValueI32(operand) >= shift // can leave MSB\r\n                );\r\n          }\r\n\r\n          // overflows if any side does\r\n          case BinaryOp.DivU32:\r\n          case BinaryOp.RemI32:\r\n          case BinaryOp.RemU32: {\r\n            return this.canOverflow(getBinaryLeft(expr), type)\r\n                || this.canOverflow(getBinaryRight(expr), type);\r\n          }\r\n        }\r\n        break;\r\n      }\r\n\r\n      case ExpressionId.Unary: {\r\n        switch (getUnaryOp(expr)) {\r\n\r\n          // comparisons do not overflow (result is 0 or 1)\r\n          case UnaryOp.EqzI32:\r\n          case UnaryOp.EqzI64: return false;\r\n\r\n          // overflow if the maximum result (32) cannot be represented in the target type\r\n          case UnaryOp.ClzI32:\r\n          case UnaryOp.CtzI32:\r\n          case UnaryOp.PopcntI32: return type.size < 7;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // overflows if the value cannot be represented in the target type\r\n      case ExpressionId.Const: {\r\n        let value: i32 = 0;\r\n        switch (getExpressionType(expr)) {\r\n          case NativeType.I32: { value = getConstValueI32(expr); break; }\r\n          case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\r\n          case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\r\n          case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\r\n          default: assert(false);\r\n        }\r\n        switch (type.kind) {\r\n          case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\r\n          case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\r\n          case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\r\n          case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\r\n          case TypeKind.BOOL: return (value & ~1) != 0;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // overflows if the conversion does\r\n      case ExpressionId.Load: {\r\n        let fromType: Type;\r\n        switch (getLoadBytes(expr)) {\r\n          case 1:  { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\r\n          case 2:  { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\r\n          default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\r\n        }\r\n        return canConversionOverflow(fromType, type);\r\n      }\r\n\r\n      // overflows if the result does, which is either\r\n      // - the last expression of the block, by contract, if the block doesn't have a label\r\n      // - the last expression or the value of an inner br if the block has a label (TODO)\r\n      case ExpressionId.Block: {\r\n        if (!getBlockName(expr)) {\r\n          let size = assert(getBlockChildCount(expr));\r\n          let last = getBlockChild(expr, size - 1);\r\n          return this.canOverflow(last, type);\r\n        }\r\n        // actually, brs with a value that'd be handled here is not emitted atm\r\n        break;\r\n      }\r\n\r\n      // overflows if either side does\r\n      case ExpressionId.If: {\r\n        return this.canOverflow(getIfTrue(expr), type)\r\n            || this.canOverflow(assert(getIfFalse(expr)), type);\r\n      }\r\n\r\n      // overflows if either side does\r\n      case ExpressionId.Select: {\r\n        return this.canOverflow(getSelectThen(expr), type)\r\n            || this.canOverflow(getSelectElse(expr), type);\r\n      }\r\n\r\n      // overflows if the call does not return a wrapped value or the conversion does\r\n      case ExpressionId.Call: {\r\n        let program = this.currentFunction.program;\r\n        let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\r\n        assert(instance.kind == ElementKind.FUNCTION);\r\n        let returnType = (<Function>instance).signature.returnType;\r\n        return !(<Function>instance).flow.is(FlowFlags.RETURNS_WRAPPED)\r\n            || canConversionOverflow(returnType, type);\r\n      }\r\n\r\n      // doesn't technically overflow\r\n      case ExpressionId.Unreachable: return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n  finalize(): void {\r\n    assert(this.parent == null); // must be the topmost parent flow\r\n    this.continueLabel = null;\r\n    this.breakLabel = null;\r\n    this.returnLabel = null;\r\n    this.contextualTypeArguments = null;\r\n  }\r\n}\r\n\r\n/** Tests if a conversion from one type to another can technically overflow. */\r\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\r\n  var fromSize = fromType.byteSize;\r\n  var toSize = toType.byteSize;\r\n  return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\r\n      || fromSize > toSize\r\n      || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\r\n}\r\n","/**\r\n * Mappings from AssemblyScript types to WebAssembly types.\r\n * @module types\r\n *//***/\r\n\r\nimport {\r\n  Class,\r\n  FunctionTarget\r\n} from \"./program\";\r\n\r\nimport {\r\n  NativeType,\r\n  ExpressionRef,\r\n  Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n  // signed integers\r\n\r\n  /** An 8-bit signed integer. */\r\n  I8,\r\n  /** A 16-bit signed integer. */\r\n  I16,\r\n  /** A 32-bit signed integer. */\r\n  I32,\r\n  /** A 64-bit signed integer. */\r\n  I64,\r\n  /** A 32-bit/64-bit signed integer, depending on the target. */\r\n  ISIZE,\r\n\r\n  // unsigned integers\r\n\r\n  /** An 8-bit unsigned integer. */\r\n  U8,\r\n  /** A 16-bit unsigned integer. */\r\n  U16,\r\n  /** A 32-bit unsigned integer. Also the base of function types. */\r\n  U32,\r\n  /** A 64-bit unsigned integer. */\r\n  U64,\r\n  /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\r\n  USIZE,\r\n  /** A 1-bit unsigned integer. */\r\n  BOOL, // sic\r\n\r\n  // floats\r\n\r\n  /** A 32-bit float. */\r\n  F32,\r\n  /** A 64-bit double. */\r\n  F64,\r\n\r\n  // other\r\n\r\n  /** No return type. */\r\n  VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n  NONE = 0,\r\n  /** Is a signed type that can represent negative values. */\r\n  SIGNED = 1 << 0,\r\n  /** Is an unsigned type that cannot represent negative values. */\r\n  UNSIGNED = 1 << 1,\r\n  /** Is an integer type. */\r\n  INTEGER = 1 << 2,\r\n  /** Is a floating point type. */\r\n  FLOAT = 1 << 3,\r\n  /** Is a pointer type. */\r\n  POINTER = 1 << 4,\r\n  /** Is smaller than 32-bits. */\r\n  SHORT = 1 << 5,\r\n  /** Is larger than 32-bits. */\r\n  LONG = 1 << 6,\r\n  /** Is a value type. */\r\n  VALUE = 1 << 7,\r\n  /** Is a reference type. */\r\n  REFERENCE = 1 << 8,\r\n  /** Is a nullable type. */\r\n  NULLABLE = 1 << 9\r\n}\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n  /** Type kind. */\r\n  kind: TypeKind;\r\n  /** Type flags. */\r\n  flags: TypeFlags;\r\n  /** Size in bits. */\r\n  size: u32;\r\n  /** Size in bytes. */\r\n  byteSize: i32;\r\n  /** Underlying class reference, if a class type. */\r\n  classReference: Class | null;\r\n  /** Underlying signature reference, if a function type. */\r\n  signatureReference: Signature | null;\r\n  /** Respective non-nullable type, if nullable. */\r\n  nonNullableType: Type;\r\n  /** Cached nullable type, if non-nullable. */\r\n  private cachedNullableType: Type | null = null;\r\n\r\n  /** Constructs a new resolved type. */\r\n  constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\r\n    this.kind = kind;\r\n    this.flags = flags;\r\n    this.size = size;\r\n    this.byteSize = <i32>ceil<f64>(<f64>size / 8);\r\n    this.classReference = null;\r\n    this.signatureReference = null;\r\n    this.nonNullableType = this;\r\n  }\r\n\r\n  /** Returns the closest int type representing this type. */\r\n  get intType(): Type {\r\n    switch (this.kind) {\r\n      case TypeKind.I8: return Type.i8;\r\n      case TypeKind.I16: return Type.i16;\r\n      case TypeKind.F32:\r\n      case TypeKind.I32: return Type.i32;\r\n      case TypeKind.F64:\r\n      case TypeKind.I64: return Type.i64;\r\n      case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\r\n      case TypeKind.U8: return Type.u8;\r\n      case TypeKind.U16: return Type.u16;\r\n      case TypeKind.U32: return Type.u32;\r\n      case TypeKind.U64: return Type.u64;\r\n      case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\r\n      case TypeKind.BOOL:\r\n      default: return Type.i32;\r\n    }\r\n  }\r\n\r\n  /** Computes the sign-extending shift in the target type. */\r\n  computeSmallIntegerShift(targetType: Type): u32 {\r\n    return targetType.size - this.size;\r\n  }\r\n\r\n  /** Computes the truncating mask in the target type. */\r\n  computeSmallIntegerMask(targetType: Type): u32 {\r\n    var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\r\n    return ~0 >>> (targetType.size - size);\r\n  }\r\n\r\n  /** Tests if this type has (all of) the specified flags. */\r\n  is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\r\n  /** Tests if this type has any of the specified flags. */\r\n  isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\r\n\r\n  /** Composes a class type from this type and a class. */\r\n  asClass(classType: Class): Type {\r\n    assert(this.kind == TypeKind.USIZE && !this.classReference);\r\n    var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n    ret.classReference = classType;\r\n    return ret;\r\n  }\r\n\r\n  /** Composes a function type from this type and a function. */\r\n  asFunction(signature: Signature): Type {\r\n    assert(this.kind == TypeKind.U32 && !this.signatureReference);\r\n    var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n    ret.signatureReference = signature;\r\n    return ret;\r\n  }\r\n\r\n  /** Composes the respective nullable type of this type. */\r\n  asNullable(): Type {\r\n    assert(this.is(TypeFlags.REFERENCE));\r\n    if (!this.cachedNullableType) {\r\n      assert(!this.is(TypeFlags.NULLABLE));\r\n      this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n      this.cachedNullableType.nonNullableType = this;\r\n      this.cachedNullableType.classReference = this.classReference;       // either a class reference\r\n      this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\r\n    }\r\n    return this.cachedNullableType;\r\n  }\r\n\r\n  /** Tests if a value of this type is assignable to a target of the specified type. */\r\n  isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\r\n    var currentClass: Class | null;\r\n    var targetClass: Class | null;\r\n    var currentFunction: Signature | null;\r\n    var targetFunction: Signature | null;\r\n    if (this.is(TypeFlags.REFERENCE)) {\r\n      if (target.is(TypeFlags.REFERENCE)) {\r\n        if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\r\n          if (currentClass = this.classReference) {\r\n            if (targetClass = target.classReference) {\r\n              return currentClass.isAssignableTo(targetClass);\r\n            }\r\n          } else if (currentFunction = this.signatureReference) {\r\n            if (targetFunction = target.signatureReference) {\r\n              return currentFunction.isAssignableTo(targetFunction);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } else if (!target.is(TypeFlags.REFERENCE)) {\r\n      if (this.is(TypeFlags.INTEGER)) {\r\n        if (target.is(TypeFlags.INTEGER)) {\r\n          if (!signednessIsRelevant || this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)) {\r\n            return this.size <= target.size;\r\n          }\r\n        } else if (target.kind == TypeKind.F32) {\r\n          return this.size <= 23; // mantissa bits\r\n        } else if (target.kind == TypeKind.F64) {\r\n          return this.size <= 52; // ^\r\n        }\r\n      } else if (this.is(TypeFlags.FLOAT)) {\r\n        if (target.is(TypeFlags.FLOAT)) {\r\n          return this.size <= target.size;\r\n        }\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  /** Determines the common compatible type of two types, if any. */\r\n  static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\r\n    if (right.isAssignableTo(left, signednessIsImportant)) return left;\r\n    else if (left.isAssignableTo(right, signednessIsImportant)) return right;\r\n    return null;\r\n  }\r\n\r\n  /** Converts this type to its TypeScript representation. */\r\n  toString(kindOnly: bool = false): string {\r\n    if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\r\n      let classReference = this.classReference;\r\n      if (classReference) {\r\n        return this.is(TypeFlags.NULLABLE)\r\n          ? classReference.toString() + \" | null\"\r\n          : classReference.toString();\r\n      }\r\n      let signatureReference = this.signatureReference;\r\n      if (signatureReference) {\r\n        return this.is(TypeFlags.NULLABLE)\r\n          ? \"(\" + signatureReference.toString(true) + \") | null\"\r\n          : signatureReference.toString(true);\r\n      }\r\n      assert(false);\r\n    }\r\n    switch (this.kind) {\r\n      case TypeKind.I8: return \"i8\";\r\n      case TypeKind.I16: return \"i16\";\r\n      case TypeKind.I32: return \"i32\";\r\n      case TypeKind.I64: return \"i64\";\r\n      case TypeKind.ISIZE: return \"isize\";\r\n      case TypeKind.U8: return \"u8\";\r\n      case TypeKind.U16: return \"u16\";\r\n      case TypeKind.U32: return \"u32\";\r\n      case TypeKind.U64: return \"u64\";\r\n      case TypeKind.USIZE: return \"usize\";\r\n      case TypeKind.BOOL: return \"bool\";\r\n      case TypeKind.F32: return \"f32\";\r\n      case TypeKind.F64: return \"f64\";\r\n      default: assert(false);\r\n      case TypeKind.VOID: return \"void\";\r\n    }\r\n  }\r\n\r\n  // Binaryen specific\r\n\r\n  /** Converts this type to its respective native type. */\r\n  toNativeType(): NativeType {\r\n    switch (this.kind) {\r\n      default: return NativeType.I32;\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return NativeType.I64;\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n      case TypeKind.F32: return NativeType.F32;\r\n      case TypeKind.F64: return NativeType.F64;\r\n      case TypeKind.VOID:  return NativeType.None;\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `0` value. */\r\n  toNativeZero(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(0);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(0);\r\n      case TypeKind.F32: return module.createF32(0);\r\n      case TypeKind.F64: return module.createF64(0);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `1` value. */\r\n  toNativeOne(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(1);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(1);\r\n      case TypeKind.F32: return module.createF32(1);\r\n      case TypeKind.F64: return module.createF64(1);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its native `-1` value. */\r\n  toNativeNegOne(module: Module): ExpressionRef {\r\n    switch (this.kind) {\r\n      case TypeKind.VOID: assert(false);\r\n      default: return module.createI32(-1);\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return module.createI64(-1, -1);\r\n      case TypeKind.F32: return module.createF32(-1);\r\n      case TypeKind.F64: return module.createF64(-1);\r\n    }\r\n  }\r\n\r\n  /** Converts this type to its signature string. */\r\n  toSignatureString(): string {\r\n    switch (this.kind) {\r\n      default: return \"i\";\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: return \"I\";\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\r\n      case TypeKind.F32: return \"f\";\r\n      case TypeKind.F64: return \"F\";\r\n      case TypeKind.VOID: return \"v\";\r\n    }\r\n  }\r\n\r\n  // Types\r\n\r\n  /** An 8-bit signed integer. */\r\n  static readonly i8: Type  = new Type(TypeKind.I8,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   8\r\n  );\r\n\r\n  /** A 16-bit signed integer. */\r\n  static readonly i16: Type = new Type(TypeKind.I16,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  16\r\n  );\r\n\r\n  /** A 32-bit signed integer. */\r\n  static readonly i32: Type = new Type(TypeKind.I32,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit signed integer. */\r\n  static readonly i64: Type = new Type(TypeKind.I64,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 32-bit signed size. WASM32 only. */\r\n  static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit signed size. WASM64 only. */\r\n  static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** An 8-bit unsigned integer. */\r\n  static readonly u8: Type = new Type(TypeKind.U8,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   8\r\n  );\r\n\r\n  /** A 16-bit unsigned integer. */\r\n  static readonly u16: Type = new Type(TypeKind.U16,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  16\r\n  );\r\n\r\n  /** A 32-bit unsigned integer. */\r\n  static readonly u32: Type = new Type(TypeKind.U32,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit unsigned integer. */\r\n  static readonly u64: Type = new Type(TypeKind.U64,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 32-bit unsigned size. WASM32 only. */\r\n  static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit unsigned size. WASM64 only. */\r\n  static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.POINTER  |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** A 1-bit unsigned integer. */\r\n  static readonly bool: Type = new Type(TypeKind.BOOL,\r\n    TypeFlags.UNSIGNED |\r\n    TypeFlags.SHORT    |\r\n    TypeFlags.INTEGER  |\r\n    TypeFlags.VALUE,   1\r\n  );\r\n\r\n  /** A 32-bit float. */\r\n  static readonly f32: Type = new Type(TypeKind.F32,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.FLOAT    |\r\n    TypeFlags.VALUE,  32\r\n  );\r\n\r\n  /** A 64-bit float. */\r\n  static readonly f64: Type = new Type(TypeKind.F64,\r\n    TypeFlags.SIGNED   |\r\n    TypeFlags.LONG     |\r\n    TypeFlags.FLOAT    |\r\n    TypeFlags.VALUE,  64\r\n  );\r\n\r\n  /** No return type. */\r\n  static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n  var numTypes = types.length;\r\n  var ret = new Array<NativeType>(numTypes);\r\n  for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\r\n  return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n  var numTypes = types.length;\r\n  if (!numTypes) return \"\";\r\n  var sb = new Array<string>(numTypes);\r\n  for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\r\n  return sb.join(\",\");\r\n}\r\n\r\n/** Represents a fully resolved function signature. */\r\nexport class Signature {\r\n\r\n  /** Parameter types, if any, excluding `this`. */\r\n  parameterTypes: Type[];\r\n  /** Parameter names, if known, excluding `this`. */\r\n  parameterNames: string[] | null;\r\n  /** Number of required parameters excluding `this`. Other parameters are considered optional. */\r\n  requiredParameters: i32;\r\n  /** Return type. */\r\n  returnType: Type;\r\n  /** This type, if an instance signature. */\r\n  thisType: Type | null;\r\n  /** Whether the last parameter is a rest parameter. */\r\n  hasRest: bool;\r\n  /** Cached {@link FunctionTarget}. */\r\n  cachedFunctionTarget: FunctionTarget | null = null;\r\n  /** Respective function type. */\r\n  type: Type;\r\n\r\n  /** Constructs a new signature. */\r\n  constructor(\r\n    parameterTypes: Type[] | null = null,\r\n    returnType: Type | null = null,\r\n    thisType: Type | null = null\r\n  ) {\r\n    this.parameterTypes = parameterTypes ? parameterTypes : [];\r\n    this.parameterNames = null;\r\n    this.requiredParameters = 0;\r\n    this.returnType = returnType ? returnType : Type.void;\r\n    this.thisType = thisType;\r\n    this.hasRest = false;\r\n    this.type = Type.u32.asFunction(this);\r\n  }\r\n\r\n  /** Gets the known or, alternatively, generic parameter name at the specified index. */\r\n  getParameterName(index: i32): string {\r\n    var parameterNames = this.parameterNames;\r\n    return parameterNames && parameterNames.length > index\r\n      ? parameterNames[index]\r\n      : getDefaultParameterName(index);\r\n  }\r\n\r\n  /** Tests if a value of this function type is assignable to a target of the specified function type. */\r\n  isAssignableTo(target: Signature): bool {\r\n    // TODO: maybe cache results?\r\n\r\n    // check `this` type\r\n    var thisThisType = this.thisType;\r\n    var targetThisType = target.thisType;\r\n    if (thisThisType) {\r\n      if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\r\n    } else if (targetThisType) {\r\n      return false;\r\n    }\r\n\r\n    // check rest parameter\r\n    if (this.hasRest != target.hasRest) return false; // TODO\r\n\r\n    // check parameter types\r\n    var thisParameterTypes = this.parameterTypes;\r\n    var targetParameterTypes = target.parameterTypes;\r\n    var numParameters = thisParameterTypes.length;\r\n    if (numParameters != targetParameterTypes.length) return false;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      let thisParameterType = thisParameterTypes[i];\r\n      let targetParameterType = targetParameterTypes[i];\r\n      if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\r\n    }\r\n\r\n    // check return type\r\n    var thisReturnType = this.returnType;\r\n    var targetReturnType = target.returnType;\r\n    return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\r\n  }\r\n\r\n  /** Converts a signature to a function type string. */\r\n  static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\r\n    var sb = [];\r\n    if (thisType) sb.push(thisType.toSignatureString());\r\n    if (parameterTypes) {\r\n      for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\r\n    }\r\n    sb.push(returnType.toSignatureString());\r\n    return sb.join(\"\");\r\n  }\r\n\r\n  /** Converts this signature to a function type string. */\r\n  toSignatureString(): string {\r\n    return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\r\n  }\r\n\r\n  /** Converts this signature to a string. */\r\n  toString(includeThis: bool = false): string {\r\n    var sb = new Array<string>();\r\n    sb.push(\"(\");\r\n    var index = 0;\r\n    var thisType = this.thisType;\r\n    if (thisType) {\r\n      if (includeThis) {\r\n        sb.push(\"this: \");\r\n        sb.push(thisType.toString());\r\n        index = 1;\r\n      }\r\n    }\r\n    var parameters = this.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    if (numParameters) {\r\n      let names = this.parameterNames;\r\n      let numNames = names ? names.length : 0;\r\n      let optionalStart = this.requiredParameters;\r\n      let restIndex = this.hasRest ? numParameters - 1 : -1;\r\n      for (let i = 0; i < numParameters; ++i, ++index) {\r\n        if (index) sb.push(\", \");\r\n        if (i == restIndex) sb.push(\"...\");\r\n        if (i < numNames) sb.push((<string[]>names)[i]);\r\n        else sb.push(getDefaultParameterName(i));\r\n        if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\r\n        else sb.push(\": \");\r\n        sb.push(parameters[i].toString());\r\n      }\r\n    }\r\n    sb.push(\") => \");\r\n    sb.push(this.returnType.toString());\r\n    return sb.join(\"\");\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\n// Cached default parameter names used where names are unknown.\r\nvar cachedDefaultParameterNames: string[] | null = null;\r\n\r\n/** Gets the cached default parameter name for the specified index. */\r\nexport function getDefaultParameterName(index: i32): string {\r\n  if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\r\n  for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\r\n    cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\r\n  }\r\n  return cachedDefaultParameterNames[index - 1];\r\n}\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * A TypeScript tokenizer modified for AssemblyScript.\r\n *\r\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\r\n * ambiguous tokens.\r\n *\r\n * @module tokenizer\r\n *//***/\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticMessage,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Source,\r\n  CommentKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n  CharCode,\r\n  isLineBreak,\r\n  isWhiteSpace,\r\n  isIdentifierStart,\r\n  isIdentifierPart,\r\n  isDecimalDigit,\r\n  isOctalDigit,\r\n  isKeywordCharacter\r\n} from \"./util\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n  // keywords\r\n  // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n  ABSTRACT,\r\n  AS,\r\n  ASYNC,\r\n  AWAIT,        // ES2017\r\n  BREAK,        // ES2017\r\n  CASE,         // ES2017\r\n  CATCH,        // ES2017\r\n  CLASS,        // ES2017\r\n  CONST,        // ES2017\r\n  CONTINUE,     // ES2017\r\n  CONSTRUCTOR,\r\n  DEBUGGER,     // ES2017\r\n  DECLARE,\r\n  DEFAULT,      // ES2017\r\n  DELETE,       // ES2017\r\n  DO,           // ES2017\r\n  ELSE,         // ES2017\r\n  ENUM,         // ES2017 future\r\n  EXPORT,       // ES2017\r\n  EXTENDS,      // ES2017\r\n  FALSE,        // ES\r\n  FINALLY,      // ES2017\r\n  FOR,          // ES2017\r\n  FROM,         // AS possible identifier\r\n  FUNCTION,     // ES2017\r\n  GET,\r\n  IF,           // ES2017\r\n  IMPLEMENTS,   // ES2017 non-lexical\r\n  IMPORT,       // ES2017\r\n  IN,           // ES2017\r\n  INSTANCEOF,   // ES2017\r\n  INTERFACE,    // ES2017 non-lexical\r\n  IS,\r\n  KEYOF,\r\n  LET,          // ES2017 non-lexical\r\n  MODULE,       // AS possible identifier\r\n  NAMESPACE,    // AS possible identifier\r\n  NEW,          // ES2017\r\n  NULL,         // ES\r\n  OF,\r\n  PACKAGE,      // ES2017 non-lexical\r\n  PRIVATE,      // ES2017 non-lexical\r\n  PROTECTED,    // ES2017 non-lexical\r\n  PUBLIC,       // ES2017 non-lexical\r\n  READONLY,\r\n  RETURN,       // ES2017\r\n  SET,\r\n  STATIC,       // ES2017 non-lexical\r\n  SUPER,        // ES2017\r\n  SWITCH,       // ES2017\r\n  THIS,         // ES2017\r\n  THROW,        // ES2017\r\n  TRUE,         // ES\r\n  TRY,          // ES2017\r\n  TYPE,         // AS possible identifier\r\n  TYPEOF,       // ES2017\r\n  VAR,          // ES2017\r\n  VOID,         // ES2017\r\n  WHILE,        // ES2017\r\n  WITH,         // ES2017\r\n  YIELD,        // ES2017\r\n\r\n  // punctuation\r\n\r\n  OPENBRACE,\r\n  CLOSEBRACE,\r\n  OPENPAREN,\r\n  CLOSEPAREN,\r\n  OPENBRACKET,\r\n  CLOSEBRACKET,\r\n  DOT,\r\n  DOT_DOT_DOT,\r\n  SEMICOLON,\r\n  COMMA,\r\n  LESSTHAN,\r\n  GREATERTHAN,\r\n  LESSTHAN_EQUALS,\r\n  GREATERTHAN_EQUALS,\r\n  EQUALS_EQUALS,\r\n  EXCLAMATION_EQUALS,\r\n  EQUALS_EQUALS_EQUALS,\r\n  EXCLAMATION_EQUALS_EQUALS,\r\n  EQUALS_GREATERTHAN,\r\n  PLUS,\r\n  MINUS,\r\n  ASTERISK_ASTERISK,\r\n  ASTERISK,\r\n  SLASH,\r\n  PERCENT,\r\n  PLUS_PLUS,\r\n  MINUS_MINUS,\r\n  LESSTHAN_LESSTHAN,\r\n  GREATERTHAN_GREATERTHAN,\r\n  GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n  AMPERSAND,\r\n  BAR,\r\n  CARET,\r\n  EXCLAMATION,\r\n  TILDE,\r\n  AMPERSAND_AMPERSAND,\r\n  BAR_BAR,\r\n  QUESTION,\r\n  COLON,\r\n  EQUALS,\r\n  PLUS_EQUALS,\r\n  MINUS_EQUALS,\r\n  ASTERISK_EQUALS,\r\n  ASTERISK_ASTERISK_EQUALS,\r\n  SLASH_EQUALS,\r\n  PERCENT_EQUALS,\r\n  LESSTHAN_LESSTHAN_EQUALS,\r\n  GREATERTHAN_GREATERTHAN_EQUALS,\r\n  GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n  AMPERSAND_EQUALS,\r\n  BAR_EQUALS,\r\n  CARET_EQUALS,\r\n  AT,\r\n\r\n  // literals\r\n\r\n  IDENTIFIER,\r\n  STRINGLITERAL,\r\n  INTEGERLITERAL,\r\n  FLOATLITERAL,\r\n\r\n  // meta\r\n\r\n  INVALID,\r\n  ENDOFFILE\r\n}\r\n\r\nexport enum IdentifierHandling {\r\n  DEFAULT,\r\n  PREFER,\r\n  ALWAYS\r\n}\r\n\r\nexport function tokenFromKeyword(text: string): Token {\r\n  assert(text.length);\r\n  switch (text.charCodeAt(0)) {\r\n    case CharCode.a: {\r\n      switch (text) {\r\n        case \"abstract\": return Token.ABSTRACT;\r\n        case \"as\": return Token.AS;\r\n        case \"async\": return Token.ASYNC;\r\n        case \"await\": return Token.AWAIT;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.b: {\r\n      switch (text) {\r\n        case \"break\": return Token.BREAK;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.c: {\r\n      switch (text) {\r\n        case \"case\": return Token.CASE;\r\n        case \"catch\": return Token.CATCH;\r\n        case \"class\": return Token.CLASS;\r\n        case \"continue\": return Token.CONTINUE;\r\n        case \"const\": return Token.CONST;\r\n        case \"constructor\": return Token.CONSTRUCTOR;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.d: {\r\n      switch (text) {\r\n        case \"debugger\": return Token.DEBUGGER;\r\n        case \"declare\": return Token.DECLARE;\r\n        case \"default\": return Token.DEFAULT;\r\n        case \"delete\": return Token.DELETE;\r\n        case \"do\": return Token.DO;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.e: {\r\n      switch (text) {\r\n        case \"else\": return Token.ELSE;\r\n        case \"enum\": return Token.ENUM;\r\n        case \"export\": return Token.EXPORT;\r\n        case \"extends\": return Token.EXTENDS;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.f: {\r\n      switch (text) {\r\n        case \"false\": return Token.FALSE;\r\n        case \"finally\": return Token.FINALLY;\r\n        case \"for\": return Token.FOR;\r\n        case \"from\": return Token.FROM;\r\n        case \"function\": return Token.FUNCTION;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.g: {\r\n      switch (text) {\r\n        case \"get\": return Token.GET;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.i: {\r\n      switch (text) {\r\n        case \"if\": return Token.IF;\r\n        case \"implements\": return Token.IMPLEMENTS;\r\n        case \"import\": return Token.IMPORT;\r\n        case \"in\": return Token.IN;\r\n        case \"instanceof\": return Token.INSTANCEOF;\r\n        case \"interface\": return Token.INTERFACE;\r\n        case \"is\": return Token.IS;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.k: {\r\n      switch (text) {\r\n        case \"keyof\": return Token.KEYOF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.l: {\r\n      switch (text) {\r\n        case \"let\": return Token.LET;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.m: {\r\n      switch (text) {\r\n        case \"module\": return Token.MODULE;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.n: {\r\n      switch (text) {\r\n        case \"namespace\": return Token.NAMESPACE;\r\n        case \"new\": return Token.NEW;\r\n        case \"null\": return Token.NULL;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.o: {\r\n      switch (text) {\r\n        case \"of\": return Token.OF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.p: {\r\n      switch (text) {\r\n        case \"package\": return Token.PACKAGE;\r\n        case \"private\": return Token.PRIVATE;\r\n        case \"protected\": return Token.PROTECTED;\r\n        case \"public\": return Token.PUBLIC;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.r: {\r\n      switch (text) {\r\n        case \"readonly\": return Token.READONLY;\r\n        case \"return\": return Token.RETURN;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.s: {\r\n      switch (text) {\r\n        case \"set\": return Token.SET;\r\n        case \"static\": return Token.STATIC;\r\n        case \"super\": return Token.SUPER;\r\n        case \"switch\": return Token.SWITCH;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.t: {\r\n      switch (text) {\r\n        case \"this\": return Token.THIS;\r\n        case \"throw\": return Token.THROW;\r\n        case \"true\": return Token.TRUE;\r\n        case \"try\": return Token.TRY;\r\n        case \"type\": return Token.TYPE;\r\n        case \"typeof\": return Token.TYPEOF;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.v: {\r\n      switch (text) {\r\n        case \"var\": return Token.VAR;\r\n        case \"void\": return Token.VOID;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.w: {\r\n      switch (text) {\r\n        case \"while\": return Token.WHILE;\r\n        case \"with\": return Token.WITH;\r\n      }\r\n      break;\r\n    }\r\n    case CharCode.y: {\r\n      switch (text) {\r\n        case \"yield\": return Token.YIELD;\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return Token.INVALID;\r\n}\r\n\r\nexport function tokenIsAlsoIdentifier(token: Token): bool {\r\n  switch (token) {\r\n    case Token.ABSTRACT:\r\n    case Token.AS:\r\n    case Token.CONSTRUCTOR:\r\n    case Token.DECLARE:\r\n    case Token.DELETE:\r\n    case Token.FROM:\r\n    case Token.FOR:\r\n    case Token.GET:\r\n    case Token.IS:\r\n    case Token.KEYOF:\r\n    case Token.MODULE:\r\n    case Token.NAMESPACE:\r\n    case Token.READONLY:\r\n    case Token.SET:\r\n    case Token.TYPE: return true;\r\n    default: return false;\r\n  }\r\n}\r\n\r\nexport function operatorTokenToString(token: Token): string {\r\n  switch (token) {\r\n    case Token.DELETE: return \"delete\";\r\n    case Token.IN: return \"in\";\r\n    case Token.INSTANCEOF: return \"instanceof\";\r\n    case Token.NEW: return \"new\";\r\n    case Token.TYPEOF: return \"typeof\";\r\n    case Token.VOID: return \"void\";\r\n    case Token.YIELD: return \"yield\";\r\n    case Token.DOT_DOT_DOT: return \"...\";\r\n    case Token.COMMA: return \",\";\r\n    case Token.LESSTHAN: return \"<\";\r\n    case Token.GREATERTHAN: return \">\";\r\n    case Token.LESSTHAN_EQUALS: return \"<=\";\r\n    case Token.GREATERTHAN_EQUALS: return \">=\";\r\n    case Token.EQUALS_EQUALS: return \"==\";\r\n    case Token.EXCLAMATION_EQUALS: return \"!=\";\r\n    case Token.EQUALS_EQUALS_EQUALS: return \"===\";\r\n    case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\r\n    case Token.PLUS: return \"+\";\r\n    case Token.MINUS: return \"-\";\r\n    case Token.ASTERISK_ASTERISK: return \"**\";\r\n    case Token.ASTERISK: return \"*\";\r\n    case Token.SLASH: return \"/\";\r\n    case Token.PERCENT: return \"%\";\r\n    case Token.PLUS_PLUS: return \"++\";\r\n    case Token.MINUS_MINUS: return \"--\";\r\n    case Token.LESSTHAN_LESSTHAN: return \"<<\";\r\n    case Token.GREATERTHAN_GREATERTHAN: return \">>\";\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\r\n    case Token.AMPERSAND: return \"&\";\r\n    case Token.BAR: return \"|\";\r\n    case Token.CARET: return \"^\";\r\n    case Token.EXCLAMATION: return \"!\";\r\n    case Token.TILDE: return \"~\";\r\n    case Token.AMPERSAND_AMPERSAND: return \"&&\";\r\n    case Token.BAR_BAR: return \"||\";\r\n    case Token.EQUALS: return \"=\";\r\n    case Token.PLUS_EQUALS: return \"+=\";\r\n    case Token.MINUS_EQUALS: return \"-=\";\r\n    case Token.ASTERISK_EQUALS: return \"*=\";\r\n    case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\r\n    case Token.SLASH_EQUALS: return \"/=\";\r\n    case Token.PERCENT_EQUALS: return \"%=\";\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\r\n    case Token.AMPERSAND_EQUALS: return \"&=\";\r\n    case Token.BAR_EQUALS: return \"|=\";\r\n    case Token.CARET_EQUALS: return \"^=\";\r\n    default: {\r\n      assert(false);\r\n      return \"\";\r\n    }\r\n  }\r\n}\r\n\r\nexport class Range {\r\n\r\n  source: Source;\r\n  start: i32;\r\n  end: i32;\r\n\r\n  // TODO: set these while tokenizing\r\n  // line: i32;\r\n  // column: i32;\r\n\r\n  constructor(source: Source, start: i32, end: i32) {\r\n    this.source = source;\r\n    this.start = start;\r\n    this.end = end;\r\n  }\r\n\r\n  static join(a: Range, b: Range): Range {\r\n    if (a.source != b.source) throw new Error(\"source mismatch\");\r\n    return new Range(a.source,\r\n      a.start < b.start ? a.start : b.start,\r\n      a.end > b.end ? a.end : b.end\r\n    );\r\n  }\r\n\r\n  get atStart(): Range {\r\n    return new Range(this.source, this.start, this.start);\r\n  }\r\n  get atEnd(): Range {\r\n    return new Range(this.source, this.end, this.end);\r\n  }\r\n\r\n  get line(): i32 {\r\n    var text = this.source.text;\r\n    var line = 1;\r\n    for (let pos = this.start; pos >= 0; --pos) {\r\n      if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\r\n    }\r\n    return line;\r\n  }\r\n\r\n  get column(): i32 {\r\n    var text = this.source.text;\r\n    var column = 0;\r\n    for (let pos = this.start - 1; pos >= 0; --pos) {\r\n      if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n      ++column;\r\n    }\r\n    return column;\r\n  }\r\n\r\n  toString(): string {\r\n    return this.source.text.substring(this.start, this.end);\r\n  }\r\n\r\n  debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\n/** Handler for intercepting comments while tokenizing. */\r\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\r\n\r\n/** Tokenizes a source to individual {@link Token}s. */\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n  source: Source;\r\n  end: i32 = 0;\r\n\r\n  pos: i32 = 0;\r\n  token: Token = -1;\r\n  tokenPos: i32 = 0;\r\n\r\n  nextToken: Token = -1;\r\n  nextTokenPos: i32 = 0;\r\n  nextTokenOnNewLine: bool = false;\r\n\r\n  onComment: CommentHandler | null = null;\r\n\r\n  /** Constructs a new tokenizer. */\r\n  constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n    super(diagnostics);\r\n    this.source = source;\r\n    this.pos = 0;\r\n    this.end = source.text.length;\r\n    this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n    var text = source.text;\r\n\r\n    // skip bom\r\n    if (\r\n      this.pos < this.end &&\r\n      text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n    ) {\r\n      ++this.pos;\r\n    }\r\n\r\n    // skip shebang\r\n    if (\r\n      this.pos + 1 < this.end &&\r\n      text.charCodeAt(this.pos) == CharCode.HASH &&\r\n      text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n    ) {\r\n      this.pos += 2;\r\n      while (\r\n        this.pos < this.end &&\r\n        text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n      ) {\r\n        ++this.pos;\r\n      }\r\n      // 'next' now starts at lf or eof\r\n    }\r\n  }\r\n\r\n  next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\r\n    this.nextToken = -1;\r\n    return this.token = this.unsafeNext(identifierHandling);\r\n  }\r\n\r\n  private unsafeNext(\r\n    identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n    maxTokenLength: i32 = i32.MAX_VALUE\r\n  ): Token {\r\n    var text = this.source.text;\r\n    while (this.pos < this.end) {\r\n      this.tokenPos = this.pos;\r\n      let c = text.charCodeAt(this.pos);\r\n      switch (c) {\r\n        case CharCode.CARRIAGERETURN: {\r\n          if (!(\r\n            ++this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n          )) break;\r\n          // otherwise fall-through\r\n        }\r\n        case CharCode.LINEFEED:\r\n        case CharCode.TAB:\r\n        case CharCode.VERTICALTAB:\r\n        case CharCode.FORMFEED:\r\n        case CharCode.SPACE: {\r\n          ++this.pos;\r\n          break;\r\n        }\r\n        case CharCode.EXCLAMATION: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            if (\r\n              maxTokenLength > 2 && this.pos < this.end &&\r\n              text.charCodeAt(this.pos) == CharCode.EQUALS\r\n            ) {\r\n              ++this.pos;\r\n              return Token.EXCLAMATION_EQUALS_EQUALS;\r\n            }\r\n            return Token.EXCLAMATION_EQUALS;\r\n          }\r\n          return Token.EXCLAMATION;\r\n        }\r\n        case CharCode.DOUBLEQUOTE:\r\n        case CharCode.SINGLEQUOTE:\r\n        case CharCode.BACKTICK: { // TODO\r\n          return Token.STRINGLITERAL; // expects a call to readString\r\n        }\r\n        case CharCode.PERCENT: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            return Token.PERCENT_EQUALS;\r\n          }\r\n          return Token.PERCENT;\r\n        }\r\n        case CharCode.AMPERSAND: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n              ++this.pos;\r\n              return Token.AMPERSAND_AMPERSAND;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.AMPERSAND_EQUALS;\r\n            }\r\n          }\r\n          return Token.AMPERSAND;\r\n        }\r\n        case CharCode.OPENPAREN: {\r\n          ++this.pos;\r\n          return Token.OPENPAREN;\r\n        }\r\n        case CharCode.CLOSEPAREN: {\r\n          ++this.pos;\r\n          return Token.CLOSEPAREN;\r\n        }\r\n        case CharCode.ASTERISK: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.ASTERISK_EQUALS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 && this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.ASTERISK_ASTERISK_EQUALS;\r\n              }\r\n              return Token.ASTERISK_ASTERISK;\r\n            }\r\n          }\r\n          return Token.ASTERISK;\r\n        }\r\n        case CharCode.PLUS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n              ++this.pos;\r\n              return Token.PLUS_PLUS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.PLUS_EQUALS;\r\n            }\r\n          }\r\n          return Token.PLUS;\r\n        }\r\n        case CharCode.COMMA: {\r\n          ++this.pos;\r\n          return Token.COMMA;\r\n        }\r\n        case CharCode.MINUS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n              ++this.pos;\r\n              return Token.MINUS_MINUS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.MINUS_EQUALS;\r\n            }\r\n          }\r\n          return Token.MINUS;\r\n        }\r\n        case CharCode.DOT: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n              --this.pos;\r\n              return Token.FLOATLITERAL; // expects a call to readFloat\r\n            }\r\n            if (\r\n              maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n              text.charCodeAt(this.pos) == CharCode.DOT &&\r\n              text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n            ) {\r\n              this.pos += 2;\r\n              return Token.DOT_DOT_DOT;\r\n            }\r\n          }\r\n          return Token.DOT;\r\n        }\r\n        case CharCode.SLASH: {\r\n          let commentStartPos = this.pos;\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n              let commentKind = CommentKind.LINE;\r\n              if (\r\n                this.pos + 1 < this.end &&\r\n                text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n              ) {\r\n                ++this.pos;\r\n                commentKind = CommentKind.TRIPLE;\r\n              }\r\n              while (++this.pos < this.end) {\r\n                if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\r\n                  ++this.pos;\r\n                  break;\r\n                }\r\n              }\r\n              if (this.onComment) {\r\n                this.onComment(\r\n                  commentKind,\r\n                  text.substring(commentStartPos, this.pos),\r\n                  this.range(commentStartPos, this.pos)\r\n                );\r\n              }\r\n              break;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n              let closed = false;\r\n              while (++this.pos < this.end) {\r\n                c = text.charCodeAt(this.pos);\r\n                if (\r\n                  c == CharCode.ASTERISK &&\r\n                  this.pos + 1 < this.end &&\r\n                  text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n                ) {\r\n                  this.pos += 2;\r\n                  closed = true;\r\n                  break;\r\n                }\r\n              }\r\n              if (!closed) {\r\n                this.error(\r\n                  DiagnosticCode._0_expected,\r\n                  this.range(this.pos), \"*/\"\r\n                );\r\n              } else if (this.onComment) {\r\n                this.onComment(\r\n                  CommentKind.BLOCK,\r\n                  text.substring(commentStartPos, this.pos),\r\n                  this.range(commentStartPos, this.pos)\r\n                );\r\n              }\r\n              break;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.SLASH_EQUALS;\r\n            }\r\n          }\r\n          return Token.SLASH;\r\n        }\r\n        case CharCode._0:\r\n        case CharCode._1:\r\n        case CharCode._2:\r\n        case CharCode._3:\r\n        case CharCode._4:\r\n        case CharCode._5:\r\n        case CharCode._6:\r\n        case CharCode._7:\r\n        case CharCode._8:\r\n        case CharCode._9: {\r\n          return this.testInteger()\r\n            ? Token.INTEGERLITERAL // expects a call to readInteger\r\n            : Token.FLOATLITERAL;  // expects a call to readFloat\r\n        }\r\n        case CharCode.COLON: {\r\n          ++this.pos;\r\n          return Token.COLON;\r\n        }\r\n        case CharCode.SEMICOLON: {\r\n          ++this.pos;\r\n          return Token.SEMICOLON;\r\n        }\r\n        case CharCode.LESSTHAN: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 &&\r\n                this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n              }\r\n              return Token.LESSTHAN_LESSTHAN;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.LESSTHAN_EQUALS;\r\n            }\r\n          }\r\n          return Token.LESSTHAN;\r\n        }\r\n        case CharCode.EQUALS: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              if (\r\n                maxTokenLength > 2 &&\r\n                this.pos < this.end &&\r\n                text.charCodeAt(this.pos) == CharCode.EQUALS\r\n              ) {\r\n                ++this.pos;\r\n                return Token.EQUALS_EQUALS_EQUALS;\r\n              }\r\n              return Token.EQUALS_EQUALS;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n              ++this.pos;\r\n              return Token.EQUALS_GREATERTHAN;\r\n            }\r\n          }\r\n          return Token.EQUALS;\r\n        }\r\n        case CharCode.GREATERTHAN: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n              ++this.pos;\r\n              if (maxTokenLength > 2 && this.pos < this.end) {\r\n                if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n                  ++this.pos;\r\n                  if (\r\n                    maxTokenLength > 3 && this.pos < this.end &&\r\n                    text.charCodeAt(this.pos) == CharCode.EQUALS\r\n                  ) {\r\n                    ++this.pos;\r\n                    return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n                  }\r\n                  return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n                }\r\n                if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n                  ++this.pos;\r\n                  return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n                }\r\n              }\r\n              return Token.GREATERTHAN_GREATERTHAN;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.GREATERTHAN_EQUALS;\r\n            }\r\n          }\r\n          return Token.GREATERTHAN;\r\n        }\r\n        case CharCode.QUESTION: {\r\n          ++this.pos;\r\n          return Token.QUESTION;\r\n        }\r\n        case CharCode.OPENBRACKET: {\r\n          ++this.pos;\r\n          return Token.OPENBRACKET;\r\n        }\r\n        case CharCode.CLOSEBRACKET: {\r\n          ++this.pos;\r\n          return Token.CLOSEBRACKET;\r\n        }\r\n        case CharCode.CARET: {\r\n          ++this.pos;\r\n          if (\r\n            maxTokenLength > 1 && this.pos < this.end &&\r\n            text.charCodeAt(this.pos) == CharCode.EQUALS\r\n          ) {\r\n            ++this.pos;\r\n            return Token.CARET_EQUALS;\r\n          }\r\n          return Token.CARET;\r\n        }\r\n        case CharCode.OPENBRACE: {\r\n          ++this.pos;\r\n          return Token.OPENBRACE;\r\n        }\r\n        case CharCode.BAR: {\r\n          ++this.pos;\r\n          if (maxTokenLength > 1 && this.pos < this.end) {\r\n            if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n              ++this.pos;\r\n              return Token.BAR_BAR;\r\n            }\r\n            if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n              ++this.pos;\r\n              return Token.BAR_EQUALS;\r\n            }\r\n          }\r\n          return Token.BAR;\r\n        }\r\n        case CharCode.CLOSEBRACE: {\r\n          ++this.pos;\r\n          return Token.CLOSEBRACE;\r\n        }\r\n        case CharCode.TILDE: {\r\n          ++this.pos;\r\n          return Token.TILDE;\r\n        }\r\n        case CharCode.AT: {\r\n          ++this.pos;\r\n          return Token.AT;\r\n        }\r\n        default: {\r\n          if (isIdentifierStart(c)) {\r\n            if (isKeywordCharacter(c)) {\r\n              let posBefore = this.pos;\r\n              while (\r\n                ++this.pos < this.end &&\r\n                isIdentifierPart(c = text.charCodeAt(this.pos))\r\n              ) {\r\n                if (!isKeywordCharacter(c)) {\r\n                  this.pos = posBefore;\r\n                  return Token.IDENTIFIER;\r\n                }\r\n              }\r\n              let keywordText = text.substring(posBefore, this.pos);\r\n              let keywordToken = tokenFromKeyword(keywordText);\r\n              if (\r\n                keywordToken != Token.INVALID &&\r\n                identifierHandling !== IdentifierHandling.ALWAYS &&\r\n                !(\r\n                  identifierHandling === IdentifierHandling.PREFER &&\r\n                  tokenIsAlsoIdentifier(keywordToken)\r\n                )\r\n              ) {\r\n                return keywordToken;\r\n              }\r\n              this.pos = posBefore;\r\n            }\r\n            return Token.IDENTIFIER; // expects a call to readIdentifier\r\n          } else if (isWhiteSpace(c)) {\r\n            ++this.pos;\r\n            break;\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Invalid_character,\r\n            this.range(this.pos, this.pos + 1)\r\n          );\r\n          ++this.pos;\r\n          return Token.INVALID;\r\n        }\r\n      }\r\n    }\r\n    return Token.ENDOFFILE;\r\n  }\r\n\r\n  peek(\r\n    checkOnNewLine: bool = false,\r\n    identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n    maxCompoundLength: i32 = i32.MAX_VALUE\r\n  ): Token {\r\n    var text = this.source.text;\r\n    if (this.nextToken < 0) {\r\n      let posBefore = this.pos;\r\n      let tokenBefore = this.token;\r\n      let tokenPosBefore = this.tokenPos;\r\n      this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n      this.nextTokenPos = this.tokenPos;\r\n      if (checkOnNewLine) {\r\n        this.nextTokenOnNewLine = false;\r\n        for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\r\n          if (isLineBreak(text.charCodeAt(pos))) {\r\n            this.nextTokenOnNewLine = true;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      this.pos = posBefore;\r\n      this.token = tokenBefore;\r\n      this.tokenPos = tokenPosBefore;\r\n    }\r\n    return this.nextToken;\r\n  }\r\n\r\n  skipIdentifier(): bool {\r\n    return this.skip(Token.IDENTIFIER, IdentifierHandling.PREFER);\r\n  }\r\n\r\n  skipIdentifierName(): bool {\r\n    return this.skip(Token.IDENTIFIER, IdentifierHandling.ALWAYS);\r\n  }\r\n\r\n  skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\r\n    var posBefore = this.pos;\r\n    var tokenBefore = this.token;\r\n    var tokenPosBefore = this.tokenPos;\r\n    var maxCompoundLength = i32.MAX_VALUE;\r\n    switch (token) {\r\n      case Token.GREATERTHAN: { // where parsing type arguments\r\n        maxCompoundLength = 1;\r\n        break;\r\n      }\r\n    }\r\n    this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n    if (this.token == token) {\r\n      this.nextToken = -1;\r\n      return true;\r\n    } else {\r\n      this.pos = posBefore;\r\n      this.token = tokenBefore;\r\n      this.tokenPos = tokenPosBefore;\r\n      return false;\r\n    }\r\n  }\r\n\r\n  mark(): State {\r\n    var state: State;\r\n    if (reusableState) {\r\n      state = reusableState;\r\n      reusableState = null;\r\n    } else {\r\n      state = new State();\r\n    }\r\n    state.pos = this.pos;\r\n    state.token = this.token;\r\n    state.tokenPos = this.tokenPos;\r\n    return state;\r\n  }\r\n\r\n  discard(state: State): void {\r\n    reusableState = state;\r\n  }\r\n\r\n  reset(state: State): void {\r\n    this.pos = state.pos;\r\n    this.token = state.token;\r\n    this.tokenPos = state.tokenPos;\r\n    this.nextToken = -1;\r\n  }\r\n\r\n  range(start: i32 = -1, end: i32 = -1): Range {\r\n    if (start < 0) {\r\n      start = this.tokenPos;\r\n      end = this.pos;\r\n    } else if (end < 0) {\r\n      end = start;\r\n    }\r\n    return new Range(this.source, start, end);\r\n  }\r\n\r\n  readIdentifier(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    while (\r\n      ++this.pos < this.end &&\r\n      isIdentifierPart(text.charCodeAt(this.pos))\r\n    );\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  readString(): string {\r\n    var text = this.source.text;\r\n    var quote = text.charCodeAt(this.pos++);\r\n    var start = this.pos;\r\n    var result = \"\";\r\n    while (true) {\r\n      if (this.pos >= this.end) {\r\n        result += text.substring(start, this.pos);\r\n        this.error(\r\n          DiagnosticCode.Unterminated_string_literal,\r\n          this.range(start - 1, this.end)\r\n        );\r\n        break;\r\n      }\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == quote) {\r\n        result += text.substring(start, this.pos++);\r\n        break;\r\n      }\r\n      if (c == CharCode.BACKSLASH) {\r\n        result += text.substring(start, this.pos);\r\n        result += this.readEscapeSequence();\r\n        start = this.pos;\r\n        continue;\r\n      }\r\n      if (isLineBreak(c)) {\r\n        result += text.substring(start, this.pos);\r\n        this.error(\r\n          DiagnosticCode.Unterminated_string_literal,\r\n          this.range(start - 1, this.pos)\r\n        );\r\n        break;\r\n      }\r\n      ++this.pos;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  readEscapeSequence(): string {\r\n    if (++this.pos >= this.end) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(this.end)\r\n      );\r\n      return \"\";\r\n    }\r\n\r\n    var text = this.source.text;\r\n    var c = text.charCodeAt(this.pos++);\r\n    switch (c) {\r\n      case CharCode._0: return \"\\0\";\r\n      case CharCode.b: return \"\\b\";\r\n      case CharCode.t: return \"\\t\";\r\n      case CharCode.n: return \"\\n\";\r\n      case CharCode.v: return \"\\v\";\r\n      case CharCode.f: return \"\\f\";\r\n      case CharCode.r: return \"\\r\";\r\n      case CharCode.SINGLEQUOTE: return \"'\";\r\n      case CharCode.DOUBLEQUOTE: return \"\\\"\";\r\n      case CharCode.u: {\r\n        if (\r\n          this.pos < this.end &&\r\n          text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n        ) {\r\n          ++this.pos;\r\n          return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n        }\r\n        return this.readUnicodeEscape(); // \\uDDDD\r\n      }\r\n      case CharCode.CARRIAGERETURN: {\r\n        if (\r\n          this.pos < this.end &&\r\n          text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n        ) {\r\n          ++this.pos;\r\n        }\r\n        // fall through\r\n      }\r\n      case CharCode.LINEFEED:\r\n      case CharCode.LINESEPARATOR:\r\n      case CharCode.PARAGRAPHSEPARATOR: return \"\";\r\n      default: return String.fromCharCode(c);\r\n    }\r\n  }\r\n\r\n  readRegexpPattern(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var escaped = false;\r\n    while (true) {\r\n      if (this.pos >= this.end) {\r\n        this.error(\r\n          DiagnosticCode.Unterminated_regular_expression_literal,\r\n          this.range(start, this.end)\r\n        );\r\n        break;\r\n      }\r\n      if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n        ++this.pos;\r\n        escaped = true;\r\n        continue;\r\n      }\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == CharCode.SLASH && !escaped) break;\r\n      if (isLineBreak(c)) {\r\n        this.error(\r\n          DiagnosticCode.Unterminated_regular_expression_literal,\r\n          this.range(start, this.pos)\r\n        );\r\n        break;\r\n      }\r\n      ++this.pos;\r\n      escaped = false;\r\n    }\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  readRegexpFlags(): string {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var flags = 0;\r\n    while (this.pos < this.end) {\r\n      let c: i32 = text.charCodeAt(this.pos);\r\n      if (!isIdentifierPart(c)) break;\r\n      ++this.pos;\r\n\r\n      // make sure each supported flag is unique\r\n      switch (c) {\r\n        case CharCode.g: {\r\n          flags |= flags & 1 ? -1 : 1;\r\n          break;\r\n        }\r\n        case CharCode.i: {\r\n          flags |= flags & 2 ? -1 : 2;\r\n          break;\r\n        }\r\n        case CharCode.m: {\r\n          flags |= flags & 4 ? -1 : 4;\r\n          break;\r\n        }\r\n        default: {\r\n          flags = -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    if (flags == -1) {\r\n      this.error(\r\n        DiagnosticCode.Invalid_regular_expression_flags,\r\n        this.range(start, this.pos)\r\n      );\r\n    }\r\n    return text.substring(start, this.pos);\r\n  }\r\n\r\n  testInteger(): bool {\r\n    var text = this.source.text;\r\n    if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n      switch (text.charCodeAt(this.pos + 2)) {\r\n        case CharCode.X:\r\n        case CharCode.x:\r\n        case CharCode.B:\r\n        case CharCode.b:\r\n        case CharCode.O:\r\n        case CharCode.o: return true;\r\n      }\r\n    }\r\n    var pos = this.pos;\r\n    while (pos < this.end) {\r\n      let c = text.charCodeAt(pos);\r\n      if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n        return false;\r\n      }\r\n      if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\r\n      // does not validate separator placement (this is done in readXYInteger)\r\n      pos++;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  readInteger(): I64 {\r\n    var text = this.source.text;\r\n    if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n      switch (text.charCodeAt(this.pos + 1)) {\r\n        case CharCode.X:\r\n        case CharCode.x: {\r\n          this.pos += 2;\r\n          return this.readHexInteger();\r\n        }\r\n        case CharCode.B:\r\n        case CharCode.b: {\r\n          this.pos += 2;\r\n          return this.readBinaryInteger();\r\n        }\r\n        case CharCode.O:\r\n        case CharCode.o: {\r\n          this.pos += 2;\r\n          return this.readOctalInteger();\r\n        }\r\n      }\r\n      if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n        let start = this.pos;\r\n        ++this.pos;\r\n        let value = this.readOctalInteger();\r\n        this.error(\r\n          DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n          this.range(start, this.pos)\r\n        );\r\n        return value;\r\n      }\r\n    }\r\n    return this.readDecimalInteger();\r\n  }\r\n\r\n  readHexInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_16 = i64_new(16, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        // value = value * 16 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n       } else if (c >= CharCode.A && c <= CharCode.F) {\r\n        // value = value * 16 + 10 + c - CharCode.A;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(10 + c - CharCode.A, 0)\r\n        );\r\n      } else if (c >= CharCode.a && c <= CharCode.f) {\r\n        // value = value * 16 + 10 + c - CharCode.a;\r\n        value = i64_add(\r\n          i64_mul(value, i64_16),\r\n          i64_new(10 + c - CharCode.a, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Hexadecimal_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readDecimalInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_10 = i64_new(10, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        // value = value * 10 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_10),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readOctalInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_8 = i64_new(8, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c >= CharCode._0 && c <= CharCode._7) {\r\n        // value = value * 8 + c - CharCode._0;\r\n        value = i64_add(\r\n          i64_mul(value, i64_8),\r\n          i64_new(c - CharCode._0, 0)\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      ++this.pos;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Octal_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readBinaryInteger(): I64 {\r\n    var text = this.source.text;\r\n    var start = this.pos;\r\n    var value = i64_new(0, 0);\r\n    var i64_2 = i64_new(2, 0);\r\n    var i64_1 = i64_new(1, 0);\r\n    var sepEnd = start;\r\n    while (this.pos < this.end) {\r\n      let pos = this.pos;\r\n      let c = text.charCodeAt(pos);\r\n      if (c == CharCode._0) {\r\n        // value = value * 2;\r\n        value = i64_mul(\r\n          value,\r\n          i64_2\r\n        );\r\n      } else if (c == CharCode._1) {\r\n        // value = value * 2 + 1;\r\n        value = i64_add(\r\n          i64_mul(value, i64_2),\r\n          i64_1\r\n        );\r\n      } else if (c == CharCode._) {\r\n        if (sepEnd == pos) {\r\n          this.error(\r\n            sepEnd == start\r\n              ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n              : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n            this.range(pos)\r\n          );\r\n        }\r\n        sepEnd = pos + 1;\r\n      } else {\r\n        break;\r\n      }\r\n      this.pos = pos + 1;\r\n    }\r\n    if (this.pos == start) {\r\n      this.error(\r\n        DiagnosticCode.Binary_digit_expected,\r\n        this.range(start)\r\n      );\r\n    } else if (sepEnd == this.pos) {\r\n      this.error(\r\n        DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n        this.range(sepEnd - 1)\r\n      );\r\n    }\r\n    return value;\r\n  }\r\n\r\n  readFloat(): f64 {\r\n    // var text = this.source.text;\r\n    // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n    //   switch (text.charCodeAt(this.pos + 1)) {\r\n    //     case CharCode.X:\r\n    //     case CharCode.x: {\r\n    //       this.pos += 2;\r\n    //       return this.readHexFloat();\r\n    //     }\r\n    //   }\r\n    // }\r\n    return this.readDecimalFloat();\r\n  }\r\n\r\n  readDecimalFloat(): f64 {\r\n    // TODO: numeric separators (parseFloat can't handle these)\r\n    var start = this.pos;\r\n    var text = this.source.text;\r\n    while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n      ++this.pos;\r\n    }\r\n    if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n      ++this.pos;\r\n      while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n        ++this.pos;\r\n      }\r\n    }\r\n    if (this.pos < this.end) {\r\n      let c = text.charCodeAt(this.pos);\r\n      if (c == CharCode.E || c == CharCode.e) {\r\n        if (\r\n          ++this.pos < this.end && (\r\n            text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n            text.charCodeAt(this.pos) == CharCode.PLUS\r\n          ) &&\r\n          isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n        ) {\r\n          ++this.pos;\r\n        }\r\n        while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n          ++this.pos;\r\n        }\r\n      }\r\n    }\r\n    return parseFloat(text.substring(start, this.pos));\r\n  }\r\n\r\n  readHexFloat(): f64 {\r\n    throw new Error(\"not implemented\"); // TBD\r\n  }\r\n\r\n  readUnicodeEscape(): string {\r\n    var remain = 4;\r\n    var value = 0;\r\n    var text = this.source.text;\r\n    while (this.pos < this.end) {\r\n      let c = text.charCodeAt(this.pos++);\r\n      if (c >= CharCode._0 && c <= CharCode._9) {\r\n        value = value * 16 + c - CharCode._0;\r\n      } else if (c >= CharCode.A && c <= CharCode.F) {\r\n        value = value * 16 + 10 + c - CharCode.A;\r\n      } else if (c >= CharCode.a && c <= CharCode.f) {\r\n        value = value * 16 + 10 + c - CharCode.a;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Hexadecimal_digit_expected,\r\n          this.range(this.pos - 1, this.pos)\r\n        );\r\n        return \"\";\r\n      }\r\n      if (--remain == 0) break;\r\n    }\r\n    if (remain) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(this.pos)\r\n      );\r\n      return \"\";\r\n    }\r\n    return String.fromCharCode(value);\r\n  }\r\n\r\n  private readExtendedUnicodeEscape(): string {\r\n    var start = this.pos;\r\n    var value = this.readHexInteger();\r\n    var value32 = i64_low(value);\r\n    var invalid = false;\r\n\r\n    assert(!i64_high(value));\r\n    if (value32 > 0x10FFFF) {\r\n      this.error(\r\n        DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n        this.range(start, this.pos)\r\n      );\r\n      invalid = true;\r\n    }\r\n\r\n    var text = this.source.text;\r\n    if (this.pos >= this.end) {\r\n      this.error(\r\n        DiagnosticCode.Unexpected_end_of_text,\r\n        this.range(start, this.end)\r\n      );\r\n      invalid = true;\r\n    } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n      ++this.pos;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n        this.range(start, this.pos)\r\n      );\r\n      invalid = true;\r\n    }\r\n\r\n    if (invalid) return \"\";\r\n    return value32 < 65536\r\n      ? String.fromCharCode(value32)\r\n      : String.fromCharCode(\r\n        (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n        ( (value32 - 65536) % 1024      + 0xDC00) as i32\r\n      );\r\n  }\r\n\r\n  finish(): void {\r\n  }\r\n}\r\n\r\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\r\nexport class State {\r\n  /** Current position. */\r\n  pos: i32;\r\n  /** Current token. */\r\n  token: Token;\r\n  /** Current token's position. */\r\n  tokenPos: i32;\r\n}\r\n\r\n// Reusable state object to reduce allocations\r\nvar reusableState: State | null = null;\r\n","/**\n * Generated from diagnosticsMessages.json. Do not edit.\n * @module diagnostics\n *//***/\n\n/* tslint:disable:max-line-length */\n\n/** Enum of available diagnostic codes. */\nexport enum DiagnosticCode {\n  Operation_not_supported = 100,\n  Operation_is_unsafe = 101,\n  Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\n  Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n  Type_0_cannot_be_changed_to_type_1 = 202,\n  Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n  Basic_type_0_cannot_be_nullable = 204,\n  Cannot_export_a_mutable_global = 205,\n  Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n  Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\n  Unmanaged_classes_cannot_implement_interfaces = 208,\n  Invalid_regular_expression_flags = 209,\n  Implementation_0_must_match_the_signature_1 = 210,\n  Class_0_is_sealed_and_cannot_be_extended = 211,\n  Decorator_0_is_not_valid_here = 212,\n  Duplicate_decorator = 213,\n  An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\n  Optional_parameter_must_have_an_initializer = 215,\n  Unterminated_string_literal = 1002,\n  Identifier_expected = 1003,\n  _0_expected = 1005,\n  A_file_cannot_have_a_reference_to_itself = 1006,\n  Trailing_comma_not_allowed = 1009,\n  Unexpected_token = 1012,\n  A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n  Parameter_cannot_have_question_mark_and_initializer = 1015,\n  A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n  Enum_member_must_have_initializer = 1061,\n  Statements_are_not_allowed_in_ambient_contexts = 1036,\n  Initializers_are_not_allowed_in_ambient_contexts = 1039,\n  _0_modifier_cannot_be_used_here = 1042,\n  A_rest_parameter_cannot_be_optional = 1047,\n  A_rest_parameter_cannot_have_an_initializer = 1048,\n  A_set_accessor_must_have_exactly_one_parameter = 1049,\n  A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n  A_get_accessor_cannot_have_parameters = 1054,\n  Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n  Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n  An_accessor_cannot_have_type_parameters = 1094,\n  A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n  Type_parameter_list_cannot_be_empty = 1098,\n  A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n  A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n  A_return_statement_can_only_be_used_within_a_function_body = 1108,\n  Expression_expected = 1109,\n  Type_expected = 1110,\n  A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n  Duplicate_label_0 = 1114,\n  Octal_literals_are_not_allowed_in_strict_mode = 1121,\n  Digit_expected = 1124,\n  Hexadecimal_digit_expected = 1125,\n  Unexpected_end_of_text = 1126,\n  Invalid_character = 1127,\n  _case_or_default_expected = 1130,\n  A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\n  Type_argument_expected = 1140,\n  String_literal_expected = 1141,\n  Line_break_not_permitted_here = 1142,\n  Declaration_expected = 1146,\n  _const_declarations_must_be_initialized = 1155,\n  Unterminated_regular_expression_literal = 1161,\n  Interface_declaration_cannot_have_implements_clause = 1176,\n  Binary_digit_expected = 1177,\n  Octal_digit_expected = 1178,\n  An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n  An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n  Unterminated_Unicode_escape_sequence = 1199,\n  Decorators_are_not_valid_here = 1206,\n  _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n  Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\n  A_class_may_only_extend_another_class = 1311,\n  A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\n  Duplicate_identifier_0 = 2300,\n  Cannot_find_name_0 = 2304,\n  Module_0_has_no_exported_member_1 = 2305,\n  Generic_type_0_requires_1_type_argument_s = 2314,\n  Type_0_is_not_generic = 2315,\n  Type_0_is_not_assignable_to_type_1 = 2322,\n  Index_signature_is_missing_in_type_0 = 2329,\n  _this_cannot_be_referenced_in_current_location = 2332,\n  _super_can_only_be_referenced_in_a_derived_class = 2335,\n  Property_0_does_not_exist_on_type_1 = 2339,\n  Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n  Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n  A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n  The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n  The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n  Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\n  _get_and_set_accessor_must_have_the_same_type = 2380,\n  Constructor_implementation_is_missing = 2390,\n  Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n  Multiple_constructor_implementations_are_not_allowed = 2392,\n  Duplicate_function_implementation = 2393,\n  Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\n  Type_0_has_no_property_1 = 2460,\n  The_0_operator_cannot_be_applied_to_type_1 = 2469,\n  Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n  Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n  The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n  Index_signature_in_type_0_only_permits_reading = 2542,\n  Expected_0_arguments_but_got_1 = 2554,\n  Expected_at_least_0_arguments_but_got_1 = 2555,\n  Expected_0_type_arguments_but_got_1 = 2558,\n  A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n  Namespace_0_has_no_exported_member_1 = 2694,\n  File_0_not_found = 6054,\n  Numeric_separators_are_not_allowed_here = 6188,\n  Multiple_consecutive_numeric_separators_are_not_permitted = 6189\n}\n\n/** Translates a diagnostic code to its respective string. */\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n  switch (code) {\n    case 100: return \"Operation not supported.\";\n    case 101: return \"Operation is unsafe.\";\n    case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\n    case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n    case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n    case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n    case 204: return \"Basic type '{0}' cannot be nullable.\";\n    case 205: return \"Cannot export a mutable global.\";\n    case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n    case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\n    case 208: return \"Unmanaged classes cannot implement interfaces.\";\n    case 209: return \"Invalid regular expression flags.\";\n    case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n    case 211: return \"Class '{0}' is sealed and cannot be extended.\";\n    case 212: return \"Decorator '{0}' is not valid here.\";\n    case 213: return \"Duplicate decorator.\";\n    case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\n    case 215: return \"Optional parameter must have an initializer.\";\n    case 1002: return \"Unterminated string literal.\";\n    case 1003: return \"Identifier expected.\";\n    case 1005: return \"'{0}' expected.\";\n    case 1006: return \"A file cannot have a reference to itself.\";\n    case 1009: return \"Trailing comma not allowed.\";\n    case 1012: return \"Unexpected token.\";\n    case 1014: return \"A rest parameter must be last in a parameter list.\";\n    case 1015: return \"Parameter cannot have question mark and initializer.\";\n    case 1016: return \"A required parameter cannot follow an optional parameter.\";\n    case 1061: return \"Enum member must have initializer.\";\n    case 1036: return \"Statements are not allowed in ambient contexts.\";\n    case 1039: return \"Initializers are not allowed in ambient contexts.\";\n    case 1042: return \"'{0}' modifier cannot be used here.\";\n    case 1047: return \"A rest parameter cannot be optional.\";\n    case 1048: return \"A rest parameter cannot have an initializer.\";\n    case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n    case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n    case 1054: return \"A 'get' accessor cannot have parameters.\";\n    case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n    case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n    case 1094: return \"An accessor cannot have type parameters.\";\n    case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n    case 1098: return \"Type parameter list cannot be empty.\";\n    case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n    case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n    case 1108: return \"A 'return' statement can only be used within a function body.\";\n    case 1109: return \"Expression expected.\";\n    case 1110: return \"Type expected.\";\n    case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n    case 1114: return \"Duplicate label '{0}'.\";\n    case 1121: return \"Octal literals are not allowed in strict mode.\";\n    case 1124: return \"Digit expected.\";\n    case 1125: return \"Hexadecimal digit expected.\";\n    case 1126: return \"Unexpected end of text.\";\n    case 1127: return \"Invalid character.\";\n    case 1130: return \"'case' or 'default' expected.\";\n    case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\n    case 1140: return \"Type argument expected.\";\n    case 1141: return \"String literal expected.\";\n    case 1142: return \"Line break not permitted here.\";\n    case 1146: return \"Declaration expected.\";\n    case 1155: return \"'const' declarations must be initialized.\";\n    case 1161: return \"Unterminated regular expression literal.\";\n    case 1176: return \"Interface declaration cannot have 'implements' clause.\";\n    case 1177: return \"Binary digit expected.\";\n    case 1178: return \"Octal digit expected.\";\n    case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n    case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n    case 1199: return \"Unterminated Unicode escape sequence.\";\n    case 1206: return \"Decorators are not valid here.\";\n    case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n    case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\n    case 1311: return \"A class may only extend another class.\";\n    case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\n    case 2300: return \"Duplicate identifier '{0}'.\";\n    case 2304: return \"Cannot find name '{0}'.\";\n    case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n    case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n    case 2315: return \"Type '{0}' is not generic.\";\n    case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n    case 2329: return \"Index signature is missing in type '{0}'.\";\n    case 2332: return \"'this' cannot be referenced in current location.\";\n    case 2335: return \"'super' can only be referenced in a derived class.\";\n    case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n    case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n    case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n    case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n    case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n    case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n    case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\n    case 2380: return \"'get' and 'set' accessor must have the same type.\";\n    case 2390: return \"Constructor implementation is missing.\";\n    case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n    case 2392: return \"Multiple constructor implementations are not allowed.\";\n    case 2393: return \"Duplicate function implementation.\";\n    case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\n    case 2460: return \"Type '{0}' has no property '{1}'.\";\n    case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\n    case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n    case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n    case 2541: return \"The target of an assignment must be a variable or a property access.\";\n    case 2542: return \"Index signature in type '{0}' only permits reading.\";\n    case 2554: return \"Expected {0} arguments, but got {1}.\";\n    case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n    case 2558: return \"Expected {0} type arguments, but got {1}.\";\n    case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n    case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n    case 6054: return \"File '{0}' not found.\";\n    case 6188: return \"Numeric separators are not allowed here.\";\n    case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\n    default: return \"\";\n  }\n}\n","/**\r\n * The AssemblyScript compiler.\r\n * @module compiler\r\n *//***/\r\n\r\nimport {\r\n  compileCall as compileBuiltinCall,\r\n  compileAllocate as compileBuiltinAllocate,\r\n  compileAbort as compileBuiltinAbort\r\n} from \"./builtins\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Module,\r\n  MemorySegment,\r\n  ExpressionRef,\r\n  UnaryOp,\r\n  BinaryOp,\r\n  NativeType,\r\n  FunctionRef,\r\n  ExpressionId,\r\n  FunctionTypeRef,\r\n  GlobalRef,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getConstValueI32,\r\n  getConstValueI64Low,\r\n  getConstValueI64High,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getFunctionBody,\r\n  getGetLocalIndex,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getBlockName\r\n} from \"./module\";\r\n\r\nimport {\r\n  CommonFlags,\r\n  PATH_DELIMITER,\r\n  INNER_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  STATIC_DELIMITER,\r\n  GETTER_PREFIX,\r\n  SETTER_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program,\r\n  ClassPrototype,\r\n  Class,\r\n  Element,\r\n  ElementKind,\r\n  Enum,\r\n  Field,\r\n  FunctionPrototype,\r\n  Function,\r\n  FunctionTarget,\r\n  Global,\r\n  Local,\r\n  Namespace,\r\n  EnumValue,\r\n  Property,\r\n  VariableLikeElement,\r\n  FlowFlags,\r\n  ConstantValueKind,\r\n  Flow,\r\n  OperatorKind,\r\n  DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n  Resolver\r\n} from \"./resolver\";\r\n\r\nimport {\r\n  Token,\r\n  operatorTokenToString\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  TypeNode,\r\n  Source,\r\n  Range,\r\n  DecoratorKind,\r\n\r\n  Statement,\r\n  BlockStatement,\r\n  BreakStatement,\r\n  ClassDeclaration,\r\n  ContinueStatement,\r\n  DeclarationStatement,\r\n  DoStatement,\r\n  EmptyStatement,\r\n  EnumDeclaration,\r\n  ExportStatement,\r\n  ExpressionStatement,\r\n  FunctionDeclaration,\r\n  ForStatement,\r\n  IfStatement,\r\n  ImportStatement,\r\n  InstanceOfExpression,\r\n  InterfaceDeclaration,\r\n  NamespaceDeclaration,\r\n  ReturnStatement,\r\n  SwitchStatement,\r\n  ThrowStatement,\r\n  TryStatement,\r\n  VariableDeclaration,\r\n  VariableStatement,\r\n  VoidStatement,\r\n  WhileStatement,\r\n\r\n  Expression,\r\n  AssertionExpression,\r\n  BinaryExpression,\r\n  CallExpression,\r\n  CommaExpression,\r\n  ElementAccessExpression,\r\n  FloatLiteralExpression,\r\n  FunctionExpression,\r\n  IdentifierExpression,\r\n  IntegerLiteralExpression,\r\n  LiteralExpression,\r\n  LiteralKind,\r\n  NewExpression,\r\n  ParenthesizedExpression,\r\n  PropertyAccessExpression,\r\n  TernaryExpression,\r\n  ArrayLiteralExpression,\r\n  StringLiteralExpression,\r\n  UnaryPostfixExpression,\r\n  UnaryPrefixExpression,\r\n  FieldDeclaration,\r\n\r\n  nodeIsConstantValue,\r\n  isLastStatement,\r\n  findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags,\r\n  Signature,\r\n\r\n  typesToNativeTypes\r\n} from \"./types\";\r\n\r\nimport {\r\n  writeI32,\r\n  writeI64,\r\n  writeF32,\r\n  writeF64\r\n} from \"./util\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n  /** WebAssembly with 32-bit pointers. */\r\n  WASM32,\r\n  /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n  WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n  /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n  target: Target = Target.WASM32;\r\n  /** If true, compiles everything instead of just reachable code. */\r\n  noTreeShaking: bool = false;\r\n  /** If true, replaces assertions with nops. */\r\n  noAssert: bool = false;\r\n  /** If true, imports the memory provided by the embedder. */\r\n  importMemory: bool = false;\r\n  /** If true, imports the function table provided by the embedder. */\r\n  importTable: bool = false;\r\n  /** If true, generates information necessary for source maps. */\r\n  sourceMap: bool = false;\r\n  /** Static memory start offset. */\r\n  memoryBase: i32 = 0;\r\n  /** Global aliases. */\r\n  globalAliases: Map<string,string> | null = null;\r\n  /** Additional features to activate. */\r\n  features: Feature = Feature.NONE;\r\n\r\n  /** Hinted optimize level. Not applied by the compiler itself. */\r\n  optimizeLevelHint: i32 = 0;\r\n  /** Hinted shrink level. Not applied by the compiler itself. */\r\n  shrinkLevelHint: i32 = 0;\r\n\r\n  /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n  get isWasm64(): bool {\r\n    return this.target == Target.WASM64;\r\n  }\r\n\r\n  /** Gets the unsigned size type matching the target. */\r\n  get usizeType(): Type {\r\n    return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n  }\r\n\r\n  /** Gets the signed size type matching the target. */\r\n  get isizeType(): Type {\r\n    return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n  }\r\n\r\n  /** Gets the native size type matching the target. */\r\n  get nativeSizeType(): NativeType {\r\n    return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n  }\r\n\r\n  /** Tests if a specific feature is activated. */\r\n  hasFeature(feature: Feature): bool {\r\n    return (this.features & feature) != 0;\r\n  }\r\n}\r\n\r\n/** Indicates specific features to activate. */\r\nexport const enum Feature {\r\n  /** No additional features. */\r\n  NONE = 0,\r\n  /** Sign extension operations. */\r\n  SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\r\n  /** Mutable global imports and exports. */\r\n  MUTABLE_GLOBAL = 1 << 1  // see: https://github.com/WebAssembly/mutable-global\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n  /** No conversion. */\r\n  NONE,\r\n  /** Implicit conversion. */\r\n  IMPLICIT,\r\n  /** Explicit conversion. */\r\n  EXPLICIT\r\n}\r\n\r\n/** Indicates the desired wrap mode of a conversion. */\r\nexport const enum WrapMode {\r\n  /** No wrapping. */\r\n  NONE,\r\n  /** Wrap small integer values. */\r\n  WRAP\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n  /** Program reference. */\r\n  program: Program;\r\n  /** Resolver reference. */\r\n  resolver: Resolver;\r\n  /** Provided options. */\r\n  options: Options;\r\n  /** Module instance being compiled. */\r\n  module: Module;\r\n  /** Current function in compilation. */\r\n  currentFunction: Function;\r\n  /** Current outer function in compilation, if compiling a function expression. */\r\n  currentOuterFunction: Function | null = null;\r\n  /** Current enum in compilation. */\r\n  currentEnum: Enum | null = null;\r\n  /** Current type in compilation. */\r\n  currentType: Type = Type.void;\r\n  /** Start function being compiled. */\r\n  startFunctionInstance: Function;\r\n  /** Start function statements. */\r\n  startFunctionBody: ExpressionRef[];\r\n  /** Counting memory offset. */\r\n  memoryOffset: I64;\r\n  /** Memory segments being compiled. */\r\n  memorySegments: MemorySegment[] = [];\r\n  /** Map of already compiled static string segments. */\r\n  stringSegments: Map<string,MemorySegment> = new Map();\r\n  /** Function table being compiled. */\r\n  functionTable: Function[] = [];\r\n  /** Argument count helper global. */\r\n  argcVar: GlobalRef = 0;\r\n  /** Argument count helper setter. */\r\n  argcSet: FunctionRef = 0;\r\n\r\n  /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n  static compile(program: Program, options: Options | null = null): Module {\r\n    return new Compiler(program, options).compile();\r\n  }\r\n\r\n  /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n  constructor(program: Program, options: Options | null = null) {\r\n    super(program.diagnostics);\r\n    this.program = program;\r\n    this.resolver = program.resolver;\r\n    if (!options) options = new Options();\r\n    this.options = options;\r\n    this.memoryOffset = i64_new(\r\n      // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\r\n      // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\r\n      max(options.memoryBase, 8)\r\n    );\r\n    this.module = Module.create();\r\n  }\r\n\r\n  /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n  compile(): Module {\r\n    var options = this.options;\r\n    var module = this.module;\r\n    var program = this.program;\r\n\r\n    // initialize lookup maps, built-ins, imports, exports, etc.\r\n    program.initialize(options);\r\n\r\n    // set up the start function\r\n    var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\r\n    this.startFunctionInstance = startFunctionInstance;\r\n    var startFunctionBody = new Array<ExpressionRef>();\r\n    this.startFunctionBody = startFunctionBody;\r\n    this.currentFunction = startFunctionInstance;\r\n\r\n    // compile entry file(s) while traversing reachable elements\r\n    var sources = program.sources;\r\n    for (let i = 0, k = sources.length; i < k; ++i) {\r\n      if (sources[i].isEntry) this.compileSource(sources[i]);\r\n    }\r\n\r\n    // compile the start function if not empty or called by main\r\n    if (startFunctionBody.length || program.mainFunction !== null) {\r\n      let signature = startFunctionInstance.signature;\r\n      let funcRef = module.addFunction(\r\n        startFunctionInstance.internalName,\r\n        this.ensureFunctionType(\r\n          signature.parameterTypes,\r\n          signature.returnType,\r\n          signature.thisType\r\n        ),\r\n        typesToNativeTypes(startFunctionInstance.additionalLocals),\r\n        module.createBlock(null, startFunctionBody)\r\n      );\r\n      startFunctionInstance.finalize(module, funcRef);\r\n      if (!program.mainFunction) module.setStart(funcRef);\r\n    }\r\n\r\n    // set up static memory segments and the heap base pointer\r\n    var memoryOffset = this.memoryOffset;\r\n    memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\r\n    this.memoryOffset = memoryOffset;\r\n    if (options.isWasm64) {\r\n      module.addGlobal(\r\n        \"HEAP_BASE\",\r\n        NativeType.I64,\r\n        false,\r\n        module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n      );\r\n    } else {\r\n      module.addGlobal(\r\n        \"HEAP_BASE\",\r\n        NativeType.I32,\r\n        false,\r\n        module.createI32(i64_low(memoryOffset))\r\n      );\r\n    }\r\n\r\n    // determine initial page size\r\n    var numPages = this.memorySegments.length\r\n      ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\r\n      : 0;\r\n    module.setMemory(\r\n      numPages,\r\n      this.options.isWasm64\r\n        ? Module.MAX_MEMORY_WASM64\r\n        : Module.MAX_MEMORY_WASM32,\r\n      this.memorySegments,\r\n      options.target,\r\n      \"memory\"\r\n    );\r\n\r\n    // import memory if requested (default memory is named '0' by Binaryen)\r\n    if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\r\n\r\n    // set up function table\r\n    var functionTable = this.functionTable;\r\n    var functionTableSize = functionTable.length;\r\n    var functionTableExported = false;\r\n    if (functionTableSize) {\r\n      let entries = new Array<FunctionRef>(functionTableSize);\r\n      for (let i = 0; i < functionTableSize; ++i) {\r\n        entries[i] = functionTable[i].ref;\r\n      }\r\n      module.setFunctionTable(entries);\r\n      module.addTableExport(\"0\", \"table\");\r\n      functionTableExported = true;\r\n    }\r\n\r\n    // import table if requested (default table is named '0' by Binaryen)\r\n    if (options.importTable) {\r\n      module.addTableImport(\"0\", \"env\", \"table\");\r\n      if (!functionTableExported) module.addTableExport(\"0\", \"table\");\r\n    }\r\n\r\n    return module;\r\n  }\r\n\r\n  // sources\r\n\r\n  /** Compiles a source by looking it up by path first. */\r\n  compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n    var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\r\n    if (source) this.compileSource(source);\r\n    else {\r\n      this.error(\r\n        DiagnosticCode.File_0_not_found,\r\n        reportNode.range, normalizedPathWithoutExtension\r\n      );\r\n    }\r\n  }\r\n\r\n  /** Compiles a source. */\r\n  compileSource(source: Source): void {\r\n    if (source.is(CommonFlags.COMPILED)) return;\r\n    source.set(CommonFlags.COMPILED);\r\n\r\n    // compile top-level statements\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    var isEntry = source.isEntry;\r\n    var startFunctionInstance = this.startFunctionInstance;\r\n    var startFunctionBody = this.startFunctionBody;\r\n    var statements = source.statements;\r\n    for (let i = 0, k = statements.length; i < k; ++i) {\r\n      let statement = statements[i];\r\n      switch (statement.kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          if (\r\n            (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n            !(<ClassDeclaration>statement).isGeneric\r\n          ) {\r\n            this.compileClassDeclaration(<ClassDeclaration>statement, [], null);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: break;\r\n        case NodeKind.ENUMDECLARATION: {\r\n          if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n            this.compileEnumDeclaration(<EnumDeclaration>statement);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          if (\r\n            (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n            !(<FunctionDeclaration>statement).isGeneric\r\n          ) {\r\n            this.compileFunctionDeclaration(<FunctionDeclaration>statement, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.IMPORT: {\r\n          this.compileSourceByPath(\r\n            (<ImportStatement>statement).normalizedPath,\r\n            (<ImportStatement>statement).path\r\n          );\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n            this.compileNamespaceDeclaration(<NamespaceDeclaration>statement);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\r\n          let variableInit = this.compileVariableStatement(<VariableStatement>statement);\r\n          if (variableInit) startFunctionBody.push(variableInit);\r\n          break;\r\n        }\r\n        case NodeKind.EXPORT: {\r\n          if ((<ExportStatement>statement).normalizedPath != null) {\r\n            this.compileSourceByPath(\r\n              <string>(<ExportStatement>statement).normalizedPath,\r\n              <StringLiteralExpression>(<ExportStatement>statement).path\r\n            );\r\n          }\r\n          if (noTreeShaking || isEntry) {\r\n            this.compileExportStatement(<ExportStatement>statement);\r\n          }\r\n          break;\r\n        }\r\n        default: { // otherwise a top-level statement that is part of the start function's body\r\n          let previousFunction = this.currentFunction;\r\n          this.currentFunction = startFunctionInstance;\r\n          startFunctionBody.push(this.compileStatement(statement));\r\n          this.currentFunction = previousFunction;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // globals\r\n\r\n  compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n    // look up the initialized program element\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.GLOBAL);\r\n    if (!this.compileGlobal(<Global>element)) return null; // reports\r\n    return <Global>element;\r\n  }\r\n\r\n  compileGlobal(global: Global): bool {\r\n    if (global.is(CommonFlags.COMPILED)) return true;\r\n    global.set(CommonFlags.COMPILED);\r\n\r\n    var module = this.module;\r\n    var declaration = global.declaration;\r\n    var initExpr: ExpressionRef = 0;\r\n\r\n    if (global.type == Type.void) { // type is void if not yet resolved or not annotated\r\n      if (declaration) {\r\n\r\n        // resolve now if annotated\r\n        if (declaration.type) {\r\n          let resolvedType = this.resolver.resolveType(declaration.type); // reports\r\n          if (!resolvedType) return false;\r\n          if (resolvedType == Type.void) {\r\n            this.error(\r\n              DiagnosticCode.Type_expected,\r\n              declaration.type.range\r\n            );\r\n            return false;\r\n          }\r\n          global.type = resolvedType;\r\n\r\n        // infer from initializer if not annotated\r\n        } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n          initExpr = this.compileExpressionRetainType( // reports\r\n            declaration.initializer,\r\n            Type.void,\r\n            WrapMode.WRAP\r\n          );\r\n          if (this.currentType == Type.void) {\r\n            this.error(\r\n              DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n              declaration.initializer.range, this.currentType.toString(), \"<auto>\"\r\n            );\r\n            return false;\r\n          }\r\n          global.type = this.currentType;\r\n\r\n        // must either be annotated or have an initializer\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Type_expected,\r\n            declaration.name.range.atEnd\r\n          );\r\n          return false;\r\n        }\r\n      } else {\r\n        assert(false); // must have a declaration if 'void' (and thus resolved later on)\r\n      }\r\n    }\r\n\r\n    // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\r\n    if (global.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN)) return true;\r\n\r\n    var nativeType = global.type.toNativeType();\r\n    var isConstant = global.isAny(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n\r\n    // handle imports\r\n    if (global.is(CommonFlags.AMBIENT)) {\r\n\r\n      // constant global\r\n      if (isConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n        global.set(CommonFlags.MODULE_IMPORT);\r\n        if (declaration) {\r\n          mangleImportName(global, declaration, global.parent);\r\n        } else {\r\n          mangleImportName_moduleName = \"env\";\r\n          mangleImportName_elementName = global.simpleName;\r\n        }\r\n        module.addGlobalImport(\r\n          global.internalName,\r\n          mangleImportName_moduleName,\r\n          mangleImportName_elementName,\r\n          nativeType\r\n        );\r\n        global.set(CommonFlags.COMPILED);\r\n        return true;\r\n\r\n      // importing mutable globals is not supported in the MVP\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          assert(declaration).range\r\n        );\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // the MVP does not yet support initializer expressions other than constant values (and\r\n    // get_globals), hence such initializations must be performed in the start function for now.\r\n    var initializeInStart = false;\r\n\r\n    // inlined constant can be compiled as-is\r\n    if (global.is(CommonFlags.INLINED)) {\r\n      initExpr = this.compileInlineConstant(global, global.type, true);\r\n\r\n    } else {\r\n\r\n      // evaluate initializer if present\r\n      if (declaration && declaration.initializer) {\r\n        if (!initExpr) {\r\n          initExpr = this.compileExpression(\r\n            declaration.initializer,\r\n            global.type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP\r\n          );\r\n        }\r\n\r\n        // check if the initializer is constant\r\n        if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n\r\n          // if a constant global, check if the initializer becomes constant after precompute\r\n          if (isConstant) {\r\n            initExpr = this.precomputeExpressionRef(initExpr);\r\n            if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n              this.warning(\r\n                DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                declaration.range\r\n              );\r\n              initializeInStart = true;\r\n            }\r\n          } else {\r\n            initializeInStart = true;\r\n          }\r\n        }\r\n\r\n      // initialize to zero if there's no initializer\r\n      } else {\r\n        initExpr = global.type.toNativeZero(module);\r\n      }\r\n    }\r\n\r\n    var internalName = global.internalName;\r\n\r\n    if (initializeInStart) { // initialize to mutable zero and set the actual value in start\r\n      module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\r\n      this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\r\n\r\n    } else { // compile as-is\r\n\r\n      if (isConstant) {\r\n        let exprType = getExpressionType(initExpr);\r\n        switch (exprType) {\r\n          case NativeType.I32: {\r\n            global.constantValueKind = ConstantValueKind.INTEGER;\r\n            global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\r\n            break;\r\n          }\r\n          case NativeType.I64: {\r\n            global.constantValueKind = ConstantValueKind.INTEGER;\r\n            global.constantIntegerValue = i64_new(\r\n              getConstValueI64Low(initExpr),\r\n              getConstValueI64High(initExpr)\r\n            );\r\n            break;\r\n          }\r\n          case NativeType.F32: {\r\n            global.constantValueKind = ConstantValueKind.FLOAT;\r\n            global.constantFloatValue = getConstValueF32(initExpr);\r\n            break;\r\n          }\r\n          case NativeType.F64: {\r\n            global.constantValueKind = ConstantValueKind.FLOAT;\r\n            global.constantFloatValue = getConstValueF64(initExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return false;\r\n          }\r\n        }\r\n        global.set(CommonFlags.INLINED); // inline the value from now on\r\n        if (global.is(CommonFlags.MODULE_EXPORT)) {\r\n          module.addGlobal(internalName, nativeType, false, initExpr);\r\n          module.addGlobalExport(internalName, mangleExportName(global));\r\n        } else if (declaration && declaration.isTopLevel) { // might become re-exported\r\n          module.addGlobal(internalName, nativeType, false, initExpr);\r\n        }\r\n\r\n      } else /* mutable */ {\r\n        module.addGlobal(internalName, nativeType, !isConstant, initExpr);\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  // enums\r\n\r\n  compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.ENUM);\r\n    if (!this.compileEnum(<Enum>element)) return null;\r\n    return <Enum>element;\r\n  }\r\n\r\n  compileEnum(element: Enum): bool {\r\n    if (element.is(CommonFlags.COMPILED)) return true;\r\n    element.set(CommonFlags.COMPILED);\r\n\r\n    var module = this.module;\r\n    this.currentEnum = element;\r\n    var previousValue: EnumValue | null = null;\r\n\r\n    if (element.members) {\r\n      for (let member of element.members.values()) {\r\n        if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n        let initInStart = false;\r\n        let val = <EnumValue>member;\r\n        let valueDeclaration = val.declaration;\r\n        val.set(CommonFlags.COMPILED);\r\n        if (val.is(CommonFlags.INLINED)) {\r\n          if (element.declaration.isTopLevelExport) {\r\n            module.addGlobal(\r\n              val.internalName,\r\n              NativeType.I32,\r\n              false, // constant\r\n              module.createI32(val.constantValue)\r\n            );\r\n          }\r\n        } else {\r\n          let initExpr: ExpressionRef;\r\n          if (valueDeclaration.value) {\r\n            initExpr = this.compileExpression(\r\n              <Expression>valueDeclaration.value,\r\n              Type.i32,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE\r\n            );\r\n            if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n              initExpr = this.precomputeExpressionRef(initExpr);\r\n              if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n                if (element.is(CommonFlags.CONST)) {\r\n                  this.warning(\r\n                    DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                    valueDeclaration.range\r\n                  );\r\n                }\r\n                initInStart = true;\r\n              }\r\n            }\r\n          } else if (previousValue == null) {\r\n            initExpr = module.createI32(0);\r\n          } else if (previousValue.is(CommonFlags.INLINED)) {\r\n            initExpr = module.createI32(previousValue.constantValue + 1);\r\n          } else {\r\n            // in TypeScript this errors with TS1061, but actually we can do:\r\n            initExpr = module.createBinary(BinaryOp.AddI32,\r\n              module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n              module.createI32(1)\r\n            );\r\n            if (element.is(CommonFlags.CONST)) {\r\n              this.warning(\r\n                DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n                valueDeclaration.range\r\n              );\r\n            }\r\n            initInStart = true;\r\n          }\r\n          if (initInStart) {\r\n            module.addGlobal(\r\n              val.internalName,\r\n              NativeType.I32,\r\n              true, // mutable\r\n              module.createI32(0)\r\n            );\r\n            this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\r\n          } else {\r\n            module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\r\n            if (getExpressionType(initExpr) == NativeType.I32) {\r\n              val.constantValue = getConstValueI32(initExpr);\r\n              val.set(CommonFlags.INLINED);\r\n            } else {\r\n              assert(false);\r\n              val.constantValue = 0;\r\n            }\r\n          }\r\n        }\r\n        previousValue = <EnumValue>val;\r\n\r\n        // export values if the enum is exported\r\n        if (element.is(CommonFlags.MODULE_EXPORT)) {\r\n          if (member.is(CommonFlags.INLINED) || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n            module.addGlobalExport(member.internalName, mangleExportName(member));\r\n          } else if (valueDeclaration) {\r\n            this.warning(\r\n              DiagnosticCode.Cannot_export_a_mutable_global,\r\n              valueDeclaration.range\r\n            );\r\n          }\r\n        }\r\n      }\r\n    }\r\n    this.currentEnum = null;\r\n    return true;\r\n  }\r\n\r\n  // functions\r\n\r\n  /** Compiles a top-level function given its declaration. */\r\n  compileFunctionDeclaration(\r\n    declaration: FunctionDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ): Function | null {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n    return this.compileFunctionUsingTypeArguments( // reports\r\n      <FunctionPrototype>element,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      null, // no outer scope (is top level)\r\n      (<FunctionPrototype>element).declaration.name\r\n    );\r\n  }\r\n\r\n  /** Resolves the specified type arguments prior to compiling the resulting function instance. */\r\n  compileFunctionUsingTypeArguments(\r\n    prototype: FunctionPrototype,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    outerScope: Flow | null,\r\n    reportNode: Node\r\n  ): Function | null {\r\n    var instance = this.resolver.resolveFunctionInclTypeArguments(\r\n      prototype,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      reportNode\r\n    );\r\n    if (!instance) return null;\r\n    instance.outerScope = outerScope;\r\n    if (!this.compileFunction(instance)) return null; // reports\r\n    return instance;\r\n  }\r\n\r\n  /** Either reuses or creates the function type matching the specified signature. */\r\n  private ensureFunctionType(\r\n    parameterTypes: Type[] | null,\r\n    returnType: Type,\r\n    thisType: Type | null = null\r\n  ): FunctionTypeRef {\r\n    var numParameters = parameterTypes ? parameterTypes.length : 0;\r\n    var paramTypes: NativeType[];\r\n    var index = 0;\r\n    if (thisType) {\r\n      paramTypes = new Array(1 + numParameters);\r\n      paramTypes[0] = thisType.toNativeType();\r\n      index = 1;\r\n    } else {\r\n      paramTypes = new Array(numParameters);\r\n    }\r\n    if (parameterTypes) {\r\n      for (let i = 0; i < numParameters; ++i, ++index) {\r\n        paramTypes[index] = parameterTypes[i].toNativeType();\r\n      }\r\n    }\r\n    var resultType = returnType.toNativeType();\r\n    var module = this.module;\r\n    var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\r\n    if (!typeRef) {\r\n      let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\r\n      typeRef = module.addFunctionType(name, resultType, paramTypes);\r\n    }\r\n    return typeRef;\r\n  }\r\n\r\n  /** Compiles a readily resolved function instance. */\r\n  compileFunction(instance: Function): bool {\r\n    if (instance.is(CommonFlags.COMPILED)) return true;\r\n    assert(!instance.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN));\r\n    instance.set(CommonFlags.COMPILED);\r\n\r\n    // check that modifiers are matching\r\n    var declaration = instance.prototype.declaration;\r\n    var body = declaration.body;\r\n    if (body) {\r\n      if (instance.is(CommonFlags.AMBIENT)) {\r\n        this.error(\r\n          DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n          declaration.name.range\r\n        );\r\n      }\r\n    } else {\r\n      if (!instance.is(CommonFlags.AMBIENT)) {\r\n        this.error(\r\n          DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n          declaration.name.range\r\n        );\r\n      }\r\n    }\r\n\r\n    var ref: FunctionRef;\r\n    var signature = instance.signature;\r\n    var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n    var module = this.module;\r\n    if (body) {\r\n      let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\r\n      let returnType = instance.signature.returnType;\r\n\r\n      // compile body\r\n      let previousFunction = this.currentFunction;\r\n      this.currentFunction = instance;\r\n      let flow = instance.flow;\r\n      let stmt: ExpressionRef;\r\n      if (body.kind == NodeKind.EXPRESSION) { // () => expression\r\n        assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\r\n        assert(instance.is(CommonFlags.ARROW));\r\n        stmt = this.compileExpression(\r\n          (<ExpressionStatement>body).expression,\r\n          returnType,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        flow.set(FlowFlags.RETURNS);\r\n        if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n        flow.finalize();\r\n      } else {\r\n        assert(body.kind == NodeKind.BLOCK);\r\n        let stmts = this.compileStatements((<BlockStatement>body).statements);\r\n        if (instance.is(CommonFlags.MAIN)) {\r\n          module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\r\n          stmts.unshift(\r\n            module.createIf(\r\n              module.createUnary(\r\n                UnaryOp.EqzI32,\r\n                module.createGetGlobal(\"~started\", NativeType.I32)\r\n              ),\r\n              module.createBlock(null, [\r\n                module.createCall(\"start\", null, NativeType.None),\r\n                module.createSetGlobal(\"~started\", module.createI32(1))\r\n              ])\r\n            )\r\n          );\r\n        }\r\n        flow.finalize();\r\n        if (isConstructor) {\r\n          let nativeSizeType = this.options.nativeSizeType;\r\n          assert(instance.is(CommonFlags.INSTANCE));\r\n\r\n          // implicitly return `this` if the constructor doesn't always return on its own\r\n          if (!flow.is(FlowFlags.RETURNS)) {\r\n\r\n            // if all branches are guaranteed to allocate, skip the final conditional allocation\r\n            if (flow.is(FlowFlags.ALLOCATES)) {\r\n              stmts.push(module.createGetLocal(0, nativeSizeType));\r\n\r\n            // if not all branches are guaranteed to allocate, also append a conditional allocation\r\n            } else {\r\n              let parent = assert(instance.parent);\r\n              assert(parent.kind == ElementKind.CLASS);\r\n              stmts.push(module.createTeeLocal(0,\r\n                this.makeConditionalAllocate(<Class>parent, declaration.name)\r\n              ));\r\n            }\r\n          }\r\n\r\n        // make sure all branches return\r\n        } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\r\n          this.error(\r\n            DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n            declaration.signature.returnType.range\r\n          );\r\n        }\r\n        stmt = !stmts.length\r\n          ? module.createNop()\r\n          : stmts.length == 1\r\n            ? stmts[0]\r\n            : module.createBlock(null, stmts, returnType.toNativeType());\r\n      }\r\n      this.currentFunction = previousFunction;\r\n\r\n      // create the function\r\n      ref = module.addFunction(\r\n        instance.internalName,\r\n        typeRef,\r\n        typesToNativeTypes(instance.additionalLocals),\r\n        stmt\r\n      );\r\n\r\n      // concrete functions cannot have an annotated external name\r\n      if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\r\n        let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          decorator.range\r\n        );\r\n      }\r\n\r\n    } else {\r\n      instance.set(CommonFlags.MODULE_IMPORT);\r\n      mangleImportName(instance, declaration, instance.prototype.parent); // TODO: check for duplicates\r\n\r\n      // create the function import\r\n      ref = module.addFunctionImport(\r\n        instance.internalName,\r\n        mangleImportName_moduleName,\r\n        mangleImportName_elementName,\r\n        typeRef\r\n      );\r\n    }\r\n\r\n    // check module-level export\r\n    if (instance.is(CommonFlags.MODULE_EXPORT)) {\r\n      if (signature.requiredParameters < signature.parameterTypes.length) {\r\n        // export the trampoline if the function takes optional parameters\r\n        instance = this.ensureTrampoline(instance);\r\n        this.ensureArgcSet();\r\n      }\r\n      module.addFunctionExport(instance.internalName, mangleExportName(instance));\r\n    }\r\n\r\n    instance.finalize(module, ref);\r\n    return true;\r\n  }\r\n\r\n  // namespaces\r\n\r\n  compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n    var members = declaration.members;\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      let member = members[i];\r\n      switch (member.kind) {\r\n        case NodeKind.CLASSDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<ClassDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileClassDeclaration(<ClassDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.INTERFACEDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<InterfaceDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileInterfaceDeclaration(<InterfaceDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.ENUMDECLARATION: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            this.compileEnumDeclaration(<EnumDeclaration>member);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.FUNCTIONDECLARATION: {\r\n          if (\r\n            (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n            !(<FunctionDeclaration>member).isGeneric\r\n          ) {\r\n            this.compileFunctionDeclaration(<FunctionDeclaration>member, []);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.NAMESPACEDECLARATION: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            this.compileNamespaceDeclaration(<NamespaceDeclaration>member);\r\n          }\r\n          break;\r\n        }\r\n        case NodeKind.VARIABLE: {\r\n          if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n            let variableInit = this.compileVariableStatement(<VariableStatement>member, true);\r\n            if (variableInit) this.startFunctionBody.push(variableInit);\r\n          }\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n  }\r\n\r\n  compileNamespace(ns: Namespace): void {\r\n    if (!ns.members) return;\r\n\r\n    var noTreeShaking = this.options.noTreeShaking;\r\n    for (let element of ns.members.values()) {\r\n      switch (element.kind) {\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          if (\r\n            (\r\n              noTreeShaking ||\r\n              (<ClassPrototype>element).is(CommonFlags.EXPORT)\r\n            ) && !(<ClassPrototype>element).is(CommonFlags.GENERIC)\r\n          ) {\r\n            this.compileClassUsingTypeArguments(<ClassPrototype>element, []);\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.ENUM: {\r\n          this.compileEnum(<Enum>element);\r\n          break;\r\n        }\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          if (\r\n            (\r\n              noTreeShaking || (<FunctionPrototype>element).is(CommonFlags.EXPORT)\r\n            ) && !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n          ) {\r\n            this.compileFunctionUsingTypeArguments(\r\n              <FunctionPrototype>element,\r\n              [],\r\n              null, // no contextual type arguments\r\n              null, // no outer scope\r\n              (<FunctionPrototype>element).declaration.name\r\n            );\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.GLOBAL: {\r\n          this.compileGlobal(<Global>element);\r\n          break;\r\n        }\r\n        case ElementKind.NAMESPACE: {\r\n          this.compileNamespace(<Namespace>element);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // exports\r\n\r\n  compileExportStatement(statement: ExportStatement): void {\r\n    var module = this.module;\r\n    var fileLevelExports = this.program.fileLevelExports;\r\n    var members = statement.members;\r\n    if (!members) return; // filespace\r\n    for (let i = 0, k = members.length; i < k; ++i) {\r\n      let member = members[i];\r\n      let internalExportName = (\r\n        statement.range.source.internalPath +\r\n        PATH_DELIMITER +\r\n        member.externalName.text\r\n      );\r\n      let element = fileLevelExports.get(internalExportName);\r\n      if (!element) continue; // reported in Program#initialize\r\n      switch (element.kind) {\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          if (!(<ClassPrototype>element).is(CommonFlags.GENERIC)) {\r\n            this.compileClassUsingTypeArguments(<ClassPrototype>element, []);\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.ENUM: {\r\n          this.compileEnum(<Enum>element);\r\n          break;\r\n        }\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          if (\r\n            !(<FunctionPrototype>element).is(CommonFlags.GENERIC) &&\r\n            statement.range.source.isEntry\r\n          ) {\r\n            let functionInstance = this.compileFunctionUsingTypeArguments(\r\n              <FunctionPrototype>element,\r\n              [],\r\n              null, // no contextual type arguments\r\n              null, // no outer scope\r\n              (<FunctionPrototype>element).declaration.name\r\n            );\r\n            if (functionInstance) {\r\n              let functionDeclaration = functionInstance.prototype.declaration;\r\n              if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n                module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n              }\r\n            }\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.GLOBAL: {\r\n          if (this.compileGlobal(<Global>element) && statement.range.source.isEntry) {\r\n            let globalDeclaration = (<Global>element).declaration;\r\n            if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n              if ((<Global>element).is(CommonFlags.INLINED)) {\r\n                module.addGlobalExport(element.internalName, member.externalName.text);\r\n              } else {\r\n                this.warning(\r\n                  DiagnosticCode.Cannot_export_a_mutable_global,\r\n                  member.range\r\n                );\r\n              }\r\n            }\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.NAMESPACE: {\r\n          this.compileNamespace(<Namespace>element);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // classes\r\n\r\n  compileClassDeclaration(\r\n    declaration: ClassDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null\r\n  ): void {\r\n    var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n    assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n    this.compileClassUsingTypeArguments(\r\n      <ClassPrototype>element,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      declaration\r\n    );\r\n  }\r\n\r\n  compileClassUsingTypeArguments(\r\n    prototype: ClassPrototype,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): void {\r\n    var instance = this.resolver.resolveClassInclTypeArguments(\r\n      prototype,\r\n      typeArguments,\r\n      contextualTypeArguments,\r\n      alternativeReportNode || prototype.declaration\r\n    );\r\n    if (!instance) return;\r\n    this.compileClass(instance);\r\n  }\r\n\r\n  compileClass(instance: Class): bool {\r\n    if (instance.is(CommonFlags.COMPILED)) return true;\r\n    instance.set(CommonFlags.COMPILED);\r\n\r\n    var staticMembers = instance.prototype.members;\r\n    if (staticMembers) {\r\n      for (let element of staticMembers.values()) {\r\n        switch (element.kind) {\r\n          case ElementKind.GLOBAL: {\r\n            this.compileGlobal(<Global>element);\r\n            break;\r\n          }\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (\r\n              !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n            ) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                <FunctionPrototype>element,\r\n                [], null, null,\r\n                (<FunctionPrototype>element).declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n          case ElementKind.PROPERTY: {\r\n            let getter = (<Property>element).getterPrototype;\r\n            if (getter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                getter,\r\n                [], null, null,\r\n                getter.declaration.name\r\n              );\r\n            }\r\n            let setter = (<Property>element).setterPrototype;\r\n            if (setter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                setter,\r\n                [], null, null,\r\n                setter.declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    var ctorInstance = instance.constructorInstance;\r\n    if (ctorInstance) this.compileFunction(ctorInstance);\r\n    var instanceMembers = instance.members;\r\n    if (instanceMembers) {\r\n      for (let element of instanceMembers.values()) {\r\n        switch (element.kind) {\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (\r\n              !(<FunctionPrototype>element).is(CommonFlags.GENERIC)\r\n            ) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                <FunctionPrototype>element,\r\n                [],\r\n                instance.contextualTypeArguments,\r\n                null, // no outer scope\r\n                (<FunctionPrototype>element).declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n          case ElementKind.FIELD: {\r\n            element.set(CommonFlags.COMPILED);\r\n            if (!instance.is(CommonFlags.MODULE_EXPORT) || element.is(CommonFlags.PRIVATE)) break;\r\n            let module = this.module;\r\n            let name = (<Field>element).simpleName;\r\n            let type = (<Field>element).type;\r\n            let nativeType = type.toNativeType();\r\n            let offset = (<Field>element).memoryOffset;\r\n            let usizeType = this.options.usizeType;\r\n            let nativeSizeType = this.options.nativeSizeType;\r\n\r\n            // export an implicit getter: get:fieldName(this: usize) -> fieldType\r\n            let getterName = mangleExportName(element, GETTER_PREFIX + name);\r\n            module.addFunction(\r\n              getterName,\r\n              this.ensureFunctionType(null, type, usizeType),\r\n              null,\r\n              module.createLoad(\r\n                type.byteSize,\r\n                type.is(TypeFlags.SIGNED),\r\n                module.createGetLocal(0, nativeSizeType),\r\n                nativeType,\r\n                offset\r\n              )\r\n            );\r\n            module.addFunctionExport(getterName, getterName);\r\n\r\n            // export an implicit setter: set:fieldName(this: usize, value: fieldType) -> void\r\n            if (element.is(CommonFlags.READONLY)) break;\r\n            let setterName = mangleExportName(element, SETTER_PREFIX + name);\r\n            module.addFunction(\r\n              setterName,\r\n              this.ensureFunctionType([ type ], Type.void, usizeType),\r\n              null,\r\n              module.createStore(\r\n                type.byteSize,\r\n                module.createGetLocal(0, nativeSizeType),\r\n                module.createGetLocal(1, nativeType),\r\n                nativeType,\r\n                offset\r\n              )\r\n            );\r\n            module.addFunctionExport(setterName, setterName);\r\n            break;\r\n          }\r\n          case ElementKind.PROPERTY: {\r\n            let getter = (<Property>element).getterPrototype;\r\n            if (getter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                getter,\r\n                [], instance.contextualTypeArguments, null,\r\n                getter.declaration.name\r\n              );\r\n            }\r\n            let setter = (<Property>element).setterPrototype;\r\n            if (setter) {\r\n              this.compileFunctionUsingTypeArguments(\r\n                setter,\r\n                [], instance.contextualTypeArguments, null,\r\n                setter.declaration.name\r\n              );\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  compileInterfaceDeclaration(\r\n    declaration: InterfaceDeclaration,\r\n    typeArguments: TypeNode[],\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null\r\n  ): void {\r\n    // TODO\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      declaration.range\r\n    );\r\n  }\r\n\r\n  // memory\r\n\r\n  /** Adds a static memory segment with the specified data. */\r\n  addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n    var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n    var segment = MemorySegment.create(buffer, memoryOffset);\r\n    this.memorySegments.push(segment);\r\n    this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n    return segment;\r\n  }\r\n\r\n  // function table\r\n\r\n  /** Ensures that a table entry exists for the specified function and returns its index. */\r\n  ensureFunctionTableEntry(func: Function): i32 {\r\n    assert(func.is(CommonFlags.COMPILED));\r\n    if (func.functionTableIndex >= 0) {\r\n      return func.functionTableIndex;\r\n    }\r\n    var functionTable = this.functionTable;\r\n    var index = functionTable.length;\r\n    if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\r\n      // insert the trampoline if the function has optional parameters\r\n      func = this.ensureTrampoline(func);\r\n    }\r\n    functionTable.push(func);\r\n    func.functionTableIndex = index;\r\n    return index;\r\n  }\r\n\r\n  // statements\r\n\r\n  compileStatement(statement: Statement): ExpressionRef {\r\n    var module = this.module;\r\n    var stmt: ExpressionRef;\r\n    switch (statement.kind) {\r\n      case NodeKind.BLOCK: {\r\n        stmt = this.compileBlockStatement(<BlockStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.BREAK: {\r\n        stmt = this.compileBreakStatement(<BreakStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.CONTINUE: {\r\n        stmt = this.compileContinueStatement(<ContinueStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.DO: {\r\n        stmt = this.compileDoStatement(<DoStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.EMPTY: {\r\n        stmt = this.compileEmptyStatement(<EmptyStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.EXPRESSION: {\r\n        stmt = this.compileExpressionStatement(<ExpressionStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.FOR: {\r\n        stmt = this.compileForStatement(<ForStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.IF: {\r\n        stmt = this.compileIfStatement(<IfStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.RETURN: {\r\n        stmt = this.compileReturnStatement(<ReturnStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.SWITCH: {\r\n        stmt = this.compileSwitchStatement(<SwitchStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.THROW: {\r\n        stmt = this.compileThrowStatement(<ThrowStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.TRY: {\r\n        stmt = this.compileTryStatement(<TryStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.VARIABLE: {\r\n        stmt = this.compileVariableStatement(<VariableStatement>statement);\r\n        if (!stmt) stmt = module.createNop();\r\n        break;\r\n      }\r\n      case NodeKind.VOID: {\r\n        stmt = this.compileVoidStatement(<VoidStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.WHILE: {\r\n        stmt = this.compileWhileStatement(<WhileStatement>statement);\r\n        break;\r\n      }\r\n      case NodeKind.TYPEDECLARATION: {\r\n        // type declarations must be top-level because function bodies are evaluated when\r\n        // reachaable only.\r\n        if (this.currentFunction == this.startFunctionInstance) {\r\n          return module.createNop();\r\n        }\r\n        // otherwise fall-through\r\n      }\r\n      default: {\r\n        assert(false);\r\n        stmt = module.createUnreachable();\r\n      }\r\n    }\r\n    if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\r\n    return stmt;\r\n  }\r\n\r\n  compileStatements(statements: Statement[]): ExpressionRef[] {\r\n    var numStatements = statements.length;\r\n    var stmts = new Array<ExpressionRef>(numStatements);\r\n    stmts.length = 0;\r\n    var flow = this.currentFunction.flow;\r\n    for (let i = 0; i < numStatements; ++i) {\r\n      let stmt = this.compileStatement(statements[i]);\r\n      switch (getExpressionId(stmt)) {\r\n        case ExpressionId.Block: {\r\n          if (!getBlockName(stmt)) {\r\n            for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: stmts.push(stmt);\r\n        case ExpressionId.Nop:\r\n      }\r\n      if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\r\n    }\r\n    return stmts;\r\n  }\r\n\r\n  compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n    var statements = statement.statements;\r\n    var parentFlow = this.currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    this.currentFunction.flow = flow;\r\n\r\n    var stmts = this.compileStatements(statements);\r\n    var stmt = stmts.length == 0\r\n      ? this.module.createNop()\r\n      : stmts.length == 1\r\n        ? stmts[0]\r\n        : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\r\n\r\n    this.currentFunction.flow = flow.free();\r\n    parentFlow.inherit(flow);\r\n    return stmt;\r\n  }\r\n\r\n  compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n    var module = this.module;\r\n    if (statement.label) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        statement.label.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    var flow = this.currentFunction.flow;\r\n    var breakLabel = flow.breakLabel;\r\n    if (breakLabel == null) {\r\n      this.error(\r\n        DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n        statement.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    flow.set(FlowFlags.BREAKS);\r\n    return module.createBreak(breakLabel);\r\n  }\r\n\r\n  compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var label = statement.label;\r\n    if (label) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        label.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    // Check if 'continue' is allowed here\r\n    var flow = this.currentFunction.flow;\r\n    var continueLabel = flow.continueLabel;\r\n    if (continueLabel == null) {\r\n      this.error(\r\n        DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n        statement.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    flow.set(FlowFlags.CONTINUES);\r\n    return module.createBreak(continueLabel);\r\n  }\r\n\r\n  compileDoStatement(statement: DoStatement): ExpressionRef {\r\n    var currentFunction = this.currentFunction;\r\n    var module = this.module;\r\n\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n\r\n    var body = this.compileStatement(statement.statement);\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n    // TODO: check if condition is always false and if so, omit it (just a block)\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    parentFlow.inherit(flow);\r\n\r\n    return module.createBlock(breakLabel, [\r\n      module.createLoop(continueLabel,\r\n        terminated\r\n          ? body // skip trailing continue if unnecessary\r\n          : module.createBlock(null, [\r\n              body,\r\n              module.createBreak(continueLabel, condExpr)\r\n            ], NativeType.None)\r\n      )\r\n    ], terminated ? NativeType.Unreachable : NativeType.None);\r\n  }\r\n\r\n  compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n    return this.module.createNop();\r\n  }\r\n\r\n  compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n    var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\r\n    if (this.currentType != Type.void) {\r\n      expr = this.module.createDrop(expr);\r\n      this.currentType = Type.void;\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  compileForStatement(statement: ForStatement): ExpressionRef {\r\n    // A for statement initiates a new branch with its own scoped variables\r\n    // possibly declared in its initializer, and break context.\r\n    var currentFunction = this.currentFunction;\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = flow.breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n    var repeatLabel = \"repeat|\" + label;\r\n\r\n    // Compile in correct order\r\n    var module = this.module;\r\n    var initExpr = statement.initializer\r\n      ? this.compileStatement(<Statement>statement.initializer)\r\n      : 0;\r\n    var condExpr: ExpressionRef = 0;\r\n    var alwaysTrue = false;\r\n    if (statement.condition) {\r\n      condExpr = this.makeIsTrueish(\r\n        this.compileExpressionRetainType(<Expression>statement.condition, Type.bool, WrapMode.NONE),\r\n        this.currentType\r\n      );\r\n      // check if the condition is always true\r\n      let condPre = this.precomputeExpressionRef(condExpr);\r\n      if (getExpressionId(condPre) == ExpressionId.Const) {\r\n        assert(getExpressionType(condPre) == NativeType.I32);\r\n        if (getConstValueI32(condPre) != 0) alwaysTrue = true;\r\n        // TODO: could skip compilation if the condition is always false here, but beware that the\r\n        // initializer could still declare new 'var's that are used later on.\r\n      }\r\n      // recompile to original\r\n      condExpr = this.makeIsTrueish(\r\n        this.compileExpressionRetainType(<Expression>statement.condition, Type.bool, WrapMode.NONE),\r\n        this.currentType\r\n      );\r\n    } else {\r\n      // omitted condition is always true\r\n      condExpr = module.createI32(1);\r\n      alwaysTrue = true;\r\n    }\r\n    var incrExpr = statement.incrementor\r\n      ? this.compileExpression(<Expression>statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n      : 0;\r\n    var bodyExpr = this.compileStatement(statement.statement);\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    var usesContinue = flow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    var terminated = alwaysTrue && flow.isAny(FlowFlags.ANY_TERMINATING);\r\n    if (alwaysTrue) parentFlow.inherit(flow);\r\n    else parentFlow.inheritConditional(flow);\r\n\r\n    var breakBlock = new Array<ExpressionRef>(); // outer 'break' block\r\n    if (initExpr) breakBlock.push(initExpr);\r\n\r\n    var repeatBlock = new Array<ExpressionRef>(); // block repeating the loop\r\n    if (usesContinue) {\r\n      repeatBlock.push(\r\n        module.createBlock(continueLabel, [ // inner 'continue' block\r\n          module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\r\n          bodyExpr\r\n        ], NativeType.None)\r\n      );\r\n    } else { // can omit the 'continue' block\r\n      repeatBlock.push(\r\n        module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\r\n      );\r\n      repeatBlock.push(bodyExpr);\r\n    }\r\n    if (incrExpr) repeatBlock.push(incrExpr);\r\n    repeatBlock.push(\r\n      module.createBreak(repeatLabel)\r\n    );\r\n\r\n    breakBlock.push(\r\n      module.createLoop(repeatLabel,\r\n        module.createBlock(null, repeatBlock, NativeType.None)\r\n      )\r\n    );\r\n\r\n    return module.createBlock(\r\n      breakLabel,\r\n      breakBlock,\r\n      terminated\r\n        ? NativeType.Unreachable\r\n        : NativeType.None\r\n      );\r\n  }\r\n\r\n  compileIfStatement(statement: IfStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var ifTrue = statement.ifTrue;\r\n    var ifFalse = statement.ifFalse;\r\n\r\n    // The condition doesn't initiate a branch yet\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary branches if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        return getConstValueI32(condExprPrecomp)\r\n          ? this.compileStatement(ifTrue)\r\n          : ifFalse\r\n            ? this.compileStatement(ifFalse)\r\n            : module.createNop();\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    // Each arm initiates a branch\r\n    var parentFlow = currentFunction.flow;\r\n    var ifTrueFlow = parentFlow.fork();\r\n    currentFunction.flow = ifTrueFlow;\r\n    var ifTrueExpr = this.compileStatement(ifTrue);\r\n    currentFunction.flow = ifTrueFlow.free();\r\n\r\n    var ifFalseExpr: ExpressionRef = 0;\r\n    if (ifFalse) {\r\n      let ifFalseFlow = parentFlow.fork();\r\n      currentFunction.flow = ifFalseFlow;\r\n      ifFalseExpr = this.compileStatement(ifFalse);\r\n      currentFunction.flow = ifFalseFlow.free();\r\n      parentFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\r\n    } else {\r\n      parentFlow.inheritConditional(ifTrueFlow);\r\n    }\r\n    return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\r\n  }\r\n\r\n  compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var expr: ExpressionRef = 0;\r\n    var flow = currentFunction.flow;\r\n\r\n    // Remember that this flow returns\r\n    flow.set(FlowFlags.RETURNS);\r\n\r\n    if (statement.value) {\r\n      let returnType = flow.returnType;\r\n      if (returnType == Type.void) {\r\n        this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\r\n        this.error(\r\n          DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n          statement.value.range, this.currentType.toString(), returnType.toString()\r\n        );\r\n        this.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      expr = this.compileExpression(\r\n        statement.value,\r\n        returnType,\r\n        ConversionKind.IMPLICIT,\r\n        currentFunction.is(CommonFlags.MODULE_EXPORT)\r\n          ? WrapMode.WRAP\r\n          : WrapMode.NONE\r\n      );\r\n\r\n      // Remember whether returning a properly wrapped value\r\n      if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n    }\r\n\r\n    // If the last statement anyway, make it the block's return value\r\n    if (isLastStatement(statement)) return expr ? expr : module.createNop();\r\n\r\n    // When inlining, break to the end of the inlined function's block (no need to wrap)\r\n    return flow.is(FlowFlags.INLINE_CONTEXT)\r\n      ? module.createBreak(assert(flow.returnLabel), 0, expr)\r\n      : module.createReturn(expr);\r\n  }\r\n\r\n  compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    var cases = statement.cases;\r\n    var numCases = cases.length;\r\n    if (!numCases) {\r\n      return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    }\r\n\r\n    // Everything within a switch uses the same break context\r\n    var context = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n\r\n    // introduce a local for evaluating the condition (exactly once)\r\n    var tempLocal = currentFunction.getTempLocal(Type.u32, false);\r\n    var tempLocalIndex = tempLocal.index;\r\n\r\n    // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n    var breaks = new Array<ExpressionRef>(1 + numCases);\r\n    breaks[0] = module.createSetLocal( // initializer\r\n      tempLocalIndex,\r\n      this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n    );\r\n\r\n    // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n    var breakIndex = 1;\r\n    var defaultIndex = -1;\r\n    for (let i = 0; i < numCases; ++i) {\r\n      let case_ = cases[i];\r\n      let label = case_.label;\r\n      if (label) {\r\n        breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n          module.createBinary(BinaryOp.EqI32,\r\n            module.createGetLocal(tempLocalIndex, NativeType.I32),\r\n            this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n          )\r\n        );\r\n      } else {\r\n        defaultIndex = i;\r\n      }\r\n    }\r\n\r\n    currentFunction.freeTempLocal(tempLocal);\r\n\r\n    // otherwise br to default respectively out of the switch if there is no default case\r\n    breaks[breakIndex] = module.createBreak((defaultIndex >= 0\r\n        ? \"case\" + defaultIndex.toString(10)\r\n        : \"break\"\r\n      ) + \"|\" + context);\r\n\r\n    // nest blocks in order\r\n    var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n    var alwaysReturns = true;\r\n    var alwaysReturnsWrapped = true;\r\n    var alwaysThrows = true;\r\n    var alwaysAllocates = true;\r\n    for (let i = 0; i < numCases; ++i) {\r\n      let case_ = cases[i];\r\n      let statements = case_.statements;\r\n      let numStatements = statements.length;\r\n\r\n      // Each switch case initiates a new branch\r\n      let flow = parentFlow.fork();\r\n      currentFunction.flow = flow;\r\n      let breakLabel = \"break|\" + context;\r\n      flow.breakLabel = breakLabel;\r\n\r\n      let isLast = i == numCases - 1;\r\n      let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n      let stmts = new Array<ExpressionRef>(1 + numStatements);\r\n      stmts[0] = currentBlock;\r\n      let count = 1;\r\n      let terminated = false;\r\n      for (let j = 0; j < numStatements; ++j) {\r\n        let stmt = this.compileStatement(statements[j]);\r\n        if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n          stmts[count++] = stmt;\r\n          if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n            terminated = true;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      stmts.length = count;\r\n      if (terminated || isLast) {\r\n        if (!flow.is(FlowFlags.RETURNS)) alwaysReturns = false;\r\n        if (!flow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\r\n        if (!flow.is(FlowFlags.THROWS)) alwaysThrows = false;\r\n        if (!flow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\r\n      }\r\n\r\n      // Switch back to the parent flow\r\n      flow.unset(\r\n        FlowFlags.BREAKS |\r\n        FlowFlags.CONDITIONALLY_BREAKS\r\n      );\r\n      currentFunction.flow = flow.free();\r\n      currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\r\n    }\r\n    currentFunction.leaveBreakContext();\r\n\r\n    // If the switch has a default (guaranteed to handle any value), propagate common flags\r\n    if (defaultIndex >= 0) {\r\n      if (alwaysReturns) parentFlow.set(FlowFlags.RETURNS);\r\n      if (alwaysReturnsWrapped) parentFlow.set(FlowFlags.RETURNS_WRAPPED);\r\n      if (alwaysThrows) parentFlow.set(FlowFlags.THROWS);\r\n      if (alwaysAllocates) parentFlow.set(FlowFlags.ALLOCATES);\r\n    }\r\n    return currentBlock;\r\n  }\r\n\r\n  compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n    var flow = this.currentFunction.flow;\r\n\r\n    // Remember that this branch throws\r\n    flow.set(FlowFlags.THROWS);\r\n\r\n    // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n    flow.set(FlowFlags.RETURNS);\r\n\r\n    // TODO: requires exception-handling spec.\r\n    return compileBuiltinAbort(this, null, statement);\r\n  }\r\n\r\n  compileTryStatement(statement: TryStatement): ExpressionRef {\r\n    // TODO\r\n    // can't yet support something like: try { return ... } finally { ... }\r\n    // worthwhile to investigate lowering returns to block results (here)?\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      statement.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  /**\r\n   * Compiles a variable statement. Returns `0` if an initializer is not\r\n   * necessary.\r\n   */\r\n  compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n    var program = this.program;\r\n    var currentFunction = this.currentFunction;\r\n    var declarations = statement.declarations;\r\n    var numDeclarations = declarations.length;\r\n\r\n    // top-level variables and constants become globals\r\n    if (isKnownGlobal || (\r\n      currentFunction == this.startFunctionInstance &&\r\n      statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n    )) {\r\n      // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n      // though such variables could also become start function locals if, and only if, not used\r\n      // within any function declared in the same source, which is unknown at this point. the only\r\n      // efficient way to deal with this would be to keep track of all occasions it is used and\r\n      // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n      for (let i = 0; i < numDeclarations; ++i) {\r\n        this.compileGlobalDeclaration(declarations[i]);\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    // other variables become locals\r\n    var initializers = new Array<ExpressionRef>();\r\n    var flow = this.currentFunction.flow;\r\n    var resolver = this.resolver;\r\n    for (let i = 0; i < numDeclarations; ++i) {\r\n      let declaration = declarations[i];\r\n      let name = declaration.name.text;\r\n      let type: Type | null = null;\r\n      let initExpr: ExpressionRef = 0;\r\n      if (declaration.type) {\r\n        type = resolver.resolveType( // reports\r\n          declaration.type,\r\n          flow.contextualTypeArguments\r\n        );\r\n        if (!type) continue;\r\n        if (declaration.initializer) {\r\n          initExpr = this.compileExpression( // reports\r\n            declaration.initializer,\r\n            type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n        }\r\n      } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n        initExpr = this.compileExpressionRetainType( // reports\r\n          declaration.initializer,\r\n          Type.void,\r\n          WrapMode.NONE\r\n        );\r\n        if (this.currentType == Type.void) {\r\n          this.error(\r\n            DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n            declaration.range, this.currentType.toString(), \"<auto>\"\r\n          );\r\n          continue;\r\n        }\r\n        type = this.currentType;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          declaration.name.range.atEnd\r\n        );\r\n        continue;\r\n      }\r\n      let isInlined = false;\r\n      if (declaration.is(CommonFlags.CONST)) {\r\n        if (initExpr) {\r\n          initExpr = this.precomputeExpressionRef(initExpr);\r\n          if (getExpressionId(initExpr) == ExpressionId.Const) {\r\n            let local = new Local(program, name, -1, type);\r\n            switch (getExpressionType(initExpr)) {\r\n              case NativeType.I32: {\r\n                local = local.withConstantIntegerValue(\r\n                  i64_new(\r\n                    getConstValueI32(initExpr),\r\n                    0\r\n                  )\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.I64: {\r\n                local = local.withConstantIntegerValue(\r\n                  i64_new(\r\n                    getConstValueI64Low(initExpr),\r\n                    getConstValueI64High(initExpr)\r\n                  )\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.F32: {\r\n                local = local.withConstantFloatValue(<f64>getConstValueF32(initExpr));\r\n                break;\r\n              }\r\n              case NativeType.F64: {\r\n                local = local.withConstantFloatValue(getConstValueF64(initExpr));\r\n                break;\r\n              }\r\n              default: {\r\n                assert(false);\r\n                return this.module.createUnreachable();\r\n              }\r\n            }\r\n            // Create a virtual local that doesn't actually exist in WebAssembly\r\n            let scopedLocals = currentFunction.flow.scopedLocals;\r\n            if (!scopedLocals) currentFunction.flow.scopedLocals = scopedLocals = new Map();\r\n            else if (scopedLocals.has(name)) {\r\n              this.error(\r\n                DiagnosticCode.Duplicate_identifier_0,\r\n                declaration.name.range, name\r\n              );\r\n              return this.module.createUnreachable();\r\n            }\r\n            scopedLocals.set(name, local);\r\n            isInlined = true;\r\n          } else {\r\n            this.warning(\r\n              DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n              declaration.range\r\n            );\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._const_declarations_must_be_initialized,\r\n            declaration.range\r\n          );\r\n        }\r\n      }\r\n      if (!isInlined) {\r\n        let local: Local;\r\n        if (\r\n          declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\r\n          flow.is(FlowFlags.INLINE_CONTEXT)\r\n        ) { // here: not top-level\r\n          local = flow.addScopedLocal(type, name, false, declaration); // reports\r\n        } else {\r\n          local = currentFunction.addLocal(type, name, declaration); // reports\r\n        }\r\n        if (initExpr) {\r\n          initializers.push(this.compileAssignmentWithValue(declaration.name, initExpr));\r\n          if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n            flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\r\n          }\r\n        } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n          flow.setLocalWrapped(local.index, true); // zero\r\n        }\r\n      }\r\n    }\r\n    return initializers.length   // we can unwrap these here because the\r\n      ? initializers.length == 1 // source didn't tell us exactly what to do\r\n        ? initializers[0]\r\n        : this.module.createBlock(null, initializers, NativeType.None)\r\n      : 0;\r\n  }\r\n\r\n  compileVoidStatement(statement: VoidStatement): ExpressionRef {\r\n    return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n  }\r\n\r\n  compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n    var module = this.module;\r\n\r\n    // The condition does not yet initialize a branch\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary loops if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        if (!getConstValueI32(condExprPrecomp)) return module.createNop();\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    // Statements initiate a new branch with its own break context\r\n    var currentFunction = this.currentFunction;\r\n    var label = currentFunction.enterBreakContext();\r\n    var parentFlow = currentFunction.flow;\r\n    var flow = parentFlow.fork();\r\n    currentFunction.flow = flow;\r\n    var breakLabel = \"break|\" + label;\r\n    flow.breakLabel = breakLabel;\r\n    var continueLabel = \"continue|\" + label;\r\n    flow.continueLabel = continueLabel;\r\n\r\n    var body = this.compileStatement(statement.statement);\r\n    var alwaysTrue = false; // TODO\r\n    var alwaysReturns = alwaysTrue && flow.is(FlowFlags.RETURNS);\r\n    var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n\r\n    // Switch back to the parent flow\r\n    currentFunction.flow = flow.free();\r\n    currentFunction.leaveBreakContext();\r\n    flow.unset(\r\n      FlowFlags.BREAKS |\r\n      FlowFlags.CONDITIONALLY_BREAKS |\r\n      FlowFlags.CONTINUES |\r\n      FlowFlags.CONDITIONALLY_CONTINUES\r\n    );\r\n    if (alwaysTrue) parentFlow.inherit(flow);\r\n    else parentFlow.inheritConditional(flow);\r\n\r\n    var expr = module.createBlock(breakLabel, [\r\n      module.createLoop(continueLabel,\r\n        module.createIf(condExpr,\r\n          terminated\r\n            ? body // skip trailing continue if unnecessary\r\n            : module.createBlock(null, [\r\n                body,\r\n                module.createBreak(continueLabel)\r\n              ], NativeType.None)\r\n        )\r\n      )\r\n    ], alwaysReturns ? NativeType.Unreachable : NativeType.None);\r\n    return expr;\r\n  }\r\n\r\n  // expressions\r\n\r\n  /**\r\n   * Compiles the value of an inlined constant element.\r\n   * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\r\n   *  is precomputed according to context.\r\n   */\r\n  compileInlineConstant(\r\n    element: VariableLikeElement,\r\n    contextualType: Type,\r\n    retainType: bool\r\n  ): ExpressionRef {\r\n    assert(element.is(CommonFlags.INLINED));\r\n    var type = element.type;\r\n    switch (\r\n      !retainType &&\r\n      type.is(TypeFlags.INTEGER) &&\r\n      contextualType.is(TypeFlags.INTEGER) &&\r\n      type.size < contextualType.size\r\n        ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n        : (this.currentType = type).kind\r\n    ) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16: {\r\n        let shift = type.computeSmallIntegerShift(Type.i32);\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue) << shift >> shift\r\n            : 0\r\n        ); // recognized by canOverflow\r\n      }\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        let mask = element.type.computeSmallIntegerMask(Type.i32);\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue) & mask\r\n            : 0\r\n        ); // recognized by canOverflow\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return this.module.createI32(\r\n          element.constantValueKind == ConstantValueKind.INTEGER\r\n            ? i64_low(element.constantIntegerValue)\r\n            : 0\r\n        );\r\n      }\r\n      case TypeKind.ISIZE:\r\n      case TypeKind.USIZE: {\r\n        if (!element.program.options.isWasm64) {\r\n          return this.module.createI32(\r\n            element.constantValueKind == ConstantValueKind.INTEGER\r\n              ? i64_low(element.constantIntegerValue)\r\n              : 0\r\n          );\r\n        }\r\n        // fall-through\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return element.constantValueKind == ConstantValueKind.INTEGER\r\n          ? this.module.createI64(\r\n              i64_low(element.constantIntegerValue),\r\n              i64_high(element.constantIntegerValue)\r\n            )\r\n          : this.module.createI64(0);\r\n      }\r\n      case TypeKind.F64: {\r\n        if (!(element.is(CommonFlags.BUILTIN) && contextualType == Type.f32)) {\r\n          return this.module.createF64((<VariableLikeElement>element).constantFloatValue);\r\n        }\r\n        // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\r\n        this.currentType = Type.f32;\r\n      }\r\n      case TypeKind.F32: {\r\n        return this.module.createF32((<VariableLikeElement>element).constantFloatValue);\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return this.module.createUnreachable();\r\n      }\r\n    }\r\n  }\r\n\r\n  compileExpression(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    this.currentType = contextualType;\r\n\r\n    var expr: ExpressionRef;\r\n    switch (expression.kind) {\r\n      case NodeKind.ASSERTION: {\r\n        expr = this.compileAssertionExpression(<AssertionExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.BINARY: {\r\n        expr = this.compileBinaryExpression(<BinaryExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.CALL: {\r\n        expr = this.compileCallExpression(<CallExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.COMMA: {\r\n        expr = this.compileCommaExpression(<CommaExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.ELEMENTACCESS: {\r\n        expr = this.compileElementAccessExpression(<ElementAccessExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.FUNCTION: {\r\n        expr = this.compileFunctionExpression(<FunctionExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.IDENTIFIER:\r\n      case NodeKind.FALSE:\r\n      case NodeKind.NULL:\r\n      case NodeKind.THIS:\r\n      case NodeKind.SUPER:\r\n      case NodeKind.TRUE: {\r\n        expr = this.compileIdentifierExpression(\r\n          <IdentifierExpression>expression,\r\n          contextualType,\r\n          conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n        );\r\n        break;\r\n      }\r\n      case NodeKind.INSTANCEOF: {\r\n        expr = this.compileInstanceOfExpression(<InstanceOfExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.LITERAL: {\r\n        expr = this.compileLiteralExpression(<LiteralExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.NEW: {\r\n        expr = this.compileNewExpression(<NewExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.PARENTHESIZED: {\r\n        expr = this.compileParenthesizedExpression(<ParenthesizedExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.PROPERTYACCESS: {\r\n        expr = this.compilePropertyAccessExpression(\r\n          <PropertyAccessExpression>expression,\r\n          contextualType,\r\n          conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n        );\r\n        break;\r\n      }\r\n      case NodeKind.TERNARY: {\r\n        expr = this.compileTernaryExpression(<TernaryExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.UNARYPOSTFIX: {\r\n        expr = this.compileUnaryPostfixExpression(<UnaryPostfixExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      case NodeKind.UNARYPREFIX: {\r\n        expr = this.compileUnaryPrefixExpression(<UnaryPrefixExpression>expression, contextualType);\r\n        break;\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        expr = this.module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    var currentType = this.currentType;\r\n    if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\r\n      expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\r\n      this.currentType = contextualType;\r\n    } else if (wrapMode == WrapMode.WRAP) {\r\n      expr = this.ensureSmallIntegerWrap(expr, currentType);\r\n    }\r\n\r\n    if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n    return expr;\r\n  }\r\n\r\n  compileExpressionRetainType(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    return this.compileExpression(\r\n      expression,\r\n      contextualType == Type.void\r\n        ? Type.i32\r\n        : contextualType,\r\n      ConversionKind.NONE,\r\n      wrapMode\r\n    );\r\n  }\r\n\r\n  precomputeExpression(\r\n    expression: Expression,\r\n    contextualType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode\r\n  ): ExpressionRef {\r\n    return this.precomputeExpressionRef(\r\n      this.compileExpression(expression, contextualType, conversionKind, wrapMode)\r\n    );\r\n  }\r\n\r\n  precomputeExpressionRef(expr: ExpressionRef): ExpressionRef {\r\n    var module = this.module;\r\n    var type = this.currentType;\r\n    var nativeType = type.toNativeType();\r\n    var funcRef = module.addTemporaryFunction(nativeType, null, expr);\r\n    module.runPasses([ \"precompute\" ], funcRef);\r\n    var ret = getFunctionBody(funcRef);\r\n    module.removeTemporaryFunction();\r\n    return ret;\r\n  }\r\n\r\n  convertExpression(\r\n    expr: ExpressionRef,\r\n    fromType: Type,\r\n    toType: Type,\r\n    conversionKind: ConversionKind,\r\n    wrapMode: WrapMode,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    assert(conversionKind != ConversionKind.NONE);\r\n    var module = this.module;\r\n\r\n    // void to any\r\n    if (fromType.kind == TypeKind.VOID) {\r\n      assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\r\n      this.error(\r\n        DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n        reportNode.range, fromType.toString(), toType.toString()\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n\r\n    // any to void\r\n    if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\r\n\r\n    if (!fromType.isAssignableTo(toType)) {\r\n      if (conversionKind == ConversionKind.IMPLICIT) {\r\n        this.error(\r\n          DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\r\n          reportNode.range, fromType.toString(), toType.toString()\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n      // float to float\r\n      if (toType.is(TypeFlags.FLOAT)) {\r\n        if (fromType.kind == TypeKind.F32) {\r\n\r\n          // f32 to f64\r\n          if (toType.kind == TypeKind.F64) {\r\n            expr = module.createUnary(UnaryOp.PromoteF32, expr);\r\n          }\r\n\r\n          // otherwise f32 to f32\r\n\r\n        // f64 to f32\r\n        } else if (toType.kind == TypeKind.F32) {\r\n          expr = module.createUnary(UnaryOp.DemoteF64, expr);\r\n        }\r\n\r\n        // otherwise f64 to f64\r\n\r\n      // float to int\r\n      } else if (toType.is(TypeFlags.INTEGER)) {\r\n\r\n        // f32 to int\r\n        if (fromType.kind == TypeKind.F32) {\r\n          if (toType.is(TypeFlags.SIGNED)) {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n            }\r\n          } else {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n            }\r\n          }\r\n\r\n        // f64 to int\r\n        } else {\r\n          if (toType.is(TypeFlags.SIGNED)) {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n            }\r\n          } else {\r\n            if (toType.is(TypeFlags.LONG)) {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n            } else {\r\n              expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n            }\r\n          }\r\n        }\r\n\r\n      // float to void\r\n      } else {\r\n        assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n        expr = module.createDrop(expr);\r\n      }\r\n\r\n    // int to float\r\n    } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n      // int to f32\r\n      if (toType.kind == TypeKind.F32) {\r\n        if (fromType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI64ToF32\r\n              : UnaryOp.ConvertU64ToF32,\r\n            expr\r\n          );\r\n        } else {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI32ToF32\r\n              : UnaryOp.ConvertU32ToF32,\r\n            expr\r\n          );\r\n        }\r\n\r\n      // int to f64\r\n      } else {\r\n        if (fromType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI64ToF64\r\n              : UnaryOp.ConvertU64ToF64,\r\n            expr\r\n          );\r\n        } else {\r\n          expr = module.createUnary(\r\n            fromType.is(TypeFlags.SIGNED)\r\n              ? UnaryOp.ConvertI32ToF64\r\n              : UnaryOp.ConvertU32ToF64,\r\n            expr\r\n          );\r\n        }\r\n      }\r\n\r\n    // int to int\r\n    } else {\r\n      // i64 to ...\r\n      if (fromType.is(TypeFlags.LONG)) {\r\n\r\n        // i64 to i32 or smaller\r\n        if (!toType.is(TypeFlags.LONG)) {\r\n          expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n        }\r\n\r\n      // i32 or smaller to i64\r\n      } else if (toType.is(TypeFlags.LONG)) {\r\n        expr = module.createUnary(\r\n          toType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\r\n          this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\r\n        );\r\n        wrapMode = WrapMode.NONE;\r\n\r\n      // i32 to i32\r\n      } else {\r\n        // small i32 to ...\r\n        if (fromType.is(TypeFlags.SHORT)) {\r\n          // small i32 to larger i32\r\n          if (fromType.size < toType.size) {\r\n            expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\r\n            wrapMode = WrapMode.NONE;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    this.currentType = toType;\r\n    return wrapMode == WrapMode.WRAP\r\n      ? this.ensureSmallIntegerWrap(expr, toType)\r\n      : expr;\r\n  }\r\n\r\n  compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n    var toType = this.resolver.resolveType( // reports\r\n      expression.toType,\r\n      this.currentFunction.flow.contextualTypeArguments\r\n    );\r\n    if (!toType) return this.module.createUnreachable();\r\n    return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n  }\r\n\r\n  private f32ModInstance: Function | null = null;\r\n  private f64ModInstance: Function | null = null;\r\n  private f32PowInstance: Function | null = null;\r\n  private f64PowInstance: Function | null = null;\r\n\r\n  compileBinaryExpression(\r\n    expression: BinaryExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var left = expression.left;\r\n    var right = expression.right;\r\n\r\n    var leftExpr: ExpressionRef;\r\n    var leftType: Type;\r\n    var rightExpr: ExpressionRef;\r\n    var rightType: Type;\r\n    var commonType: Type | null;\r\n\r\n    var expr: ExpressionRef;\r\n    var compound = false;\r\n\r\n    var operator = expression.operator;\r\n    switch (operator) {\r\n      case Token.LESSTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.LT);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \"<\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LtI64\r\n                : BinaryOp.LtI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LtU64\r\n                : BinaryOp.LtU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.GT);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \">\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GtU64\r\n                : BinaryOp.GtU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.LESSTHAN_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.LE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \"<=\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LeI64\r\n                : BinaryOp.LeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.LeU64\r\n                : BinaryOp.LeU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.GE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, \">=\", leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GeI64\r\n                : BinaryOp.GeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.GeU64\r\n                : BinaryOp.GeU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n\r\n      case Token.EQUALS_EQUALS_EQUALS:\r\n      case Token.EQUALS_EQUALS: {\r\n\r\n        // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n        // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n        // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n         // check operator overload\r\n        if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.EQ);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          // still allow '==' with references\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.EqI64\r\n                : BinaryOp.EqI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.EXCLAMATION_EQUALS_EQUALS:\r\n      case Token.EXCLAMATION_EQUALS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n         // check operator overload\r\n        if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.NE);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          // still allow '!=' with references\r\n        }\r\n\r\n        rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            leftType,\r\n            leftType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            left\r\n          );\r\n          rightExpr = this.convertExpression(\r\n            rightExpr,\r\n            rightType,\r\n            rightType = commonType,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP,\r\n            right\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n            expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n          );\r\n          this.currentType = contextualType;\r\n          return module.createUnreachable();\r\n        }\r\n        switch (commonType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.NeI64\r\n                : BinaryOp.NeI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.EQUALS: {\r\n        return this.compileAssignment(left, right, contextualType);\r\n      }\r\n      case Token.PLUS_EQUALS: compound = true;\r\n      case Token.PLUS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.ADD);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"+\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:   // addition might overflow\r\n          case TypeKind.I16:  // ^\r\n          case TypeKind.U8:   // ^\r\n          case TypeKind.U16:  // ^\r\n          case TypeKind.BOOL: // ^\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AddI64\r\n                : BinaryOp.AddI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_EQUALS: compound = true;\r\n      case Token.MINUS: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.SUB);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"-\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:   // subtraction might overflow\r\n          case TypeKind.I16:  // ^\r\n          case TypeKind.U8:   // ^\r\n          case TypeKind.U16:  // ^\r\n          case TypeKind.BOOL: // ^\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.ASTERISK_EQUALS: compound = true;\r\n      case Token.ASTERISK: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.MUL);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"*\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.MulI64\r\n                : BinaryOp.MulI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\r\n      case Token.ASTERISK_ASTERISK: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.POW);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        let instance: Function | null;\r\n\r\n        // Mathf.pow if lhs is f32 (result is f32)\r\n        if (this.currentType.kind == TypeKind.F32) {\r\n          rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (!(instance = this.f32PowInstance)) {\r\n            let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n            if (!namespace) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Mathf\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n            if (!prototype) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Mathf.pow\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n            this.f32PowInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);\r\n          }\r\n\r\n        // Math.pow otherwise (result is f64)\r\n        // TODO: should the result be converted back?\r\n        } else {\r\n          leftExpr = this.convertExpression(\r\n            leftExpr,\r\n            this.currentType,\r\n            Type.f64,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE,\r\n            left\r\n          );\r\n          leftType = this.currentType;\r\n          rightExpr = this.compileExpression(\r\n            right,\r\n            Type.f64,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          rightType = this.currentType;\r\n          if (!(instance = this.f64PowInstance)) {\r\n            let namespace = this.program.elementsLookup.get(\"Math\");\r\n            if (!namespace) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Math\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n            if (!prototype) {\r\n              this.error(\r\n                DiagnosticCode.Cannot_find_name_0,\r\n                expression.range, \"Math.pow\"\r\n              );\r\n              expr = module.createUnreachable();\r\n              break;\r\n            }\r\n            assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n            this.f64PowInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);\r\n          }\r\n        }\r\n        if (!(instance && this.compileFunction(instance))) {\r\n          expr = module.createUnreachable();\r\n        } else {\r\n          expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n        }\r\n        break;\r\n      }\r\n      case Token.SLASH_EQUALS: compound = true;\r\n      case Token.SLASH: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.DIV);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"/\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:  // signed div on signed small integers might overflow, e.g. -128/-1\r\n          case TypeKind.I16: // ^\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.DivI64\r\n                : BinaryOp.DivI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.DivU64\r\n                : BinaryOp.DivU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.PERCENT_EQUALS: compound = true;\r\n      case Token.PERCENT: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.REM);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.WRAP, // !\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"%\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16: {\r\n            expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.RemI64\r\n                : BinaryOp.RemI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.RemU64\r\n                : BinaryOp.RemU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            let instance = this.f32ModInstance;\r\n            if (!instance) {\r\n              let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n              if (!namespace) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Mathf\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n              if (!prototype) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Mathf.mod\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n              this.f32ModInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);\r\n            }\r\n            if (!(instance && this.compileFunction(instance))) {\r\n              expr = module.createUnreachable();\r\n            } else {\r\n              expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n            }\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            let instance = this.f64ModInstance;\r\n            if (!instance) {\r\n              let namespace = this.program.elementsLookup.get(\"Math\");\r\n              if (!namespace) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Math\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n              if (!prototype) {\r\n                this.error(\r\n                  DiagnosticCode.Cannot_find_name_0,\r\n                  expression.range, \"Math.mod\"\r\n                );\r\n                expr = module.createUnreachable();\r\n                break;\r\n              }\r\n              assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n              this.f64ModInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);\r\n            }\r\n            if (!(instance && this.compileFunction(instance))) {\r\n              expr = module.createUnreachable();\r\n            } else {\r\n              expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n            }\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\r\n      case Token.LESSTHAN_LESSTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShlI64\r\n                : BinaryOp.ShlI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n      case Token.GREATERTHAN_GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16: {\r\n            expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64: {\r\n            expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrI64\r\n                : BinaryOp.ShrI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrU64\r\n                : BinaryOp.ShrU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n      case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n          }\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.ShrU64\r\n                : BinaryOp.ShrU32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.AMPERSAND_EQUALS: compound = true;\r\n      case Token.AMPERSAND: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overloadd\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"&\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AndI64\r\n                : BinaryOp.AndI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.BAR_EQUALS: compound = true;\r\n      case Token.BAR: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"|\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.OrI64\r\n                : BinaryOp.OrI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.CARET_EQUALS: compound = true;\r\n      case Token.CARET: {\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = leftType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\r\n            if (overload) {\r\n              expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        if (compound) {\r\n          rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n        } else {\r\n          rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n          rightType = this.currentType;\r\n          if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n            leftExpr = this.convertExpression(\r\n              leftExpr,\r\n              leftType,\r\n              leftType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              left\r\n            );\r\n            rightExpr = this.convertExpression(\r\n              rightExpr,\r\n              rightType,\r\n              rightType = commonType,\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE,\r\n              right\r\n            );\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n              expression.range, \"^\", leftType.toString(), rightType.toString()\r\n            );\r\n            this.currentType = contextualType;\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32: {\r\n            expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.XorI64\r\n                : BinaryOp.XorI32,\r\n              leftExpr,\r\n              rightExpr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32:\r\n          case TypeKind.F64: {\r\n            this.error(\r\n              DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n              expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n\r\n      // logical (no overloading)\r\n\r\n      case Token.AMPERSAND_AMPERSAND: { // left && right\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n\r\n        // simplify if cloning left without side effects is possible\r\n        if (expr = module.cloneExpression(leftExpr, true, 0)) {\r\n          this.makeIsTrueish(leftExpr, this.currentType);\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(leftExpr, this.currentType),\r\n            rightExpr,\r\n            expr\r\n          );\r\n\r\n        // if not possible, tee left to a temp. local\r\n        } else {\r\n          let flow = this.currentFunction.flow;\r\n          let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n            this.currentType,\r\n            !flow.canOverflow(leftExpr, this.currentType)\r\n          );\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(\r\n              module.createTeeLocal(tempLocal.index, leftExpr),\r\n              this.currentType\r\n            ),\r\n            rightExpr,\r\n            module.createGetLocal(\r\n              assert(tempLocal).index, // to be sure\r\n              this.currentType.toNativeType()\r\n            )\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case Token.BAR_BAR: { // left || right\r\n        leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n        leftType = this.currentType;\r\n        rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n        rightType = this.currentType;\r\n\r\n        // simplify if cloning left without side effects is possible\r\n        if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\r\n          expr = this.module.createIf(\r\n            this.makeIsTrueish(leftExpr, this.currentType),\r\n            expr,\r\n            rightExpr\r\n          );\r\n\r\n        // if not possible, tee left to a temp. local\r\n        } else {\r\n          let flow = this.currentFunction.flow;\r\n          let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n            this.currentType,\r\n            !flow.canOverflow(leftExpr, this.currentType)\r\n          );\r\n          expr = module.createIf(\r\n            this.makeIsTrueish(\r\n              module.createTeeLocal(tempLocal.index, leftExpr),\r\n              this.currentType\r\n            ),\r\n            module.createGetLocal(\r\n              assert(tempLocal).index, // to be sure\r\n              this.currentType.toNativeType()\r\n            ),\r\n            rightExpr\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n        assert(false);\r\n        expr = this.module.createUnreachable();\r\n      }\r\n    }\r\n    return compound\r\n      ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\r\n      : expr;\r\n  }\r\n\r\n  compileUnaryOverload(\r\n    operatorInstance: Function,\r\n    value: Expression,\r\n    valueExpr: ExpressionRef,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    var argumentExpressions: Expression[];\r\n    var thisArg: ExpressionRef = 0;\r\n    if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n      thisArg = valueExpr;  // can reuse the previously evaluated expr as the this value here\r\n      argumentExpressions = [];\r\n    } else {\r\n      argumentExpressions = [ value ]; // annotated type might differ -> recompile\r\n    }\r\n    return this.compileCallDirect(\r\n      operatorInstance,\r\n      argumentExpressions,\r\n      reportNode,\r\n      thisArg,\r\n      operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n    );\r\n  }\r\n\r\n  compileBinaryOverload(\r\n    operatorInstance: Function,\r\n    left: Expression,\r\n    leftExpr: ExpressionRef,\r\n    right: Expression,\r\n    reportNode: Node\r\n  ): ExpressionRef {\r\n    var argumentExpressions: Expression[];\r\n    var thisArg: ExpressionRef = 0;\r\n    if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n      let parent = assert(operatorInstance.parent);\r\n      assert(parent.kind == ElementKind.CLASS);\r\n      thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\r\n      argumentExpressions = [ right ];\r\n    } else {\r\n      argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\r\n    }\r\n    var ret = this.compileCallDirect(\r\n      operatorInstance,\r\n      argumentExpressions,\r\n      reportNode,\r\n      thisArg,\r\n      operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n    );\r\n    return ret;\r\n  }\r\n\r\n  compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n    var program = this.program;\r\n    var resolver = program.resolver;\r\n    var currentFunction = this.currentFunction;\r\n    var target = resolver.resolveExpression(expression, currentFunction); // reports\r\n    if (!target) return this.module.createUnreachable();\r\n\r\n    // to compile just the value, we need to know the target's type\r\n    var targetType: Type;\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field compiled as a global\r\n          return this.module.createUnreachable();\r\n        }\r\n        assert((<Global>target).type != Type.void); // compileGlobal must guarantee this\r\n        // fall-through\r\n      }\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        targetType = (<VariableLikeElement>target).type;\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let setterPrototype = (<Property>target).setterPrototype;\r\n        if (setterPrototype) {\r\n          let instance = this.resolver.resolveFunction(setterPrototype, null);\r\n          if (!instance) return this.module.createUnreachable();\r\n          assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n          targetType = instance.signature.parameterTypes[0];\r\n          break;\r\n        }\r\n        this.error(\r\n          DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n          expression.range, (<Property>target).internalName\r\n        );\r\n        return this.module.createUnreachable();\r\n      }\r\n      case ElementKind.CLASS: {\r\n        if (resolver.resolvedElementExpression) { // indexed access\r\n          let isUnchecked = currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n          let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n          if (!indexedSet) {\r\n            let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n            if (!indexedGet) {\r\n              this.error(\r\n                DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n                expression.range, (<Class>target).internalName\r\n              );\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n                expression.range, (<Class>target).internalName\r\n              );\r\n            }\r\n            return this.module.createUnreachable();\r\n          }\r\n          assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\r\n          targetType = indexedSet.signature.parameterTypes[1];    // 2nd parameter is the element\r\n          break;\r\n        }\r\n        // fall-through\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return this.module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // compile the value and do the assignment\r\n    assert(targetType != Type.void);\r\n    var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    return this.compileAssignmentWithValue(\r\n      expression,\r\n      valueExpr,\r\n      contextualType != Type.void\r\n    );\r\n  }\r\n\r\n  compileAssignmentWithValue(\r\n    expression: Expression,\r\n    valueWithCorrectType: ExpressionRef,\r\n    tee: bool = false\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var target = this.resolver.resolveExpression(expression, this.currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.LOCAL: {\r\n        let type = (<Local>target).type;\r\n        assert(type != Type.void);\r\n        this.currentType = tee ? type : Type.void;\r\n        if ((<Local>target).is(CommonFlags.CONST)) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, target.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let flow = this.currentFunction.flow;\r\n        if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n          flow.setLocalWrapped((<Local>target).index, !flow.canOverflow(valueWithCorrectType, type));\r\n        }\r\n        return tee\r\n          ? module.createTeeLocal((<Local>target).index, valueWithCorrectType)\r\n          : module.createSetLocal((<Local>target).index, valueWithCorrectType);\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) return module.createUnreachable();\r\n        let type = (<Global>target).type;\r\n        assert(type != Type.void);\r\n        this.currentType = tee ? type : Type.void;\r\n        if ((<Local>target).is(CommonFlags.CONST)) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range,\r\n            target.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\r\n        if (tee) {\r\n          let nativeType = type.toNativeType();\r\n          let internalName = target.internalName;\r\n          return module.createBlock(null, [ // emulated teeGlobal\r\n            module.createSetGlobal(internalName, valueWithCorrectType),\r\n            module.createGetGlobal(internalName, nativeType)\r\n          ], nativeType);\r\n        } else {\r\n          return module.createSetGlobal(target.internalName, valueWithCorrectType);\r\n        }\r\n      }\r\n      case ElementKind.FIELD: {\r\n        const declaration = (<Field>target).declaration;\r\n        if (\r\n          (<Field>target).is(CommonFlags.READONLY) &&\r\n          !(\r\n            this.currentFunction.is(CommonFlags.CONSTRUCTOR) ||\r\n            declaration == null ||\r\n            declaration.initializer != null\r\n          )\r\n        ) {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, (<Field>target).internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n        let thisExpr = this.compileExpressionRetainType(\r\n          thisExpression,\r\n          this.options.usizeType,\r\n          WrapMode.NONE\r\n        );\r\n        let type = (<Field>target).type;\r\n        this.currentType = tee ? type : Type.void;\r\n        let nativeType = type.toNativeType();\r\n        if (type.kind == TypeKind.BOOL) {\r\n          // make sure bools are wrapped (usually are) when storing as 8 bits\r\n          valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\r\n        }\r\n        if (tee) {\r\n          let currentFunction = this.currentFunction;\r\n          let flow = currentFunction.flow;\r\n          let tempLocal = currentFunction.getAndFreeTempLocal(\r\n            type,\r\n            !flow.canOverflow(valueWithCorrectType, type)\r\n          );\r\n          let tempLocalIndex = tempLocal.index;\r\n          // TODO: simplify if valueWithCorrectType has no side effects\r\n          return module.createBlock(null, [\r\n            module.createSetLocal(tempLocalIndex, valueWithCorrectType),\r\n            module.createStore(\r\n              type.byteSize,\r\n              thisExpr,\r\n              module.createGetLocal(tempLocalIndex, nativeType),\r\n              nativeType,\r\n              (<Field>target).memoryOffset\r\n            ),\r\n            module.createGetLocal(tempLocalIndex, nativeType)\r\n          ], nativeType);\r\n        } else {\r\n          return module.createStore(\r\n            type.byteSize,\r\n            thisExpr,\r\n            valueWithCorrectType,\r\n            nativeType,\r\n            (<Field>target).memoryOffset\r\n          );\r\n        }\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let setterPrototype = (<Property>target).setterPrototype;\r\n        if (setterPrototype) {\r\n          let setterInstance = this.resolver.resolveFunction(setterPrototype, null);\r\n          if (!setterInstance) return module.createUnreachable();\r\n\r\n          // call just the setter if the return value isn't of interest\r\n          if (!tee) {\r\n            if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n              let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n              let thisExpr = this.compileExpressionRetainType(\r\n                thisExpression,\r\n                this.options.usizeType,\r\n                WrapMode.NONE\r\n              );\r\n              return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\r\n            } else {\r\n              return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\r\n            }\r\n          }\r\n\r\n          // otherwise call the setter first, then the getter\r\n          let getterPrototype = (<Property>target).getterPrototype;\r\n          assert(getterPrototype != null); // must have one if there is a setter\r\n          let getterInstance = this.resolver.resolveFunction(<FunctionPrototype>getterPrototype, null);\r\n          if (!getterInstance) return module.createUnreachable();\r\n          let returnType = getterInstance.signature.returnType;\r\n          let nativeReturnType = returnType.toNativeType();\r\n          if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n            let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n            let thisExpr = this.compileExpressionRetainType(\r\n              thisExpression,\r\n              this.options.usizeType,\r\n              WrapMode.NONE\r\n            );\r\n            let tempLocal = this.currentFunction.getAndFreeTempLocal(returnType, false);\r\n            let tempLocalIndex = tempLocal.index;\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(setterInstance, [ // set and remember the target\r\n                module.createTeeLocal(tempLocalIndex, thisExpr),\r\n                valueWithCorrectType\r\n              ]),\r\n              this.makeCallDirect(getterInstance, [ // get from remembered target\r\n                module.createGetLocal(tempLocalIndex, nativeReturnType)\r\n              ])\r\n            ], nativeReturnType);\r\n          } else {\r\n            // note that this must be performed here because `resolved` is shared\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\r\n              this.makeCallDirect(getterInstance)\r\n            ], nativeReturnType);\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n            expression.range, target.internalName\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      case ElementKind.CLASS: {\r\n        let elementExpression = this.resolver.resolvedElementExpression;\r\n        if (elementExpression) {\r\n          let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n          if (!indexedGet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n              expression.range, target.internalName\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n          if (!indexedSet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n              expression.range, target.internalName\r\n            );\r\n            this.currentType = tee ? indexedGet.signature.returnType : Type.void;\r\n            return module.createUnreachable();\r\n          }\r\n          let targetType = (<Class>target).type;\r\n          let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n          let thisExpr = this.compileExpressionRetainType(\r\n            thisExpression,\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n          let elementExpr = this.compileExpression(\r\n            elementExpression,\r\n            Type.i32,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          if (tee) {\r\n            let currentFunction = this.currentFunction;\r\n            let tempLocalTarget = currentFunction.getTempLocal(targetType, false);\r\n            let tempLocalElement = currentFunction.getAndFreeTempLocal(this.currentType, false);\r\n            let returnType = indexedGet.signature.returnType;\r\n            this.currentFunction.freeTempLocal(tempLocalTarget);\r\n            return module.createBlock(null, [\r\n              this.makeCallDirect(indexedSet, [\r\n                module.createTeeLocal(tempLocalTarget.index, thisExpr),\r\n                module.createTeeLocal(tempLocalElement.index, elementExpr),\r\n                valueWithCorrectType\r\n              ]),\r\n              this.makeCallDirect(indexedGet, [\r\n                module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\r\n                module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\r\n              ])\r\n            ], returnType.toNativeType());\r\n          } else {\r\n            return this.makeCallDirect(indexedSet, [\r\n              thisExpr,\r\n              elementExpr,\r\n              valueWithCorrectType\r\n            ]);\r\n          }\r\n        }\r\n        // fall-through\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var target = this.resolver.resolveExpression(expression.expression, currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    var signature: Signature | null;\r\n    var indexArg: ExpressionRef;\r\n    switch (target.kind) {\r\n\r\n      // direct call: concrete function\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        let prototype = <FunctionPrototype>target;\r\n        let typeArguments = expression.typeArguments;\r\n\r\n        // builtins handle present respectively omitted type arguments on their own\r\n        if (prototype.is(CommonFlags.AMBIENT | CommonFlags.BUILTIN)) {\r\n          return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\r\n        }\r\n\r\n        let instance: Function | null = null;\r\n\r\n        // resolve generic call if type arguments have been provided\r\n        if (typeArguments) {\r\n          if (!prototype.is(CommonFlags.GENERIC)) {\r\n            this.error(\r\n              DiagnosticCode.Type_0_is_not_generic,\r\n              expression.expression.range, prototype.internalName\r\n            );\r\n            return module.createUnreachable();\r\n          }\r\n          instance = this.resolver.resolveFunctionInclTypeArguments(\r\n            prototype,\r\n            typeArguments,\r\n            this.currentFunction.flow.contextualTypeArguments,\r\n            expression\r\n          );\r\n\r\n        // infer generic call if type arguments have been omitted\r\n        } else if (prototype.is(CommonFlags.GENERIC)) {\r\n          let inferredTypes = new Map<string,Type | null>();\r\n          let typeParameters = assert(prototype.declaration.typeParameters);\r\n          let numTypeParameters = typeParameters.length;\r\n          for (let i = 0; i < numTypeParameters; ++i) {\r\n            inferredTypes.set(typeParameters[i].name.text, null);\r\n          }\r\n          // let numInferred = 0;\r\n          let parameterTypes = prototype.declaration.signature.parameters;\r\n          let numParameterTypes = parameterTypes.length;\r\n          let argumentExpressions = expression.arguments;\r\n          let numArguments = argumentExpressions.length;\r\n          let argumentExprs = new Array<ExpressionRef>(numArguments);\r\n          for (let i = 0; i < numParameterTypes; ++i) {\r\n            let typeNode = parameterTypes[i].type;\r\n            let name = typeNode.kind == NodeKind.TYPE ? (<TypeNode>typeNode).name.text : null;\r\n            let argumentExpression = i < numArguments\r\n              ? argumentExpressions[i]\r\n              : prototype.declaration.signature.parameters[i].initializer;\r\n            if (!argumentExpression) { // missing initializer -> too few arguments\r\n              this.error(\r\n                DiagnosticCode.Expected_0_arguments_but_got_1,\r\n                expression.range, numParameterTypes.toString(10), numArguments.toString(10)\r\n              );\r\n              return module.createUnreachable();\r\n            }\r\n            if (name !== null && inferredTypes.has(name)) {\r\n              let inferredType = inferredTypes.get(name);\r\n              if (inferredType) {\r\n                argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\r\n                let commonType: Type | null;\r\n                if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\r\n                  if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\r\n                    this.error(\r\n                      DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n                      parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\r\n                    );\r\n                    return module.createUnreachable();\r\n                  }\r\n                }\r\n                inferredType = commonType;\r\n              } else {\r\n                argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\r\n                inferredType = this.currentType;\r\n                // ++numInferred;\r\n              }\r\n              inferredTypes.set(name, inferredType);\r\n            } else {\r\n              let concreteType = this.resolver.resolveType(\r\n                parameterTypes[i].type,\r\n                this.currentFunction.flow.contextualTypeArguments\r\n              );\r\n              if (!concreteType) return module.createUnreachable();\r\n              argumentExprs[i] = this.compileExpression(\r\n                argumentExpression,\r\n                concreteType,\r\n                ConversionKind.IMPLICIT,\r\n                WrapMode.NONE\r\n              );\r\n            }\r\n          }\r\n          let resolvedTypeArguments = new Array<Type>(numTypeParameters);\r\n          for (let i = 0; i < numTypeParameters; ++i) {\r\n            let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\r\n            resolvedTypeArguments[i] = inferredType;\r\n          }\r\n          instance = this.resolver.resolveFunction(\r\n            prototype,\r\n            resolvedTypeArguments,\r\n            this.currentFunction.flow.contextualTypeArguments\r\n          );\r\n          if (!instance) return this.module.createUnreachable();\r\n          return this.makeCallDirect(instance, argumentExprs);\r\n          // TODO: this skips inlining because inlining requires compiling its temporary locals in\r\n          // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\r\n          // so inlining can be performed in `makeCallDirect` instead?\r\n\r\n        // otherwise resolve the non-generic call as usual\r\n        } else {\r\n          instance = this.resolver.resolveFunction(\r\n            prototype,\r\n            null,\r\n            this.currentFunction.flow.contextualTypeArguments\r\n          );\r\n        }\r\n        if (!instance) return this.module.createUnreachable();\r\n\r\n        // compile 'this' expression if an instance method\r\n        let thisExpr: ExpressionRef = 0;\r\n        if (instance.is(CommonFlags.INSTANCE)) {\r\n          thisExpr = this.compileExpressionRetainType(\r\n            assert(this.resolver.resolvedThisExpression),\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n        }\r\n\r\n        return this.compileCallDirect(\r\n          instance,\r\n          expression.arguments,\r\n          expression,\r\n          thisExpr,\r\n          instance.hasDecorator(DecoratorFlags.INLINE)\r\n        );\r\n      }\r\n\r\n      // indirect call: index argument with signature (non-generic, can't be inlined)\r\n      case ElementKind.LOCAL: {\r\n        if (signature = (<Local>target).type.signatureReference) {\r\n          indexArg = module.createGetLocal((<Local>target).index, NativeType.I32);\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Local>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (signature = (<Global>target).type.signatureReference) {\r\n          indexArg = module.createGetGlobal((<Global>target).internalName, (<Global>target).type.toNativeType());\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Global>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.FIELD: {\r\n        let type = (<Field>target).type;\r\n        if (signature = type.signatureReference) {\r\n          let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n          let thisExpr = this.compileExpressionRetainType(\r\n            thisExpression,\r\n            this.options.usizeType,\r\n            WrapMode.NONE\r\n          );\r\n          indexArg = module.createLoad(\r\n            4,\r\n            false,\r\n            thisExpr,\r\n            NativeType.I32,\r\n            (<Field>target).memoryOffset\r\n          );\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n            expression.range, (<Field>target).type.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n      case ElementKind.FUNCTION_TARGET: {\r\n        signature = (<FunctionTarget>target).signature;\r\n        indexArg = this.compileExpression(\r\n          expression.expression,\r\n          (<FunctionTarget>target).type,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: // TODO\r\n\r\n      // not supported\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n    return this.compileCallIndirect(\r\n      signature,\r\n      indexArg,\r\n      expression.arguments,\r\n      expression\r\n    );\r\n  }\r\n\r\n  private compileCallExpressionBuiltin(\r\n    prototype: FunctionPrototype,\r\n    expression: CallExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var typeArguments: Type[] | null = null;\r\n\r\n    // builtins handle omitted type arguments on their own. if present, however, resolve them here\r\n    // and pass them to the builtin, even if it's still up to the builtin how to handle them.\r\n    var typeArgumentNodes = expression.typeArguments;\r\n    if (expression.typeArguments) {\r\n      if (!prototype.is(CommonFlags.GENERIC)) {\r\n        this.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          expression.range, prototype.internalName\r\n        );\r\n      }\r\n      typeArguments = this.resolver.resolveTypeArguments(\r\n        assert(prototype.declaration.typeParameters),\r\n        typeArgumentNodes,\r\n        this.currentFunction.flow.contextualTypeArguments,\r\n        expression\r\n      );\r\n    }\r\n\r\n    // now compile the builtin, which usually returns a block of code that replaces the call.\r\n    var expr = compileBuiltinCall(\r\n      this,\r\n      prototype,\r\n      typeArguments,\r\n      expression.arguments,\r\n      contextualType,\r\n      expression\r\n    );\r\n    if (!expr) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      return this.module.createUnreachable();\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /**\r\n   * Checks that a call with the given number as arguments can be performed according to the\r\n   * specified signature.\r\n   */\r\n  checkCallSignature(\r\n    signature: Signature,\r\n    numArguments: i32,\r\n    hasThis: bool,\r\n    reportNode: Node\r\n  ): bool {\r\n\r\n    // cannot call an instance method without a `this` argument (TODO: `.call`?)\r\n    var thisType = signature.thisType;\r\n    if (hasThis != (thisType != null)) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported, // TODO: better message?\r\n        reportNode.range\r\n      );\r\n      return false;\r\n    }\r\n\r\n    // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\r\n    var hasRest = signature.hasRest;\r\n    if (hasRest) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        reportNode.range\r\n      );\r\n      return false;\r\n    }\r\n\r\n    var minimum = signature.requiredParameters;\r\n    var maximum = signature.parameterTypes.length;\r\n\r\n    // must at least be called with required arguments\r\n    if (numArguments < minimum) {\r\n      this.error(\r\n        minimum < maximum\r\n          ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\r\n          : DiagnosticCode.Expected_0_arguments_but_got_1,\r\n        reportNode.range, minimum.toString(), numArguments.toString()\r\n      );\r\n      return false;\r\n    }\r\n\r\n    // must not be called with more than the maximum arguments\r\n    if (numArguments > maximum && !hasRest) {\r\n      this.error(\r\n        DiagnosticCode.Expected_0_arguments_but_got_1,\r\n        reportNode.range, maximum.toString(), numArguments.toString()\r\n      );\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /** Compiles a direct call to a concrete function. */\r\n  compileCallDirect(\r\n    instance: Function,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0,\r\n    inline: bool = false\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n    var signature = instance.signature;\r\n\r\n    if (!this.checkCallSignature( // reports\r\n      signature,\r\n      numArguments,\r\n      thisArg != 0,\r\n      reportNode\r\n    )) {\r\n      return this.module.createUnreachable();\r\n    }\r\n\r\n    // Inline if explicitly requested\r\n    if (inline) {\r\n      assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\r\n      return this.compileCallInlineUnchecked(instance, argumentExpressions, reportNode, thisArg);\r\n    }\r\n\r\n    // Otherwise compile to just a call\r\n    var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n    var operands = new Array<ExpressionRef>(numArgumentsInclThis);\r\n    var index = 0;\r\n    if (thisArg) {\r\n      operands[0] = thisArg;\r\n      index = 1;\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i, ++index) {\r\n      operands[index] = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    assert(index == numArgumentsInclThis);\r\n    return this.makeCallDirect(instance, operands);\r\n  }\r\n\r\n  // Depends on being pre-checked in compileCallDirect\r\n  private compileCallInlineUnchecked(\r\n    instance: Function,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n    var signature = instance.signature;\r\n    var currentFunction = this.currentFunction;\r\n    var module = this.module;\r\n    var declaration = instance.prototype.declaration;\r\n\r\n    // Create an empty child flow with its own scope and mark it for inlining\r\n    var previousFlow = currentFunction.flow;\r\n    var returnLabel = instance.internalName + \"|inlined.\" + (instance.nextInlineId++).toString(10);\r\n    var returnType = instance.signature.returnType;\r\n    var flow = Flow.create(currentFunction);\r\n    flow.set(FlowFlags.INLINE_CONTEXT);\r\n    flow.returnLabel = returnLabel;\r\n    flow.returnType = returnType;\r\n    flow.contextualTypeArguments = instance.contextualTypeArguments;\r\n\r\n    // Convert provided call arguments to temporary locals. It is important that these are compiled\r\n    // here, with their respective locals being blocked. There is no 'makeCallInline'.\r\n    var body = [];\r\n    if (thisArg) {\r\n      let parent = assert(instance.parent);\r\n      assert(parent.kind == ElementKind.CLASS);\r\n      if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\r\n        flow.addScopedLocalAlias(\r\n          getGetLocalIndex(thisArg),\r\n          (<Class>parent).type,\r\n          \"this\"\r\n        );\r\n      } else {\r\n        let thisLocal = flow.addScopedLocal((<Class>parent).type, \"this\", false);\r\n        body.push(\r\n          module.createSetLocal(thisLocal.index, thisArg)\r\n        );\r\n      }\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i) {\r\n      let paramExpr = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      if (getExpressionId(paramExpr) == ExpressionId.GetLocal) {\r\n        flow.addScopedLocalAlias(\r\n          getGetLocalIndex(paramExpr),\r\n          parameterTypes[i],\r\n          signature.getParameterName(i)\r\n        );\r\n        // inherits wrap status\r\n      } else {\r\n        let argumentLocal = flow.addScopedLocal(\r\n          parameterTypes[i],\r\n          signature.getParameterName(i),\r\n          !flow.canOverflow(paramExpr, parameterTypes[i])\r\n        );\r\n        body.push(\r\n          module.createSetLocal(argumentLocal.index, paramExpr)\r\n        );\r\n      }\r\n    }\r\n\r\n    // Compile optional parameter initializers in the scope of the inlined flow\r\n    currentFunction.flow = flow;\r\n    var numParameters = signature.parameterTypes.length;\r\n    for (let i = numArguments; i < numParameters; ++i) {\r\n      let initExpr = this.compileExpression(\r\n        assert(declaration.signature.parameters[i].initializer),\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.WRAP\r\n      );\r\n      let argumentLocal = flow.addScopedLocal(\r\n        parameterTypes[i],\r\n        signature.getParameterName(i),\r\n        !flow.canOverflow(initExpr, parameterTypes[i])\r\n      );\r\n      body.push(\r\n        module.createSetLocal(argumentLocal.index, initExpr)\r\n      );\r\n    }\r\n\r\n    // Compile the called function's body in the scope of the inlined flow\r\n    var bodyStatement = assert(declaration.body);\r\n    if (bodyStatement.kind == NodeKind.BLOCK) {\r\n      let statements = (<BlockStatement>bodyStatement).statements;\r\n      for (let i = 0, k = statements.length; i < k; ++i) {\r\n        let stmt = this.compileStatement(statements[i]);\r\n        if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n          body.push(stmt);\r\n          if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\r\n        }\r\n      }\r\n    } else {\r\n      body.push(this.compileStatement(bodyStatement));\r\n    }\r\n\r\n    // Free any new scoped locals and reset to the original flow\r\n    var scopedLocals = flow.scopedLocals;\r\n    if (scopedLocals) {\r\n      for (let scopedLocal of scopedLocals.values()) {\r\n        if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n          currentFunction.freeTempLocal(scopedLocal);\r\n        }\r\n      }\r\n      flow.scopedLocals = null;\r\n    }\r\n    flow.finalize();\r\n    this.currentFunction.flow = previousFlow;\r\n    this.currentType = returnType;\r\n\r\n    // Check that all branches are terminated\r\n    if (returnType != Type.void && !flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n      this.error(\r\n        DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n        declaration.signature.returnType.range\r\n      );\r\n      return module.createUnreachable();\r\n    }\r\n    return module.createBlock(returnLabel, body, returnType.toNativeType());\r\n  }\r\n\r\n  /** Gets the trampoline for the specified function. */\r\n  ensureTrampoline(original: Function): Function {\r\n    // A trampoline is a function that takes a fixed amount of operands with some of them possibly\r\n    // being zeroed. It takes one additional argument denoting the number of actual operands\r\n    // provided to the call, and takes appropriate steps to initialize zeroed operands to their\r\n    // default values using the optional parameter initializers of the original function. Doing so\r\n    // allows calls to functions with optional parameters to circumvent the trampoline when all\r\n    // parameters are provided as a fast route, respectively setting up omitted operands in a proper\r\n    // context otherwise.\r\n    var trampoline = original.trampoline;\r\n    if (trampoline) return trampoline;\r\n\r\n    var originalSignature = original.signature;\r\n    var originalName = original.internalName;\r\n    var originalParameterTypes = originalSignature.parameterTypes;\r\n    var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\r\n    var commonReturnType = originalSignature.returnType;\r\n    var commonThisType = originalSignature.thisType;\r\n    var isInstance = original.is(CommonFlags.INSTANCE);\r\n\r\n    // arguments excl. `this`, operands incl. `this`\r\n    var minArguments = originalSignature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = originalParameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (isInstance) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n    }\r\n    var numOptional = assert(maxOperands - minOperands);\r\n\r\n    var forwardedOperands = new Array<ExpressionRef>(minOperands);\r\n    var operandIndex = 0;\r\n\r\n    // forward `this` if applicable\r\n    var module = this.module;\r\n    if (isInstance) {\r\n      forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\r\n      operandIndex = 1;\r\n    }\r\n\r\n    // forward required arguments\r\n    for (let i = 0; i < minArguments; ++i, ++operandIndex) {\r\n      forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\r\n    }\r\n    assert(operandIndex == minOperands);\r\n\r\n    // create the trampoline element\r\n    var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\r\n    var trampolineName = originalName + \"|trampoline\";\r\n    trampolineSignature.requiredParameters = maxArguments;\r\n    trampoline = new Function(\r\n      original.prototype,\r\n      trampolineName,\r\n      trampolineSignature,\r\n      original.parent,\r\n      original.contextualTypeArguments\r\n    );\r\n    trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\r\n    original.trampoline = trampoline;\r\n\r\n    // compile initializers of omitted arguments in scope of the trampoline function\r\n    // this is necessary because initializers might need additional locals and a proper this context\r\n    var previousFunction = this.currentFunction;\r\n    this.currentFunction = trampoline;\r\n\r\n    // create a br_table switching over the number of optional parameters provided\r\n    var numNames = numOptional + 1; // incl. outer block\r\n    var names = new Array<string>(numNames);\r\n    var ofN = \"of\" + numOptional.toString(10);\r\n    for (let i = 0; i < numNames; ++i) {\r\n      let label = i.toString(10) + ofN;\r\n      names[i] = label;\r\n    }\r\n    var body = module.createBlock(names[0], [\r\n      module.createBlock(\"oob\", [\r\n        module.createSwitch(names, \"oob\",\r\n          // condition is number of provided optional arguments, so subtract required arguments\r\n          minArguments\r\n            ? module.createBinary(\r\n                BinaryOp.SubI32,\r\n                module.createGetGlobal(\"~argc\", NativeType.I32),\r\n                module.createI32(minArguments)\r\n              )\r\n            : module.createGetGlobal(\"~argc\", NativeType.I32)\r\n        )\r\n      ]),\r\n      module.createUnreachable()\r\n    ]);\r\n    for (let i = 0; i < numOptional; ++i, ++operandIndex) {\r\n      let type = originalParameterTypes[minArguments + i];\r\n      let declaration = originalParameterDeclarations[minArguments + i];\r\n      let initializer = declaration.initializer;\r\n      let initExpr: ExpressionRef;\r\n      if (initializer) {\r\n        initExpr = module.createSetLocal(operandIndex,\r\n          this.compileExpression(\r\n            initializer,\r\n            type,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.WRAP\r\n          )\r\n        );\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Optional_parameter_must_have_an_initializer,\r\n          declaration.range\r\n        );\r\n        initExpr = module.createUnreachable();\r\n      }\r\n      body = module.createBlock(names[i + 1], [\r\n        body,\r\n        initExpr,\r\n      ]);\r\n      forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\r\n    }\r\n    this.currentFunction = previousFunction;\r\n    assert(operandIndex == maxOperands);\r\n\r\n    var funcRef = module.addFunction(\r\n      trampolineName,\r\n      this.ensureFunctionType(\r\n        trampolineSignature.parameterTypes,\r\n        trampolineSignature.returnType,\r\n        trampolineSignature.thisType\r\n      ),\r\n      typesToNativeTypes(trampoline.additionalLocals),\r\n      module.createBlock(null, [\r\n        body,\r\n        module.createCall(\r\n          originalName,\r\n          forwardedOperands,\r\n          commonReturnType.toNativeType()\r\n        )\r\n      ], commonReturnType.toNativeType())\r\n    );\r\n    trampoline.finalize(module, funcRef);\r\n    return trampoline;\r\n  }\r\n\r\n  /** Makes sure that the argument count helper global is present and returns its name. */\r\n  private ensureArgcVar(): string {\r\n    var internalName = \"~argc\";\r\n    if (!this.argcVar) {\r\n      let module = this.module;\r\n      this.argcVar = module.addGlobal(\r\n        internalName,\r\n        NativeType.I32,\r\n        true,\r\n        module.createI32(0)\r\n      );\r\n    }\r\n    return internalName;\r\n  }\r\n\r\n  /** Makes sure that the argument count helper setter is present and returns its name. */\r\n  private ensureArgcSet(): string {\r\n    var internalName = \"~setargc\";\r\n    if (!this.argcSet) {\r\n      let module = this.module;\r\n      this.argcSet = module.addFunction(internalName,\r\n        this.ensureFunctionType([ Type.u32 ], Type.void),\r\n        null,\r\n        module.createSetGlobal(this.ensureArgcVar(),\r\n          module.createGetLocal(0, NativeType.I32)\r\n        )\r\n      );\r\n      module.addFunctionExport(internalName, \"_setargc\");\r\n    }\r\n    return internalName;\r\n  }\r\n\r\n  /** Creates a direct call to the specified function. */\r\n  makeCallDirect(\r\n    instance: Function,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var numOperands = operands ? operands.length : 0;\r\n    var numArguments = numOperands;\r\n    var minArguments = instance.signature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = instance.signature.parameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (instance.is(CommonFlags.INSTANCE)) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n      --numArguments;\r\n    }\r\n    assert(numOperands >= minOperands);\r\n\r\n    var module = this.module;\r\n    if (!this.compileFunction(instance)) return module.createUnreachable();\r\n    var returnType = instance.signature.returnType;\r\n    var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\r\n\r\n    // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\r\n    if (numOperands < maxOperands) {\r\n      if (!operands) {\r\n        operands = new Array(maxOperands);\r\n        operands.length = 0;\r\n      }\r\n      let parameterTypes = instance.signature.parameterTypes;\r\n      let parameterNodes = instance.prototype.declaration.signature.parameters;\r\n      let allOptionalsAreConstant = true;\r\n      for (let i = numArguments; i < maxArguments; ++i) {\r\n        let initializer = parameterNodes[i].initializer;\r\n        if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\r\n          allOptionalsAreConstant = false;\r\n          break;\r\n        }\r\n      }\r\n      if (allOptionalsAreConstant) { // inline into the call\r\n        for (let i = numArguments; i < maxArguments; ++i) {\r\n          operands.push(\r\n            this.compileExpression(\r\n              <Expression>parameterNodes[i].initializer,\r\n              parameterTypes[i],\r\n              ConversionKind.IMPLICIT,\r\n              WrapMode.NONE\r\n            )\r\n          );\r\n        }\r\n      } else { // otherwise fill up with zeroes and call the trampoline\r\n        for (let i = numArguments; i < maxArguments; ++i) {\r\n          operands.push(parameterTypes[i].toNativeZero(module));\r\n        }\r\n        if (!isCallImport) {\r\n          let original = instance;\r\n          instance = this.ensureTrampoline(instance);\r\n          if (!this.compileFunction(instance)) return module.createUnreachable();\r\n          instance.flow.flags = original.flow.flags;\r\n          this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\r\n          let nativeReturnType = returnType.toNativeType();\r\n          this.currentType = returnType;\r\n          return module.createBlock(null, [\r\n            module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\r\n            module.createCall(instance.internalName, operands, nativeReturnType)\r\n          ], nativeReturnType);\r\n        }\r\n      }\r\n    }\r\n\r\n    // otherwise just call through\r\n    this.currentType = returnType;\r\n    if (isCallImport) return module.createCallImport(instance.internalName, operands, returnType.toNativeType());\r\n    var ret = module.createCall(instance.internalName, operands, returnType.toNativeType());\r\n    return ret;\r\n  }\r\n\r\n  /** Compiles an indirect call using an index argument and a signature. */\r\n  compileCallIndirect(\r\n    signature: Signature,\r\n    indexArg: ExpressionRef,\r\n    argumentExpressions: Expression[],\r\n    reportNode: Node,\r\n    thisArg: ExpressionRef = 0\r\n  ): ExpressionRef {\r\n    var numArguments = argumentExpressions.length;\r\n\r\n    if (!this.checkCallSignature( // reports\r\n      signature,\r\n      numArguments,\r\n      thisArg != 0,\r\n      reportNode\r\n    )) {\r\n      return this.module.createUnreachable();\r\n    }\r\n\r\n    var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n    var operands = new Array<ExpressionRef>(numArgumentsInclThis);\r\n    var index = 0;\r\n    if (thisArg) {\r\n      operands[0] = thisArg;\r\n      index = 1;\r\n    }\r\n    var parameterTypes = signature.parameterTypes;\r\n    for (let i = 0; i < numArguments; ++i, ++index) {\r\n      operands[index] = this.compileExpression(\r\n        argumentExpressions[i],\r\n        parameterTypes[i],\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    assert(index == numArgumentsInclThis);\r\n    return this.makeCallIndirect(signature, indexArg, operands);\r\n  }\r\n\r\n  /** Creates an indirect call to the function at `indexArg` in the function table. */\r\n  makeCallIndirect(\r\n    signature: Signature,\r\n    indexArg: ExpressionRef,\r\n    operands: ExpressionRef[] | null = null\r\n  ): ExpressionRef {\r\n    var numOperands = operands ? operands.length : 0;\r\n    var numArguments = numOperands;\r\n    var minArguments = signature.requiredParameters;\r\n    var minOperands = minArguments;\r\n    var maxArguments = signature.parameterTypes.length;\r\n    var maxOperands = maxArguments;\r\n    if (signature.thisType) {\r\n      ++minOperands;\r\n      ++maxOperands;\r\n      --numArguments;\r\n    }\r\n    assert(numOperands >= minOperands);\r\n\r\n    this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n    var module = this.module;\r\n\r\n    // fill up omitted arguments with zeroes\r\n    if (numOperands < maxOperands) {\r\n      if (!operands) {\r\n        operands = new Array(maxOperands);\r\n        operands.length = 0;\r\n      }\r\n      let parameterTypes = signature.parameterTypes;\r\n      for (let i = numArguments; i < maxArguments; ++i) {\r\n        operands.push(parameterTypes[i].toNativeZero(module));\r\n      }\r\n    }\r\n\r\n    var returnType = signature.returnType;\r\n    this.currentType = returnType;\r\n    return module.createBlock(null, [\r\n      module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\r\n        module.createI32(numArguments)\r\n      ),\r\n      module.createCallIndirect(indexArg, operands, signature.toSignatureString())\r\n    ], returnType.toNativeType()); // not necessarily wrapped\r\n  }\r\n\r\n  compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n    var expressions = expression.expressions;\r\n    var numExpressions = expressions.length;\r\n    var exprs = new Array<ExpressionRef>(numExpressions--);\r\n    for (let i = 0; i < numExpressions; ++i) {\r\n      exprs[i] = this.compileExpression(\r\n        expressions[i],\r\n        Type.void, // drop all\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    exprs[numExpressions] = this.compileExpression(\r\n      expressions[numExpressions],\r\n      contextualType, // except last\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE\r\n    );\r\n    return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n  }\r\n\r\n  compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n    var target = this.resolver.resolveElementAccess(expression, this.currentFunction); // reports\r\n    if (!target) return this.module.createUnreachable();\r\n    switch (target.kind) {\r\n      case ElementKind.CLASS: {\r\n        let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n        if (!indexedGet) {\r\n          this.error(\r\n            DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n            expression.expression.range, (<Class>target).internalName\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n        let thisArg = this.compileExpression(\r\n          expression.expression,\r\n          (<Class>target).type,\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE\r\n        );\r\n        return this.compileCallDirect(indexedGet, [\r\n          expression.elementExpression\r\n        ], expression, thisArg);\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\r\n    var declaration = expression.declaration;\r\n    var name = declaration.name;\r\n    var simpleName = (name.text.length\r\n      ? name.text\r\n      : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\r\n    var currentFunction = this.currentFunction;\r\n    var prototype = new FunctionPrototype(\r\n      this.program,\r\n      simpleName,\r\n      currentFunction.internalName + INNER_DELIMITER + simpleName,\r\n      declaration,\r\n      null,\r\n      DecoratorFlags.NONE\r\n    );\r\n    var flow = currentFunction.flow;\r\n    var instance = this.compileFunctionUsingTypeArguments(\r\n      prototype,\r\n      [],\r\n      flow.contextualTypeArguments,\r\n      flow,\r\n      declaration\r\n    );\r\n    if (!instance) return this.module.createUnreachable();\r\n    this.currentType = instance.signature.type; // TODO: get cached type?\r\n    // NOTE that, in order to make this work in every case, the function must be represented by a\r\n    // value, so we add it and rely on the optimizer to figure out where it can be called directly.\r\n    var index = this.ensureFunctionTableEntry(instance); // reports\r\n    return index < 0\r\n      ? this.module.createUnreachable()\r\n      : this.module.createI32(index);\r\n  }\r\n\r\n  /**\r\n   * Compiles an identifier in the specified context.\r\n   * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n   *  precomputes them according to context.\r\n   */\r\n  compileIdentifierExpression(\r\n    expression: IdentifierExpression,\r\n    contextualType: Type,\r\n    retainConstantType: bool\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // check special keywords first\r\n    switch (expression.kind) {\r\n      case NodeKind.NULL: {\r\n        let options = this.options;\r\n        if (!contextualType.classReference) {\r\n          this.currentType = options.usizeType;\r\n        }\r\n        return options.isWasm64\r\n          ? module.createI64(0)\r\n          : module.createI32(0);\r\n      }\r\n      case NodeKind.TRUE: {\r\n        this.currentType = Type.bool;\r\n        return module.createI32(1);\r\n      }\r\n      case NodeKind.FALSE: {\r\n        this.currentType = Type.bool;\r\n        return module.createI32(0);\r\n      }\r\n      case NodeKind.THIS: {\r\n        let flow = currentFunction.flow;\r\n        if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let scopedThis = flow.getScopedLocal(\"this\");\r\n          if (scopedThis) {\r\n            this.currentType = scopedThis.type;\r\n            return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\r\n          }\r\n        }\r\n        if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n          let parent = assert(currentFunction.parent);\r\n          assert(parent.kind == ElementKind.CLASS);\r\n          let thisType = (<Class>parent).type;\r\n          if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n            if (!flow.is(FlowFlags.ALLOCATES)) {\r\n              flow.set(FlowFlags.ALLOCATES);\r\n              // must be conditional because `this` could have been provided by a derived class\r\n              this.currentType = thisType;\r\n              return module.createTeeLocal(0,\r\n                this.makeConditionalAllocate(<Class>parent, expression)\r\n              );\r\n            }\r\n          }\r\n          this.currentType = thisType;\r\n          return module.createGetLocal(0, thisType.toNativeType());\r\n        }\r\n        this.error(\r\n          DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n          expression.range\r\n        );\r\n        this.currentType = this.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n      case NodeKind.SUPER: {\r\n        let flow = currentFunction.flow;\r\n        if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let scopedThis = flow.getScopedLocal(\"this\");\r\n          if (scopedThis) {\r\n            let scopedThisClass = assert(scopedThis.type.classReference);\r\n            let base = scopedThisClass.base;\r\n            if (base) {\r\n              this.currentType = base.type;\r\n              return module.createGetLocal(scopedThis.index, base.type.toNativeType());\r\n            }\r\n          }\r\n        }\r\n        if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n          let parent = assert(currentFunction.parent);\r\n          assert(parent.kind == ElementKind.CLASS);\r\n          let base = (<Class>parent).base;\r\n          if (base) {\r\n            let superType = base.type;\r\n            this.currentType = superType;\r\n            return module.createGetLocal(0, superType.toNativeType());\r\n          }\r\n        }\r\n        this.error(\r\n          DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n          expression.range\r\n        );\r\n        this.currentType = this.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // otherwise resolve\r\n    var target = this.resolver.resolveIdentifier( // reports\r\n      expression,\r\n      this.currentEnum || currentFunction\r\n    );\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.LOCAL: {\r\n        if ((<Local>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Local>target, contextualType, retainConstantType);\r\n        }\r\n        let localType = (<Local>target).type;\r\n        let localIndex = (<Local>target).index;\r\n        assert(localIndex >= 0);\r\n        this.currentType = localType;\r\n        return this.module.createGetLocal(localIndex, localType.toNativeType());\r\n      }\r\n      case ElementKind.GLOBAL: {\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field\r\n          return this.module.createUnreachable();\r\n        }\r\n        let globalType = (<Global>target).type;\r\n        assert(globalType != Type.void);\r\n        if ((<Global>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Global>target, contextualType, retainConstantType);\r\n        }\r\n        this.currentType = globalType;\r\n        return this.module.createGetGlobal((<Global>target).internalName, globalType.toNativeType());\r\n      }\r\n      case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\r\n        if (!target.is(CommonFlags.COMPILED)) {\r\n          this.error(\r\n            DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n            expression.range\r\n          );\r\n          this.currentType = Type.i32;\r\n          return this.module.createUnreachable();\r\n        }\r\n        this.currentType = Type.i32;\r\n        if ((<EnumValue>target).is(CommonFlags.INLINED)) {\r\n          return this.module.createI32((<EnumValue>target).constantValue);\r\n        }\r\n        return this.module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);\r\n      }\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        let instance = this.resolver.resolveFunction(\r\n          <FunctionPrototype>target,\r\n          null,\r\n          currentFunction.flow.contextualTypeArguments\r\n        );\r\n        if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\r\n        let index = this.ensureFunctionTableEntry(instance);\r\n        this.currentType = instance.signature.type;\r\n        return this.module.createI32(index);\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    return this.module.createUnreachable();\r\n  }\r\n\r\n  compileInstanceOfExpression(\r\n    expression: InstanceOfExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\r\n    // time of implementation, this seemed more useful because dynamic rhs expressions are not\r\n    // possible in AS anyway.\r\n    var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\r\n    var type = this.currentType;\r\n    var isType = this.resolver.resolveType(expression.isType);\r\n    this.currentType = Type.bool;\r\n    if (!isType) return module.createUnreachable();\r\n    return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\r\n      ? type.nonNullableType.isAssignableTo(isType)\r\n        ? module.createBinary( // not precomputeable\r\n            type.is(TypeFlags.LONG)\r\n              ? BinaryOp.NeI64\r\n              : BinaryOp.NeI32,\r\n            expr,\r\n            type.toNativeZero(module)\r\n          )\r\n        : module.createI32(0)\r\n      : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\r\n  }\r\n\r\n  compileLiteralExpression(\r\n    expression: LiteralExpression,\r\n    contextualType: Type,\r\n    implicitNegate: bool = false\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n\r\n    switch (expression.literalKind) {\r\n      case LiteralKind.ARRAY: {\r\n        assert(!implicitNegate);\r\n        let classType = contextualType.classReference;\r\n        if (\r\n          classType &&\r\n          classType.prototype == this.program.arrayPrototype\r\n        ) {\r\n          return this.compileArrayLiteral(\r\n            assert(classType.typeArguments)[0],\r\n            (<ArrayLiteralExpression>expression).elementExpressions,\r\n            expression\r\n          );\r\n        }\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      case LiteralKind.FLOAT: {\r\n        let floatValue = (<FloatLiteralExpression>expression).value;\r\n        if (implicitNegate) {\r\n          floatValue = -floatValue;\r\n        }\r\n        if (contextualType == Type.f32) {\r\n          return module.createF32(<f32>floatValue);\r\n        }\r\n        this.currentType = Type.f64;\r\n        return module.createF64(floatValue);\r\n      }\r\n      case LiteralKind.INTEGER: {\r\n        let intValue = (<IntegerLiteralExpression>expression).value;\r\n        if (implicitNegate) {\r\n          intValue = i64_sub(\r\n            i64_new(0),\r\n            intValue\r\n          );\r\n        }\r\n        switch (contextualType.kind) {\r\n\r\n          // compile to contextualType if matching\r\n\r\n          case TypeKind.I8: {\r\n            if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U8: {\r\n            if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.I16: {\r\n            if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U16: {\r\n            if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.I32: {\r\n            if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.U32: {\r\n            if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.BOOL: {\r\n            if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE: {\r\n            if (!this.options.isWasm64) {\r\n              if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\r\n              break;\r\n            }\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.USIZE: {\r\n            if (!this.options.isWasm64) {\r\n              if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\r\n              break;\r\n            }\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            return module.createI64(i64_low(intValue), i64_high(intValue));\r\n          }\r\n          case TypeKind.F32: {\r\n            if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            break; // compiles to best fitting type below, being dropped\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n\r\n        // otherwise compile to best fitting native type\r\n\r\n        if (i64_is_i32(intValue)) {\r\n          this.currentType = Type.i32;\r\n          return module.createI32(i64_low(intValue));\r\n        } else if (i64_is_u32(intValue)) {\r\n          this.currentType = Type.u32;\r\n          return module.createI32(i64_low(intValue));\r\n        } else {\r\n          this.currentType = Type.i64;\r\n          return module.createI64(i64_low(intValue), i64_high(intValue));\r\n        }\r\n      }\r\n      case LiteralKind.STRING: {\r\n        assert(!implicitNegate);\r\n        return this.compileStaticString((<StringLiteralExpression>expression).value);\r\n      }\r\n      // case LiteralKind.OBJECT:\r\n      // case LiteralKind.REGEXP:\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      expression.range\r\n    );\r\n    this.currentType = contextualType;\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileStaticString(stringValue: string): ExpressionRef {\r\n    var module = this.module;\r\n    var options = this.options;\r\n    var stringSegments = this.stringSegments;\r\n\r\n    var stringSegment: MemorySegment | null = stringSegments.get(stringValue);\r\n    if (!stringSegment) {\r\n      let stringLength = stringValue.length;\r\n      let stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n      stringBuffer[0] =  stringLength         & 0xff;\r\n      stringBuffer[1] = (stringLength >>>  8) & 0xff;\r\n      stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n      stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n      for (let i = 0; i < stringLength; ++i) {\r\n        stringBuffer[4 + i * 2] =  stringValue.charCodeAt(i)        & 0xff;\r\n        stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n      }\r\n      stringSegment = this.addMemorySegment(stringBuffer, options.usizeType.byteSize);\r\n      stringSegments.set(stringValue, stringSegment);\r\n    }\r\n    var stringOffset = stringSegment.offset;\r\n    var stringType = this.program.typesLookup.get(\"string\");\r\n    this.currentType = stringType ? stringType : options.usizeType;\r\n    if (options.isWasm64) {\r\n      return module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n    }\r\n    assert(i64_is_i32(stringOffset));\r\n    return module.createI32(i64_low(stringOffset));\r\n  }\r\n\r\n  compileArrayLiteral(elementType: Type, expressions: (Expression | null)[], reportNode: Node): ExpressionRef {\r\n    var isStatic = true;\r\n    var module = this.module;\r\n\r\n    // obtain the array type\r\n    var arrayPrototype = assert(this.program.arrayPrototype);\r\n    if (!arrayPrototype || arrayPrototype.kind != ElementKind.CLASS_PROTOTYPE) return module.createUnreachable();\r\n    var arrayInstance = this.resolver.resolveClass(<ClassPrototype>arrayPrototype, [ elementType ]);\r\n    if (!arrayInstance) return module.createUnreachable();\r\n    var arrayType = arrayInstance.type;\r\n\r\n    var elementCount = expressions.length;\r\n    if (elementCount) { // non-empty static or dynamic\r\n      let nativeElementType = elementType.toNativeType();\r\n      let values: usize;\r\n      let byteLength: usize;\r\n      switch (nativeElementType) {\r\n        case NativeType.I32: {\r\n          values = changetype<usize>(new Int32Array(elementCount));\r\n          byteLength = elementCount * 4;\r\n          break;\r\n        }\r\n        case NativeType.I64: {\r\n          values = changetype<usize>(new Array<I64>(elementCount));\r\n          byteLength = elementCount * 8;\r\n          break;\r\n        }\r\n        case NativeType.F32: {\r\n          values = changetype<usize>(new Float32Array(elementCount));\r\n          byteLength = elementCount * 4;\r\n          break;\r\n        }\r\n        case NativeType.F64: {\r\n          values = changetype<usize>(new Float64Array(elementCount));\r\n          byteLength = elementCount * 8;\r\n          break;\r\n        }\r\n        default: {\r\n          assert(false);\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n\r\n      // precompute value expressions\r\n      let exprs = new Array<ExpressionRef>(elementCount);\r\n      let expr: BinaryenExpressionRef;\r\n      for (let i = 0; i < elementCount; ++i) {\r\n        exprs[i] = expressions[i]\r\n          ? this.compileExpression(<Expression>expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n          : elementType.toNativeZero(module);\r\n        if (isStatic) {\r\n          expr = this.precomputeExpressionRef(exprs[i]);\r\n          if (getExpressionId(expr) == ExpressionId.Const) {\r\n            assert(getExpressionType(expr) == nativeElementType);\r\n            switch (nativeElementType) {\r\n              case NativeType.I32: {\r\n                changetype<i32[]>(values)[i] = getConstValueI32(expr);\r\n                break;\r\n              }\r\n              case NativeType.I64: {\r\n                changetype<I64[]>(values)[i] = i64_new(\r\n                  getConstValueI64Low(expr),\r\n                  getConstValueI64High(expr)\r\n                );\r\n                break;\r\n              }\r\n              case NativeType.F32: {\r\n                changetype<f32[]>(values)[i] = getConstValueF32(expr);\r\n                break;\r\n              }\r\n              case NativeType.F64: {\r\n                changetype<f64[]>(values)[i] = getConstValueF64(expr);\r\n                break;\r\n              }\r\n              default: assert(false); // checked above\r\n            }\r\n          } else {\r\n            // TODO: emit a warning if declared 'const'\r\n            // if (isConst) {\r\n            //   this.warn(\r\n            //     DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n            //     reportNode.range\r\n            //   );\r\n            // }\r\n            isStatic = false;\r\n          }\r\n        }\r\n      }\r\n\r\n      let usizeTypeSize = this.options.usizeType.byteSize;\r\n      if (isStatic) { // non-empty, all elements can be precomputed\r\n\r\n        // Create a combined static memory segment composed of:\r\n        // Array struct + ArrayBuffer struct + aligned ArrayBuffer data\r\n\r\n        let arraySize = usizeTypeSize + 4; // buffer_ & length_\r\n        let bufferHeaderSize = (4 + 7) & ~7; // aligned byteLength (8)\r\n        let bufferTotalSize = 1 << (32 - clz(byteLength + bufferHeaderSize - 1)); // see internals\r\n        let data = new Uint8Array(arraySize + bufferTotalSize);\r\n        let segment = this.addMemorySegment(data);\r\n        let offset = 0;\r\n\r\n        // write Array struct\r\n        if (usizeTypeSize == 8) {\r\n          writeI64(i64_add(segment.offset, i64_new(arraySize)), data, offset); // buffer_ @ segment[arSize]\r\n          offset += 8;\r\n        } else {\r\n          assert(i64_high(segment.offset) == 0);\r\n          writeI32(i64_low(segment.offset) + arraySize, data, offset); // buffer_ @ segment[arSize]\r\n          offset += 4;\r\n        }\r\n        writeI32(elementCount, data, offset); // length_\r\n        offset += 4;\r\n        assert(offset == arraySize);\r\n\r\n        // write ArrayBuffer struct\r\n        writeI32(byteLength, data, offset);\r\n        offset += bufferHeaderSize; // incl. alignment\r\n\r\n        // write ArrayBuffer data\r\n        switch (nativeElementType) {\r\n          case NativeType.I32: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeI32(changetype<i32[]>(values)[i], data, offset); offset += 4;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.I64: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeI64(changetype<I64[]>(values)[i], data, offset); offset += 8;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.F32: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeF32(changetype<f32[]>(values)[i], data, offset); offset += 4;\r\n            }\r\n            break;\r\n          }\r\n          case NativeType.F64: {\r\n            for (let i = 0; i < elementCount; ++i) {\r\n              writeF64(changetype<f64[]>(values)[i], data, offset); offset += 8;\r\n            }\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        assert(offset <= arraySize + bufferTotalSize);\r\n\r\n        this.currentType = arrayType;\r\n        return usizeTypeSize == 8\r\n          ? module.createI64(\r\n              i64_low(segment.offset),\r\n              i64_high(segment.offset)\r\n            )\r\n          : module.createI32(\r\n              i64_low(segment.offset)\r\n            );\r\n\r\n      } else { // non-empty, some elements can't be precomputed\r\n\r\n        this.currentType = arrayType;\r\n        let setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\r\n        if (!setter) {\r\n          this.error(\r\n            DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n            reportNode.range, arrayInstance.internalName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let nativeArrayType = arrayType.toNativeType();\r\n        let currentFunction = this.currentFunction;\r\n        let tempLocal = currentFunction.getTempLocal(arrayType, false);\r\n        let stmts = new Array<ExpressionRef>(2 + elementCount);\r\n        let index = 0;\r\n        stmts[index++] = module.createSetLocal(tempLocal.index,\r\n          this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n            module.createI32(0), // this\r\n            module.createI32(elementCount)\r\n          ])\r\n        );\r\n        for (let i = 0; i < elementCount; ++i) {\r\n          stmts[index++] = this.makeCallDirect(setter, [\r\n            module.createGetLocal(tempLocal.index, nativeArrayType), // this\r\n            module.createI32(i),\r\n            exprs[i]\r\n          ]);\r\n        }\r\n        assert(index + 1 == stmts.length);\r\n        stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\r\n        currentFunction.freeTempLocal(tempLocal);\r\n        this.currentType = arrayType;\r\n        return module.createBlock(null, stmts, nativeArrayType);\r\n      }\r\n\r\n    } else { // empty, TBD: cache this somehow?\r\n      this.currentType = arrayType;\r\n      return this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n        module.createI32(0), // this\r\n        module.createI32(0)\r\n      ]);\r\n    }\r\n  }\r\n\r\n  compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var options = this.options;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // obtain the class being instantiated\r\n    var target = this.resolver.resolveExpression( // reports\r\n      expression.expression,\r\n      currentFunction\r\n    );\r\n    if (!target) return module.createUnreachable();\r\n    if (target.kind != ElementKind.CLASS_PROTOTYPE) {\r\n      this.error(\r\n        DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n        expression.expression.range\r\n      );\r\n      return this.module.createUnreachable();\r\n    }\r\n    var classPrototype = <ClassPrototype>target;\r\n    var classInstance: Class | null = null;\r\n    var typeArguments = expression.typeArguments;\r\n    var classReference: Class | null;\r\n    if (\r\n      !typeArguments &&\r\n      (classReference = contextualType.classReference) !== null &&\r\n      classReference.is(CommonFlags.GENERIC)\r\n    ) {\r\n      classInstance = this.resolver.resolveClass(\r\n        classPrototype,\r\n        classReference.typeArguments,\r\n        currentFunction.flow.contextualTypeArguments\r\n      );\r\n    } else {\r\n      classInstance = this.resolver.resolveClassInclTypeArguments(\r\n        classPrototype,\r\n        typeArguments,\r\n        currentFunction.flow.contextualTypeArguments,\r\n        expression\r\n      );\r\n    }\r\n    if (!classInstance) return module.createUnreachable();\r\n\r\n    var expr: ExpressionRef;\r\n\r\n    // traverse to the first matching constructor\r\n    var currentClassInstance: Class | null = classInstance;\r\n    var constructorInstance = classInstance.constructorInstance;\r\n    while (!constructorInstance && (currentClassInstance = classInstance.base)) {\r\n      constructorInstance = currentClassInstance.constructorInstance;\r\n    }\r\n\r\n    // if a constructor is present, call it with a zero `this`\r\n    if (constructorInstance) {\r\n      expr = this.compileCallDirect(constructorInstance, expression.arguments, expression,\r\n        options.usizeType.toNativeZero(module)\r\n      );\r\n\r\n    // otherwise simply allocate a new instance and initialize its fields\r\n    } else {\r\n      expr = this.makeAllocate(classInstance, expression);\r\n    }\r\n\r\n    this.currentType = classInstance.type;\r\n    return expr;\r\n  }\r\n\r\n  compileParenthesizedExpression(\r\n    expression: ParenthesizedExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    // does not change types, just order\r\n    return this.compileExpression(\r\n      expression.expression,\r\n      contextualType,\r\n      ConversionKind.NONE,\r\n      WrapMode.NONE\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Compiles a property access in the specified context.\r\n   * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n   *  precomputes them according to context.\r\n   */\r\n  compilePropertyAccessExpression(\r\n    propertyAccess: PropertyAccessExpression,\r\n    contextualType: Type,\r\n    retainConstantType: bool\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n\r\n    var target = this.resolver.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n    if (!target) return module.createUnreachable();\r\n\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL: { // static property\r\n        if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field\r\n          return module.createUnreachable();\r\n        }\r\n        let globalType = (<Global>target).type;\r\n        assert(globalType != Type.void);\r\n        if ((<Global>target).is(CommonFlags.INLINED)) {\r\n          return this.compileInlineConstant(<Global>target, contextualType, retainConstantType);\r\n        }\r\n        this.currentType = globalType;\r\n        return module.createGetGlobal((<Global>target).internalName, globalType.toNativeType());\r\n      }\r\n      case ElementKind.ENUMVALUE: { // enum value\r\n        let parent = (<EnumValue>target).parent;\r\n        assert(parent !== null && parent.kind == ElementKind.ENUM);\r\n        if (!this.compileEnum(<Enum>parent)) {\r\n          return this.module.createUnreachable();\r\n        }\r\n        this.currentType = Type.i32;\r\n        if ((<EnumValue>target).is(CommonFlags.INLINED)) {\r\n          return module.createI32((<EnumValue>target).constantValue);\r\n        }\r\n        return module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);\r\n      }\r\n      case ElementKind.FIELD: { // instance field\r\n        let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n        assert((<Field>target).memoryOffset >= 0);\r\n        let thisExpr = this.compileExpressionRetainType(\r\n          thisExpression,\r\n          this.options.usizeType,\r\n          WrapMode.NONE\r\n        );\r\n        this.currentType = (<Field>target).type;\r\n        return module.createLoad(\r\n          (<Field>target).type.byteSize,\r\n          (<Field>target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n          thisExpr,\r\n          (<Field>target).type.toNativeType(),\r\n          (<Field>target).memoryOffset\r\n        );\r\n      }\r\n      case ElementKind.PROPERTY: { // instance property (here: getter)\r\n        let prototype = (<Property>target).getterPrototype;\r\n        if (prototype) {\r\n          let instance = this.resolver.resolveFunction(prototype, null);\r\n          if (!instance) return module.createUnreachable();\r\n          let signature = instance.signature;\r\n          if (!this.checkCallSignature( // reports\r\n            signature,\r\n            0,\r\n            instance.is(CommonFlags.INSTANCE),\r\n            propertyAccess\r\n          )) {\r\n            return module.createUnreachable();\r\n          }\r\n          let inline = (instance.decoratorFlags & DecoratorFlags.INLINE) != 0;\r\n          if (instance.is(CommonFlags.INSTANCE)) {\r\n            let parent = assert(instance.parent);\r\n            assert(parent.kind == ElementKind.CLASS);\r\n            let thisExpression = assert(this.resolver.resolvedThisExpression);\r\n            let thisExpr = this.compileExpressionRetainType(\r\n              thisExpression,\r\n              this.options.usizeType,\r\n              WrapMode.NONE\r\n            );\r\n            this.currentType = signature.returnType;\r\n            return this.compileCallDirect(instance, [], propertyAccess, thisExpr, inline);\r\n          } else {\r\n            this.currentType = signature.returnType;\r\n            return this.compileCallDirect(instance, [], propertyAccess, 0, inline);\r\n          }\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.range, (<Property>target).simpleName, (<Property>target).parent.toString()\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Operation_not_supported,\r\n      propertyAccess.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n    var ifThen = expression.ifThen;\r\n    var ifElse = expression.ifElse;\r\n    var currentFunction = this.currentFunction;\r\n    var parentFlow = currentFunction.flow;\r\n\r\n    var condExpr = this.makeIsTrueish(\r\n      this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n      this.currentType\r\n    );\r\n\r\n    if (\r\n      !this.options.noTreeShaking ||\r\n      this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n    ) {\r\n      // Try to eliminate unnecesssary branches if the condition is constant\r\n      let condExprPrecomp = this.precomputeExpressionRef(condExpr);\r\n      if (\r\n        getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n        getExpressionType(condExprPrecomp) == NativeType.I32\r\n      ) {\r\n        return getConstValueI32(condExprPrecomp)\r\n          ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\r\n          : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n\r\n      // Otherwise recompile to the original and let the optimizer decide\r\n      } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n        condExpr = this.makeIsTrueish(\r\n          this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n          this.currentType\r\n        );\r\n      }\r\n    }\r\n\r\n    var ifThenFlow = parentFlow.fork();\r\n    currentFunction.flow = ifThenFlow;\r\n    var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\r\n    var ifThenType = this.currentType;\r\n    ifThenFlow.free();\r\n\r\n    var ifElseFlow = parentFlow.fork();\r\n    currentFunction.flow = ifElseFlow;\r\n    var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n    var ifElseType = this.currentType;\r\n    currentFunction.flow = ifElseFlow.free();\r\n\r\n    parentFlow.inheritMutual(ifThenFlow, ifElseFlow);\r\n\r\n    var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\r\n    if (!commonType) {\r\n      this.error(\r\n        DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n        expression.range, ifThenType.toString(), ifElseType.toString()\r\n      );\r\n      this.currentType = contextualType;\r\n      return this.module.createUnreachable();\r\n    }\r\n    ifThenExpr = this.convertExpression(\r\n      ifThenExpr,\r\n      ifThenType,\r\n      commonType,\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE,\r\n      ifThen\r\n    );\r\n    ifElseExpr = this.convertExpression(\r\n      ifElseExpr,\r\n      ifElseType,\r\n      commonType,\r\n      ConversionKind.IMPLICIT,\r\n      WrapMode.NONE,\r\n      ifElse\r\n    );\r\n    this.currentType = commonType;\r\n    return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\r\n  }\r\n\r\n  compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n\r\n    // make a getter for the expression (also obtains the type)\r\n    var getValue = this.compileExpression( // reports\r\n      expression.operand,\r\n      contextualType == Type.void\r\n        ? Type.i32\r\n        : contextualType,\r\n      ConversionKind.NONE,\r\n      WrapMode.NONE\r\n    );\r\n    // shortcut if compiling the getter already failed\r\n    if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\r\n    var currentType = this.currentType;\r\n\r\n    var op: BinaryOp;\r\n    var nativeType: NativeType;\r\n    var nativeOne: ExpressionRef;\r\n\r\n    switch (expression.operator) {\r\n      case Token.PLUS_PLUS: {\r\n\r\n        // TODO: check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        switch (currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            op = BinaryOp.AddI32;\r\n            nativeType = NativeType.I32;\r\n            nativeOne = module.createI32(1);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: // TODO: check operator overload\r\n          case TypeKind.ISIZE: {\r\n            let options = this.options;\r\n            op = options.isWasm64\r\n              ? BinaryOp.AddI64\r\n              : BinaryOp.AddI32;\r\n            nativeType = options.nativeSizeType;\r\n            nativeOne = currentType.toNativeOne(module);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            op = BinaryOp.AddI64;\r\n            nativeType = NativeType.I64;\r\n            nativeOne = module.createI64(1);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            op = BinaryOp.AddF32;\r\n            nativeType = NativeType.F32;\r\n            nativeOne = module.createF32(1);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            op = BinaryOp.AddF64;\r\n            nativeType = NativeType.F64;\r\n            nativeOne = module.createF64(1);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_MINUS: {\r\n\r\n        // TODO: check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return this.module.createUnreachable();\r\n        }\r\n\r\n        switch (currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            op = BinaryOp.SubI32;\r\n            nativeType = NativeType.I32;\r\n            nativeOne = module.createI32(1);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE: // TODO: check operator overload\r\n          case TypeKind.ISIZE: {\r\n            let options = this.options;\r\n            op = options.isWasm64\r\n              ? BinaryOp.SubI64\r\n              : BinaryOp.SubI32;\r\n            nativeType = options.nativeSizeType;\r\n            nativeOne = currentType.toNativeOne(module);\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            op = BinaryOp.SubI64;\r\n            nativeType = NativeType.I64;\r\n            nativeOne = module.createI64(1);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            op = BinaryOp.SubF32;\r\n            nativeType = NativeType.F32;\r\n            nativeOne = module.createF32(1);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            op = BinaryOp.SubF64;\r\n            nativeType = NativeType.F64;\r\n            nativeOne = module.createF64(1);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            return module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n\r\n    // simplify if dropped anyway\r\n    if (contextualType == Type.void) {\r\n      return this.compileAssignmentWithValue(expression.operand,\r\n        module.createBinary(op,\r\n          getValue,\r\n          nativeOne\r\n        ),\r\n        false\r\n      );\r\n    }\r\n\r\n    // otherwise use a temp local for the intermediate value (always possibly overflows)\r\n    var tempLocal = currentFunction.getTempLocal(currentType, false);\r\n    var setValue = this.compileAssignmentWithValue(expression.operand,\r\n      module.createBinary(op,\r\n        this.module.createGetLocal(tempLocal.index, nativeType),\r\n        nativeOne\r\n      ),\r\n      false\r\n    );\r\n    this.currentType = assert(tempLocal).type;\r\n    currentFunction.freeTempLocal(<Local>tempLocal);\r\n\r\n    var localIndex = (<Local>tempLocal).index;\r\n    return module.createBlock(null, [\r\n      module.createSetLocal(localIndex, getValue),\r\n      setValue,\r\n      module.createGetLocal(localIndex, nativeType)\r\n    ], nativeType); // result of 'x++' / 'x--' might overflow\r\n  }\r\n\r\n  compileUnaryPrefixExpression(\r\n    expression: UnaryPrefixExpression,\r\n    contextualType: Type\r\n  ): ExpressionRef {\r\n    var module = this.module;\r\n    var compound = false;\r\n    var expr: ExpressionRef;\r\n\r\n    switch (expression.operator) {\r\n      case Token.PLUS: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PLUS);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        // nop\r\n        break;\r\n      }\r\n      case Token.MINUS: {\r\n        if (expression.operand.kind == NodeKind.LITERAL && (\r\n          (<LiteralExpression>expression.operand).literalKind == LiteralKind.INTEGER ||\r\n          (<LiteralExpression>expression.operand).literalKind == LiteralKind.FLOAT\r\n        )) {\r\n          // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n          expr = this.compileLiteralExpression(<LiteralExpression>expression.operand, contextualType, true);\r\n          // compileExpression normally does this:\r\n          if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n          break;\r\n        }\r\n\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.MINUS);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              this.currentType.toNativeZero(module),\r\n              expr\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createUnary(UnaryOp.NegF32, expr);\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createUnary(UnaryOp.NegF64, expr);\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.PLUS_PLUS: {\r\n        compound = true;\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.AddI64\r\n                : BinaryOp.AddI32,\r\n              expr,\r\n              this.currentType.toNativeOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.MINUS_MINUS: {\r\n        compound = true;\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              expr,\r\n              this.currentType.toNativeOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.EXCLAMATION: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.NOT);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          // allow '!' for references even without an overload\r\n        }\r\n\r\n        expr = this.makeIsFalseish(expr, this.currentType);\r\n        this.currentType = Type.bool;\r\n        break;\r\n      }\r\n      case Token.TILDE: {\r\n        expr = this.compileExpression(\r\n          expression.operand,\r\n          contextualType == Type.void\r\n            ? Type.i32\r\n            : contextualType.is(TypeFlags.FLOAT)\r\n              ? Type.i64\r\n              : contextualType,\r\n          ConversionKind.NONE,\r\n          WrapMode.NONE\r\n        );\r\n\r\n        // check operator overload\r\n        if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n          let classReference = this.currentType.classReference;\r\n          if (classReference) {\r\n            let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\r\n            if (overload) {\r\n              expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n              break;\r\n            }\r\n          }\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            expression.range\r\n          );\r\n          return module.createUnreachable();\r\n        } else {\r\n          expr = this.convertExpression(\r\n            expr,\r\n            this.currentType, this.currentType.intType,\r\n            ConversionKind.IMPLICIT, WrapMode.NONE,\r\n            expression.operand\r\n          );\r\n        }\r\n\r\n        switch (this.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.I32:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.U32:\r\n          case TypeKind.BOOL: {\r\n            expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\r\n            break;\r\n          }\r\n          case TypeKind.USIZE:\r\n          case TypeKind.ISIZE: {\r\n            expr = module.createBinary(\r\n              this.options.isWasm64\r\n                ? BinaryOp.XorI64\r\n                : BinaryOp.XorI32,\r\n              expr,\r\n              this.currentType.toNativeNegOne(module)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\r\n            break;\r\n          }\r\n          default: {\r\n            assert(false);\r\n            expr = module.createUnreachable();\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case Token.TYPEOF: {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          expression.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createUnreachable();\r\n      }\r\n    }\r\n    return compound\r\n      ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n      : expr;\r\n  }\r\n\r\n  /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\r\n  ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    var flow = this.currentFunction.flow;\r\n    switch (type.kind) {\r\n      case TypeKind.I8: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n            ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\r\n            : module.createBinary(BinaryOp.ShrI32,\r\n                module.createBinary(BinaryOp.ShlI32,\r\n                  expr,\r\n                  module.createI32(24)\r\n                ),\r\n                module.createI32(24)\r\n              );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.I16: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n            ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\r\n            : module.createBinary(BinaryOp.ShrI32,\r\n                module.createBinary(BinaryOp.ShlI32,\r\n                  expr,\r\n                  module.createI32(16)\r\n                ),\r\n                module.createI32(16)\r\n              );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.U8: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0xff)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.U16: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0xffff)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n      case TypeKind.BOOL: {\r\n        if (flow.canOverflow(expr, type)) {\r\n          expr = module.createBinary(BinaryOp.AndI32,\r\n            expr,\r\n            module.createI32(0x1)\r\n          );\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /** Creates a comparison whether an expression is 'false' in a broader sense. */\r\n  makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    switch (type.kind) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16:\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        expr = this.ensureSmallIntegerWrap(expr, type);\r\n        // fall-through\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return module.createUnary(UnaryOp.EqzI32, expr);\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return module.createUnary(UnaryOp.EqzI64, expr);\r\n      }\r\n      case TypeKind.USIZE: // TODO: strings?\r\n      case TypeKind.ISIZE: {\r\n        return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n      }\r\n      case TypeKind.F32: {\r\n        return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n      }\r\n      case TypeKind.F64: {\r\n        return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createI32(1);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Creates a comparison whether an expression is 'true' in a broader sense. */\r\n  makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n    var module = this.module;\r\n    switch (type.kind) {\r\n      case TypeKind.I8:\r\n      case TypeKind.I16:\r\n      case TypeKind.U8:\r\n      case TypeKind.U16:\r\n      case TypeKind.BOOL: {\r\n        expr = this.ensureSmallIntegerWrap(expr, type);\r\n        // fall-through\r\n      }\r\n      case TypeKind.I32:\r\n      case TypeKind.U32: {\r\n        return expr;\r\n      }\r\n      case TypeKind.I64:\r\n      case TypeKind.U64: {\r\n        return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n      }\r\n      case TypeKind.USIZE: // TODO: strings?\r\n      case TypeKind.ISIZE: {\r\n        return type.size == 64\r\n          ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n          : expr;\r\n      }\r\n      case TypeKind.F32: {\r\n        return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n      }\r\n      case TypeKind.F64: {\r\n        return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n      }\r\n      default: {\r\n        assert(false);\r\n        return module.createI32(0);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Makes an allocation expression for an instance of the specified class. */\r\n  makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n    var module = this.module;\r\n    var currentFunction = this.currentFunction;\r\n    var nativeSizeType = this.options.nativeSizeType;\r\n\r\n    // allocate the necessary memory and tee the pointer to a temp. local for reuse\r\n    var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\r\n    var initializers = new Array<ExpressionRef>();\r\n    initializers.push(\r\n      module.createSetLocal(tempLocal.index,\r\n        compileBuiltinAllocate(this, classInstance, reportNode)\r\n      )\r\n    );\r\n\r\n    // apply field initializers\r\n    if (classInstance.members) {\r\n      for (let member of classInstance.members.values()) {\r\n        if (member.kind == ElementKind.FIELD) {\r\n          let field = <Field>member;\r\n          let fieldType = field.type;\r\n          let nativeFieldType = fieldType.toNativeType();\r\n          let fieldDeclaration = field.prototype.declaration;\r\n          assert(!field.isAny(CommonFlags.CONST));\r\n          if (fieldDeclaration.initializer) { // use initializer\r\n            initializers.push(module.createStore(fieldType.byteSize,\r\n              module.createGetLocal(tempLocal.index, nativeSizeType),\r\n              this.compileExpression( // reports\r\n                fieldDeclaration.initializer,\r\n                fieldType,\r\n                ConversionKind.IMPLICIT,\r\n                WrapMode.NONE\r\n              ),\r\n              nativeFieldType,\r\n              field.memoryOffset\r\n            ));\r\n          } else { // initialize with zero\r\n            // TODO: might be unnecessary if the ctor initializes the field\r\n            let parameterIndex = (<FieldDeclaration>field.prototype.declaration).parameterIndex;\r\n            initializers.push(module.createStore(fieldType.byteSize,\r\n              module.createGetLocal(tempLocal.index, nativeSizeType),\r\n              parameterIndex >= 0 // initialized via parameter\r\n                ? module.createGetLocal(1 + parameterIndex, nativeFieldType)\r\n                : fieldType.toNativeZero(module),\r\n                nativeFieldType,\r\n              field.memoryOffset\r\n            ));\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // return `this`\r\n    initializers.push(\r\n      module.createGetLocal(tempLocal.index, nativeSizeType)\r\n    );\r\n\r\n    currentFunction.freeTempLocal(tempLocal);\r\n    this.currentType = classInstance.type;\r\n    return module.createBlock(null, initializers, nativeSizeType);\r\n  }\r\n\r\n  /** Makes a conditional allocation expression inside of the constructor of the specified class. */\r\n  makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n    // requires that `this` is the first local\r\n    var module = this.module;\r\n    var nativeSizeType = this.options.nativeSizeType;\r\n    this.currentType = classInstance.type;\r\n    return module.createIf(\r\n      nativeSizeType == NativeType.I64\r\n        ? module.createBinary(\r\n            BinaryOp.NeI64,\r\n            module.createGetLocal(0, NativeType.I64),\r\n            module.createI64(0)\r\n          )\r\n        : module.createGetLocal(0, NativeType.I32),\r\n      module.createGetLocal(0, nativeSizeType),\r\n      module.createTeeLocal(0,\r\n        this.makeAllocate(classInstance, reportNode)\r\n      )\r\n    );\r\n  }\r\n\r\n  /** Adds the debug location of the specified expression at the specified range to the source map. */\r\n  addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n    var currentFunction = this.currentFunction;\r\n    var source = range.source;\r\n    if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n    range.debugInfoRef = expr;\r\n    currentFunction.debugLocations.push(range);\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\nfunction mangleExportName(element: Element, simpleName: string = element.simpleName): string {\r\n  switch (element.kind) {\r\n    case ElementKind.FUNCTION: {\r\n      let parent = (<Function>element).parent || (<Function>element).prototype.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n    case ElementKind.FIELD: {\r\n      let parent = assert((<Field>element).parent);\r\n      return mangleExportName(parent)\r\n          + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n          + simpleName;\r\n    }\r\n    case ElementKind.ENUMVALUE: {\r\n      let parent = assert((<EnumValue>element).parent);\r\n      return mangleExportName(parent)\r\n          + (element.is(CommonFlags.INSTANCE) ? INSTANCE_DELIMITER : STATIC_DELIMITER)\r\n          + simpleName;\r\n    }\r\n    case ElementKind.CLASS: {\r\n      let parent = (<Class>element).prototype.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + STATIC_DELIMITER\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n    default: {\r\n      let parent = element.parent;\r\n      return parent\r\n        ? mangleExportName(parent)\r\n        + STATIC_DELIMITER\r\n        + simpleName\r\n        : simpleName;\r\n    }\r\n  }\r\n}\r\n\r\nfunction mangleImportName(\r\n  element: Element,\r\n  declaration: DeclarationStatement,\r\n  parentElement: Element | null = null\r\n): void {\r\n  mangleImportName_moduleName = parentElement ? parentElement.simpleName : declaration.range.source.simplePath;\r\n  mangleImportName_elementName = element.simpleName;\r\n\r\n  if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\r\n\r\n  var program = element.program;\r\n  var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n  var args = decorator.arguments;\r\n  if (args && args.length) {\r\n    let arg = args[0];\r\n    if (arg.kind == NodeKind.LITERAL && (<LiteralExpression>arg).literalKind == LiteralKind.STRING) {\r\n      mangleImportName_elementName = (<StringLiteralExpression>arg).value;\r\n      if (args.length >= 2) {\r\n        arg = args[1];\r\n        if (arg.kind == NodeKind.LITERAL && (<LiteralExpression>arg).literalKind == LiteralKind.STRING) {\r\n          mangleImportName_moduleName = mangleImportName_elementName;\r\n          mangleImportName_elementName = (<StringLiteralExpression>arg).value;\r\n          if (args.length > 2) {\r\n            program.error(\r\n              DiagnosticCode.Expected_0_arguments_but_got_1,\r\n              decorator.range, \"2\", args.length.toString()\r\n            );\r\n          }\r\n        } else {\r\n          program.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            arg.range\r\n          );\r\n        }\r\n      }\r\n    } else {\r\n      program.error(\r\n        DiagnosticCode.String_literal_expected,\r\n        arg.range\r\n      );\r\n    }\r\n  } else {\r\n    program.error(\r\n      DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n      decorator.range, \"1\", \"0\"\r\n    );\r\n  }\r\n}\r\n\r\nvar mangleImportName_moduleName: string;\r\nvar mangleImportName_elementName: string;\r\n","/**\r\n * A TypeScript parser for the AssemblyScript subset.\r\n * @module parser\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags,\r\n  LIBRARY_PREFIX,\r\n  PATH_DELIMITER\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program\r\n} from \"./program\";\r\n\r\nimport {\r\n  Tokenizer,\r\n  Token,\r\n  Range,\r\n  CommentHandler,\r\n  IdentifierHandling\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n  DiagnosticCode,\r\n  DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  normalizePath\r\n} from \"./util\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Source,\r\n  SourceKind,\r\n  CommonTypeNode,\r\n  TypeNode,\r\n  SignatureNode,\r\n\r\n  Expression,\r\n  AssertionKind,\r\n  CallExpression,\r\n  ClassExpression,\r\n  FunctionExpression,\r\n  IdentifierExpression,\r\n  StringLiteralExpression,\r\n\r\n  Statement,\r\n  BlockStatement,\r\n  BreakStatement,\r\n  ClassDeclaration,\r\n  ContinueStatement,\r\n  DeclarationStatement,\r\n  DecoratorNode,\r\n  DoStatement,\r\n  EnumDeclaration,\r\n  EnumValueDeclaration,\r\n  ExportImportStatement,\r\n  ExportMember,\r\n  ExportStatement,\r\n  ExpressionStatement,\r\n  ForStatement,\r\n  FunctionDeclaration,\r\n  IfStatement,\r\n  ImportDeclaration,\r\n  ImportStatement,\r\n  NamespaceDeclaration,\r\n  ParameterNode,\r\n  ParameterKind,\r\n  ReturnStatement,\r\n  SwitchCase,\r\n  SwitchStatement,\r\n  ThrowStatement,\r\n  TryStatement,\r\n  TypeDeclaration,\r\n  TypeParameterNode,\r\n  VariableStatement,\r\n  VariableDeclaration,\r\n  VoidStatement,\r\n  WhileStatement,\r\n\r\n  mangleInternalPath,\r\n  nodeIsCallable,\r\n  nodeIsGenericCallable\r\n} from \"./ast\";\r\n\r\nconst builtinsFile = LIBRARY_PREFIX + \"builtins.ts\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n  /** Program being created. */\r\n  program: Program;\r\n  /** Source file names to be requested next. */\r\n  backlog: string[] = new Array();\r\n  /** Source file names already seen, that is processed or backlogged. */\r\n  seenlog: Set<string> = new Set();\r\n  /** Source file names already completely processed. */\r\n  donelog: Set<string> = new Set();\r\n  /** Optional handler to intercept comments while tokenizing. */\r\n  onComment: CommentHandler | null = null;\r\n\r\n  /** Constructs a new parser. */\r\n  constructor() {\r\n    super();\r\n    this.program = new Program(this.diagnostics);\r\n  }\r\n\r\n  /** Parses a file and adds its definitions to the program. */\r\n  parseFile(\r\n    text: string,\r\n    path: string,\r\n    isEntry: bool\r\n  ): void {\r\n    var normalizedPath = normalizePath(path);\r\n    var internalPath = mangleInternalPath(normalizedPath);\r\n\r\n    // check if already processed\r\n    if (this.donelog.has(internalPath)) return;\r\n    this.donelog.add(internalPath); // do not parse again\r\n    this.seenlog.add(internalPath); // do not request again\r\n\r\n    // create the source element\r\n    var source = new Source(\r\n      normalizedPath,\r\n      text,\r\n      isEntry\r\n        ? SourceKind.ENTRY\r\n        : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n          ? SourceKind.LIBRARY\r\n          : SourceKind.DEFAULT\r\n    );\r\n    var program = this.program;\r\n    program.sources.push(source);\r\n\r\n    // mark the special builtins library file\r\n    if (source.normalizedPath == builtinsFile) {\r\n      source.set(CommonFlags.BUILTIN);\r\n    }\r\n\r\n    // tokenize and parse\r\n    var tn = new Tokenizer(source, program.diagnostics);\r\n    tn.onComment = this.onComment;\r\n    source.tokenizer = tn;\r\n    var statements = source.statements;\r\n    while (!tn.skip(Token.ENDOFFILE)) {\r\n      let statement = this.parseTopLevelStatement(tn);\r\n      if (statement) {\r\n        statement.parent = source;\r\n        statements.push(statement);\r\n      }\r\n    }\r\n    tn.finish();\r\n  }\r\n\r\n  /** Parses a top-level statement. */\r\n  parseTopLevelStatement(\r\n    tn: Tokenizer,\r\n    namespace: Node | null = null\r\n  ): Statement | null {\r\n    var flags = CommonFlags.NONE;\r\n    var startPos: i32 = -1;\r\n\r\n    // check decorators\r\n    var decorators: DecoratorNode[] | null = null;\r\n    while (tn.skip(Token.AT)) {\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      let decorator = this.parseDecorator(tn);\r\n      if (!decorator) {\r\n        this.skipStatement(tn);\r\n        continue;\r\n      }\r\n      if (!decorators) decorators = [];\r\n      decorators.push(decorator);\r\n    }\r\n\r\n    // mark builtins\r\n    flags |= (tn.source.flags & CommonFlags.BUILTIN);\r\n\r\n    // check modifiers\r\n    var exportStart: i32 = 0;\r\n    var exportEnd: i32 = 0;\r\n    if (tn.skip(Token.EXPORT)) {\r\n      if (tn.skip(Token.DEFAULT)) {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          tn.range()\r\n        );\r\n      }\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      flags |= CommonFlags.EXPORT;\r\n      exportStart = tn.tokenPos;\r\n      exportEnd = tn.pos;\r\n    }\r\n\r\n    var declareStart: i32 = 0;\r\n    var declareEnd: i32 = 0;\r\n    var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\r\n    if (tn.skip(Token.DECLARE)) {\r\n      if (startPos < 0) startPos = tn.tokenPos;\r\n      if (contextIsAmbient) {\r\n        this.error(\r\n          DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\r\n    } else if (contextIsAmbient) {\r\n      flags |= CommonFlags.AMBIENT;\r\n    }\r\n\r\n    // parse the statement\r\n    var statement: Statement | null = null;\r\n\r\n    // handle declarations\r\n    var first = tn.peek();\r\n    if (startPos < 0) startPos = tn.nextTokenPos;\r\n    switch (first) {\r\n      case Token.CONST: {\r\n        tn.next();\r\n        flags |= CommonFlags.CONST;\r\n        if (tn.skip(Token.ENUM)) {\r\n          statement = this.parseEnum(tn, flags, decorators, startPos);\r\n          break;\r\n        } else {\r\n          statement = this.parseVariable(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        }\r\n        break;\r\n      }\r\n      case Token.LET: flags |= CommonFlags.LET;\r\n      case Token.VAR: {\r\n        tn.next();\r\n        statement = this.parseVariable(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.ENUM: {\r\n        tn.next();\r\n        statement = this.parseEnum(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.FUNCTION: {\r\n        tn.next();\r\n        statement = this.parseFunction(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.ABSTRACT: {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (!tn.skip(Token.CLASS)) {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n          break;\r\n        } else {\r\n          tn.discard(state);\r\n        }\r\n        flags |= CommonFlags.ABSTRACT;\r\n        // fall through\r\n      }\r\n      case Token.CLASS:\r\n      case Token.INTERFACE: {\r\n        tn.next();\r\n        statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\r\n        decorators = null;\r\n        break;\r\n      }\r\n      case Token.NAMESPACE: {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          tn.discard(state);\r\n          statement = this.parseNamespace(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        } else {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n        }\r\n        break;\r\n      }\r\n      case Token.IMPORT: {\r\n        tn.next();\r\n        flags |= CommonFlags.IMPORT;\r\n        if (flags & CommonFlags.EXPORT) {\r\n          statement = this.parseExportImport(tn, startPos);\r\n        } else {\r\n          statement = this.parseImport(tn);\r\n        }\r\n        break;\r\n      }\r\n      case Token.TYPE: { // also identifier\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          tn.discard(state);\r\n          statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\r\n          decorators = null;\r\n        } else {\r\n          tn.reset(state);\r\n          statement = this.parseStatement(tn, true);\r\n        }\r\n        break;\r\n      }\r\n      default: {\r\n\r\n        // handle plain exports\r\n        if (flags & CommonFlags.EXPORT) {\r\n          statement = this.parseExport(tn, flags, startPos);\r\n\r\n        // handle non-declaration statements\r\n        } else {\r\n          if (exportEnd) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(exportStart, exportEnd), \"export\"\r\n            ); // recoverable\r\n          }\r\n          if (declareEnd) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(declareStart, declareEnd), \"declare\"\r\n            ); // recoverable\r\n          }\r\n          if (!namespace) {\r\n            statement = this.parseStatement(tn, true);\r\n          } // TODO: else?\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    // check for decorators that weren't consumed\r\n    if (decorators) {\r\n      for (let i = 0, k = decorators.length; i < k; ++i) {\r\n        this.error(\r\n          DiagnosticCode.Decorators_are_not_valid_here,\r\n          decorators[i].range\r\n        );\r\n      }\r\n    }\r\n    return statement;\r\n  }\r\n\r\n  /** Obtains the next file to parse. */\r\n  nextFile(): string | null {\r\n    var backlog = this.backlog;\r\n    return backlog.length ? backlog.shift() : null;\r\n  }\r\n\r\n  /** Finishes parsing and returns the program. */\r\n  finish(): Program {\r\n    if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n    this.backlog = [];\r\n    this.seenlog.clear();\r\n    this.donelog.clear();\r\n    return this.program;\r\n  }\r\n\r\n  /** Parses a type. */\r\n  parseType(\r\n    tn: Tokenizer,\r\n    acceptParenthesized: bool = true,\r\n    suppressErrors: bool = false\r\n  ): CommonTypeNode | null {\r\n\r\n    // NOTE: this parses our limited subset\r\n    var token = tn.next();\r\n    var startPos = tn.tokenPos;\r\n\r\n    var type: CommonTypeNode;\r\n\r\n    // '(' ...\r\n    if (token == Token.OPENPAREN) {\r\n\r\n      // '(' FunctionSignature ')' '|' 'null'?\r\n      let isNullableSignature = tn.skip(Token.OPENPAREN);\r\n      // FunctionSignature?\r\n      let signature = this.tryParseSignature(tn);\r\n      if (signature) {\r\n        if (isNullableSignature) {\r\n          if (!tn.skip(Token.CLOSEPAREN)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \")\"\r\n            );\r\n            return null;\r\n          }\r\n          if (!tn.skip(Token.BAR)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"|\"\r\n            );\r\n            return null;\r\n          }\r\n          if (!tn.skip(Token.NULL)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"null\"\r\n            );\r\n          }\r\n          signature.isNullable = true;\r\n        }\r\n        return signature;\r\n      } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\r\n        this.error(\r\n          DiagnosticCode.Unexpected_token,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n\r\n      // Type (',' Type)* ')'\r\n      if (acceptParenthesized) {\r\n        let innerType = this.parseType(tn, false, suppressErrors);\r\n        if (!innerType) return null;\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \"}\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n        type = innerType;\r\n        type.range.start = startPos;\r\n        type.range.end = tn.pos;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Unexpected_token,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n\r\n    // 'void'\r\n    } else if (token == Token.VOID) {\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // 'this'\r\n    } else if (token == Token.THIS) {\r\n      type = Node.createType(\r\n        Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // 'true'\r\n    } else if (token == Token.TRUE || token == Token.FALSE) {\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // StringLiteral\r\n    } else if (token == Token.STRINGLITERAL) {\r\n      tn.readString();\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n      );\r\n\r\n    // Identifier\r\n    } else if (token == Token.IDENTIFIER) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let parameters = new Array<TypeNode>();\r\n      let nullable = false;\r\n\r\n      // Name<T>\r\n      if (tn.skip(Token.LESSTHAN)) {\r\n        do {\r\n          let parameter = this.parseType(tn, true, suppressErrors);\r\n          if (!parameter) return null;\r\n          parameters.push(<TypeNode>parameter);\r\n        } while (tn.skip(Token.COMMA));\r\n        if (!tn.skip(Token.GREATERTHAN)) {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \">\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      // ... | null\r\n      if (tn.skip(Token.BAR)) {\r\n        if (tn.skip(Token.NULL)) {\r\n          nullable = true;\r\n        } else {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(tn.pos), \"null\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n    } else {\r\n      if (!suppressErrors) {\r\n        this.error(\r\n          DiagnosticCode.Identifier_expected,\r\n          tn.range()\r\n        );\r\n      }\r\n      return null;\r\n    }\r\n    // ... [][]\r\n    while (tn.skip(Token.OPENBRACKET)) {\r\n      let bracketStart = tn.tokenPos;\r\n      if (!tn.skip(Token.CLOSEBRACKET)) {\r\n        if (!suppressErrors) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"]\"\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      let bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n      // ...[] | null\r\n      let nullable = false;\r\n      if (tn.skip(Token.BAR)) {\r\n        if (tn.skip(Token.NULL)) {\r\n          nullable = true;\r\n        } else {\r\n          if (!suppressErrors) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"null\"\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n      }\r\n      type = Node.createType(\r\n        Node.createIdentifierExpression(\"Array\", bracketRange),\r\n        [ type ],\r\n        nullable,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      if (nullable) break;\r\n    }\r\n\r\n    return type;\r\n  }\r\n\r\n  // Indicates whether tryParseSignature determined that it is handling a Signature\r\n  private tryParseSignatureIsSignature: bool = false;\r\n\r\n  /** Parses a function signature, as used in type declarations. */\r\n  tryParseSignature(\r\n    tn: Tokenizer\r\n  ): SignatureNode | null {\r\n\r\n    // at '(': ('...'? Identifier '?'? ':' Type (','  '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\r\n\r\n    var state = tn.mark();\r\n    var startPos = tn.tokenPos;\r\n    var parameters: ParameterNode[] | null = null;\r\n    var thisType: TypeNode | null = null;\r\n    var isSignature: bool = false;\r\n\r\n    if (tn.skip(Token.CLOSEPAREN)) {\r\n      isSignature = true;\r\n      tn.discard(state);\r\n      parameters = [];\r\n\r\n    } else {\r\n      isSignature = false; // not yet known\r\n      do {\r\n        let kind = ParameterKind.DEFAULT;\r\n        if (tn.skip(Token.DOT_DOT_DOT)) {\r\n          isSignature = true;\r\n          tn.discard(state);\r\n          kind = ParameterKind.REST;\r\n        }\r\n        if (tn.skip(Token.THIS)) {\r\n          if (tn.skip(Token.COLON)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            let t = this.parseType(tn, false);\r\n            if (!t) return null;\r\n            if (t.kind != NodeKind.TYPE) {\r\n              this.error(\r\n                DiagnosticCode.Operation_not_supported,\r\n                t.range\r\n              );\r\n              this.tryParseSignatureIsSignature = true;\r\n              return null;\r\n            }\r\n            thisType = <TypeNode>t;\r\n          } else {\r\n            tn.reset(state);\r\n            this.tryParseSignatureIsSignature = false;\r\n            return null;\r\n          }\r\n        } else if (tn.skipIdentifier()) {\r\n          let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\r\n          if (tn.skip(Token.QUESTION)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            if (kind == ParameterKind.REST) {\r\n              this.error(\r\n                DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n                tn.range()\r\n              ); // recoverable\r\n            } else {\r\n              kind = ParameterKind.OPTIONAL;\r\n            }\r\n          }\r\n          if (tn.skip(Token.COLON)) {\r\n            isSignature = true;\r\n            tn.discard(state);\r\n            let type = this.parseType(tn); // not suppressing errors because known\r\n            if (!type) {\r\n              this.tryParseSignatureIsSignature = isSignature;\r\n              return null;\r\n            }\r\n            let param = new ParameterNode();\r\n            param.parameterKind = kind;\r\n            param.name = name;\r\n            param.type = type;\r\n            if (!parameters) parameters = [ param ];\r\n            else parameters.push(param);\r\n          } else {\r\n            if (isSignature) {\r\n              this.error(\r\n                DiagnosticCode.Type_expected,\r\n                tn.range()\r\n              ); // recoverable\r\n            }\r\n          }\r\n        } else {\r\n          if (isSignature) {\r\n            this.error(\r\n              DiagnosticCode.Identifier_expected,\r\n              tn.range()\r\n            );\r\n          } else {\r\n            tn.reset(state);\r\n          }\r\n          this.tryParseSignatureIsSignature = isSignature;\r\n          return null;\r\n        }\r\n      } while (tn.skip(Token.COMMA));\r\n      if (!tn.skip(Token.CLOSEPAREN)) {\r\n        if (isSignature) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n        this.tryParseSignatureIsSignature = isSignature;\r\n        return null;\r\n      }\r\n    }\r\n\r\n    var returnType: CommonTypeNode | null;\r\n    if (tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n      isSignature = true;\r\n      tn.discard(state);\r\n      returnType = this.parseType(tn);\r\n      if (!returnType) {\r\n        this.tryParseSignatureIsSignature = isSignature;\r\n        return null;\r\n      }\r\n    } else {\r\n      if (isSignature) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=>\"\r\n        );\r\n      } else {\r\n        tn.reset(state);\r\n      }\r\n      this.tryParseSignatureIsSignature = isSignature;\r\n      return null;\r\n    }\r\n    this.tryParseSignatureIsSignature = true;\r\n    return Node.createSignature(\r\n      parameters || [],\r\n      returnType,\r\n      thisType,\r\n      false,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n  }\r\n\r\n  // statements\r\n\r\n  parseDecorator(\r\n    tn: Tokenizer\r\n  ): DecoratorNode | null {\r\n\r\n    // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skipIdentifier()) {\r\n      let name = tn.readIdentifier();\r\n      let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n      while (tn.skip(Token.DOT)) {\r\n        if (tn.skipIdentifier()) {\r\n          name = tn.readIdentifier();\r\n          expression = Node.createPropertyAccessExpression(\r\n            expression,\r\n            Node.createIdentifierExpression(name, tn.range()),\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      let args: Expression[] | null;\r\n      if (tn.skip(Token.OPENPAREN)) {\r\n        args = this.parseArguments(tn);\r\n        if (args) {\r\n          return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n        }\r\n      } else {\r\n        return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseVariable(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): VariableStatement | null {\r\n\r\n    // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n    var members = new Array<VariableDeclaration>();\r\n    do {\r\n      let member = this.parseVariableDeclaration(tn, flags, decorators);\r\n      if (!member) return null;\r\n      members.push(<VariableDeclaration>member);\r\n    } while (tn.skip(Token.COMMA));\r\n\r\n    var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseVariableDeclaration(\r\n    tn: Tokenizer,\r\n    parentFlags: CommonFlags,\r\n    parentDecorators: DecoratorNode[] | null\r\n  ): VariableDeclaration | null {\r\n\r\n    // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var flags = parentFlags;\r\n\r\n    var type: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      type = this.parseType(tn);\r\n    }\r\n\r\n    var initializer: Expression | null = null;\r\n    if (tn.skip(Token.EQUALS)) {\r\n      if (flags & CommonFlags.AMBIENT) {\r\n        this.error(\r\n          DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!initializer) return null;\r\n    } else {\r\n      if (flags & CommonFlags.CONST) {\r\n        if (!(flags & CommonFlags.AMBIENT)) {\r\n          this.error(\r\n            DiagnosticCode._const_declarations_must_be_initialized,\r\n            identifier.range\r\n          ); // recoverable\r\n        }\r\n      } else if (!type) { // neither type nor initializer\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          tn.range(tn.pos)\r\n        ); // recoverable\r\n      }\r\n    }\r\n    return Node.createVariableDeclaration(\r\n      identifier,\r\n      type,\r\n      initializer,\r\n      parentDecorators,\r\n      flags,\r\n      Range.join(identifier.range, tn.range())\r\n    );\r\n  }\r\n\r\n  parseEnum(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): EnumDeclaration | null {\r\n\r\n    // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n    if (tn.next() != Token.IDENTIFIER) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    if (tn.next() != Token.OPENBRACE) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n    var members = new Array<EnumValueDeclaration>();\r\n    while (!tn.skip(Token.CLOSEBRACE)) {\r\n      let member = this.parseEnumValue(tn, CommonFlags.NONE);\r\n      if (!member) return null;\r\n      members.push(<EnumValueDeclaration>member);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEBRACE)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"}\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    var ret = Node.createEnumDeclaration(\r\n      identifier,\r\n      members,\r\n      decorators,\r\n      flags,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseEnumValue(\r\n    tn: Tokenizer,\r\n    parentFlags: CommonFlags\r\n  ): EnumValueDeclaration | null {\r\n\r\n    // before: Identifier ('=' Expression)?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n    var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var value: Expression | null = null;\r\n    if (tn.skip(Token.EQUALS)) {\r\n      value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!value) return null;\r\n    }\r\n    return Node.createEnumValueDeclaration(\r\n      identifier,\r\n      value,\r\n      parentFlags,\r\n      Range.join(identifier.range, tn.range())\r\n    );\r\n  }\r\n\r\n  parseReturn(\r\n    tn: Tokenizer\r\n  ): ReturnStatement | null {\r\n\r\n    // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n    var expr: Expression | null = null;\r\n    if (\r\n      tn.peek(true) != Token.SEMICOLON &&\r\n      tn.nextToken != Token.CLOSEBRACE &&\r\n      !tn.nextTokenOnNewLine\r\n    ) {\r\n      if (!(expr = this.parseExpression(tn))) return null;\r\n    }\r\n\r\n    var ret = Node.createReturnStatement(expr, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseTypeParameters(\r\n    tn: Tokenizer\r\n  ): TypeParameterNode[] | null {\r\n\r\n    // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n    var typeParameters = new Array<TypeParameterNode>();\r\n    while (!tn.skip(Token.GREATERTHAN)) {\r\n      let typeParameter = this.parseTypeParameter(tn);\r\n      if (!typeParameter) return null;\r\n      typeParameters.push(<TypeParameterNode>typeParameter);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.GREATERTHAN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \">\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    if (typeParameters.length === 0) {\r\n      this.error(\r\n        DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n        tn.range()\r\n      ); // recoverable\r\n    }\r\n    return typeParameters;\r\n  }\r\n\r\n  parseTypeParameter(\r\n    tn: Tokenizer\r\n  ): TypeParameterNode | null {\r\n\r\n    // before: Identifier ('extends' Type)?\r\n\r\n    if (tn.next() == Token.IDENTIFIER) {\r\n      let identifier = Node.createIdentifierExpression(\r\n        tn.readIdentifier(),\r\n        tn.range()\r\n      );\r\n      let extendsType: TypeNode | null = null;\r\n      if (tn.skip(Token.EXTENDS)) {\r\n        let t = this.parseType(tn);\r\n        if (!t) return null;\r\n        if (t.kind != NodeKind.TYPE) {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            t.range\r\n          );\r\n          return null;\r\n        }\r\n        extendsType = <TypeNode>t;\r\n      }\r\n      return Node.createTypeParameter(\r\n        identifier,\r\n        extendsType,\r\n        Range.join(identifier.range, tn.range())\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private parseParametersThis: TypeNode | null = null;\r\n\r\n  parseParameters(\r\n    tn: Tokenizer,\r\n    isConstructor: bool = false\r\n  ): ParameterNode[] | null {\r\n\r\n    // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n    var parameters = new Array<ParameterNode>();\r\n    var seenRest: ParameterNode | null = null;\r\n    var seenOptional = false;\r\n    var reportedRest = false;\r\n    var thisType: CommonTypeNode | null = null;\r\n\r\n    // check if there is a leading `this` parameter\r\n    this.parseParametersThis = null;\r\n    if (tn.skip(Token.THIS)) {\r\n      if (tn.skip(Token.COLON)) {\r\n        thisType = this.parseType(tn); // reports\r\n        if (!thisType) return null;\r\n        if (thisType.kind == NodeKind.TYPE) {\r\n          this.parseParametersThis = <TypeNode>thisType;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            thisType.range\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n        return null;\r\n      }\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          return parameters;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n\r\n    while (!tn.skip(Token.CLOSEPAREN)) {\r\n      let param = this.parseParameter(tn, isConstructor); // reports\r\n      if (!param) return null;\r\n      if (seenRest && !reportedRest) {\r\n        this.error(\r\n          DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n          seenRest.name.range\r\n        );\r\n        reportedRest = true;\r\n      }\r\n      switch (param.parameterKind) {\r\n        default: {\r\n          if (seenOptional) {\r\n            this.error(\r\n              DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n              param.name.range\r\n            );\r\n          }\r\n          break;\r\n        }\r\n        case ParameterKind.OPTIONAL: {\r\n          seenOptional = true;\r\n          break;\r\n        }\r\n        case ParameterKind.REST: {\r\n          seenRest = param;\r\n          break;\r\n        }\r\n      }\r\n      parameters.push(param);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    return parameters;\r\n  }\r\n\r\n  parseParameter(\r\n    tn: Tokenizer,\r\n    isConstructor: bool = false\r\n  ): ParameterNode | null {\r\n\r\n    // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n    var isRest = false;\r\n    var isOptional = false;\r\n    var startRange: Range | null = null;\r\n    var accessFlags: CommonFlags = CommonFlags.NONE;\r\n    if (isConstructor) {\r\n      if (tn.skip(Token.PUBLIC)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PUBLIC;\r\n      } else if (tn.skip(Token.PROTECTED)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PROTECTED;\r\n      } else if (tn.skip(Token.PRIVATE)) {\r\n        startRange = tn.range();\r\n        accessFlags |= CommonFlags.PRIVATE;\r\n      }\r\n      if (tn.peek() == Token.READONLY) {\r\n        let state = tn.mark();\r\n        tn.next();\r\n        if (tn.peek() != Token.COLON) { // modifier\r\n          tn.discard(state);\r\n          if (!startRange) startRange = tn.range();\r\n          accessFlags |= CommonFlags.READONLY;\r\n        } else { // identifier\r\n          tn.reset(state);\r\n        }\r\n      }\r\n    }\r\n    if (tn.skip(Token.DOT_DOT_DOT)) {\r\n      if (accessFlags) {\r\n        this.error(\r\n          DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\r\n          tn.range()\r\n        );\r\n      } else {\r\n        startRange = tn.range();\r\n      }\r\n      isRest = true;\r\n    }\r\n    if (tn.skipIdentifier()) {\r\n      if (!isRest) startRange = tn.range();\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let type: CommonTypeNode | null = null;\r\n      if (isOptional = tn.skip(Token.QUESTION)) {\r\n        if (isRest) {\r\n          this.error(\r\n            DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n            identifier.range\r\n          );\r\n        }\r\n      }\r\n      if (tn.skip(Token.COLON)) {\r\n        type = this.parseType(tn);\r\n        if (!type) return null;\r\n      } else {\r\n        type = Node.createOmittedType(tn.range(tn.pos));\r\n      }\r\n      let initializer: Expression | null = null;\r\n      if (tn.skip(Token.EQUALS)) {\r\n        if (isRest) {\r\n          this.error(\r\n            DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n            identifier.range\r\n          );\r\n        }\r\n        if (isOptional) {\r\n          this.error(\r\n            DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n            identifier.range\r\n          );\r\n        } else {\r\n          isOptional = true;\r\n        }\r\n        initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n        if (!initializer) return null;\r\n      }\r\n      let param = Node.createParameter(\r\n        identifier,\r\n        type,\r\n        initializer,\r\n        isRest\r\n          ? ParameterKind.REST\r\n          : isOptional\r\n            ? ParameterKind.OPTIONAL\r\n            : ParameterKind.DEFAULT,\r\n        Range.join(<Range>startRange, tn.range())\r\n      );\r\n      param.flags |= accessFlags;\r\n      return param;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseFunction(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): FunctionDeclaration | null {\r\n\r\n    // at 'function':\r\n    //  Identifier\r\n    //  ('<' TypeParameters)?\r\n    //  '(' Parameters (':' Type)?\r\n    //  '{' Statement* '}'\r\n    //  ';'?\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range(tn.pos)\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var signatureStart: i32 = -1;\r\n\r\n    var typeParameters: TypeParameterNode[] | null = null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      signatureStart = tn.tokenPos;\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      flags |= CommonFlags.GENERIC;\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENPAREN)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(tn.pos), \"(\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    if (signatureStart < 0) {\r\n      signatureStart = tn.tokenPos;\r\n    }\r\n\r\n    var parameters = this.parseParameters(tn);\r\n    if (!parameters) return null;\r\n    var thisType = this.parseParametersThis;\r\n\r\n    var isSetter = (flags & CommonFlags.SET) != 0;\r\n    if (isSetter) {\r\n      if (parameters.length != 1) {\r\n        this.error(\r\n          DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n      if (parameters.length && parameters[0].initializer) {\r\n        this.error(\r\n          DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    if (flags & CommonFlags.GET) {\r\n      if (parameters.length) {\r\n        this.error(\r\n          DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n          name.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    var returnType: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      returnType = this.parseType(tn, true, isSetter);\r\n      if (!returnType) return null;\r\n    }\r\n\r\n    if (!returnType) {\r\n      returnType = Node.createOmittedType(\r\n        tn.range(tn.pos)\r\n      );\r\n      if (!isSetter) {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          returnType.range\r\n        ); // recoverable\r\n      }\r\n    }\r\n\r\n    var signature = Node.createSignature(\r\n      parameters,\r\n      returnType,\r\n      thisType,\r\n      false,\r\n      tn.range(signatureStart, tn.pos)\r\n    );\r\n\r\n    var body: Statement | null = null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      if (flags & CommonFlags.AMBIENT) {\r\n        this.error(\r\n          DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n\r\n      body = this.parseBlockStatement(tn, false);\r\n      if (!body) return null;\r\n    } else if (!(flags & CommonFlags.AMBIENT)) {\r\n      this.error(\r\n        DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n        tn.range(tn.pos)\r\n      );\r\n    }\r\n\r\n    var ret = Node.createFunctionDeclaration(\r\n      name,\r\n      typeParameters,\r\n      signature,\r\n      body,\r\n      decorators,\r\n      flags,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\r\n    var startPos = tn.tokenPos;\r\n    var name: IdentifierExpression;\r\n    var isArrow = false;\r\n\r\n    // either at 'function':\r\n    //  Identifier?\r\n    //  '(' Parameters (':' Type)?\r\n    //  Statement\r\n\r\n    if (tn.token == Token.FUNCTION) {\r\n      if (tn.skipIdentifier()) {\r\n        name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      } else { // empty name\r\n        name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n      }\r\n      if (!tn.skip(Token.OPENPAREN)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"(\"\r\n        );\r\n        return null;\r\n      }\r\n\r\n    // or at '(' of arrow function:\r\n    //  Parameters (':' Type)?\r\n    //  Statement\r\n\r\n    } else {\r\n      isArrow = true;\r\n      assert(tn.token == Token.OPENPAREN);\r\n      name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\r\n    }\r\n\r\n    // TODO: type parameters? doesn't seem worth it.\r\n\r\n    var signatureStart = tn.pos;\r\n    var parameters = this.parseParameters(tn);\r\n    if (!parameters) return null;\r\n\r\n    return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\r\n  }\r\n\r\n  private parseFunctionExpressionCommon(\r\n    tn: Tokenizer,\r\n    name: IdentifierExpression,\r\n    parameters: ParameterNode[],\r\n    isArrow: bool,\r\n    startPos: i32 = -1,\r\n    signatureStart: i32 = -1\r\n  ): FunctionExpression | null {\r\n    if (startPos < 0) startPos = name.range.start;\r\n    if (signatureStart < 0) signatureStart = startPos;\r\n\r\n    var returnType: CommonTypeNode | null = null;\r\n    if (tn.skip(Token.COLON)) {\r\n      returnType = this.parseType(tn);\r\n      if (!returnType) return null;\r\n    } else {\r\n      returnType = Node.createOmittedType(tn.range(tn.pos));\r\n      this.error(\r\n        DiagnosticCode.Type_expected,\r\n        returnType.range\r\n      ); // recoverable\r\n    }\r\n\r\n    if (isArrow) {\r\n      if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"=>\"\r\n        );\r\n        return null;\r\n      }\r\n    }\r\n\r\n    var signature = Node.createSignature(\r\n      parameters,\r\n      returnType,\r\n      null, // TODO?\r\n      false,\r\n      tn.range(signatureStart, tn.pos)\r\n    );\r\n\r\n    var body: Statement | null;\r\n    if (isArrow) {\r\n      body = this.parseStatement(tn, false);\r\n    } else {\r\n      if (!tn.skip(Token.OPENBRACE)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(tn.pos), \"{\"\r\n        );\r\n        return null;\r\n      }\r\n      body = this.parseBlockStatement(tn, false);\r\n    }\r\n    if (!body) return null;\r\n\r\n    var declaration = Node.createFunctionDeclaration(\r\n      name,\r\n      null,\r\n      signature,\r\n      body,\r\n      null,\r\n      isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    return Node.createFunctionExpression(declaration);\r\n  }\r\n\r\n  parseClassOrInterface(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): ClassDeclaration | null {\r\n\r\n    // at ('class' | 'interface'):\r\n    //   Identifier\r\n    //   ('<' TypeParameters)?\r\n    //   ('extends' Type)?\r\n    //   ('implements' Type (',' Type)*)?\r\n    //   '{' ClassMember* '}'\r\n\r\n    var isInterface = tn.token == Token.INTERFACE;\r\n\r\n    if (!tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var identifier = Node.createIdentifierExpression(\r\n      tn.readIdentifier(),\r\n      tn.range()\r\n    );\r\n\r\n    var typeParameters: TypeParameterNode[] | null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      flags |= CommonFlags.GENERIC;\r\n    } else {\r\n      typeParameters = [];\r\n    }\r\n\r\n    var extendsType: TypeNode | null = null;\r\n    if (tn.skip(Token.EXTENDS)) {\r\n      let t = this.parseType(tn);\r\n      if (!t) return null;\r\n      if (t.kind != NodeKind.TYPE) {\r\n        this.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          t.range\r\n        );\r\n        return null;\r\n      }\r\n      extendsType = <TypeNode>t;\r\n    }\r\n\r\n    var implementsTypes: TypeNode[] | null = null;\r\n    if (tn.skip(Token.IMPLEMENTS)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      do {\r\n        let type = this.parseType(tn);\r\n        if (!type) return null;\r\n        if (!isInterface) {\r\n          if (!implementsTypes) implementsTypes = [];\r\n          implementsTypes.push(<TypeNode>type);\r\n        }\r\n      } while (tn.skip(Token.COMMA));\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENBRACE)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var members = new Array<DeclarationStatement>();\r\n    var declaration: ClassDeclaration;\r\n    if (isInterface) {\r\n      assert(!implementsTypes);\r\n      declaration = Node.createInterfaceDeclaration(\r\n        identifier,\r\n        typeParameters,\r\n        extendsType,\r\n        members,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n    } else {\r\n      declaration = Node.createClassDeclaration(\r\n        identifier,\r\n        typeParameters,\r\n        extendsType,\r\n        implementsTypes,\r\n        members,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n    }\r\n    if (!tn.skip(Token.CLOSEBRACE)) {\r\n      do {\r\n        let member = this.parseClassMember(tn, declaration);\r\n        if (!member) return null;\r\n        member.parent = declaration;\r\n        members.push(<DeclarationStatement>member);\r\n      } while (!tn.skip(Token.CLOSEBRACE));\r\n    }\r\n    return declaration;\r\n  }\r\n\r\n  parseClassExpression(tn: Tokenizer): ClassExpression | null {\r\n\r\n    // at 'class': Identifier? '{' ... '}'\r\n\r\n    var startPos = tn.tokenPos;\r\n    var name: IdentifierExpression;\r\n\r\n    if (tn.skipIdentifier()) {\r\n      name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    } else {\r\n      name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n    }\r\n\r\n    if (!tn.skip(Token.OPENBRACE)) {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(tn.pos), \"{\"\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var members = new Array<DeclarationStatement>();\r\n    var declaration = Node.createClassDeclaration(\r\n      name,\r\n      [],\r\n      null,\r\n      null,\r\n      members,\r\n      null,\r\n      CommonFlags.NONE,\r\n      tn.range(startPos, tn.pos)\r\n    );\r\n    if (!tn.skip(Token.CLOSEBRACE)) {\r\n      do {\r\n        let member = this.parseClassMember(tn, declaration);\r\n        if (!member) return null;\r\n        member.parent = declaration;\r\n        members.push(<DeclarationStatement>member);\r\n      } while (!tn.skip(Token.CLOSEBRACE));\r\n    }\r\n    return Node.createClassExpression(declaration);\r\n  }\r\n\r\n  parseClassMember(\r\n    tn: Tokenizer,\r\n    parent: ClassDeclaration\r\n  ): DeclarationStatement | null {\r\n\r\n    // before:\r\n    //   ('public' | 'private' | 'protected')?\r\n    //   ('static' | 'abstract')?\r\n    //   'readonly'?\r\n    //   ('get' | 'set')?\r\n    //   Identifier ...\r\n\r\n    var startPos = tn.pos;\r\n    var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\r\n\r\n    var decorators = new Array<DecoratorNode>();\r\n    while (tn.skip(Token.AT)) {\r\n      let decorator = this.parseDecorator(tn);\r\n      if (!decorator) break;\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Decorators_are_not_valid_here,\r\n          decorator.range\r\n        );\r\n      }\r\n      decorators.push(<DecoratorNode>decorator);\r\n    }\r\n\r\n    // inherit ambient status\r\n    var flags = parent.flags & CommonFlags.AMBIENT;\r\n\r\n    // implemented methods are virtual\r\n    if (isInterface) flags |= CommonFlags.VIRTUAL;\r\n\r\n    if (tn.skip(Token.PUBLIC)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"public\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PUBLIC;\r\n    } else if (tn.skip(Token.PRIVATE)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"private\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PRIVATE;\r\n    } else if (tn.skip(Token.PROTECTED)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"protected\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.PROTECTED;\r\n    }\r\n\r\n    var staticStart: i32 = 0;\r\n    var staticEnd: i32 = 0;\r\n    var abstractStart: i32 = 0;\r\n    var abstractEnd: i32 = 0;\r\n    if (tn.skip(Token.STATIC)) {\r\n      if (isInterface) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(), \"static\"\r\n        );\r\n      }\r\n      flags |= CommonFlags.STATIC;\r\n      staticStart = tn.tokenPos;\r\n      staticEnd = tn.pos;\r\n    } else {\r\n      flags |= CommonFlags.INSTANCE;\r\n      if (tn.skip(Token.ABSTRACT)) {\r\n        if (isInterface) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(), \"abstract\"\r\n          );\r\n        }\r\n        flags |= CommonFlags.ABSTRACT;\r\n        abstractStart = tn.tokenPos;\r\n        abstractEnd = tn.pos;\r\n      }\r\n      if (parent.flags & CommonFlags.GENERIC) {\r\n        flags |= CommonFlags.GENERIC_CONTEXT;\r\n      }\r\n    }\r\n\r\n    var readonlyStart: i32 = 0;\r\n    var readonlyEnd: i32 = 0;\r\n    if (tn.skip(Token.READONLY)) {\r\n      flags |= CommonFlags.READONLY;\r\n      readonlyStart = tn.tokenPos;\r\n      readonlyEnd = tn.pos;\r\n    }\r\n\r\n    // check if accessor: ('get' | 'set') ^\\n Identifier\r\n    var state = tn.mark();\r\n    var isConstructor = false;\r\n    var isGetter = false;\r\n    var getStart: i32 = 0;\r\n    var getEnd: i32 = 0;\r\n    var isSetter = false;\r\n    var setStart: i32 = 0;\r\n    var setEnd: i32 = 0;\r\n    if (!isInterface) {\r\n      if (tn.skip(Token.GET)) {\r\n        if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n          flags |= CommonFlags.GET;\r\n          isGetter = true;\r\n          setStart = tn.tokenPos;\r\n          setEnd = tn.pos;\r\n          if (flags & CommonFlags.READONLY) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n            ); // recoverable\r\n          }\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n      } else if (tn.skip(Token.SET)) {\r\n        if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n          flags |= CommonFlags.SET | CommonFlags.SET;\r\n          isSetter = true;\r\n          setStart = tn.tokenPos;\r\n          setEnd = tn.pos;\r\n          if (flags & CommonFlags.READONLY) {\r\n            this.error(\r\n              DiagnosticCode._0_modifier_cannot_be_used_here,\r\n              tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n            ); // recoverable\r\n          }\r\n        } else {\r\n          tn.reset(state);\r\n        }\r\n      } else if (tn.skip(Token.CONSTRUCTOR)) {\r\n        flags |= CommonFlags.CONSTRUCTOR;\r\n        isConstructor = true;\r\n        if (flags & CommonFlags.STATIC) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(staticStart, staticEnd), \"static\"\r\n          ); // recoverable\r\n        }\r\n        if (flags & CommonFlags.ABSTRACT) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(abstractStart, abstractEnd), \"abstract\"\r\n          ); // recoverable\r\n        }\r\n        if (flags & CommonFlags.READONLY) {\r\n          this.error(\r\n            DiagnosticCode._0_modifier_cannot_be_used_here,\r\n            tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n          ); // recoverable\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!isConstructor && !tn.skipIdentifier()) {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n      return null;\r\n    }\r\n\r\n    var name = isConstructor\r\n      ? Node.createConstructorExpression(tn.range())\r\n      : Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    var typeParameters: TypeParameterNode[] | null = null;\r\n    if (tn.skip(Token.LESSTHAN)) {\r\n      let typeParametersStart = tn.tokenPos;\r\n      typeParameters = this.parseTypeParameters(tn);\r\n      if (!typeParameters) return null;\r\n      if (isConstructor) {\r\n        this.error(\r\n          DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n          tn.range(typeParametersStart, tn.pos)\r\n        ); // recoverable\r\n      } else if (isGetter || isSetter) {\r\n        this.error(\r\n          DiagnosticCode.An_accessor_cannot_have_type_parameters,\r\n          tn.range(typeParametersStart, tn.pos)\r\n        ); // recoverable\r\n      } else {\r\n        flags |= CommonFlags.GENERIC;\r\n      }\r\n    }\r\n\r\n    // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let signatureStart = tn.tokenPos;\r\n      let parameters = this.parseParameters(tn, isConstructor);\r\n      if (!parameters) return null;\r\n      let thisType = this.parseParametersThis;\r\n      if (isConstructor) {\r\n        for (let i = 0, k = parameters.length; i < k; ++i) {\r\n          let parameter = parameters[i];\r\n          if (parameter.isAny(\r\n            CommonFlags.PUBLIC |\r\n            CommonFlags.PROTECTED |\r\n            CommonFlags.PRIVATE |\r\n            CommonFlags.READONLY\r\n          )) {\r\n            let implicitFieldDeclaration = Node.createFieldDeclaration(\r\n              parameter.name,\r\n              parameter.type,\r\n              null, // initialized via parameter\r\n              null,\r\n              parameter.flags | CommonFlags.INSTANCE,\r\n              parameter.range\r\n            );\r\n            implicitFieldDeclaration.parameterIndex = i;\r\n            implicitFieldDeclaration.parent = parent;\r\n            parameter.implicitFieldDeclaration = implicitFieldDeclaration;\r\n            parent.members.push(implicitFieldDeclaration);\r\n          }\r\n        }\r\n      } else if (isGetter) {\r\n        if (parameters.length) {\r\n          this.error(\r\n            DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n            name.range\r\n          );\r\n        }\r\n      } else if (isSetter) {\r\n        if (parameters.length != 1) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n            name.range\r\n          );\r\n        }\r\n        if (parameters.length && parameters[0].initializer) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n            name.range\r\n          );\r\n        }\r\n      }\r\n\r\n      let returnType: CommonTypeNode | null = null;\r\n      if (tn.skip(Token.COLON)) {\r\n        if (name.kind == NodeKind.CONSTRUCTOR) {\r\n          this.error(\r\n            DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n            tn.range()\r\n          );\r\n        } else if (isSetter) {\r\n          this.error(\r\n            DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n            tn.range()\r\n          );\r\n        }\r\n        returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n        if (!returnType) return null;\r\n      } else {\r\n        returnType = Node.createOmittedType(tn.range(tn.pos));\r\n        if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\r\n          this.error(\r\n            DiagnosticCode.Type_expected,\r\n            returnType.range\r\n          ); // recoverable\r\n        }\r\n      }\r\n\r\n      let signature = Node.createSignature(\r\n        parameters,\r\n        returnType,\r\n        thisType,\r\n        false,\r\n        tn.range(signatureStart, tn.pos)\r\n      );\r\n\r\n      let body: Statement | null = null;\r\n      if (tn.skip(Token.OPENBRACE)) {\r\n        if (flags & CommonFlags.AMBIENT) {\r\n          this.error(\r\n            DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n            tn.range()\r\n          ); // recoverable\r\n        } else if (flags & CommonFlags.ABSTRACT) {\r\n          this.error(\r\n            DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\r\n            tn.range(), name.text\r\n          ); // recoverable\r\n        }\r\n        body = this.parseBlockStatement(tn, false);\r\n        if (!body) return null;\r\n      } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\r\n        this.error(\r\n          DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n\r\n      let retMethod = Node.createMethodDeclaration(\r\n        name,\r\n        typeParameters,\r\n        signature,\r\n        body,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return retMethod;\r\n\r\n    } else if (isConstructor) {\r\n      this.error(\r\n        DiagnosticCode.Constructor_implementation_is_missing,\r\n        name.range\r\n      );\r\n\r\n    } else if (isGetter || isSetter) {\r\n      this.error(\r\n        DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n        name.range\r\n      );\r\n\r\n    // field: (':' Type)? ('=' Expression)? ';'?\r\n    } else {\r\n      if (flags & CommonFlags.ABSTRACT) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(abstractStart, abstractEnd), \"abstract\"\r\n        ); // recoverable\r\n      }\r\n\r\n      if (flags & CommonFlags.GET) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(getStart, getEnd), \"get\"\r\n        ); // recoverable\r\n      }\r\n\r\n      if (flags & CommonFlags.SET) {\r\n        this.error(\r\n          DiagnosticCode._0_modifier_cannot_be_used_here,\r\n          tn.range(setStart, setEnd), \"set\"\r\n        ); // recoverable\r\n      }\r\n\r\n      let type: CommonTypeNode | null = null;\r\n      if (tn.skip(Token.COLON)) {\r\n        type = this.parseType(tn);\r\n        if (!type) return null;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.Type_expected,\r\n          tn.range()\r\n        ); // recoverable\r\n      }\r\n      let initializer: Expression | null = null;\r\n      if (tn.skip(Token.EQUALS)) {\r\n        initializer = this.parseExpression(tn);\r\n        if (!initializer) return null;\r\n      }\r\n      let retField = Node.createFieldDeclaration(\r\n        name,\r\n        type,\r\n        initializer,\r\n        decorators,\r\n        flags,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return retField;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseNamespace(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): NamespaceDeclaration | null {\r\n\r\n    // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      if (tn.skip(Token.OPENBRACE)) {\r\n        let members = new Array<Statement>();\r\n        let ns = Node.createNamespaceDeclaration(\r\n          identifier,\r\n          members,\r\n          decorators,\r\n          flags,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          let member = this.parseTopLevelStatement(tn, ns);\r\n          if (!member) return null;\r\n          member.parent = ns;\r\n          members.push(member);\r\n        }\r\n        tn.skip(Token.SEMICOLON);\r\n        return ns;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"{\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExport(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    startPos: i32\r\n  ): ExportStatement | null {\r\n\r\n    // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n    var path: StringLiteralExpression | null = null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      let members = new Array<ExportMember>();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n          let member = this.parseExportMember(tn);\r\n          if (!member) return null;\r\n          members.push(member);\r\n        if (!tn.skip(Token.COMMA)) {\r\n          if (tn.skip(Token.CLOSEBRACE)) {\r\n            break;\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"}\"\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n      }\r\n      if (tn.skip(Token.FROM)) {\r\n        if (tn.skip(Token.STRINGLITERAL)) {\r\n          path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\r\n      let internalPath = ret.internalPath;\r\n      if (internalPath !== null && !this.seenlog.has(internalPath)) {\r\n        this.backlog.push(internalPath);\r\n        this.seenlog.add(internalPath);\r\n      }\r\n      tn.skip(Token.SEMICOLON);\r\n      return ret;\r\n    } else if (tn.skip(Token.ASTERISK)) {\r\n      if (tn.skip(Token.FROM)) {\r\n        if (tn.skip(Token.STRINGLITERAL)) {\r\n          path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n          let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\r\n          let internalPath = assert(ret.internalPath);\r\n          let source = tn.source;\r\n          if (!source.exportPaths) source.exportPaths = new Set();\r\n          source.exportPaths.add(internalPath);\r\n          if (!this.seenlog.has(internalPath)) {\r\n            this.backlog.push(internalPath);\r\n            this.seenlog.add(internalPath);\r\n          }\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            tn.range()\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"from\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExportMember(\r\n    tn: Tokenizer\r\n  ): ExportMember | null {\r\n\r\n    // before: Identifier ('as' Identifier)?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let asIdentifier: IdentifierExpression | null = null;\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifierName()) {\r\n          asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      return Node.createExportMember(\r\n        identifier,\r\n        asIdentifier,\r\n        asIdentifier\r\n          ? Range.join(identifier.range, asIdentifier.range)\r\n          : identifier.range\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseImport(\r\n    tn: Tokenizer\r\n  ): ImportStatement | null {\r\n\r\n    // at 'import':\r\n    //  ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n    //  'from' StringLiteral ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var members: ImportDeclaration[] | null = null;\r\n    var namespaceName: IdentifierExpression | null = null;\r\n    var skipFrom = false;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      members = new Array();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n        let member = this.parseImportDeclaration(tn);\r\n        if (!member) return null;\r\n        members.push(member);\r\n        if (!tn.skip(Token.COMMA)) {\r\n          if (tn.skip(Token.CLOSEBRACE)) {\r\n            break;\r\n          } else {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"}\"\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n      }\r\n    } else if (tn.skip(Token.ASTERISK)) {\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifier()) {\r\n          namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"as\"\r\n        );\r\n        return null;\r\n      }\r\n    } else {\r\n      skipFrom = true;\r\n    }\r\n\r\n    if (skipFrom || tn.skip(Token.FROM)) {\r\n      if (tn.skip(Token.STRINGLITERAL)) {\r\n        let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n        let ret: ImportStatement;\r\n        if (namespaceName) {\r\n          assert(!members);\r\n          ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n        } else {\r\n          ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n        }\r\n        let internalPath = ret.internalPath;\r\n        if (!this.seenlog.has(internalPath)) {\r\n          this.backlog.push(internalPath);\r\n          this.seenlog.add(internalPath);\r\n        }\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode.String_literal_expected,\r\n          tn.range()\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"from\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseImportDeclaration(\r\n    tn: Tokenizer\r\n  ): ImportDeclaration | null {\r\n\r\n    // before: Identifier ('as' Identifier)?\r\n\r\n    if (tn.skipIdentifierName()) {\r\n      let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let asIdentifier: IdentifierExpression | null = null;\r\n      if (tn.skip(Token.AS)) {\r\n        if (tn.skipIdentifier()) {\r\n          asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n      return Node.createImportDeclaration(\r\n        identifier,\r\n        asIdentifier,\r\n        asIdentifier\r\n          ? Range.join(identifier.range, asIdentifier.range)\r\n          : identifier.range\r\n      );\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExportImport(\r\n    tn: Tokenizer,\r\n    startPos: i32\r\n  ): ExportImportStatement | null {\r\n\r\n    // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      if (tn.skip(Token.EQUALS)) {\r\n        if (tn.skipIdentifier()) {\r\n          let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n          let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseStatement(\r\n    tn: Tokenizer,\r\n    topLevel: bool = false\r\n  ): Statement | null {\r\n\r\n    // at previous token\r\n\r\n    var state = tn.mark();\r\n    var token = tn.next();\r\n    var statement: Statement | null = null;\r\n    switch (token) {\r\n      case Token.BREAK: {\r\n        statement = this.parseBreak(tn);\r\n        break;\r\n      }\r\n      case Token.CONST: {\r\n        statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.CONTINUE: {\r\n        statement = this.parseContinue(tn);\r\n        break;\r\n      }\r\n      case Token.DO: {\r\n        statement = this.parseDoStatement(tn);\r\n        break;\r\n      }\r\n      case Token.FOR: {\r\n        statement = this.parseForStatement(tn);\r\n        break;\r\n      }\r\n      case Token.IF: {\r\n        statement = this.parseIfStatement(tn);\r\n        break;\r\n      }\r\n      case Token.LET: {\r\n        statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.VAR: {\r\n        statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n        break;\r\n      }\r\n      case Token.OPENBRACE: {\r\n        statement = this.parseBlockStatement(tn, topLevel);\r\n        break;\r\n      }\r\n      case Token.RETURN: {\r\n        if (topLevel) {\r\n          this.error(\r\n            DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n            tn.range()\r\n          ); // recoverable\r\n        }\r\n        statement = this.parseReturn(tn);\r\n        break;\r\n      }\r\n      case Token.SEMICOLON: {\r\n        return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n      }\r\n      case Token.SWITCH: {\r\n        statement = this.parseSwitchStatement(tn);\r\n        break;\r\n      }\r\n      case Token.THROW: {\r\n        statement = this.parseThrowStatement(tn);\r\n        break;\r\n      }\r\n      case Token.TRY: {\r\n        statement = this.parseTryStatement(tn);\r\n        break;\r\n      }\r\n      case Token.VOID: {\r\n        statement = this.parseVoidStatement(tn);\r\n        break;\r\n      }\r\n      case Token.WHILE: {\r\n        statement = this.parseWhileStatement(tn);\r\n        break;\r\n      }\r\n      case Token.TYPE: { // also identifier\r\n        if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n          statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n          break;\r\n        }\r\n        // fall-through\r\n      }\r\n      default: {\r\n        tn.reset(state);\r\n        statement = this.parseExpressionStatement(tn);\r\n        break;\r\n      }\r\n    }\r\n    if (!statement) { // has been reported\r\n      tn.reset(state);\r\n      this.skipStatement(tn);\r\n    } else {\r\n      tn.discard(state);\r\n    }\r\n    return statement;\r\n  }\r\n\r\n  parseBlockStatement(\r\n    tn: Tokenizer,\r\n    topLevel: bool\r\n  ): BlockStatement | null {\r\n\r\n    // at '{': Statement* '}' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statements = new Array<Statement>();\r\n    while (!tn.skip(Token.CLOSEBRACE)) {\r\n      let state = tn.mark();\r\n      let statement = this.parseStatement(tn, topLevel);\r\n      if (!statement) {\r\n        tn.reset(state);\r\n        this.skipStatement(tn);\r\n      } else {\r\n        tn.discard(state);\r\n        statements.push(statement);\r\n      }\r\n    }\r\n    var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseBreak(\r\n    tn: Tokenizer\r\n  ): BreakStatement | null {\r\n\r\n    // at 'break': Identifier? ';'?\r\n\r\n    var identifier: IdentifierExpression | null = null;\r\n    if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n      tn.next(IdentifierHandling.PREFER);\r\n      identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    }\r\n    var ret = Node.createBreakStatement(identifier, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseContinue(\r\n    tn: Tokenizer\r\n  ): ContinueStatement | null {\r\n\r\n    // at 'continue': Identifier? ';'?\r\n\r\n    var identifier: IdentifierExpression | null = null;\r\n    if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n      tn.next(IdentifierHandling.PREFER);\r\n      identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n    }\r\n    var ret = Node.createContinueStatement(identifier, tn.range());\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseDoStatement(\r\n    tn: Tokenizer\r\n  ): DoStatement | null {\r\n\r\n    // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statement = this.parseStatement(tn);\r\n    if (!statement) return null;\r\n\r\n    if (tn.skip(Token.WHILE)) {\r\n\r\n      if (tn.skip(Token.OPENPAREN)) {\r\n        let condition = this.parseExpression(tn);\r\n        if (!condition) return null;\r\n\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          let ret = Node.createDoStatement(<Statement>statement, <Expression>condition, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"(\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"while\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseExpressionStatement(\r\n    tn: Tokenizer\r\n  ): ExpressionStatement | null {\r\n\r\n    // at previous token\r\n\r\n    var expr = this.parseExpression(tn);\r\n    if (!expr) return null;\r\n\r\n    var ret = Node.createExpressionStatement(expr);\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseForStatement(\r\n    tn: Tokenizer\r\n  ): ForStatement | null {\r\n\r\n    // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n    var startPos = tn.tokenPos;\r\n\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let initializer: Statement | null = null;\r\n\r\n      if (tn.skip(Token.CONST)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n      } else if (tn.skip(Token.LET)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n      } else if (tn.skip(Token.VAR)) {\r\n        initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n\r\n      } else if (!tn.skip(Token.SEMICOLON)) {\r\n        initializer = this.parseExpressionStatement(tn);\r\n        if (!initializer) return null;\r\n      }\r\n\r\n      if (tn.token == Token.SEMICOLON) {\r\n        let condition: ExpressionStatement | null = null;\r\n        if (!tn.skip(Token.SEMICOLON)) {\r\n          condition = this.parseExpressionStatement(tn);\r\n          if (!condition) return null;\r\n        }\r\n\r\n        if (tn.token == Token.SEMICOLON) {\r\n          let incrementor: Expression | null = null;\r\n          if (!tn.skip(Token.CLOSEPAREN)) {\r\n            incrementor = this.parseExpression(tn);\r\n            if (!incrementor) return null;\r\n\r\n            if (!tn.skip(Token.CLOSEPAREN)) {\r\n              this.error(\r\n                DiagnosticCode._0_expected,\r\n                tn.range(), \")\"\r\n              );\r\n              return null;\r\n            }\r\n          }\r\n\r\n          let statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n\r\n          return Node.createForStatement(\r\n            initializer,\r\n            condition\r\n              ? condition.expression\r\n              : null,\r\n            incrementor,\r\n            statement,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \";\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \";\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseIfStatement(\r\n    tn: Tokenizer\r\n  ): IfStatement | null {\r\n\r\n    // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let condition = this.parseExpression(tn);\r\n      if (!condition) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        let statement = this.parseStatement(tn);\r\n        if (!statement) return null;\r\n        let elseStatement: Statement | null = null;\r\n        if (tn.skip(Token.ELSE)) {\r\n          elseStatement = this.parseStatement(tn);\r\n          if (!elseStatement) return null;\r\n        }\r\n        return Node.createIfStatement(\r\n          condition,\r\n          statement,\r\n          elseStatement,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseSwitchStatement(\r\n    tn: Tokenizer\r\n  ): SwitchStatement | null {\r\n\r\n    // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let condition = this.parseExpression(tn);\r\n      if (!condition) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        if (tn.skip(Token.OPENBRACE)) {\r\n          let cases = new Array<SwitchCase>();\r\n          while (!tn.skip(Token.CLOSEBRACE)) {\r\n            let case_ = this.parseSwitchCase(tn);\r\n            if (!case_) return null;\r\n            cases.push(<SwitchCase>case_);\r\n          }\r\n          let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n          tn.skip(Token.SEMICOLON);\r\n          return ret;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n        }\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseSwitchCase(\r\n    tn: Tokenizer\r\n  ): SwitchCase | null {\r\n\r\n    var startPos = tn.tokenPos;\r\n    var statements: Statement[],\r\n        statement: Statement | null;\r\n\r\n    // 'case' Expression ':' Statement*\r\n\r\n    if (tn.skip(Token.CASE)) {\r\n      let label = this.parseExpression(tn);\r\n      if (!label) return null;\r\n      if (tn.skip(Token.COLON)) {\r\n        statements = new Array<Statement>();\r\n        while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n          statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n          statements.push(statement);\r\n        }\r\n        return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n      }\r\n\r\n    // 'default' ':' Statement*\r\n\r\n    } else if (tn.skip(Token.DEFAULT)) {\r\n      if (tn.skip(Token.COLON)) {\r\n        statements = new Array<Statement>();\r\n        while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n          statement = this.parseStatement(tn);\r\n          if (!statement) return null;\r\n          statements.push(statement);\r\n        }\r\n        return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \":\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._case_or_default_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseThrowStatement(\r\n    tn: Tokenizer\r\n  ): ThrowStatement | null {\r\n\r\n    // at 'throw': Expression ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var expression = this.parseExpression(tn);\r\n    if (!expression) return null;\r\n    var ret = Node.createThrowStatement(<Expression>expression, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseTryStatement(\r\n    tn: Tokenizer\r\n  ): TryStatement | null {\r\n\r\n    // at 'try':\r\n    //   '{' Statement* '}'\r\n    //   ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n    //   ('finally' '{' Statement* '}'? ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var stmt: Statement | null;\r\n    if (tn.skip(Token.OPENBRACE)) {\r\n      let statements = new Array<Statement>();\r\n      while (!tn.skip(Token.CLOSEBRACE)) {\r\n        stmt = this.parseStatement(tn);\r\n        if (!stmt) return null;\r\n        statements.push(<Statement>stmt);\r\n      }\r\n      let catchVariable: IdentifierExpression | null = null;\r\n      let catchStatements: Statement[] | null = null;\r\n      let finallyStatements: Statement[] | null = null;\r\n      if (tn.skip(Token.CATCH)) {\r\n        if (!tn.skip(Token.OPENPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"(\"\r\n          );\r\n          return null;\r\n        }\r\n        if (!tn.skipIdentifier()) {\r\n          this.error(\r\n            DiagnosticCode.Identifier_expected,\r\n            tn.range()\r\n          );\r\n          return null;\r\n        }\r\n        catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n        if (!tn.skip(Token.OPENBRACE)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n          return null;\r\n        }\r\n        catchStatements = [];\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          stmt = this.parseStatement(tn);\r\n          if (!stmt) return null;\r\n          catchStatements.push(<Statement>stmt);\r\n        }\r\n      }\r\n      if (tn.skip(Token.FINALLY)) {\r\n        if (!tn.skip(Token.OPENBRACE)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"{\"\r\n          );\r\n          return null;\r\n        }\r\n        finallyStatements = [];\r\n        while (!tn.skip(Token.CLOSEBRACE)) {\r\n          stmt = this.parseStatement(tn);\r\n          if (!stmt) return null;\r\n          finallyStatements.push(<Statement>stmt);\r\n        }\r\n      }\r\n      if (!(catchStatements || finallyStatements)) {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"catch\"\r\n        );\r\n        return null;\r\n      }\r\n      let ret = Node.createTryStatement(\r\n        statements,\r\n        catchVariable,\r\n        catchStatements,\r\n        finallyStatements,\r\n        tn.range(startPos, tn.pos)\r\n      );\r\n      tn.skip(Token.SEMICOLON);\r\n      return ret;\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"{\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseTypeDeclaration(\r\n    tn: Tokenizer,\r\n    flags: CommonFlags,\r\n    decorators: DecoratorNode[] | null,\r\n    startPos: i32\r\n  ): TypeDeclaration | null {\r\n\r\n    // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\r\n\r\n    if (tn.skipIdentifier()) {\r\n      let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n      let typeParameters: TypeParameterNode[] | null = null;\r\n      if (tn.skip(Token.LESSTHAN)) {\r\n        typeParameters = this.parseTypeParameters(tn);\r\n        if (!typeParameters) return null;\r\n        flags |= CommonFlags.GENERIC;\r\n      }\r\n      if (tn.skip(Token.EQUALS)) {\r\n        let type = this.parseType(tn);\r\n        if (!type) return null;\r\n        let ret = Node.createTypeDeclaration(\r\n          name,\r\n          typeParameters,\r\n          type,\r\n          decorators,\r\n          flags,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \"=\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode.Identifier_expected,\r\n        tn.range()\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  parseVoidStatement(\r\n    tn: Tokenizer\r\n  ): VoidStatement | null {\r\n\r\n    // at 'void': Expression ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    var expression = this.parseExpression(tn, Precedence.GROUPING);\r\n    if (!expression) return null;\r\n    var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\r\n    tn.skip(Token.SEMICOLON);\r\n    return ret;\r\n  }\r\n\r\n  parseWhileStatement(\r\n    tn: Tokenizer\r\n  ): WhileStatement | null {\r\n\r\n    // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n    var startPos = tn.tokenPos;\r\n    if (tn.skip(Token.OPENPAREN)) {\r\n      let expression = this.parseExpression(tn);\r\n      if (!expression) return null;\r\n      if (tn.skip(Token.CLOSEPAREN)) {\r\n        let statement = this.parseStatement(tn);\r\n        if (!statement) return null;\r\n        let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n        tn.skip(Token.SEMICOLON);\r\n        return ret;\r\n      } else {\r\n        this.error(\r\n          DiagnosticCode._0_expected,\r\n          tn.range(), \")\"\r\n        );\r\n      }\r\n    } else {\r\n      this.error(\r\n        DiagnosticCode._0_expected,\r\n        tn.range(), \"(\"\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // expressions\r\n  // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n  parseExpressionStart(\r\n    tn: Tokenizer\r\n  ): Expression | null {\r\n\r\n    var token = tn.next(IdentifierHandling.PREFER);\r\n    var startPos = tn.tokenPos;\r\n    var precedence = determinePrecedenceStart(token);\r\n    if (precedence != Precedence.NONE) {\r\n      let operand: Expression | null;\r\n\r\n      // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n      // NewExpression\r\n      if (token == Token.NEW) {\r\n        operand = this.parseExpression(tn, Precedence.CALL);\r\n        if (!operand) return null;\r\n        if (operand.kind == NodeKind.CALL) {\r\n          return Node.createNewExpression(\r\n            (<CallExpression>operand).expression,\r\n            (<CallExpression>operand).typeArguments,\r\n            (<CallExpression>operand).arguments,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            tn.range()\r\n          );\r\n        }\r\n        return null;\r\n      } else {\r\n        operand = this.parseExpression(tn, precedence);\r\n        if (!operand) return null;\r\n      }\r\n\r\n      // UnaryPrefixExpression\r\n      if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n        if (\r\n          operand.kind != NodeKind.IDENTIFIER &&\r\n          operand.kind != NodeKind.ELEMENTACCESS &&\r\n          operand.kind != NodeKind.PROPERTYACCESS\r\n        ) {\r\n          this.error(\r\n            DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n            operand.range\r\n          );\r\n        }\r\n      }\r\n      return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n    }\r\n\r\n    var expr: Expression | null = null;\r\n    switch (token) {\r\n\r\n      case Token.NULL: return Node.createNullExpression(tn.range());\r\n      case Token.TRUE: return Node.createTrueExpression(tn.range());\r\n      case Token.FALSE: return Node.createFalseExpression(tn.range());\r\n\r\n      // ParenthesizedExpression\r\n      // FunctionExpression\r\n      case Token.OPENPAREN: {\r\n\r\n        // determine whether this is a function expression\r\n        if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\r\n          return this.parseFunctionExpressionCommon(\r\n            tn,\r\n            Node.createEmptyIdentifierExpression(tn.range(startPos)),\r\n            [],\r\n            true\r\n          );\r\n        }\r\n        let state = tn.mark();\r\n        let again = true;\r\n        do {\r\n          switch (tn.next(IdentifierHandling.PREFER)) {\r\n\r\n            // function expression\r\n            case Token.DOT_DOT_DOT: {\r\n              tn.reset(state);\r\n              return this.parseFunctionExpression(tn);\r\n            }\r\n            // can be both\r\n            case Token.IDENTIFIER: {\r\n              tn.readIdentifier();\r\n              switch (tn.next()) {\r\n\r\n                // if we got here, check for arrow\r\n                case Token.CLOSEPAREN: {\r\n                  if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n                    again = false;\r\n                    break;\r\n                  }\r\n                  // fall-through\r\n                }\r\n                // function expression\r\n                case Token.COLON: {    // type annotation\r\n                  tn.reset(state);\r\n                  return this.parseFunctionExpression(tn);\r\n                }\r\n                // can be both\r\n                case Token.QUESTION:   // optional parameter or ternary\r\n                case Token.COMMA: {\r\n                  break; // continue\r\n                }\r\n                // parenthesized expression\r\n                // case Token.EQUALS:  // missing type annotation for simplicity\r\n                default: {\r\n                  again = false;\r\n                  break;\r\n                }\r\n              }\r\n              break;\r\n            }\r\n            // parenthesized expression\r\n            default: {\r\n              again = false;\r\n              break;\r\n            }\r\n          }\r\n        } while (again);\r\n        tn.reset(state);\r\n\r\n        // parse parenthesized\r\n        expr = this.parseExpression(tn);\r\n        if (!expr) return null;\r\n        if (!tn.skip(Token.CLOSEPAREN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n        return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n      }\r\n      // ArrayLiteralExpression\r\n      case Token.OPENBRACKET: {\r\n        let elementExpressions = new Array<Expression | null>();\r\n        while (!tn.skip(Token.CLOSEBRACKET)) {\r\n          if (tn.peek() == Token.COMMA) {\r\n            expr = null; // omitted\r\n          } else {\r\n            expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n            if (!expr) return null;\r\n          }\r\n          elementExpressions.push(expr);\r\n          if (!tn.skip(Token.COMMA)) {\r\n            if (tn.skip(Token.CLOSEBRACKET)) {\r\n              break;\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode._0_expected,\r\n                tn.range(), \"]\"\r\n              );\r\n              return null;\r\n            }\r\n          }\r\n        }\r\n        return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n      }\r\n      // AssertionExpression (unary prefix)\r\n      case Token.LESSTHAN: {\r\n        let toType = this.parseType(tn);\r\n        if (!toType) return null;\r\n        if (!tn.skip(Token.GREATERTHAN)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \">\"\r\n          );\r\n          return null;\r\n        }\r\n        expr = this.parseExpression(tn, Precedence.CALL);\r\n        if (!expr) return null;\r\n        return Node.createAssertionExpression(\r\n          AssertionKind.PREFIX,\r\n          expr,\r\n          toType,\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      }\r\n      case Token.IDENTIFIER: {\r\n        return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.THIS: {\r\n        return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.CONSTRUCTOR: {\r\n        return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.SUPER: {\r\n        return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.STRINGLITERAL: {\r\n        return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.INTEGERLITERAL: {\r\n        return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n      }\r\n      case Token.FLOATLITERAL: {\r\n        return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n      }\r\n      // RegexpLiteralExpression\r\n      // note that this also continues on invalid ones so the surrounding AST remains intact\r\n      case Token.SLASH: {\r\n        let regexpPattern = tn.readRegexpPattern(); // also reports\r\n        if (!tn.skip(Token.SLASH)) {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"/\"\r\n          );\r\n          return null;\r\n        }\r\n        return Node.createRegexpLiteralExpression(\r\n          regexpPattern,\r\n          tn.readRegexpFlags(), // also reports\r\n          tn.range(startPos, tn.pos)\r\n        );\r\n      }\r\n      case Token.FUNCTION: {\r\n        return this.parseFunctionExpression(tn);\r\n      }\r\n      case Token.CLASS: {\r\n        return this.parseClassExpression(tn);\r\n      }\r\n      default: {\r\n        this.error(\r\n          DiagnosticCode.Expression_expected,\r\n          tn.range()\r\n        );\r\n        return null;\r\n      }\r\n    }\r\n  }\r\n\r\n  tryParseTypeArgumentsBeforeArguments(\r\n    tn: Tokenizer\r\n  ): CommonTypeNode[] | null {\r\n\r\n    // at '<': Type (',' Type)* '>' '('\r\n\r\n    var state = tn.mark();\r\n    if (!tn.skip(Token.LESSTHAN)) return null;\r\n    var typeArguments = new Array<CommonTypeNode>();\r\n    do {\r\n      if (tn.peek() === Token.GREATERTHAN) {\r\n        break;\r\n      }\r\n      let type = this.parseType(tn, true, true);\r\n      if (!type) {\r\n        tn.reset(state);\r\n        return null;\r\n      }\r\n      typeArguments.push(type);\r\n    } while (tn.skip(Token.COMMA));\r\n    if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n      return typeArguments;\r\n    }\r\n    tn.reset(state);\r\n    return null;\r\n  }\r\n\r\n  parseArguments(\r\n    tn: Tokenizer\r\n  ): Expression[] | null {\r\n\r\n    // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n    var args = new Array<Expression>();\r\n    while (!tn.skip(Token.CLOSEPAREN)) {\r\n      let expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n      if (!expr) return null;\r\n      args.push(expr);\r\n      if (!tn.skip(Token.COMMA)) {\r\n        if (tn.skip(Token.CLOSEPAREN)) {\r\n          break;\r\n        } else {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \")\"\r\n          );\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n    return args;\r\n  }\r\n\r\n  parseExpression(\r\n    tn: Tokenizer,\r\n    precedence: Precedence = Precedence.COMMA\r\n  ): Expression | null {\r\n    assert(precedence != Precedence.NONE);\r\n\r\n    var expr = this.parseExpressionStart(tn);\r\n    if (!expr) return null;\r\n    var startPos = expr.range.start;\r\n\r\n    // CallExpression?\r\n    if (nodeIsCallable(expr.kind)) {\r\n      let typeArguments: CommonTypeNode[] | null = null;\r\n      while (\r\n        tn.skip(Token.OPENPAREN)\r\n        ||\r\n        nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\r\n      ) {\r\n        let args = this.parseArguments(tn);\r\n        if (!args) return null;\r\n        expr = Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos)); // is again callable\r\n      }\r\n    }\r\n\r\n    var token: Token;\r\n    var next: Expression | null = null;\r\n    var nextPrecedence: Precedence;\r\n    while (\r\n      (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n    ) { // precedence climbing\r\n      tn.next();\r\n      switch (token) {\r\n        // AssertionExpression\r\n        case Token.AS: {\r\n          let toType = this.parseType(tn); // reports\r\n          if (!toType) return null;\r\n          expr = Node.createAssertionExpression(\r\n            AssertionKind.AS,\r\n            expr,\r\n            toType,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // InstanceOfExpression\r\n        case Token.INSTANCEOF: {\r\n          let isType = this.parseType(tn); // reports\r\n          if (!isType) return null;\r\n          expr = Node.createInstanceOfExpression(\r\n            expr,\r\n            isType,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // ElementAccessExpression\r\n        case Token.OPENBRACKET: {\r\n          next = this.parseExpression(tn); // reports\r\n          if (!next) return null;\r\n          if (!tn.skip(Token.CLOSEBRACKET)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \"]\"\r\n            );\r\n            return null;\r\n          }\r\n          expr = Node.createElementAccessExpression(\r\n            expr,\r\n            next,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // UnaryPostfixExpression\r\n        case Token.PLUS_PLUS:\r\n        case Token.MINUS_MINUS: {\r\n          if (\r\n            expr.kind != NodeKind.IDENTIFIER &&\r\n            expr.kind != NodeKind.ELEMENTACCESS &&\r\n            expr.kind != NodeKind.PROPERTYACCESS\r\n          ) {\r\n            this.error(\r\n              DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n              expr.range\r\n            );\r\n          }\r\n          expr = Node.createUnaryPostfixExpression(\r\n            token,\r\n            expr,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // TernaryExpression\r\n        case Token.QUESTION: {\r\n          let ifThen = this.parseExpression(tn);\r\n          if (!ifThen) return null;\r\n          if (!tn.skip(Token.COLON)) {\r\n            this.error(\r\n              DiagnosticCode._0_expected,\r\n              tn.range(), \":\"\r\n            );\r\n            return null;\r\n          }\r\n          let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\r\n            ? Precedence.COMMA + 1\r\n            : Precedence.COMMA\r\n          );\r\n          if (!ifElse) return null;\r\n          expr = Node.createTernaryExpression(\r\n            expr,\r\n            ifThen,\r\n            ifElse,\r\n            tn.range(startPos, tn.pos)\r\n          );\r\n          break;\r\n        }\r\n        // CommaExpression\r\n        case Token.COMMA: {\r\n          let commaExprs: Expression[] = [ expr ];\r\n          do {\r\n            expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n            if (!expr) return null;\r\n            commaExprs.push(expr);\r\n          } while (tn.skip(Token.COMMA));\r\n          expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n          break;\r\n        }\r\n        default: {\r\n          next = this.parseExpression(tn,\r\n            isRightAssociative(token)\r\n              ? nextPrecedence\r\n              : nextPrecedence + 1\r\n          );\r\n          if (!next) return null;\r\n\r\n          // PropertyAccessExpression\r\n          if (token == Token.DOT) {\r\n            if (next.kind == NodeKind.IDENTIFIER) {\r\n              expr = Node.createPropertyAccessExpression(\r\n                expr,\r\n                <IdentifierExpression>next,\r\n                tn.range(startPos, tn.pos)\r\n              );\r\n            } else if (next.kind == NodeKind.CALL) { // join\r\n              let propertyCall = <CallExpression>next;\r\n              if (propertyCall.expression.kind == NodeKind.IDENTIFIER) {\r\n                propertyCall.expression = Node.createPropertyAccessExpression(\r\n                  expr,\r\n                  <IdentifierExpression>propertyCall.expression,\r\n                  tn.range(startPos, tn.pos)\r\n                );\r\n              } else {\r\n                this.error(\r\n                  DiagnosticCode.Identifier_expected,\r\n                  propertyCall.expression.range\r\n                );\r\n                return null;\r\n              }\r\n              expr = propertyCall;\r\n            } else {\r\n              this.error(\r\n                DiagnosticCode.Identifier_expected,\r\n                next.range\r\n              );\r\n              return null;\r\n            }\r\n\r\n          // BinaryExpression\r\n          } else {\r\n            expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    return expr;\r\n  }\r\n\r\n  /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n  skipStatement(tn: Tokenizer): void {\r\n    tn.peek(true);\r\n    if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\r\n    do {\r\n      let nextToken = tn.peek(true);\r\n      if (\r\n        nextToken == Token.ENDOFFILE ||   // next step should handle this\r\n        nextToken == Token.SEMICOLON      // end of the statement for sure\r\n      ) {\r\n        tn.next();\r\n        break;\r\n      }\r\n      if (tn.nextTokenOnNewLine) break;   // end of the statement maybe\r\n      switch (tn.next()) {\r\n        case Token.IDENTIFIER: {\r\n          tn.readIdentifier();\r\n          break;\r\n        }\r\n        case Token.STRINGLITERAL: {\r\n          tn.readString();\r\n          break;\r\n        }\r\n        case Token.INTEGERLITERAL: {\r\n          tn.readInteger();\r\n          break;\r\n        }\r\n        case Token.FLOATLITERAL: {\r\n          tn.readFloat();\r\n          break;\r\n        }\r\n      }\r\n    } while (true);\r\n  }\r\n\r\n  /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n  skipBlock(tn: Tokenizer): void {\r\n    // at '{': ... '}'\r\n    var depth = 1;\r\n    var again = true;\r\n    do {\r\n      switch (tn.next()) {\r\n        case Token.ENDOFFILE: {\r\n          this.error(\r\n            DiagnosticCode._0_expected,\r\n            tn.range(), \"}\"\r\n          );\r\n          again = false;\r\n          break;\r\n        }\r\n        case Token.OPENBRACE: {\r\n          ++depth;\r\n          break;\r\n        }\r\n        case Token.CLOSEBRACE: {\r\n          --depth;\r\n          if (!depth) again = false;\r\n          break;\r\n        }\r\n        case Token.IDENTIFIER: {\r\n          tn.readIdentifier();\r\n          break;\r\n        }\r\n        case Token.STRINGLITERAL: {\r\n          tn.readString();\r\n          break;\r\n        }\r\n        case Token.INTEGERLITERAL: {\r\n          tn.readInteger();\r\n          break;\r\n        }\r\n        case Token.FLOATLITERAL: {\r\n          tn.readFloat();\r\n          break;\r\n        }\r\n      }\r\n    } while (again);\r\n  }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n  NONE,\r\n  COMMA,\r\n  SPREAD,\r\n  YIELD,\r\n  ASSIGNMENT,\r\n  CONDITIONAL,\r\n  LOGICAL_OR,\r\n  LOGICAL_AND,\r\n  BITWISE_OR,\r\n  BITWISE_XOR,\r\n  BITWISE_AND,\r\n  EQUALITY,\r\n  RELATIONAL,\r\n  SHIFT,\r\n  ADDITIVE,\r\n  MULTIPLICATIVE,\r\n  EXPONENTIATED,\r\n  UNARY_PREFIX,\r\n  UNARY_POSTFIX,\r\n  CALL,\r\n  MEMBERACCESS,\r\n  GROUPING\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): Precedence {\r\n  switch (kind) {\r\n    case Token.DOT_DOT_DOT: return Precedence.SPREAD;\r\n    case Token.YIELD: return Precedence.YIELD;\r\n    case Token.EXCLAMATION:\r\n    case Token.TILDE:\r\n    case Token.PLUS:\r\n    case Token.MINUS:\r\n    case Token.PLUS_PLUS:\r\n    case Token.MINUS_MINUS:\r\n    case Token.TYPEOF:\r\n    case Token.VOID:\r\n    case Token.DELETE: return Precedence.UNARY_PREFIX;\r\n    case Token.NEW: return Precedence.MEMBERACCESS;\r\n  }\r\n  return Precedence.NONE;\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): Precedence {\r\n  switch (kind) {\r\n    case Token.COMMA: return Precedence.COMMA;\r\n    case Token.EQUALS:\r\n    case Token.PLUS_EQUALS:\r\n    case Token.MINUS_EQUALS:\r\n    case Token.ASTERISK_ASTERISK_EQUALS:\r\n    case Token.ASTERISK_EQUALS:\r\n    case Token.SLASH_EQUALS:\r\n    case Token.PERCENT_EQUALS:\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.AMPERSAND_EQUALS:\r\n    case Token.CARET_EQUALS:\r\n    case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\r\n    case Token.QUESTION: return Precedence.CONDITIONAL;\r\n    case Token.BAR_BAR: return Precedence.LOGICAL_OR;\r\n    case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\r\n    case Token.BAR: return Precedence.BITWISE_OR;\r\n    case Token.CARET: return Precedence.BITWISE_XOR;\r\n    case Token.AMPERSAND: return Precedence.BITWISE_AND;\r\n    case Token.EQUALS_EQUALS:\r\n    case Token.EXCLAMATION_EQUALS:\r\n    case Token.EQUALS_EQUALS_EQUALS:\r\n    case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\r\n    case Token.AS:\r\n    case Token.IN:\r\n    case Token.INSTANCEOF:\r\n    case Token.LESSTHAN:\r\n    case Token.GREATERTHAN:\r\n    case Token.LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\r\n    case Token.LESSTHAN_LESSTHAN:\r\n    case Token.GREATERTHAN_GREATERTHAN:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\r\n    case Token.PLUS:\r\n    case Token.MINUS: return Precedence.ADDITIVE;\r\n    case Token.ASTERISK:\r\n    case Token.SLASH:\r\n    case Token.PERCENT: return Precedence.MULTIPLICATIVE;\r\n    case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\r\n    case Token.PLUS_PLUS:\r\n    case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\r\n    case Token.DOT:\r\n    case Token.NEW:\r\n    case Token.OPENBRACKET: return Precedence.MEMBERACCESS;\r\n  }\r\n  return Precedence.NONE;\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n  switch (kind) {\r\n    case Token.EQUALS:\r\n    case Token.PLUS_EQUALS:\r\n    case Token.MINUS_EQUALS:\r\n    case Token.ASTERISK_ASTERISK_EQUALS:\r\n    case Token.ASTERISK_EQUALS:\r\n    case Token.SLASH_EQUALS:\r\n    case Token.PERCENT_EQUALS:\r\n    case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n    case Token.AMPERSAND_EQUALS:\r\n    case Token.CARET_EQUALS:\r\n    case Token.BAR_EQUALS:\r\n    case Token.QUESTION:\r\n    case Token.ASTERISK_ASTERISK: return true;\r\n    default: return false;\r\n  }\r\n}\r\n","/**\r\n * Definition builders for WebIDL and TypeScript.\r\n * @module definitions\r\n *//***/\r\n\r\nimport {\r\n  CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n  Program,\r\n  Element,\r\n  ElementKind,\r\n  Global,\r\n  Enum,\r\n  EnumValue,\r\n  Field,\r\n  Function,\r\n  FunctionPrototype,\r\n  Class,\r\n  ClassPrototype,\r\n  Namespace,\r\n  ConstantValueKind,\r\n  Interface,\r\n  Property\r\n} from \"./program\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n  indent\r\n} from \"./util\";\r\n\r\n/** Walker base class. */\r\nabstract class ExportsWalker {\r\n\r\n  /** Program reference. */\r\n  program: Program;\r\n  /** Whether to include private members */\r\n  includePrivate: bool;\r\n  /** Elements still to do. */\r\n  todo: Element[] = [];\r\n  /** Already seen elements. */\r\n  seen: Set<Element> = new Set();\r\n\r\n  /** Constructs a new Element walker. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    this.program = program;\r\n    this.includePrivate;\r\n  }\r\n\r\n  /** Walks all exports and calls the respective handlers. */\r\n  walk(): void {\r\n    for (let element of this.program.moduleLevelExports.values()) this.visitElement(element);\r\n    var todo = this.todo;\r\n    for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\r\n  }\r\n\r\n  /** Visits an element.*/\r\n  visitElement(element: Element): void {\r\n    if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\r\n    if (this.seen.has(element)) return;\r\n    this.seen.add(element);\r\n    switch (element.kind) {\r\n      case ElementKind.GLOBAL: {\r\n        if (element.is(CommonFlags.COMPILED)) this.visitGlobal(<Global>element);\r\n        break;\r\n      }\r\n      case ElementKind.ENUM: {\r\n        if (element.is(CommonFlags.COMPILED)) this.visitEnum(<Enum>element);\r\n        break;\r\n      }\r\n      case ElementKind.FUNCTION_PROTOTYPE: {\r\n        this.visitFunctionInstances(<FunctionPrototype>element);\r\n        break;\r\n      }\r\n      case ElementKind.CLASS_PROTOTYPE: {\r\n        this.visitClassInstances(<ClassPrototype>element);\r\n        break;\r\n      }\r\n      case ElementKind.FIELD: {\r\n        if ((<Field>element).is(CommonFlags.COMPILED)) this.visitField(<Field>element);\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let prop = <Property>element;\r\n        let getter = prop.getterPrototype;\r\n        if (getter) this.visitFunctionInstances(getter);\r\n        let setter = prop.setterPrototype;\r\n        if (setter) this.visitFunctionInstances(setter);\r\n        break;\r\n      }\r\n      case ElementKind.NAMESPACE: {\r\n        if (hasCompiledMember(element)) this.visitNamespace(element);\r\n        break;\r\n      }\r\n      default: assert(false);\r\n    }\r\n  }\r\n\r\n  private visitFunctionInstances(element: FunctionPrototype): void {\r\n    for (let instance of element.instances.values()) {\r\n      if (instance.is(CommonFlags.COMPILED)) this.visitFunction(<Function>instance);\r\n    }\r\n  }\r\n\r\n  private visitClassInstances(element: ClassPrototype): void {\r\n    for (let instance of element.instances.values()) {\r\n      if (instance.is(CommonFlags.COMPILED)) this.visitClass(<Class>instance);\r\n    }\r\n  }\r\n\r\n  abstract visitGlobal(element: Global): void;\r\n  abstract visitEnum(element: Enum): void;\r\n  abstract visitFunction(element: Function): void;\r\n  abstract visitClass(element: Class): void;\r\n  abstract visitInterface(element: Interface): void;\r\n  abstract visitField(element: Field): void;\r\n  abstract visitNamespace(element: Element): void;\r\n}\r\n\r\n/** A WebIDL definitions builder. */\r\nexport class IDLBuilder extends ExportsWalker {\r\n\r\n  /** Builds WebIDL definitions for the specified program. */\r\n  static build(program: Program): string {\r\n    return new IDLBuilder(program).build();\r\n  }\r\n\r\n  private sb: string[] = [];\r\n  private indentLevel: i32 = 0;\r\n\r\n  /** Constructs a new WebIDL builder. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    super(program, includePrivate);\r\n  }\r\n\r\n  visitGlobal(element: Global): void {\r\n    var sb = this.sb;\r\n    var isConst = element.is(CommonFlags.INLINED);\r\n    indent(sb, this.indentLevel);\r\n    if (isConst) sb.push(\"const \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\" \");\r\n    sb.push(element.simpleName);\r\n    if (isConst) {\r\n      switch (element.constantValueKind) {\r\n        case ConstantValueKind.INTEGER: {\r\n          sb.push(\" = \");\r\n          sb.push(i64_to_string(element.constantIntegerValue));\r\n          break;\r\n        }\r\n        case ConstantValueKind.FLOAT: {\r\n          sb.push(\" = \");\r\n          sb.push(element.constantFloatValue.toString());\r\n          break;\r\n        }\r\n        default: assert(false);\r\n      }\r\n    }\r\n    sb.push(\";\\n\");\r\n  }\r\n\r\n  visitEnum(element: Enum): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      for (let [name, member] of members) {\r\n        if (member.kind == ElementKind.ENUMVALUE) {\r\n          let isConst = (<EnumValue>member).is(CommonFlags.INLINED);\r\n          indent(sb, this.indentLevel);\r\n          if (isConst) sb.push(\"const \");\r\n          else sb.push(\"readonly \");\r\n          sb.push(\"unsigned long \");\r\n          sb.push(name);\r\n          if (isConst) {\r\n            sb.push(\" = \");\r\n            sb.push((<EnumValue>member).constantValue.toString(10));\r\n          }\r\n          sb.push(\";\\n\");\r\n        }\r\n      }\r\n      for (let member of members.values()) {\r\n        if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\r\n      }\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitFunction(element: Function): void {\r\n    var sb = this.sb;\r\n    var signature = element.signature;\r\n    indent(sb, this.indentLevel);\r\n    sb.push(this.typeToString(signature.returnType));\r\n    sb.push(\" \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\"(\");\r\n    var parameters = signature.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    // var requiredParameters = signature.requiredParameters;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      if (i) sb.push(\", \");\r\n      // if (i >= requiredParameters) sb.push(\"optional \");\r\n      sb.push(this.typeToString(parameters[i]));\r\n      sb.push(\" \");\r\n      sb.push(signature.getParameterName(i));\r\n    }\r\n    sb.push(\");\\n\");\r\n    var members = element.members;\r\n    if (members && members.size) {\r\n      indent(sb, this.indentLevel);\r\n      sb.push(\"interface \");\r\n      sb.push(element.simpleName);\r\n      sb.push(\" {\\n\");\r\n      for (let member of members.values()) this.visitElement(member);\r\n      indent(sb, --this.indentLevel);\r\n      sb.push(\"}\\n\");\r\n    }\r\n  }\r\n\r\n  visitClass(element: Class): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    // TODO\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitInterface(element: Interface): void {\r\n    this.visitClass(element);\r\n  }\r\n\r\n  visitField(element: Field): void {\r\n    // TODO\r\n  }\r\n\r\n  visitNamespace(element: Namespace): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"interface \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      for (let member of members.values()) this.visitElement(member);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  typeToString(type: Type): string {\r\n    switch (type.kind) {\r\n      case TypeKind.I8: return \"byte\";\r\n      case TypeKind.I16: return \"short\";\r\n      case TypeKind.I32: return \"long\";\r\n      case TypeKind.I64: return \"long long\";\r\n      case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\r\n      case TypeKind.U8: return \"octet\";\r\n      case TypeKind.U16: return \"unsigned short\";\r\n      case TypeKind.U32: return \"unsigned long\";\r\n        // ^ TODO: function types\r\n      case TypeKind.U64: return \"unsigned long long\";\r\n      case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\r\n        // ^ TODO: class types\r\n      case TypeKind.BOOL: return \"boolean\";\r\n      case TypeKind.F32: return \"unrestricted float\";\r\n      case TypeKind.F64: return \"unrestricted double\";\r\n      case TypeKind.VOID: return \"void\";\r\n      default: {\r\n        assert(false);\r\n        return \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  build(): string {\r\n    var sb = this.sb;\r\n    sb.push(\"interface ASModule {\\n\");\r\n    ++this.indentLevel;\r\n    this.walk();\r\n    --this.indentLevel;\r\n    sb.push(\"}\\n\");\r\n    return sb.join(\"\");\r\n  }\r\n}\r\n\r\n/** A TypeScript definitions builder. */\r\nexport class TSDBuilder extends ExportsWalker {\r\n\r\n  /** Builds TypeScript definitions for the specified program. */\r\n  static build(program: Program): string {\r\n    return new TSDBuilder(program).build();\r\n  }\r\n\r\n  private sb: string[] = [];\r\n  private indentLevel: i32 = 0;\r\n\r\n  /** Constructs a new WebIDL builder. */\r\n  constructor(program: Program, includePrivate: bool = false) {\r\n    super(program, includePrivate);\r\n  }\r\n\r\n  visitGlobal(element: Global): void {\r\n    var sb = this.sb;\r\n    var isConst = element.is(CommonFlags.INLINED);\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.STATIC)) {\r\n      if (isConst) sb.push(\"static readonly \");\r\n      else sb.push(\"static \");\r\n    } else {\r\n      if (isConst) sb.push(\"const \");\r\n      else sb.push(\"var \");\r\n    }\r\n    sb.push(element.simpleName);\r\n    sb.push(\": \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\";\\n\");\r\n    this.visitNamespace(element);\r\n  }\r\n\r\n  visitEnum(element: Enum): void {\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel++);\r\n    sb.push(\"enum \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\" {\\n\");\r\n    var members = element.members;\r\n    if (members) {\r\n      let numMembers = members.size;\r\n      for (let [name, member] of members) {\r\n        if (member.kind == ElementKind.ENUMVALUE) {\r\n          indent(sb, this.indentLevel);\r\n          sb.push(name);\r\n          if (member.is(CommonFlags.INLINED)) {\r\n            sb.push(\" = \");\r\n            sb.push((<EnumValue>member).constantValue.toString(10));\r\n          }\r\n          sb.push(\",\\n\");\r\n          --numMembers;\r\n        }\r\n      }\r\n      if (numMembers) this.visitNamespace(element);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitFunction(element: Function): void {\r\n    if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\r\n    var sb = this.sb;\r\n    var signature = element.signature;\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n    if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n    if (element.is(CommonFlags.GET)) {\r\n      sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\r\n      sb.push(\": \");\r\n      sb.push(this.typeToString(signature.returnType));\r\n      sb.push(\";\\n\");\r\n      return;\r\n    } else {\r\n      if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\r\n      sb.push(element.simpleName);\r\n    }\r\n    sb.push(\"(\");\r\n    var parameters = signature.parameterTypes;\r\n    var numParameters = parameters.length;\r\n    // var requiredParameters = signature.requiredParameters;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      if (i) sb.push(\", \");\r\n      // if (i >= requiredParameters) sb.push(\"optional \");\r\n      sb.push(signature.getParameterName(i));\r\n      sb.push(\": \");\r\n      sb.push(this.typeToString(parameters[i]));\r\n    }\r\n    if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\r\n      sb.push(\")\");\r\n    } else {\r\n      sb.push(\"): \");\r\n      sb.push(this.typeToString(signature.returnType));\r\n    }\r\n    sb.push(\";\\n\");\r\n    this.visitNamespace(element);\r\n  }\r\n\r\n  visitClass(element: Class): void {\r\n    var sb = this.sb;\r\n    var isInterface = element.kind == ElementKind.INTERFACE;\r\n    indent(sb, this.indentLevel++);\r\n    if (isInterface) {\r\n      sb.push(\"interface \");\r\n    } else {\r\n      if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\r\n      sb.push(\"class \");\r\n    }\r\n    sb.push(element.simpleName);\r\n    var base = element.base;\r\n    if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\r\n      sb.push(\" extends \");\r\n      sb.push(base.simpleName); // TODO: fqn\r\n    }\r\n    sb.push(\" {\\n\");\r\n    var members = element.prototype.members; // static\r\n    if (members) {\r\n      for (let member of members.values()) {\r\n        this.visitElement(member);\r\n      }\r\n    }\r\n    var ctor = element.constructorInstance;\r\n    if (ctor) this.visitFunction(ctor);\r\n    members = element.members; // instance\r\n    if (members) {\r\n      for (let member of members.values()) this.visitElement(member);\r\n    }\r\n    indent(sb, --this.indentLevel);\r\n    sb.push(\"}\\n\");\r\n  }\r\n\r\n  visitInterface(element: Interface): void {\r\n    this.visitClass(element);\r\n  }\r\n\r\n  visitField(element: Field): void {\r\n    if (element.is(CommonFlags.PRIVATE)) return;\r\n    var sb = this.sb;\r\n    indent(sb, this.indentLevel);\r\n    if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n    if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n    if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\r\n    sb.push(element.simpleName);\r\n    sb.push(\": \");\r\n    sb.push(this.typeToString(element.type));\r\n    sb.push(\";\\n\");\r\n  }\r\n\r\n  visitNamespace(element: Element): void {\r\n    var members = element.members;\r\n    if (members && members.size) {\r\n      let sb = this.sb;\r\n      indent(sb, this.indentLevel++);\r\n      sb.push(\"namespace \");\r\n      sb.push(element.simpleName);\r\n      sb.push(\" {\\n\");\r\n      for (let member of members.values()) this.visitElement(member);\r\n      indent(sb, --this.indentLevel);\r\n      sb.push(\"}\\n\");\r\n    }\r\n  }\r\n\r\n  typeToString(type: Type): string {\r\n    switch (type.kind) {\r\n      case TypeKind.I8: return \"i8\";\r\n      case TypeKind.I16: return \"i16\";\r\n      case TypeKind.I32: return \"i32\";\r\n      case TypeKind.I64: return \"I64\";\r\n      case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\r\n      case TypeKind.U8: return \"u8\";\r\n      case TypeKind.U16: return \"u16\";\r\n      case TypeKind.U32: return \"u32\";\r\n        // ^ TODO: function types\r\n      case TypeKind.U64: return \"U64\";\r\n      case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\r\n        // ^ TODO: class types\r\n      case TypeKind.BOOL: return \"bool\";\r\n      case TypeKind.F32: return \"f32\";\r\n      case TypeKind.F64: return \"f64\";\r\n      case TypeKind.VOID: return \"void\";\r\n      default: {\r\n        assert(false);\r\n        return \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  build(): string {\r\n    var sb = this.sb;\r\n    sb.push(\"declare module ASModule {\\n\");\r\n    sb.push(\"  type i8 = number;\\n\");\r\n    sb.push(\"  type i16 = number;\\n\");\r\n    sb.push(\"  type i32 = number;\\n\");\r\n    sb.push(\"  type u8 = number;\\n\");\r\n    sb.push(\"  type u16 = number;\\n\");\r\n    sb.push(\"  type u32 = number;\\n\");\r\n    sb.push(\"  type f32 = number;\\n\");\r\n    sb.push(\"  type f64 = number;\\n\");\r\n    sb.push(\"  type bool = any;\\n\");\r\n    ++this.indentLevel;\r\n    this.walk();\r\n    --this.indentLevel;\r\n    sb.push(\"}\\n\");\r\n    sb.push(\"export default ASModule;\\n\");\r\n    return this.sb.join(\"\");\r\n  }\r\n}\r\n\r\n// helpers\r\n\r\n/** Tests if a namespace-like element has at least one compiled member. */\r\nfunction hasCompiledMember(element: Element): bool {\r\n  var members = element.members;\r\n  if (members) {\r\n    for (let member of members.values()) {\r\n      switch (member.kind) {\r\n        case ElementKind.FUNCTION_PROTOTYPE: {\r\n          for (let instance of (<FunctionPrototype>member).instances.values()) {\r\n            if (instance.is(CommonFlags.COMPILED)) return true;\r\n          }\r\n          break;\r\n        }\r\n        case ElementKind.CLASS_PROTOTYPE: {\r\n          for (let instance of (<ClassPrototype>member).instances.values()) {\r\n            if (instance.is(CommonFlags.COMPILED)) return true;\r\n          }\r\n          break;\r\n        }\r\n        default: {\r\n          if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n","/**\r\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\r\n * @module decompiler\r\n *//***/\r\n\r\nimport {\r\n  Module,\r\n  NativeType,\r\n  ExpressionId,\r\n  UnaryOp,\r\n  BinaryOp,\r\n  HostOp,\r\n  FunctionRef,\r\n  ExpressionRef,\r\n  Index,\r\n  getFunctionName,\r\n  getFunctionBody,\r\n  getFunctionParamCount,\r\n  getFunctionParamType,\r\n  getFunctionResultType,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getBlockName,\r\n  getBlockChildCount,\r\n  getBlockChild,\r\n  getIfCondition,\r\n  getIfTrue,\r\n  getIfFalse,\r\n  getLoopName,\r\n  getLoopBody,\r\n  getBreakName,\r\n  getBreakCondition,\r\n  getGetLocalIndex,\r\n  getSetLocalIndex,\r\n  getSetLocalValue,\r\n  getLoadOffset,\r\n  getLoadPtr,\r\n  getStoreOffset,\r\n  getStorePtr,\r\n  getStoreValue,\r\n  getConstValueI32,\r\n  getConstValueI64Low,\r\n  getConstValueI64High,\r\n  getConstValueF32,\r\n  getConstValueF64,\r\n  getUnaryOp,\r\n  getUnaryValue,\r\n  getBinaryOp,\r\n  getBinaryLeft,\r\n  getBinaryRight,\r\n  getSelectThen,\r\n  getSelectElse,\r\n  getSelectCondition,\r\n  getDropValue,\r\n  getReturnValue,\r\n  getHostOp,\r\n  getHostOperand\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n  static decompile(module: Module): string {\r\n    var decompiler = new Decompiler();\r\n    decompiler.decompile(module);\r\n    return decompiler.finish();\r\n  }\r\n\r\n  text: string[] = [];\r\n  functionId: i32 = 0;\r\n\r\n  constructor() { }\r\n\r\n  /** Decompiles a module to an AST that can then be serialized. */\r\n  decompile(module: Module): void {\r\n    throw new Error(\"not implemented\");\r\n  }\r\n\r\n  decompileFunction(func: FunctionRef): void {\r\n    var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\r\n    var body = getFunctionBody(func);\r\n    this.push(\"function \");\r\n    this.push(name);\r\n    this.push(\"(\");\r\n     for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\r\n      if (i > 0) this.push(\", \");\r\n      this.push(\"$\");\r\n      this.push(i.toString(10));\r\n      this.push(\": \");\r\n      this.push(nativeTypeToType(getFunctionParamType(func, i)));\r\n    }\r\n    this.push(\"): \");\r\n    this.push(nativeTypeToType(getFunctionResultType(func)));\r\n    this.push(\" \");\r\n    if (getExpressionId(body) != ExpressionId.Block) {\r\n      this.push(\"{\\n\");\r\n    }\r\n    this.decompileExpression(body);\r\n    if (getExpressionId(body) != ExpressionId.Block) {\r\n      this.push(\"\\n}\\n\");\r\n    }\r\n    ++this.functionId;\r\n  }\r\n\r\n  decompileExpression(expr: ExpressionRef): void {\r\n    var id = getExpressionId(expr);\r\n    var type = getExpressionType(expr);\r\n\r\n    var nested: ExpressionRef;\r\n    var string: string | null;\r\n    var i: Index, k: Index;\r\n\r\n    switch (id) {\r\n      case ExpressionId.Block: { // TODO: magic\r\n        if ((string = getBlockName(expr)) != null) {\r\n          this.push(string);\r\n          this.push(\": \");\r\n        }\r\n        this.push(\"{\\n\");\r\n        k = getBlockChildCount(expr);\r\n        for (i = 0; i < k; ++i) {\r\n          this.decompileExpression(getBlockChild(expr, i));\r\n        }\r\n        this.push(\"}\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.If: {\r\n        if (type == NativeType.None) {\r\n          this.push(\"if (\");\r\n          this.decompileExpression(getIfCondition(expr));\r\n          this.push(\") \");\r\n          this.decompileExpression(getIfTrue(expr));\r\n          if (nested = getIfFalse(expr)) {\r\n            this.push(\" else \");\r\n            this.decompileExpression(nested);\r\n          }\r\n        } else {\r\n          this.decompileExpression(getIfCondition(expr));\r\n          this.push(\" ? \");\r\n          this.decompileExpression(getIfTrue(expr));\r\n          this.push(\" : \");\r\n          this.decompileExpression(getIfFalse(expr));\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Loop: {\r\n        if ((string = getLoopName(expr)) != null) {\r\n          this.push(string);\r\n          this.push(\": \");\r\n        }\r\n        this.push(\"do \");\r\n        this.decompileExpression(getLoopBody(expr));\r\n        this.push(\"while (0);\\n\");\r\n      }\r\n      case ExpressionId.Break: {\r\n        if (nested = getBreakCondition(expr)) {\r\n          this.push(\"if (\");\r\n          this.decompileExpression(nested);\r\n          this.push(\") \");\r\n        }\r\n        if ((string = getBreakName(expr)) != null) {\r\n          this.push(\"break \");\r\n          this.push(string);\r\n          this.push(\";\\n\");\r\n        } else {\r\n          this.push(\"break;\\n\");\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Switch:\r\n      case ExpressionId.Call:\r\n      case ExpressionId.CallImport:\r\n      case ExpressionId.CallIndirect: {\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case ExpressionId.GetLocal: {\r\n        this.push(\"$\");\r\n        this.push(getGetLocalIndex(expr).toString(10));\r\n        return;\r\n      }\r\n      case ExpressionId.SetLocal: {\r\n        this.push(\"$\");\r\n        this.push(getSetLocalIndex(expr).toString(10));\r\n        this.push(\" = \");\r\n        this.decompileExpression(getSetLocalValue(expr));\r\n        return;\r\n      }\r\n      case ExpressionId.GetGlobal:\r\n      case ExpressionId.SetGlobal: {\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case ExpressionId.Load: {\r\n        this.push(\"load<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.push(getLoadOffset(expr).toString(10));\r\n        this.push(\" + \");\r\n        this.decompileExpression(getLoadPtr(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Store: {\r\n        this.push(\"store<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.push(getStoreOffset(expr).toString(10));\r\n        this.push(\" + \");\r\n        this.decompileExpression(getStorePtr(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getStoreValue(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Const: {\r\n        switch (type) {\r\n          case NativeType.I32: {\r\n            this.push(getConstValueI32(expr).toString(10));\r\n            return;\r\n          }\r\n          case NativeType.I64: {\r\n            this.push(\r\n              i64_to_string(\r\n                i64_new(\r\n                  getConstValueI64Low(expr),\r\n                  getConstValueI64High(expr)\r\n                )\r\n              )\r\n            );\r\n            return;\r\n          }\r\n          case NativeType.F32: {\r\n            this.push(getConstValueF32(expr).toString(10));\r\n            return;\r\n          }\r\n          case NativeType.F64: {\r\n            this.push(getConstValueF64(expr).toString(10));\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Unary: {\r\n        switch (getUnaryOp(expr)) {\r\n          case UnaryOp.ClzI32: {\r\n            this.push(\"clz<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CtzI32: {\r\n            this.push(\"ctz<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.PopcntI32: {\r\n            this.push(\"popcnt<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NegF32:\r\n          case UnaryOp.NegF64: {\r\n            this.push(\"-\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.AbsF32: {\r\n            this.push(\"abs<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CeilF32: {\r\n            this.push(\"ceil<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.FloorF32: {\r\n            this.push(\"floor<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32: {\r\n            this.push(\"trunc<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NearestF32: {\r\n            this.push(\"nearest<i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.SqrtF32: {\r\n            this.push(\"sqrt<f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.EqzI32:\r\n          case UnaryOp.EqzI64: {\r\n            this.push(\"!\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ClzI64: {\r\n            this.push(\"clz<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CtzI64: {\r\n            this.push(\"ctz<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.PopcntI64: {\r\n            this.push(\"popcnt<i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.AbsF64: {\r\n            this.push(\"abs<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.CeilF64: {\r\n            this.push(\"ceil<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.FloorF64: {\r\n            this.push(\"floor<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64: {\r\n            this.push(\"trunc<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.NearestF64: {\r\n            this.push(\"nearest<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.SqrtF64: {\r\n            this.push(\"sqrt<f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ExtendI32: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ExtendU32: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.WrapI64: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToI32: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToI64: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToU32: {\r\n            this.push(\"<i32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF32ToU64: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToI32: {\r\n            this.push(\"<i32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToI64: {\r\n            this.push(\"<i64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToU32: {\r\n            this.push(\"<i32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.TruncF64ToU64: {\r\n            this.push(\"<i64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretF32: {\r\n            this.push(\"reinterpret<f32,i32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretF64: {\r\n            this.push(\"reinterpret<f64,i64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI32ToF32: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI32ToF64: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU32ToF32: {\r\n            this.push(\"<f32><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU32ToF64: {\r\n            this.push(\"<f64><u32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI64ToF32: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertI64ToF64: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU64ToF32: {\r\n            this.push(\"<f32><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ConvertU64ToF64: {\r\n            this.push(\"<f64><u64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.PromoteF32: {\r\n            this.push(\"<f64>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.DemoteF64: {\r\n            this.push(\"<f32>\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretI32: {\r\n            this.push(\"reinterpret<i32,f32>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case UnaryOp.ReinterpretI64: {\r\n            this.push(\"reinterpret<i64,f64>(\");\r\n            this.decompileExpression(getUnaryValue(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Binary: { // TODO: precedence\r\n        switch (getBinaryOp(expr)) {\r\n          case BinaryOp.AddI32:\r\n          case BinaryOp.AddI64:\r\n          case BinaryOp.AddF32:\r\n          case BinaryOp.AddF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" + \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.SubI32:\r\n          case BinaryOp.SubI64:\r\n          case BinaryOp.SubF32:\r\n          case BinaryOp.SubF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" - \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.MulI32:\r\n          case BinaryOp.MulI64:\r\n          case BinaryOp.MulF32:\r\n          case BinaryOp.MulF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" * \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivI32:\r\n          case BinaryOp.DivI64:\r\n          case BinaryOp.DivF32:\r\n          case BinaryOp.DivF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivU32: {\r\n            this.push(\"<i32>(<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RemI32:\r\n          case BinaryOp.RemI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" % \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RemU32: {\r\n            this.push(\"<i32>(<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.AndI32:\r\n          case BinaryOp.AndI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" & \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.OrI32:\r\n          case BinaryOp.OrI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" | \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.XorI32:\r\n          case BinaryOp.XorI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" ^ \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShlI32:\r\n          case BinaryOp.ShlI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" << \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShrU32:\r\n          case BinaryOp.ShrU64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >>> \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.ShrI32:\r\n          case BinaryOp.ShrI64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >> \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RotlI32: {\r\n            this.push(\"rotl<i32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RotrI32: {\r\n            this.push(\"rotr<i32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.EqI32:\r\n          case BinaryOp.EqI64:\r\n          case BinaryOp.EqF32:\r\n          case BinaryOp.EqF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" == \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.NeI32:\r\n          case BinaryOp.NeI64:\r\n          case BinaryOp.NeF32:\r\n          case BinaryOp.NeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" != \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LtI32:\r\n          case BinaryOp.LtI64:\r\n          case BinaryOp.LtF32:\r\n          case BinaryOp.LtF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LtU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeI32:\r\n          case BinaryOp.LeI64:\r\n          case BinaryOp.LeF32:\r\n          case BinaryOp.LeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtI32:\r\n          case BinaryOp.GtI64:\r\n          case BinaryOp.GtF32:\r\n          case BinaryOp.GtF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeI32:\r\n          case BinaryOp.GeI64:\r\n          case BinaryOp.GeF32:\r\n          case BinaryOp.GeF64: {\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeU32: {\r\n            this.push(\"<u32>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= <u32>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.DivU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" / <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RemU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" % <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.RotlI64: {\r\n            this.push(\"rotl<i64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.RotrI64: {\r\n            this.push(\"rotr<i64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.LtU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" < <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.LeU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" <= <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GtU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" > <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.GeU64: {\r\n            this.push(\"<u64>\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\" >= <u64>\");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            return;\r\n          }\r\n          case BinaryOp.CopysignF32: {\r\n            this.push(\"copysign<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MinF32: {\r\n            this.push(\"min<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MaxF32: {\r\n            this.push(\"max<f32>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.CopysignF64: {\r\n            this.push(\"copysign<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MinF64: {\r\n            this.push(\"min<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n          case BinaryOp.MaxF64: {\r\n            this.push(\"max<f64>(\");\r\n            this.decompileExpression(getBinaryLeft(expr));\r\n            this.push(\", \");\r\n            this.decompileExpression(getBinaryRight(expr));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Select: {\r\n        this.push(\"select<\");\r\n        this.push(nativeTypeToType(type));\r\n        this.push(\">(\");\r\n        this.decompileExpression(getSelectThen(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getSelectElse(expr));\r\n        this.push(\", \");\r\n        this.decompileExpression(getSelectCondition(expr));\r\n        this.push(\")\");\r\n        return;\r\n      }\r\n      case ExpressionId.Drop: {\r\n        this.decompileExpression(getDropValue(expr));\r\n        this.push(\";\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.Return: {\r\n        if (nested = getReturnValue(expr)) {\r\n          this.push(\"return \");\r\n          this.decompileExpression(nested);\r\n          this.push(\";\\n\");\r\n        } else {\r\n          this.push(\"return;\\n\");\r\n        }\r\n        return;\r\n      }\r\n      case ExpressionId.Host: {\r\n        switch (getHostOp(expr)) {\r\n          case HostOp.CurrentMemory: {\r\n            this.push(\"current_memory()\");\r\n            return;\r\n          }\r\n          case HostOp.GrowMemory: {\r\n            this.push(\"grow_memory(\");\r\n            this.decompileExpression(getHostOperand(expr, 0));\r\n            this.push(\")\");\r\n            return;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case ExpressionId.Nop: {\r\n        this.push(\";\\n\");\r\n        return;\r\n      }\r\n      case ExpressionId.Unreachable: {\r\n        this.push(\"unreachable()\");\r\n        return;\r\n      }\r\n      case ExpressionId.AtomicCmpxchg:\r\n      case ExpressionId.AtomicRMW:\r\n      case ExpressionId.AtomicWait:\r\n      case ExpressionId.AtomicWake:\r\n    }\r\n    throw new Error(\"not implemented\");\r\n  }\r\n\r\n  private push(text: string): void {\r\n    // mostly here so we can add debugging if necessary\r\n    this.text.push(text);\r\n  }\r\n\r\n  finish(): string {\r\n    var ret = this.text.join(\"\");\r\n    this.text = [];\r\n    return ret;\r\n  }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n  switch (type) {\r\n    case NativeType.None: return \"void\";\r\n    case NativeType.I32: return \"i32\";\r\n    case NativeType.I64: return \"i64\";\r\n    case NativeType.F32: return \"f32\";\r\n    case NativeType.F64: return \"f64\";\r\n    case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n    case NativeType.Auto: throw new Error(\"auto type\");\r\n    default: throw new Error(\"unexpected type\");\r\n  }\r\n}\r\n","/**\r\n * Low-level C-like compiler API.\r\n * @module index\r\n *//***/\r\n\r\nimport {\r\n  Compiler,\r\n  Options,\r\n  Target,\r\n  Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n  IDLBuilder,\r\n  TSDBuilder\r\n} from \"./definitions\";\r\n\r\nimport {\r\n  DiagnosticMessage,\r\n  DiagnosticCategory,\r\n  formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Module\r\n} from \"./module\";\r\n\r\nimport {\r\n  Parser\r\n} from \"./parser\";\r\n\r\nimport {\r\n  Program\r\n} from \"./program\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n  parser: Parser | null = null\r\n): Parser {\r\n  if (!parser) parser = new Parser();\r\n  parser.parseFile(text, path, isEntry);\r\n  return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n  return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n  var program = parser.program;\r\n  return program.diagnosticsOffset < program.diagnostics.length\r\n    ? program.diagnostics[program.diagnosticsOffset++]\r\n    : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n  return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n  return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n  options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n  options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n  options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `importMemory` option. */\r\nexport function setImportMemory(options: Options, importMemory: bool): void {\r\n  options.importMemory = importMemory;\r\n}\r\n\r\n/** Sets the `importTable` option. */\r\nexport function setImportTable(options: Options, importTable: bool): void {\r\n  options.importTable = importTable;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n  options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n  options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Sets a 'globalAliases' value. */\r\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\r\n  var globalAliases = options.globalAliases;\r\n  if (!globalAliases) options.globalAliases = globalAliases = new Map();\r\n  globalAliases.set(name, alias);\r\n}\r\n\r\n/** Sign extension operations. */\r\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\r\n/** Mutable global imports and exports. */\r\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\r\n\r\n/** Enables a specific feature. */\r\nexport function enableFeature(options: Options, feature: Feature): void {\r\n  options.features |= feature;\r\n}\r\n\r\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\r\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\r\n  options.optimizeLevelHint = optimizeLevel;\r\n  options.shrinkLevelHint = shrinkLevel;\r\n}\r\n\r\n/** Finishes parsing. */\r\nexport function finishParsing(parser: Parser): Program {\r\n  return parser.finish();\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compileProgram(program: Program, options: Options | null = null): Module {\r\n  return new Compiler(program, options).compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompileModule(module: Module): string {\r\n  var decompiler = new Decompiler();\r\n  decompiler.decompile(module);\r\n  return decompiler.finish();\r\n}\r\n\r\n/** Builds WebIDL definitions for the specified program. */\r\nexport function buildIDL(program: Program): string {\r\n  return IDLBuilder.build(program);\r\n}\r\n\r\n/** Builds TypeScript definitions for the specified program. */\r\nexport function buildTSD(program: Program): string {\r\n  return TSDBuilder.build(program);\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./common\";\r\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n  wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n    0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n  ])), {}).exports;\r\n} catch (e) {\r\n  // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n *  See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n    /**\r\n     * The low 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.low = low | 0;\r\n\r\n    /**\r\n     * The high 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.high = high | 0;\r\n\r\n    /**\r\n     * Whether unsigned or not.\r\n     * @type {boolean}\r\n     */\r\n    this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations.  For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative).  Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n    return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n    var obj, cachedObj, cache;\r\n    if (unsigned) {\r\n        value >>>= 0;\r\n        if (cache = (0 <= value && value < 256)) {\r\n            cachedObj = UINT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n        if (cache)\r\n            UINT_CACHE[value] = obj;\r\n        return obj;\r\n    } else {\r\n        value |= 0;\r\n        if (cache = (-128 <= value && value < 128)) {\r\n            cachedObj = INT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n        if (cache)\r\n            INT_CACHE[value] = obj;\r\n        return obj;\r\n    }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n    if (isNaN(value))\r\n        return unsigned ? UZERO : ZERO;\r\n    if (unsigned) {\r\n        if (value < 0)\r\n            return UZERO;\r\n        if (value >= TWO_PWR_64_DBL)\r\n            return MAX_UNSIGNED_VALUE;\r\n    } else {\r\n        if (value <= -TWO_PWR_63_DBL)\r\n            return MIN_VALUE;\r\n        if (value + 1 >= TWO_PWR_63_DBL)\r\n            return MAX_VALUE;\r\n    }\r\n    if (value < 0)\r\n        return fromNumber(-value, unsigned).neg();\r\n    return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n    return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n *  assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n    if (str.length === 0)\r\n        throw Error('empty string');\r\n    if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n        return ZERO;\r\n    if (typeof unsigned === 'number') {\r\n        // For goog.math.long compatibility\r\n        radix = unsigned,\r\n        unsigned = false;\r\n    } else {\r\n        unsigned = !! unsigned;\r\n    }\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n\r\n    var p;\r\n    if ((p = str.indexOf('-')) > 0)\r\n        throw Error('interior hyphen');\r\n    else if (p === 0) {\r\n        return fromString(str.substring(1), unsigned, radix).neg();\r\n    }\r\n\r\n    // Do several (8) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n    var result = ZERO;\r\n    for (var i = 0; i < str.length; i += 8) {\r\n        var size = Math.min(8, str.length - i),\r\n            value = parseInt(str.substring(i, i + size), radix);\r\n        if (size < 8) {\r\n            var power = fromNumber(pow_dbl(radix, size));\r\n            result = result.mul(power).add(fromNumber(value));\r\n        } else {\r\n            result = result.mul(radixToPower);\r\n            result = result.add(fromNumber(value));\r\n        }\r\n    }\r\n    result.unsigned = unsigned;\r\n    return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n    if (typeof val === 'number')\r\n        return fromNumber(val, unsigned);\r\n    if (typeof val === 'string')\r\n        return fromString(val, unsigned);\r\n    // Throws for non-objects, converts non-instanceof Long:\r\n    return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n    return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n    if (this.unsigned)\r\n        return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n    return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n    if (this.isZero())\r\n        return '0';\r\n    if (this.isNegative()) { // Unsigned Longs are never negative\r\n        if (this.eq(MIN_VALUE)) {\r\n            // We need to change the Long value before it can be negated, so we remove\r\n            // the bottom-most digit in this base and then recurse to do the rest.\r\n            var radixLong = fromNumber(radix),\r\n                div = this.div(radixLong),\r\n                rem1 = div.mul(radixLong).sub(this);\r\n            return div.toString(radix) + rem1.toInt().toString(radix);\r\n        } else\r\n            return '-' + this.neg().toString(radix);\r\n    }\r\n\r\n    // Do several (6) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n        rem = this;\r\n    var result = '';\r\n    while (true) {\r\n        var remDiv = rem.div(radixToPower),\r\n            intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n            digits = intval.toString(radix);\r\n        rem = remDiv;\r\n        if (rem.isZero())\r\n            return digits + result;\r\n        else {\r\n            while (digits.length < 6)\r\n                digits = '0' + digits;\r\n            result = '' + digits + result;\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n    return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n    return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n    return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n    return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n    if (this.isNegative()) // Unsigned Longs are never negative\r\n        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n    var val = this.high != 0 ? this.high : this.low;\r\n    for (var bit = 31; bit > 0; bit--)\r\n        if ((val & (1 << bit)) != 0)\r\n            break;\r\n    return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n    return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n    return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n    return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n    return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n    return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n        return false;\r\n    return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n    return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n    return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n    return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.eq(other))\r\n        return 0;\r\n    var thisNeg = this.isNegative(),\r\n        otherNeg = other.isNegative();\r\n    if (thisNeg && !otherNeg)\r\n        return -1;\r\n    if (!thisNeg && otherNeg)\r\n        return 1;\r\n    // At this point the sign bits are the same\r\n    if (!this.unsigned)\r\n        return this.sub(other).isNegative() ? -1 : 1;\r\n    // Both are positive if at least one is unsigned\r\n    return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n    if (!this.unsigned && this.eq(MIN_VALUE))\r\n        return MIN_VALUE;\r\n    return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n    if (!isLong(addend))\r\n        addend = fromValue(addend);\r\n\r\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = addend.high >>> 16;\r\n    var b32 = addend.high & 0xFFFF;\r\n    var b16 = addend.low >>> 16;\r\n    var b00 = addend.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 + b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 + b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 + b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 + b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n    if (!isLong(subtrahend))\r\n        subtrahend = fromValue(subtrahend);\r\n    return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n    if (this.isZero())\r\n        return ZERO;\r\n    if (!isLong(multiplier))\r\n        multiplier = fromValue(multiplier);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = wasm.mul(this.low,\r\n                           this.high,\r\n                           multiplier.low,\r\n                           multiplier.high);\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (multiplier.isZero())\r\n        return ZERO;\r\n    if (this.eq(MIN_VALUE))\r\n        return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n    if (multiplier.eq(MIN_VALUE))\r\n        return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n    if (this.isNegative()) {\r\n        if (multiplier.isNegative())\r\n            return this.neg().mul(multiplier.neg());\r\n        else\r\n            return this.neg().mul(multiplier).neg();\r\n    } else if (multiplier.isNegative())\r\n        return this.mul(multiplier.neg()).neg();\r\n\r\n    // If both longs are small, use float multiplication\r\n    if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n    // We can skip products that would overflow.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = multiplier.high >>> 16;\r\n    var b32 = multiplier.high & 0xFFFF;\r\n    var b16 = multiplier.low >>> 16;\r\n    var b00 = multiplier.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 * b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 * b00;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c16 += a00 * b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 * b00;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a16 * b16;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a00 * b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n *  unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n    if (divisor.isZero())\r\n        throw Error('division by zero');\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        // guard against signed division overflow: the largest\r\n        // negative number / -1 would be 1 larger than the largest\r\n        // positive number, due to two's complement.\r\n        if (!this.unsigned &&\r\n            this.high === -0x80000000 &&\r\n            divisor.low === -1 && divisor.high === -1) {\r\n            // be consistent with non-wasm code path\r\n            return this;\r\n        }\r\n        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (this.isZero())\r\n        return this.unsigned ? UZERO : ZERO;\r\n    var approx, rem, res;\r\n    if (!this.unsigned) {\r\n        // This section is only relevant for signed longs and is derived from the\r\n        // closure library as a whole.\r\n        if (this.eq(MIN_VALUE)) {\r\n            if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n                return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\r\n            else if (divisor.eq(MIN_VALUE))\r\n                return ONE;\r\n            else {\r\n                // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n                var halfThis = this.shr(1);\r\n                approx = halfThis.div(divisor).shl(1);\r\n                if (approx.eq(ZERO)) {\r\n                    return divisor.isNegative() ? ONE : NEG_ONE;\r\n                } else {\r\n                    rem = this.sub(divisor.mul(approx));\r\n                    res = approx.add(rem.div(divisor));\r\n                    return res;\r\n                }\r\n            }\r\n        } else if (divisor.eq(MIN_VALUE))\r\n            return this.unsigned ? UZERO : ZERO;\r\n        if (this.isNegative()) {\r\n            if (divisor.isNegative())\r\n                return this.neg().div(divisor.neg());\r\n            return this.neg().div(divisor).neg();\r\n        } else if (divisor.isNegative())\r\n            return this.div(divisor.neg()).neg();\r\n        res = ZERO;\r\n    } else {\r\n        // The algorithm below has not been made for unsigned longs. It's therefore\r\n        // required to take special care of the MSB prior to running it.\r\n        if (!divisor.unsigned)\r\n            divisor = divisor.toUnsigned();\r\n        if (divisor.gt(this))\r\n            return UZERO;\r\n        if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n            return UONE;\r\n        res = UZERO;\r\n    }\r\n\r\n    // Repeat the following until the remainder is less than other:  find a\r\n    // floating-point that approximates remainder / other *from below*, add this\r\n    // into the result, and subtract it from the remainder.  It is critical that\r\n    // the approximate value is less than or equal to the real value so that the\r\n    // remainder never becomes negative.\r\n    rem = this;\r\n    while (rem.gte(divisor)) {\r\n        // Approximate the result of division. This may be a little greater or\r\n        // smaller than the actual value.\r\n        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n        // We will tweak the approximate result by changing it in the 48-th digit or\r\n        // the smallest non-fractional digit, whichever is larger.\r\n        var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n            delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n        // Decrease the approximation until it is smaller than the remainder.  Note\r\n        // that if it is too large, the product overflows and is negative.\r\n            approxRes = fromNumber(approx),\r\n            approxRem = approxRes.mul(divisor);\r\n        while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n            approx -= delta;\r\n            approxRes = fromNumber(approx, this.unsigned);\r\n            approxRem = approxRes.mul(divisor);\r\n        }\r\n\r\n        // We know the answer can't be zero... and actually, zero would cause\r\n        // infinite recursion since we would make no progress.\r\n        if (approxRes.isZero())\r\n            approxRes = ONE;\r\n\r\n        res = res.add(approxRes);\r\n        rem = rem.sub(approxRem);\r\n    }\r\n    return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n    return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n    else\r\n        return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n    else\r\n        return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    numBits &= 63;\r\n    if (numBits === 0)\r\n        return this;\r\n    else {\r\n        var high = this.high;\r\n        if (numBits < 32) {\r\n            var low = this.low;\r\n            return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n        } else if (numBits === 32)\r\n            return fromBits(high, 0, this.unsigned);\r\n        else\r\n            return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n    }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n    if (!this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n    if (this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.<number>} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n    return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.<number>} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        lo        & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo >>> 16 & 0xff,\r\n        lo >>> 24       ,\r\n        hi        & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi >>> 16 & 0xff,\r\n        hi >>> 24\r\n    ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.<number>} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        hi >>> 24       ,\r\n        hi >>> 16 & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi        & 0xff,\r\n        lo >>> 24       ,\r\n        lo >>> 16 & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo        & 0xff\r\n    ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.<number>} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n    return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.<number>} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[0]       |\r\n        bytes[1] <<  8 |\r\n        bytes[2] << 16 |\r\n        bytes[3] << 24,\r\n        bytes[4]       |\r\n        bytes[5] <<  8 |\r\n        bytes[6] << 16 |\r\n        bytes[7] << 24,\r\n        unsigned\r\n    );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.<number>} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[4] << 24 |\r\n        bytes[5] << 16 |\r\n        bytes[6] <<  8 |\r\n        bytes[7],\r\n        bytes[0] << 24 |\r\n        bytes[1] << 16 |\r\n        bytes[2] <<  8 |\r\n        bytes[3],\r\n        unsigned\r\n    );\r\n};\r\n","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_zero = Long.ZERO;\r\n\r\nglobal.i64_one = Long.ONE;\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n  return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n  return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n  return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n  return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n  return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n  return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n  return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n  return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n  return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n  return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n  return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n  return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n  return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n  return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n  return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n  return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n  return value.not();\r\n};\r\n\r\nglobal.i64_eq = function(left, right) {\r\n  return left.eq(right);\r\n};\r\n\r\nglobal.i64_ne = function(left, right) {\r\n  return left.ne(right);\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n  assert(alignment && (alignment & (alignment - 1)) == 0);\r\n  var mask = Long.fromInt(alignment - 1);\r\n  return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n  return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n      || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n  return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n      || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n  return (value.high === 0 && value.low >= 0)\r\n      || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n  return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n  return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n  return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n  return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n  return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n  return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n  return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n  return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n  return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n","const F64 = new Float64Array(1);\r\nconst F32 = new Float32Array(F64.buffer);\r\nconst I32 = new Int32Array(F64.buffer);\r\n\r\nglobal.f32_as_i32 = function(value) {\r\n  F32[0] = value;\r\n  return I32[0];\r\n};\r\n\r\nglobal.i32_as_f32 = function(value) {\r\n  I32[0] = value;\r\n  return F32[0];\r\n};\r\n\r\nglobal.f64_as_i64 = function(value) {\r\n  F64[0] = value;\r\n  return i64_new(I32[0], I32[1]);\r\n};\r\n\r\nglobal.i64_as_f64 = function(value) {\r\n  I32[0] = i64_low(value);\r\n  I32[1] = i64_high(value);\r\n  return F64[0];\r\n};\r\n","/**\r\n * Resolve infrastructure to obtain types and elements.\r\n * @module resolver\r\n *//***/\r\n\r\nimport {\r\n  DiagnosticEmitter,\r\n  DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Program,\r\n  ElementKind,\r\n  OperatorKind,\r\n  FlowFlags,\r\n\r\n  Element,\r\n  Class,\r\n  ClassPrototype,\r\n  Function,\r\n  FunctionTarget,\r\n  FunctionPrototype,\r\n  VariableLikeElement,\r\n  Property,\r\n  DecoratorFlags,\r\n  FieldPrototype,\r\n  Field\r\n} from \"./program\";\r\n\r\nimport {\r\n  SignatureNode,\r\n  ParameterKind,\r\n  CommonTypeNode,\r\n  NodeKind,\r\n  TypeNode,\r\n  TypeParameterNode,\r\n  Node,\r\n  Range,\r\n  IdentifierExpression,\r\n  CallExpression,\r\n  ElementAccessExpression,\r\n  PropertyAccessExpression,\r\n  LiteralExpression,\r\n  LiteralKind,\r\n  ParenthesizedExpression,\r\n  AssertionExpression,\r\n  Expression\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Type,\r\n  Signature,\r\n  typesToString\r\n} from \"./types\";\r\n\r\nimport {\r\n  PATH_DELIMITER,\r\n  INSTANCE_DELIMITER,\r\n  CommonFlags\r\n} from \"./common\";\r\n\r\n/** Indicates whether errors are reported or not. */\r\nenum ReportMode {\r\n  /** Report errors. */\r\n  REPORT,\r\n  /** Swallow errors. */\r\n  SWALLOW\r\n}\r\n\r\n/** Provides tools to resolve types and expressions. */\r\nexport class Resolver extends DiagnosticEmitter {\r\n\r\n  /** The program this resolver belongs to. */\r\n  program: Program;\r\n  /** Target expression of the previously resolved property or element access. */\r\n  resolvedThisExpression: Expression | null = null;\r\n  /** Element expression of the previously resolved element access. */\r\n  resolvedElementExpression : Expression | null = null;\r\n\r\n  /** Constructs the resolver for the specified program. */\r\n  constructor(program: Program) {\r\n    super(program.diagnostics);\r\n    this.program = program;\r\n  }\r\n\r\n  /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\r\n  resolveType(\r\n    node: CommonTypeNode,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportMode = ReportMode.REPORT\r\n  ): Type | null {\r\n\r\n    // handle signatures specifically\r\n    if (node.kind == NodeKind.SIGNATURE) {\r\n      let signature = this.resolveSignature(<SignatureNode>node, contextualTypeArguments, reportMode);\r\n      if (!signature) return null;\r\n      return node.isNullable ? signature.type.asNullable() : signature.type;\r\n    }\r\n\r\n    // now dealing with TypeNode\r\n    assert(node.kind == NodeKind.TYPE);\r\n    var typeNode = <TypeNode>node;\r\n    var simpleName = typeNode.name.text;\r\n    var globalName = simpleName;\r\n    var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache\r\n\r\n    // check file-global / program-global enum or class\r\n    {\r\n      let elementsLookup = this.program.elementsLookup;\r\n      let element: Element | null;\r\n      if (\r\n        (element = elementsLookup.get(localName)) || // file-global\r\n        (element = elementsLookup.get(globalName))   // program-global\r\n      ) {\r\n        switch (element.kind) {\r\n          case ElementKind.ENUM: {\r\n            if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {\r\n              if (reportMode == ReportMode.REPORT) {\r\n                this.error(\r\n                  DiagnosticCode.Type_0_is_not_generic,\r\n                  node.range, element.internalName\r\n                );\r\n              }\r\n              return null;\r\n            }\r\n            return Type.i32;\r\n          }\r\n          case ElementKind.CLASS_PROTOTYPE: {\r\n            let instance = this.resolveClassInclTypeArguments(\r\n              <ClassPrototype>element,\r\n              typeNode.typeArguments,\r\n              contextualTypeArguments,\r\n              node\r\n            ); // reports\r\n            if (!instance) return null;\r\n            return node.isNullable ? instance.type.asNullable() : instance.type;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // check (global) type alias\r\n    {\r\n      let alias = this.program.typeAliases.get(simpleName);\r\n      if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);\r\n    }\r\n\r\n    // resolve parameters\r\n    {\r\n      let typeArgumentNodes = typeNode.typeArguments;\r\n      if (typeArgumentNodes) {\r\n        let numTypeArguments = typeArgumentNodes.length;\r\n        let paramTypes = new Array<Type>(numTypeArguments);\r\n        for (let i = 0; i < numTypeArguments; ++i) {\r\n          let paramType = this.resolveType( // reports\r\n            typeArgumentNodes[i],\r\n            contextualTypeArguments,\r\n            reportMode\r\n          );\r\n          if (!paramType) return null;\r\n          paramTypes[i] = paramType;\r\n        }\r\n        if (numTypeArguments) { // can't be a placeholder if it has parameters\r\n          let instanceKey = typesToString(paramTypes);\r\n          if (instanceKey.length) {\r\n            localName += \"<\" + instanceKey + \">\";\r\n            globalName += \"<\" + instanceKey + \">\";\r\n          }\r\n        } else if (contextualTypeArguments) {\r\n          let placeholderType = contextualTypeArguments.get(globalName);\r\n          if (placeholderType) return placeholderType;\r\n        }\r\n      }\r\n    }\r\n\r\n    // check file-global / program-global type\r\n    {\r\n      let typesLookup = this.program.typesLookup;\r\n      let type: Type | null;\r\n      if (\r\n        (type = typesLookup.get(localName)) ||\r\n        (type = typesLookup.get(globalName))\r\n      ) {\r\n        return type;\r\n      }\r\n    }\r\n\r\n    if (reportMode == ReportMode.REPORT) {\r\n      this.error(\r\n        DiagnosticCode.Cannot_find_name_0,\r\n        typeNode.name.range, globalName\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\r\n  resolveSignature(\r\n    node: SignatureNode,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Signature | null {\r\n    var explicitThisType = node.explicitThisType;\r\n    var thisType: Type | null = null;\r\n    if (explicitThisType) {\r\n      thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\r\n      if (!thisType) return null;\r\n    }\r\n    var parameterTypeNodes = node.parameters;\r\n    var numParameters = parameterTypeNodes.length;\r\n    var parameterTypes = new Array<Type>(numParameters);\r\n    var parameterNames = new Array<string>(numParameters);\r\n    var requiredParameters = 0;\r\n    var hasRest = false;\r\n    for (let i = 0; i < numParameters; ++i) {\r\n      let parameterTypeNode = parameterTypeNodes[i];\r\n      switch (parameterTypeNode.parameterKind) {\r\n        case ParameterKind.DEFAULT: {\r\n          requiredParameters = i + 1;\r\n          break;\r\n        }\r\n        case ParameterKind.REST: {\r\n          assert(i == numParameters);\r\n          hasRest = true;\r\n          break;\r\n        }\r\n      }\r\n      let parameterType = this.resolveType(\r\n        assert(parameterTypeNode.type),\r\n        contextualTypeArguments,\r\n        reportMode\r\n      );\r\n      if (!parameterType) return null;\r\n      parameterTypes[i] = parameterType;\r\n      parameterNames[i] = parameterTypeNode.name.text;\r\n    }\r\n    var returnTypeNode = node.returnType;\r\n    var returnType: Type | null;\r\n    if (returnTypeNode) {\r\n      returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);\r\n      if (!returnType) return null;\r\n    } else {\r\n      returnType = Type.void;\r\n    }\r\n    var signature = new Signature(parameterTypes, returnType, thisType);\r\n    signature.parameterNames = parameterNames;\r\n    signature.requiredParameters = requiredParameters;\r\n    signature.hasRest = hasRest;\r\n    return signature;\r\n  }\r\n\r\n  /** Resolves an array of type arguments to concrete types. */\r\n  resolveTypeArguments(\r\n    typeParameters: TypeParameterNode[],\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    alternativeReportNode: Node | null = null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Type[] | null {\r\n    var parameterCount = typeParameters.length;\r\n    var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n    if (parameterCount != argumentCount) {\r\n      if (argumentCount) {\r\n        this.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          Range.join(\r\n            (<TypeNode[]>typeArgumentNodes)[0].range,\r\n            (<TypeNode[]>typeArgumentNodes)[argumentCount - 1].range\r\n          ),\r\n          parameterCount.toString(10), argumentCount.toString(10)\r\n        );\r\n      } else if (alternativeReportNode) {\r\n        this.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\"\r\n        );\r\n      }\r\n      return null;\r\n    }\r\n    var typeArguments = new Array<Type>(parameterCount);\r\n    for (let i = 0; i < parameterCount; ++i) {\r\n      let type = this.resolveType( // reports\r\n        (<TypeNode[]>typeArgumentNodes)[i],\r\n        contextualTypeArguments,\r\n        reportMode\r\n      );\r\n      if (!type) return null;\r\n      // TODO: check extendsType\r\n      typeArguments[i] = type;\r\n    }\r\n    return typeArguments;\r\n  }\r\n\r\n  /** Resolves an identifier to the element it refers to. */\r\n  resolveIdentifier(\r\n    identifier: IdentifierExpression,\r\n    context: Element | null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Element | null {\r\n    var name = identifier.text;\r\n    var element: Element | null;\r\n\r\n    if (context) {\r\n\r\n      switch (context.kind) {\r\n        case ElementKind.FUNCTION: { // search locals, use prototype\r\n          element = (<Function>context).flow.getScopedLocal(name);\r\n          if (element) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return element;\r\n          }\r\n          context = (<Function>context).prototype.parent;\r\n          break;\r\n        }\r\n        case ElementKind.CLASS: { // use prototype\r\n          context = (<Class>context).prototype.parent;\r\n          break;\r\n        }\r\n      }\r\n\r\n      // search context\r\n      while (context) {\r\n        let members = context.members;\r\n        if (members) {\r\n          if (element = members.get(name)) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return element;\r\n          }\r\n        }\r\n        context = context.parent;\r\n      }\r\n    }\r\n\r\n    // search current file\r\n    var elementsLookup = this.program.elementsLookup;\r\n    if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n      this.resolvedThisExpression = null;\r\n      this.resolvedElementExpression = null;\r\n      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n    }\r\n\r\n    // search global scope\r\n    if (element = elementsLookup.get(name)) {\r\n      this.resolvedThisExpression = null;\r\n      this.resolvedElementExpression = null;\r\n      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n    }\r\n\r\n    if (reportMode == ReportMode.REPORT) {\r\n      this.error(\r\n        DiagnosticCode.Cannot_find_name_0,\r\n        identifier.range, name\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Resolves a property access to the element it refers to. */\r\n  resolvePropertyAccess(\r\n    propertyAccess: PropertyAccessExpression,\r\n    contextualFunction: Function,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Element | null {\r\n    // start by resolving the lhs target (expression before the last dot)\r\n    var targetExpression = propertyAccess.expression;\r\n    var target = this.resolveExpression(targetExpression, contextualFunction, reportMode); // reports\r\n    if (!target) return null;\r\n\r\n    // at this point we know exactly what the target is, so look up the element within\r\n    var propertyName = propertyAccess.property.text;\r\n\r\n    // Resolve variable-likes to the class type they reference first\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL:\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        let classReference = (<VariableLikeElement>target).type.classReference;\r\n        if (!classReference) {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.property.range, propertyName, (<VariableLikeElement>target).type.toString()\r\n          );\r\n          return null;\r\n        }\r\n        target = classReference;\r\n        break;\r\n      }\r\n      case ElementKind.PROPERTY: {\r\n        let getter = this.resolveFunction(\r\n          assert((<Property>target).getterPrototype),\r\n          null,\r\n          null,\r\n          reportMode\r\n        );\r\n        if (!getter) return null;\r\n        let classReference = getter.signature.returnType.classReference;\r\n        if (!classReference) {\r\n          this.error(\r\n            DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n            propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\r\n          );\r\n          return null;\r\n        }\r\n        target = classReference;\r\n        break;\r\n      }\r\n      case ElementKind.CLASS: {\r\n        let elementExpression = this.resolvedElementExpression;\r\n        if (elementExpression) {\r\n          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);\r\n          if (!indexedGet) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n              elementExpression.range, (<Class>target).internalName\r\n            );\r\n            return null;\r\n          }\r\n          let returnType = indexedGet.signature.returnType;\r\n          if (!(target = returnType.classReference)) {\r\n            this.error(\r\n              DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n              propertyAccess.property.range, propertyName, returnType.toString()\r\n            );\r\n            return null;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    // Look up the member within\r\n    switch (target.kind) {\r\n      case ElementKind.CLASS_PROTOTYPE:\r\n      case ElementKind.CLASS: {\r\n        do {\r\n          let members = target.members;\r\n          let member: Element | null;\r\n          if (members && (member = members.get(propertyName))) {\r\n            this.resolvedThisExpression = targetExpression;\r\n            this.resolvedElementExpression = null;\r\n            return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\r\n          }\r\n          // traverse inherited static members on the base prototype if target is a class prototype\r\n          if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n            if ((<ClassPrototype>target).basePrototype) {\r\n              target = <ClassPrototype>(<ClassPrototype>target).basePrototype;\r\n            } else {\r\n              break;\r\n            }\r\n          // traverse inherited instance members on the base class if target is a class instance\r\n          } else if (target.kind == ElementKind.CLASS) {\r\n            if ((<Class>target).base) {\r\n              target = <Class>(<Class>target).base;\r\n            } else {\r\n              break;\r\n            }\r\n          } else {\r\n            break;\r\n          }\r\n        } while (true);\r\n        break;\r\n      }\r\n      default: { // enums or other namespace-like elements\r\n        let members = target.members;\r\n        if (members) {\r\n          let member = members.get(propertyName);\r\n          if (member) {\r\n            this.resolvedThisExpression = targetExpression;\r\n            this.resolvedElementExpression = null;\r\n            return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    this.error(\r\n      DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n      propertyAccess.property.range, propertyName, target.internalName\r\n    );\r\n    return null;\r\n  }\r\n\r\n  resolveElementAccess(\r\n    elementAccess: ElementAccessExpression,\r\n    contextualFunction: Function,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Element | null {\r\n    var targetExpression = elementAccess.expression;\r\n    var target = this.resolveExpression(targetExpression, contextualFunction, reportMode);\r\n    if (!target) return null;\r\n    switch (target.kind) {\r\n      case ElementKind.GLOBAL:\r\n      case ElementKind.LOCAL:\r\n      case ElementKind.FIELD: {\r\n        let type = (<VariableLikeElement>target).type;\r\n        if (target = type.classReference) {\r\n          this.resolvedThisExpression = targetExpression;\r\n          this.resolvedElementExpression = elementAccess.elementExpression;\r\n          return target;\r\n        }\r\n        break;\r\n      }\r\n      case ElementKind.CLASS: { // element access on element access\r\n        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);\r\n        if (!indexedGet) {\r\n          if (reportMode == ReportMode.REPORT) {\r\n            this.error(\r\n              DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n              elementAccess.range, (<Class>target).internalName\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n        let returnType = indexedGet.signature.returnType;\r\n        if (target = returnType.classReference) {\r\n          this.resolvedThisExpression = targetExpression;\r\n          this.resolvedElementExpression = elementAccess.elementExpression;\r\n          return target;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    if (reportMode == ReportMode.REPORT) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        targetExpression.range\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  resolveExpression(\r\n    expression: Expression,\r\n    contextualFunction: Function,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Element | null {\r\n    while (expression.kind == NodeKind.PARENTHESIZED) {\r\n      expression = (<ParenthesizedExpression>expression).expression;\r\n    }\r\n    switch (expression.kind) {\r\n      case NodeKind.ASSERTION: {\r\n        let type = this.resolveType(\r\n          (<AssertionExpression>expression).toType,\r\n          contextualFunction.flow.contextualTypeArguments,\r\n          reportMode\r\n        );\r\n        if (type) {\r\n          let classType = type.classReference;\r\n          if (classType) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return classType;\r\n          }\r\n        }\r\n        return null;\r\n      }\r\n      case NodeKind.BINARY: { // TODO: string concatenation, mostly\r\n        throw new Error(\"not implemented\");\r\n      }\r\n      case NodeKind.THIS: { // -> Class / ClassPrototype\r\n        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let explicitLocal = contextualFunction.flow.getScopedLocal(\"this\");\r\n          if (explicitLocal) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return explicitLocal;\r\n          }\r\n        }\r\n        let parent = contextualFunction.parent;\r\n        if (parent) {\r\n          this.resolvedThisExpression = null;\r\n          this.resolvedElementExpression = null;\r\n          return parent;\r\n        }\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.error(\r\n            DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n            expression.range\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      case NodeKind.SUPER: { // -> Class\r\n        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n          let explicitLocal = contextualFunction.flow.getScopedLocal(\"super\");\r\n          if (explicitLocal) {\r\n            this.resolvedThisExpression = null;\r\n            this.resolvedElementExpression = null;\r\n            return explicitLocal;\r\n          }\r\n        }\r\n        let parent = contextualFunction.parent;\r\n        if (parent && parent.kind == ElementKind.CLASS && (parent = (<Class>parent).base)) {\r\n          this.resolvedThisExpression = null;\r\n          this.resolvedElementExpression = null;\r\n          return parent;\r\n        }\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.error(\r\n            DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n            expression.range\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      case NodeKind.IDENTIFIER: {\r\n        return this.resolveIdentifier(<IdentifierExpression>expression, contextualFunction, reportMode);\r\n      }\r\n      case NodeKind.LITERAL: {\r\n        switch ((<LiteralExpression>expression).literalKind) {\r\n          case LiteralKind.STRING: {\r\n            this.resolvedThisExpression = expression;\r\n            this.resolvedElementExpression = null;\r\n            return this.program.stringInstance;\r\n          }\r\n          // case LiteralKind.ARRAY: // TODO\r\n        }\r\n        break;\r\n      }\r\n      case NodeKind.PROPERTYACCESS: {\r\n        return this.resolvePropertyAccess(\r\n          <PropertyAccessExpression>expression,\r\n          contextualFunction,\r\n          reportMode\r\n        );\r\n      }\r\n      case NodeKind.ELEMENTACCESS: {\r\n        return this.resolveElementAccess(\r\n          <ElementAccessExpression>expression,\r\n          contextualFunction,\r\n          reportMode\r\n        );\r\n      }\r\n      case NodeKind.CALL: {\r\n        let targetExpression = (<CallExpression>expression).expression;\r\n        let target = this.resolveExpression(targetExpression, contextualFunction, reportMode);\r\n        if (!target) return null;\r\n        if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n          let instance = this.resolveFunctionInclTypeArguments(\r\n            <FunctionPrototype>target,\r\n            (<CallExpression>expression).typeArguments,\r\n            contextualFunction.flow.contextualTypeArguments,\r\n            expression,\r\n            reportMode\r\n          );\r\n          if (!instance) return null;\r\n          let returnType = instance.signature.returnType;\r\n          let classType = returnType.classReference;\r\n          if (classType) {\r\n            // reuse resolvedThisExpression (might be property access)\r\n            // reuse resolvedElementExpression (might be element access)\r\n            return classType;\r\n          } else {\r\n            let signature = returnType.signatureReference;\r\n            if (signature) {\r\n              let functionTarget = signature.cachedFunctionTarget;\r\n              if (!functionTarget) {\r\n                functionTarget = new FunctionTarget(this.program, signature);\r\n                signature.cachedFunctionTarget = functionTarget;\r\n              }\r\n              // reuse resolvedThisExpression (might be property access)\r\n              // reuse resolvedElementExpression (might be element access)\r\n              return functionTarget;\r\n            }\r\n          }\r\n          if (reportMode == ReportMode.REPORT) {\r\n            this.error(\r\n              DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n              targetExpression.range, target.internalName\r\n            );\r\n          }\r\n          return null;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    if (reportMode == ReportMode.REPORT) {\r\n      this.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** Resolves a function prototype to an instance using the specified concrete type arguments. */\r\n  resolveFunction(\r\n    prototype: FunctionPrototype,\r\n    typeArguments: Type[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Function | null {\r\n    var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n    var instance = prototype.instances.get(instanceKey);\r\n    if (instance) return instance;\r\n\r\n    var declaration = prototype.declaration;\r\n    var isInstance = prototype.is(CommonFlags.INSTANCE);\r\n    var classPrototype = prototype.classPrototype;\r\n\r\n    // inherit contextual type arguments as provided. might be overridden.\r\n    var inheritedTypeArguments = contextualTypeArguments;\r\n    contextualTypeArguments = new Map();\r\n    if (inheritedTypeArguments) {\r\n      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n        contextualTypeArguments.set(\r\n          inheritedName,\r\n          inheritedType\r\n        );\r\n      }\r\n    }\r\n\r\n    // override with class type arguments if a partially resolved instance method\r\n    var classTypeArguments = prototype.classTypeArguments;\r\n    if (classTypeArguments) { // set only if partially resolved\r\n      assert(prototype.is(CommonFlags.INSTANCE));\r\n      let classDeclaration = assert(classPrototype).declaration;\r\n      let classTypeParameters = classDeclaration.typeParameters;\r\n      let numClassTypeParameters = classTypeParameters.length;\r\n      assert(numClassTypeParameters == classTypeArguments.length);\r\n      for (let i = 0; i < numClassTypeParameters; ++i) {\r\n        contextualTypeArguments.set(\r\n          classTypeParameters[i].name.text,\r\n          classTypeArguments[i]\r\n        );\r\n      }\r\n    } else {\r\n      assert(!classTypeArguments);\r\n    }\r\n\r\n    // override with function specific type arguments\r\n    var signatureNode = declaration.signature;\r\n    var functionTypeParameters = declaration.typeParameters;\r\n    var numFunctionTypeArguments: i32;\r\n    if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\r\n      assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\r\n      for (let i = 0; i < numFunctionTypeArguments; ++i) {\r\n        contextualTypeArguments.set(\r\n          (<TypeParameterNode[]>functionTypeParameters)[i].name.text,\r\n          typeArguments[i]\r\n        );\r\n      }\r\n    } else {\r\n      assert(!functionTypeParameters || functionTypeParameters.length == 0);\r\n    }\r\n\r\n    // resolve class if an instance method\r\n    var classInstance: Class | null = null;\r\n    var thisType: Type | null = null;\r\n    if (isInstance) {\r\n      classInstance = this.resolveClass(\r\n        assert(classPrototype),\r\n        classTypeArguments,\r\n        contextualTypeArguments,\r\n        reportMode\r\n      );\r\n      if (!classInstance) return null;\r\n      thisType = classInstance.type;\r\n      contextualTypeArguments.set(\"this\", thisType);\r\n    }\r\n\r\n    // resolve signature node\r\n    var signatureParameters = signatureNode.parameters;\r\n    var signatureParameterCount = signatureParameters.length;\r\n    var parameterTypes = new Array<Type>(signatureParameterCount);\r\n    var parameterNames = new Array<string>(signatureParameterCount);\r\n    var requiredParameters = 0;\r\n    for (let i = 0; i < signatureParameterCount; ++i) {\r\n      let parameterDeclaration = signatureParameters[i];\r\n      if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\r\n        requiredParameters = i + 1;\r\n      }\r\n      let typeNode = assert(parameterDeclaration.type);\r\n      let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n      if (!parameterType) return null;\r\n      parameterTypes[i] = parameterType;\r\n      parameterNames[i] = parameterDeclaration.name.text;\r\n    }\r\n\r\n    var returnType: Type;\r\n    if (prototype.is(CommonFlags.SET)) {\r\n      returnType = Type.void; // not annotated\r\n    } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\r\n      returnType = assert(classInstance).type; // not annotated\r\n    } else {\r\n      let typeNode = assert(signatureNode.returnType);\r\n      let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n      if (!type) return null;\r\n      returnType = type;\r\n    }\r\n\r\n    var signature = new Signature(parameterTypes, returnType, thisType);\r\n    signature.parameterNames = parameterNames;\r\n    signature.requiredParameters = requiredParameters;\r\n\r\n    var internalName = prototype.internalName;\r\n    if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\r\n    instance = new Function(\r\n      prototype,\r\n      internalName,\r\n      signature,\r\n      classInstance\r\n        ? classInstance\r\n        : classPrototype,\r\n      contextualTypeArguments\r\n    );\r\n    prototype.instances.set(instanceKey, instance);\r\n    this.program.instancesLookup.set(internalName, instance);\r\n    return instance;\r\n  }\r\n\r\n  /** Resolves a function prototype partially by applying the specified type arguments. */\r\n  resolveFunctionPartially(\r\n    prototype: FunctionPrototype,\r\n    typeArguments: Type[] | null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): FunctionPrototype | null {\r\n    assert(prototype.is(CommonFlags.INSTANCE));\r\n    var classPrototype = assert(prototype.classPrototype);\r\n\r\n    if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone\r\n\r\n    var simpleName = prototype.simpleName;\r\n    var partialKey = typesToString(typeArguments);\r\n    var partialPrototype = new FunctionPrototype(\r\n      this.program,\r\n      simpleName,\r\n      classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\r\n      prototype.declaration,\r\n      classPrototype,\r\n      prototype.decoratorFlags\r\n    );\r\n    partialPrototype.flags = prototype.flags;\r\n    partialPrototype.operatorKind = prototype.operatorKind;\r\n    partialPrototype.classTypeArguments = typeArguments;\r\n    return partialPrototype;\r\n  }\r\n\r\n  /** Resolves a function prototype to an instance by first resolving the specified type arguments. */\r\n  resolveFunctionInclTypeArguments(\r\n    prototype: FunctionPrototype,\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    reportNode: Node,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Function | null {\r\n    var resolvedTypeArguments: Type[] | null = null;\r\n    if (prototype.is(CommonFlags.GENERIC)) {\r\n      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n      resolvedTypeArguments = this.resolveTypeArguments( // reports\r\n        assert(prototype.declaration.typeParameters),\r\n        typeArgumentNodes,\r\n        contextualTypeArguments,\r\n        reportNode,\r\n        reportMode\r\n      );\r\n      if (!resolvedTypeArguments) return null;\r\n    }\r\n    return this.resolveFunction(\r\n      prototype,\r\n      resolvedTypeArguments,\r\n      contextualTypeArguments,\r\n      reportMode\r\n    );\r\n  }\r\n\r\n  /** Resolves a class prototype using the specified concrete type arguments. */\r\n  resolveClass(\r\n    prototype: ClassPrototype,\r\n    typeArguments: Type[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null = null,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Class | null {\r\n    var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n\r\n    // Check if this exact instance has already been resolved\r\n    var instance = prototype.instances.get(instanceKey);\r\n    if (instance) return instance;\r\n\r\n    // Copy contextual type arguments so we don't pollute the original map\r\n    var inheritedTypeArguments = contextualTypeArguments;\r\n    contextualTypeArguments = new Map();\r\n    if (inheritedTypeArguments) {\r\n      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n        contextualTypeArguments.set(inheritedName, inheritedType);\r\n      }\r\n    }\r\n\r\n    // Insert contextual type arguments for this operation. Internally, this method is always\r\n    // called with matching type parameter / argument counts.\r\n    var declaration = prototype.declaration;\r\n    if (typeArguments) {\r\n      let typeParameters = declaration.typeParameters;\r\n      let expectedTypeArguments = typeParameters.length;\r\n      let actualTypeArguments = typeArguments.length;\r\n      assert(actualTypeArguments == expectedTypeArguments);\r\n      for (let i = 0; i < actualTypeArguments; ++i) {\r\n        contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n      }\r\n    } else {\r\n      assert(declaration.typeParameters.length == 0);\r\n    }\r\n\r\n    // Resolve base class if applicable\r\n    var baseClass: Class | null = null;\r\n    if (declaration.extendsType) {\r\n      let baseClassType = this.resolveType(\r\n        declaration.extendsType,\r\n        contextualTypeArguments,\r\n        reportMode\r\n      );\r\n      if (!baseClassType) return null;\r\n      if (!(baseClass = baseClassType.classReference)) {\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.program.error(\r\n            DiagnosticCode.A_class_may_only_extend_another_class,\r\n            declaration.extendsType.range\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.program.error(\r\n            DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\r\n            declaration.extendsType.range, baseClass.internalName\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.program.error(\r\n            DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\r\n            Range.join(declaration.name.range, declaration.extendsType.range)\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n    }\r\n\r\n    // Construct the instance and remember that it has been resolved already\r\n    var simpleName = prototype.simpleName;\r\n    var internalName = prototype.internalName;\r\n    if (instanceKey.length) {\r\n      simpleName += \"<\" + instanceKey + \">\";\r\n      internalName += \"<\" + instanceKey + \">\";\r\n    }\r\n    instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);\r\n    instance.contextualTypeArguments = contextualTypeArguments;\r\n    prototype.instances.set(instanceKey, instance);\r\n    this.program.instancesLookup.set(internalName, instance);\r\n\r\n    // Inherit base class members and set up the initial memory offset for own fields\r\n    var memoryOffset: u32 = 0;\r\n    if (baseClass) {\r\n      if (baseClass.members) {\r\n        if (!instance.members) instance.members = new Map();\r\n        for (let inheritedMember of baseClass.members.values()) {\r\n          instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n        }\r\n      }\r\n      memoryOffset = baseClass.currentMemoryOffset;\r\n    }\r\n\r\n    // Resolve constructor by first applying the class type arguments\r\n    if (prototype.constructorPrototype) {\r\n      let constructorPartial = this.resolveFunctionPartially(\r\n        prototype.constructorPrototype,\r\n        typeArguments,\r\n        reportMode\r\n      );\r\n      if (!constructorPartial) return null;\r\n      instance.constructorInstance = this.resolveFunction(constructorPartial, null, null, reportMode);\r\n    }\r\n\r\n    // Resolve instance members\r\n    if (prototype.instanceMembers) {\r\n      for (let member of prototype.instanceMembers.values()) {\r\n        switch (member.kind) {\r\n\r\n          // Lay out fields in advance\r\n          case ElementKind.FIELD_PROTOTYPE: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let fieldDeclaration = (<FieldPrototype>member).declaration;\r\n            let fieldType: Type | null = null;\r\n            // TODO: handle duplicate non-private fields\r\n            if (!fieldDeclaration.type) {\r\n              if (baseClass !== null && baseClass.members !== null) {\r\n                let baseField = baseClass.members.get((<FieldPrototype>member).simpleName);\r\n                if (baseField && !baseField.is(CommonFlags.PRIVATE)) {\r\n                  assert(baseField.kind == ElementKind.FIELD);\r\n                  fieldType = (<Field>baseField).type;\r\n                }\r\n              }\r\n              if (!fieldType) {\r\n                if (reportMode == ReportMode.REPORT) {\r\n                  this.error(\r\n                    DiagnosticCode.Type_expected,\r\n                    fieldDeclaration.name.range.atEnd\r\n                  );\r\n                }\r\n              }\r\n            } else {\r\n              fieldType = this.resolveType(\r\n                fieldDeclaration.type,\r\n                instance.contextualTypeArguments,\r\n                reportMode\r\n              );\r\n            }\r\n            if (!fieldType) break;\r\n            let fieldInstance = new Field(\r\n              <FieldPrototype>member,\r\n              internalName + INSTANCE_DELIMITER + (<FieldPrototype>member).simpleName,\r\n              fieldType,\r\n              fieldDeclaration,\r\n              instance\r\n            );\r\n            switch (fieldType.byteSize) { // align\r\n              case 1: break;\r\n              case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\r\n              case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\r\n              case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\r\n              default: assert(false);\r\n            }\r\n            fieldInstance.memoryOffset = memoryOffset;\r\n            memoryOffset += fieldType.byteSize;\r\n            instance.members.set(member.simpleName, fieldInstance);\r\n            break;\r\n          }\r\n\r\n          // Partially resolve methods as these might have type arguments on their own\r\n          case ElementKind.FUNCTION_PROTOTYPE: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let partialPrototype = this.resolveFunctionPartially(\r\n              <FunctionPrototype>member,\r\n              typeArguments,\r\n              reportMode\r\n            );\r\n            if (!partialPrototype) return null;\r\n            partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\r\n            instance.members.set(member.simpleName, partialPrototype);\r\n            break;\r\n          }\r\n\r\n          // Clone properties and partially resolve the wrapped accessors for consistence with other methods\r\n          case ElementKind.PROPERTY: {\r\n            if (!instance.members) instance.members = new Map();\r\n            let getterPrototype = assert((<Property>member).getterPrototype); // must be present\r\n            let setterPrototype = (<Property>member).setterPrototype;         // might be present\r\n            let instanceProperty = new Property(\r\n              this.program,\r\n              member.simpleName,\r\n              internalName + INSTANCE_DELIMITER + member.simpleName,\r\n              prototype\r\n            );\r\n            let partialGetterPrototype = this.resolveFunctionPartially(\r\n              getterPrototype,\r\n              typeArguments,\r\n              reportMode\r\n            );\r\n            if (!partialGetterPrototype) return null;\r\n            partialGetterPrototype\r\n              .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;\r\n            instanceProperty.getterPrototype = partialGetterPrototype;\r\n            if (setterPrototype) {\r\n              let partialSetterPrototype = this.resolveFunctionPartially(\r\n                setterPrototype,\r\n                typeArguments,\r\n                reportMode\r\n              );\r\n              if (!partialSetterPrototype) return null;\r\n              partialSetterPrototype\r\n                .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;\r\n              instanceProperty.setterPrototype = partialSetterPrototype;\r\n            }\r\n            instance.members.set(member.simpleName, instanceProperty);\r\n            break;\r\n          }\r\n          default: assert(false);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Finalize memory offset\r\n    instance.currentMemoryOffset = memoryOffset;\r\n\r\n    // Fully resolve operator overloads (don't have type parameters on their own)\r\n    for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\r\n      assert(kind != OperatorKind.INVALID);\r\n      let operatorInstance: Function | null;\r\n      if (overloadPrototype.is(CommonFlags.INSTANCE)) {\r\n        let operatorPartial = this.resolveFunctionPartially(\r\n          overloadPrototype,\r\n          typeArguments,\r\n          reportMode\r\n        );\r\n        if (!operatorPartial) continue;\r\n        operatorInstance = this.resolveFunction(operatorPartial, null, null, reportMode);\r\n      } else {\r\n        operatorInstance = this.resolveFunction(overloadPrototype, null, null, reportMode);\r\n      }\r\n      if (!operatorInstance) continue;\r\n      let overloads = instance.overloads;\r\n      if (!overloads) instance.overloads = overloads = new Map();\r\n      overloads.set(kind, operatorInstance);\r\n    }\r\n    return instance;\r\n  }\r\n\r\n  /** Resolves a class prototype by first resolving the specified type arguments. */\r\n  resolveClassInclTypeArguments(\r\n    prototype: ClassPrototype,\r\n    typeArgumentNodes: CommonTypeNode[] | null,\r\n    contextualTypeArguments: Map<string,Type> | null,\r\n    reportNode: Node,\r\n    reportMode: ReportMode = ReportMode.REPORT\r\n  ): Class | null {\r\n    var resolvedTypeArguments: Type[] | null = null;\r\n\r\n    // Resolve type arguments if generic\r\n    if (prototype.is(CommonFlags.GENERIC)) {\r\n      let typeParameterNodes = prototype.declaration.typeParameters;\r\n      let expectedTypeArguments = typeParameterNodes.length;\r\n      assert(expectedTypeArguments > 0);\r\n      let actualTypeArguments = typeArgumentNodes !== null ? typeArgumentNodes.length : 0;\r\n      if (expectedTypeArguments != actualTypeArguments) {\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, expectedTypeArguments.toString(10), actualTypeArguments.toString(10)\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n      resolvedTypeArguments = this.resolveTypeArguments(\r\n        typeParameterNodes,\r\n        typeArgumentNodes,\r\n        contextualTypeArguments,\r\n        reportNode,\r\n        reportMode\r\n      );\r\n      if (!resolvedTypeArguments) return null;\r\n\r\n    // Otherwise make sure that no type arguments have been specified\r\n    } else {\r\n      if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n        if (reportMode == ReportMode.REPORT) {\r\n          this.error(\r\n            DiagnosticCode.Type_0_is_not_generic,\r\n            reportNode.range, prototype.internalName\r\n          );\r\n        }\r\n        return null;\r\n      }\r\n    }\r\n\r\n    // Continue with concrete types\r\n    return this.resolveClass(\r\n      prototype,\r\n      resolvedTypeArguments,\r\n      contextualTypeArguments,\r\n      reportMode\r\n    );\r\n  }\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Reads a 32-bit integer from the specified buffer. */\r\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\r\n  return buffer[offset    ]\r\n       | buffer[offset + 1] << 8\r\n       | buffer[offset + 2] << 16\r\n       | buffer[offset + 3] << 24;\r\n}\r\n\r\n/** Writes a 32-bit integer to the specified buffer. */\r\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\r\n  buffer[offset    ] = value;\r\n  buffer[offset + 1] = value >>> 8;\r\n  buffer[offset + 2] = value >>> 16;\r\n  buffer[offset + 3] = value >>> 24;\r\n}\r\n\r\n/** Reads a 64-bit integer from the specified buffer. */\r\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\r\n  var lo = readI32(buffer, offset);\r\n  var hi = readI32(buffer, offset + 4);\r\n  return i64_new(lo, hi);\r\n}\r\n\r\n/** Writes a 64-bit integer to the specified buffer. */\r\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\r\n  writeI32(i64_low(value), buffer, offset);\r\n  writeI32(i64_high(value), buffer, offset + 4);\r\n}\r\n\r\n/** Reads a 32-bit float from the specified buffer. */\r\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\r\n  return i32_as_f32(readI32(buffer, offset));\r\n}\r\n\r\n/** Writes a 32-bit float to the specified buffer. */\r\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\r\n  writeI32(f32_as_i32(value), buffer, offset);\r\n}\r\n\r\n/** Reads a 64-bit float from the specified buffer. */\r\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\r\n  return i64_as_f64(readI64(buffer, offset));\r\n}\r\n\r\n/** Writes a 64-bit float to the specified buffer. */\r\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\r\n  var valueI64 = f64_as_i64(value);\r\n  writeI32(i64_low(valueI64), buffer, offset);\r\n  writeI32(i64_high(valueI64), buffer, offset + 4);\r\n}\r\n","/** @module util *//***/\r\n\r\nconst indentX1 = \"  \";\r\nconst indentX2 = \"    \";\r\nconst indentX4 = \"        \";\r\n\r\n/** Creates an indentation matching the number of specified levels. */\r\nexport function indent(sb: string[], level: i32): void {\r\n  while (level >= 4) {\r\n    sb.push(indentX4);\r\n    level -= 4;\r\n  }\r\n  if (level >= 2) {\r\n    sb.push(indentX2);\r\n    level -= 2;\r\n  }\r\n  if (level) {\r\n    sb.push(indentX1);\r\n  }\r\n}\r\n","/** @module util *//***/\r\n\r\nimport {\r\n  CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalizePath(path: string): string {\r\n  var pos = 0;\r\n  var len = path.length;\r\n\r\n  // trim leading './'\r\n  while (pos + 1 < len &&\r\n    path.charCodeAt(pos) == CharCode.DOT &&\r\n    path.charCodeAt(pos + 1) == separator\r\n  ) {\r\n    pos += 2;\r\n  }\r\n\r\n  if (pos > 0 || len < path.length) {\r\n    path = path.substring(pos, len);\r\n    len -= pos;\r\n    pos = 0;\r\n  }\r\n\r\n  var atEnd: bool;\r\n  while (pos + 1 < len) {\r\n    atEnd = false;\r\n\r\n    // we are only interested in '/.' sequences ...\r\n    if (\r\n      path.charCodeAt(pos) == separator &&\r\n      path.charCodeAt(pos + 1) == CharCode.DOT\r\n    ) {\r\n      // '/.' ( '/' | $ )\r\n      atEnd = pos + 2 == len;\r\n      if (atEnd ||\r\n        pos + 2 < len &&\r\n        path.charCodeAt(pos + 2) == separator\r\n      ) {\r\n        path = atEnd\r\n          ? path.substring(0, pos)\r\n          : path.substring(0, pos) + path.substring(pos + 2);\r\n        len -= 2;\r\n        continue;\r\n      }\r\n\r\n      // '/.' ( './' | '.' $ )\r\n      atEnd = pos + 3 == len;\r\n      if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n        pos + 3 < len &&\r\n        path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n        path.charCodeAt(pos + 3) == separator\r\n      ) {\r\n        // find preceeding '/'\r\n        let ipos = pos;\r\n        while (--ipos >= 0) {\r\n          if (path.charCodeAt(ipos) == separator) {\r\n            if (pos - ipos != 3 ||\r\n              path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n              path.charCodeAt(ipos + 2) != CharCode.DOT\r\n            ) { // exclude '..' itself\r\n              path = atEnd\r\n                ? path.substring(0, ipos)\r\n                : path.substring(0, ipos) + path.substring(pos + 3);\r\n              len -= pos + 3 - ipos;\r\n              pos = ipos - 1; // incremented again at end of loop\r\n            }\r\n            break;\r\n          }\r\n        }\r\n\r\n        // if there's no preceeding '/', trim start if non-empty\r\n        if (ipos < 0 && pos > 0) {\r\n          if (pos != 2 ||\r\n            path.charCodeAt(0) != CharCode.DOT ||\r\n            path.charCodeAt(1) != CharCode.DOT\r\n          ) { // exclude '..' itself\r\n            path = path.substring(pos + 4);\r\n            len = path.length;\r\n            continue;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    pos++;\r\n  }\r\n  return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolvePath(normalizedPath: string, origin: string): string {\r\n  if (normalizedPath.startsWith(\"std/\")) {\r\n    return normalizedPath;\r\n  }\r\n  return normalizePath(\r\n    dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n  );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n  var pos = normalizedPath.length;\r\n  while (--pos > 0) {\r\n    if (normalizedPath.charCodeAt(pos) == separator) {\r\n      return normalizedPath.substring(0, pos);\r\n    }\r\n  }\r\n  return \".\";\r\n}\r\n","/** @module util *//***/\r\n\r\n/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n  NULL = 0,\r\n  LINEFEED = 0x0A,\r\n  CARRIAGERETURN = 0x0D,\r\n  LINESEPARATOR = 0x2028,\r\n  PARAGRAPHSEPARATOR = 0x2029,\r\n  NEXTLINE = 0x0085,\r\n\r\n  SPACE = 0x20,\r\n  NONBREAKINGSPACE = 0xA0,\r\n  ENQUAD = 0x2000,\r\n  EMQUAD = 0x2001,\r\n  ENSPACE = 0x2002,\r\n  EMSPACE = 0x2003,\r\n  THREEPEREMSPACE = 0x2004,\r\n  FOURPEREMSPACE = 0x2005,\r\n  SIXPEREMSPACE = 0x2006,\r\n  FIGURESPACE = 0x2007,\r\n  PUNCTUATIONSPACE = 0x2008,\r\n  THINSPACE = 0x2009,\r\n  HAIRSPACE = 0x200A,\r\n  ZEROWIDTHSPACE = 0x200B,\r\n  NARROWNOBREAKSPACE = 0x202F,\r\n  IDEOGRAPHICSPACE = 0x3000,\r\n  MATHEMATICALSPACE = 0x205F,\r\n  OGHAM = 0x1680,\r\n\r\n  _ = 0x5F,\r\n\r\n  _0 = 0x30,\r\n  _1 = 0x31,\r\n  _2 = 0x32,\r\n  _3 = 0x33,\r\n  _4 = 0x34,\r\n  _5 = 0x35,\r\n  _6 = 0x36,\r\n  _7 = 0x37,\r\n  _8 = 0x38,\r\n  _9 = 0x39,\r\n\r\n  a = 0x61,\r\n  b = 0x62,\r\n  c = 0x63,\r\n  d = 0x64,\r\n  e = 0x65,\r\n  f = 0x66,\r\n  g = 0x67,\r\n  h = 0x68,\r\n  i = 0x69,\r\n  j = 0x6A,\r\n  k = 0x6B,\r\n  l = 0x6C,\r\n  m = 0x6D,\r\n  n = 0x6E,\r\n  o = 0x6F,\r\n  p = 0x70,\r\n  q = 0x71,\r\n  r = 0x72,\r\n  s = 0x73,\r\n  t = 0x74,\r\n  u = 0x75,\r\n  v = 0x76,\r\n  w = 0x77,\r\n  x = 0x78,\r\n  y = 0x79,\r\n  z = 0x7A,\r\n\r\n  A = 0x41,\r\n  B = 0x42,\r\n  C = 0x43,\r\n  D = 0x44,\r\n  E = 0x45,\r\n  F = 0x46,\r\n  G = 0x47,\r\n  H = 0x48,\r\n  I = 0x49,\r\n  J = 0x4A,\r\n  K = 0x4B,\r\n  L = 0x4C,\r\n  M = 0x4D,\r\n  N = 0x4E,\r\n  O = 0x4F,\r\n  P = 0x50,\r\n  Q = 0x51,\r\n  R = 0x52,\r\n  S = 0x53,\r\n  T = 0x54,\r\n  U = 0x55,\r\n  V = 0x56,\r\n  W = 0x57,\r\n  X = 0x58,\r\n  Y = 0x59,\r\n  Z = 0x5a,\r\n\r\n  AMPERSAND = 0x26,\r\n  ASTERISK = 0x2A,\r\n  AT = 0x40,\r\n  BACKSLASH = 0x5C,\r\n  BACKTICK = 0x60,\r\n  BAR = 0x7C,\r\n  CARET = 0x5E,\r\n  CLOSEBRACE = 0x7D,\r\n  CLOSEBRACKET = 0x5D,\r\n  CLOSEPAREN = 0x29,\r\n  COLON = 0x3A,\r\n  COMMA = 0x2C,\r\n  DOLLAR = 0x24,\r\n  DOT = 0x2E,\r\n  DOUBLEQUOTE = 0x22,\r\n  EQUALS = 0x3D,\r\n  EXCLAMATION = 0x21,\r\n  GREATERTHAN = 0x3E,\r\n  HASH = 0x23,\r\n  LESSTHAN = 0x3C,\r\n  MINUS = 0x2D,\r\n  OPENBRACE = 0x7B,\r\n  OPENBRACKET = 0x5B,\r\n  OPENPAREN = 0x28,\r\n  PERCENT = 0x25,\r\n  PLUS = 0x2B,\r\n  QUESTION = 0x3F,\r\n  SEMICOLON = 0x3B,\r\n  SINGLEQUOTE = 0x27,\r\n  SLASH = 0x2F,\r\n  TILDE = 0x7E,\r\n\r\n  BACKSPACE = 0x08,\r\n  FORMFEED = 0x0C,\r\n  BYTEORDERMARK = 0xFEFF,\r\n  TAB = 0x09,\r\n  VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n  switch (c) {\r\n    case CharCode.LINEFEED:\r\n    case CharCode.CARRIAGERETURN:\r\n    case CharCode.LINESEPARATOR:\r\n    case CharCode.PARAGRAPHSEPARATOR: {\r\n      return true;\r\n    }\r\n    default: {\r\n      return false;\r\n    }\r\n  }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n  switch (c) {\r\n    case CharCode.SPACE:\r\n    case CharCode.TAB:\r\n    case CharCode.VERTICALTAB:\r\n    case CharCode.FORMFEED:\r\n    case CharCode.NONBREAKINGSPACE:\r\n    case CharCode.NEXTLINE:\r\n    case CharCode.OGHAM:\r\n    case CharCode.NARROWNOBREAKSPACE:\r\n    case CharCode.MATHEMATICALSPACE:\r\n    case CharCode.IDEOGRAPHICSPACE:\r\n    case CharCode.BYTEORDERMARK: {\r\n      return true;\r\n    }\r\n    default: {\r\n      return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n    }\r\n  }\r\n}\r\n\r\n/** Tests if the specified character code is a valid decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n  return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is a valid octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n  return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n  return c >= CharCode.A && c <= CharCode.Z\r\n      || c >= CharCode.a && c <= CharCode.z\r\n      || c == CharCode.DOLLAR\r\n      || c == CharCode._\r\n      || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n  return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n  return c >= CharCode.A && c <= CharCode.Z\r\n      || c >= CharCode.a && c <= CharCode.z\r\n      || c >= CharCode._0 && c <= CharCode._9\r\n      || c == CharCode.DOLLAR\r\n      || c == CharCode._\r\n      || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n  170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n  740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n  908, 908, 910, 929, 931,\r\n  1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n  1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n  1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n  1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n  2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n  2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n  2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n  2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n  2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n  2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n  2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n  2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n  2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n  2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n  3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n  3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n  3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n  3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n  3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n  3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n  3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n  3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n  4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n  4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n  4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n  4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n  5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n  5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n  6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n  6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n  6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n  7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n  7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n  8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n  8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n  8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n  8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n  8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n  11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n  11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n  11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n  11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n  12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n  12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n  19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n  42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n  42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n  43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n  43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n  43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n  43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n  43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n  43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n  55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n  64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n  64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n  65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n  65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n  170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n  740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n  908, 908, 910, 929, 931,\r\n  1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n  1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n  1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n  1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n  2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n  2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n  2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n  2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n  2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n  2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n  2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n  2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n  2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n  2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n  2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n  2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n  3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n  3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n  3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n  3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n  3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n  3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n  3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n  3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n  3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n  3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n  3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n  3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n  3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n  4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n  4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n  4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n  4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n  5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n  5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n  6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n  6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n  6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n  6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n  7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n  7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n  8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n  8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n  8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n  8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n  8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n  8521, 8526, 8526, 8544, 8584,\r\n  11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n  11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n  11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n  11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n  12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n  12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n  13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n  42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n  42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n  43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n  43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n  43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n  43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n  43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n  55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n  64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n  64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n  65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n  65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n  65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n  if (code < map[0]) return false;\r\n\r\n  var lo = 0;\r\n  var hi = map.length;\r\n  var mid: i32;\r\n\r\n  while (lo + 1 < hi) {\r\n    mid = lo + (hi - lo) / 2;\r\n    mid -= mid % 2;\r\n    if (map[mid] <= code && code <= map[mid + 1]) {\r\n      return true;\r\n    }\r\n    if (code < map[mid]) {\r\n      hi = mid;\r\n    } else {\r\n      lo = mid + 2;\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n  return code < 0 || code > 0xffff ? false\r\n       : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n  return code < 0 || code > 0xffff ? false\r\n       : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n","/**\r\n * Built-in elements providing WebAssembly core functionality.\r\n * @module builtins\r\n *//***/\r\n\r\n import {\r\n  Compiler,\r\n  ConversionKind,\r\n  WrapMode\r\n} from \"./compiler\";\r\n\r\nimport {\r\n  DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n  Node,\r\n  NodeKind,\r\n  Expression,\r\n  LiteralKind,\r\n  LiteralExpression,\r\n  StringLiteralExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n  Type,\r\n  TypeKind,\r\n  TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n  BinaryOp,\r\n  UnaryOp,\r\n  HostOp,\r\n  NativeType,\r\n  ExpressionRef,\r\n  ExpressionId,\r\n  getExpressionId,\r\n  getExpressionType,\r\n  getConstValueI64High,\r\n  getConstValueI64Low,\r\n  getConstValueI32\r\n} from \"./module\";\r\n\r\nimport {\r\n  ElementKind,\r\n  FunctionPrototype,\r\n  Class,\r\n  Field,\r\n  OperatorKind,\r\n  FlowFlags\r\n} from \"./program\";\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n  compiler: Compiler,\r\n  prototype: FunctionPrototype,\r\n  typeArguments: Type[] | null,\r\n  operands: Expression[],\r\n  contextualType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var module = compiler.module;\r\n\r\n  var arg0: ExpressionRef,\r\n      arg1: ExpressionRef,\r\n      arg2: ExpressionRef,\r\n      ret: ExpressionRef;\r\n\r\n  // NOTE that some implementations below make use of the select expression where straight-forward.\r\n  // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n  // search: createSelect\r\n\r\n  switch (prototype.internalName) {\r\n\r\n    // types\r\n\r\n    case \"isInteger\": { // isInteger<T!>() / isInteger<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isFloat\": { // isFloat<T!>() / isFloat<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.FLOAT)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isSigned\": { // isSigned<T!>() / isSigned<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      return type.is(TypeFlags.SIGNED)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isReference\": { // isReference<T!>() / isReference<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      compiler.currentType = Type.bool;\r\n      return type.is(TypeFlags.REFERENCE)\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n    case \"isString\": { // isString<T!>() / isString<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      let classType = type.classReference;\r\n      if (classType) {\r\n        let stringInstance = compiler.program.stringInstance;\r\n        if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\r\n      }\r\n      return module.createI32(0);\r\n    }\r\n    case \"isArray\": { // isArray<T!>() / isArray<T?>(value: T) -> bool\r\n      let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n      compiler.currentType = Type.bool;\r\n      if (!type) return module.createUnreachable();\r\n      let classType = type.classReference;\r\n      return classType != null && classType.lookupOverload(OperatorKind.INDEXED_GET) != null\r\n        ? module.createI32(1)\r\n        : module.createI32(0);\r\n    }\r\n\r\n    // math\r\n\r\n    case \"clz\": { // clz<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.ClzI64\r\n              : UnaryOp.ClzI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"ctz\": { // ctz<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.CtzI64\r\n              : UnaryOp.CtzI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"popcnt\": { // popcnt<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16: {\r\n          ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.BOOL: // usually overflows\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.PopcntI64\r\n              : UnaryOp.PopcntI32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"rotl\": { // rotl<T?>(value: T, shift: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = compiler.ensureSmallIntegerWrap(\r\n            module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n            compiler.currentType\r\n          );\r\n          // fall-through\r\n        }\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createBinary(\r\n            compiler.options.isWasm64\r\n              ? BinaryOp.RotlI64\r\n              : BinaryOp.RotlI32,\r\n            arg0,\r\n            arg1\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret; // possibly overflows\r\n    }\r\n    case \"rotr\": { // rotr<T?>(value: T, shift: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = compiler.ensureSmallIntegerWrap(\r\n            module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n            compiler.currentType\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          ret = module.createBinary(\r\n            compiler.options.isWasm64\r\n              ? BinaryOp.RotrI64\r\n              : BinaryOp.RotrI32,\r\n            arg0,\r\n            arg1\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret; // possibly overflowws\r\n    }\r\n    case \"abs\": { // abs<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          // possibly overflows, e.g. abs<i8>(-128) == 128\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\r\n          ret = module.createSelect( // x > 0 ? x : 0-x\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(BinaryOp.SubI32, // ifFalse\r\n              module.createI32(0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32)\r\n            ),\r\n            module.createBinary(BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              module.createI32(0)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.SubI64\r\n                : BinaryOp.SubI32,\r\n              compiler.options.usizeType.toNativeZero(module),\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n            ),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\r\n              compiler.options.usizeType.toNativeZero(module)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal.index, arg0),\r\n            module.createBinary(BinaryOp.SubI64,\r\n              module.createI64(0, 0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I64),\r\n            ),\r\n            module.createBinary(BinaryOp.GtI64,\r\n              module.createGetLocal(tempLocal.index, NativeType.I64),\r\n              module.createI64(0, 0)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.U64:\r\n        case TypeKind.BOOL: {\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"max\": { // max<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.BOOL: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtU32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtI64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.GtU64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtI64\r\n                : BinaryOp.GtI32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.GtU64\r\n                : BinaryOp.GtU32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"min\": { // min<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.I32: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtI32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.U32:\r\n        case TypeKind.BOOL: {\r\n          let flow = compiler.currentFunction.flow;\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg0, compiler.currentType)\r\n          );\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n            compiler.currentType,\r\n            !flow.canOverflow(arg1, compiler.currentType)\r\n          );\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtU32,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.I64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtI64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.U64: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(BinaryOp.LtU64,\r\n              module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n              module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.LtI64\r\n                : BinaryOp.LtI32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n          let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n          compiler.currentFunction.freeTempLocal(tempLocal0);\r\n          ret = module.createSelect(\r\n            module.createTeeLocal(tempLocal0.index, arg0),\r\n            module.createTeeLocal(tempLocal1.index, arg1),\r\n            module.createBinary(\r\n              compiler.options.isWasm64\r\n                ? BinaryOp.LtU64\r\n                : BinaryOp.LtU32,\r\n              module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n              module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n            )\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: { // void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"ceil\": { // ceil<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"floor\": { // floor<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"copysign\": { // copysign<T?>(left: T, right: T) -> T\r\n      if (operands.length != 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"2\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\r\n        case TypeKind.F32: {\r\n          ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n          break;\r\n        }\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"nearest\": { // nearest<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"reinterpret\": { // reinterpret<T!>(value: *) -> T\r\n      if (operands.length != 1) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      switch (typeArguments[0].kind) {\r\n        case TypeKind.I32:\r\n        case TypeKind.U32: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.I64:\r\n        case TypeKind.U64: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.USIZE: {\r\n          if (typeArguments[0].is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            compiler.currentType = typeArguments[0];\r\n            return module.createUnreachable();\r\n          }\r\n          // fall-through\r\n        }\r\n        case TypeKind.ISIZE: {\r\n          arg0 = compiler.compileExpression(\r\n            operands[0],\r\n            compiler.options.isWasm64\r\n              ? Type.f64\r\n              : Type.f32,\r\n            ConversionKind.IMPLICIT,\r\n            WrapMode.NONE\r\n          );\r\n          ret = module.createUnary(\r\n            compiler.options.isWasm64\r\n              ? UnaryOp.ReinterpretF64\r\n              : UnaryOp.ReinterpretF32,\r\n            arg0\r\n          );\r\n          break;\r\n        }\r\n        case TypeKind.F32: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n          ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n          break;\r\n        }\r\n        default: { // small integers and void\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      compiler.currentType = typeArguments[0];\r\n      return ret;\r\n    }\r\n    case \"sqrt\": { // sqrt<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n          break;\r\n        }\r\n        // case TypeKind.VOID:\r\n        default: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"trunc\": { // trunc<T?>(value: T) -> T\r\n      if (operands.length != 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments && typeArguments.length) {\r\n        compiler.currentType = typeArguments[0];\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n      }\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.USIZE: {\r\n          if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = module.createUnreachable();\r\n            break;\r\n          }\r\n          // fall-through\r\n        }\r\n        default: { // any integer\r\n          ret = arg0;\r\n          break;\r\n        }\r\n        // TODO: truncate to contextual type directly (if not void etc.)?\r\n        case TypeKind.F32: {\r\n          ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.F64: {\r\n          ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n\r\n    // memory access\r\n\r\n    case \"load\": { // load<T!>(offset: usize, constantOffset?: usize) -> *\r\n      if (operands.length < 1 || operands.length > 2) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        if (operands.length < 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"1\", operands.length.toString(10)\r\n          );\r\n        } else {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n      if (offset < 0) { // reported in evaluateConstantOffset\r\n        return module.createUnreachable();\r\n      }\r\n      compiler.currentType = typeArguments[0];\r\n      return module.createLoad(\r\n        typeArguments[0].byteSize,\r\n        typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n        arg0,\r\n        typeArguments[0].is(TypeFlags.INTEGER) &&\r\n        contextualType.is(TypeFlags.INTEGER) &&\r\n        contextualType.size > typeArguments[0].size\r\n          ? (compiler.currentType = contextualType).toNativeType()\r\n          : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n        offset\r\n      );\r\n    }\r\n    case \"store\": { // store<T!>(offset: usize, value: *, constantOffset?: usize) -> void\r\n      compiler.currentType = Type.void;\r\n      if (operands.length < 2 || operands.length > 3) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        if (operands.length < 2) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        } else {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"3\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        typeArguments[0],\r\n        typeArguments[0].is(TypeFlags.INTEGER)\r\n          ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n          : ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      let type: Type;\r\n      if (\r\n        typeArguments[0].is(TypeFlags.INTEGER) &&\r\n        (\r\n          !compiler.currentType.is(TypeFlags.INTEGER) ||    // float to int\r\n          compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n        )\r\n      ) {\r\n        arg1 = compiler.convertExpression(\r\n          arg1,\r\n          compiler.currentType, typeArguments[0],\r\n          ConversionKind.IMPLICIT,\r\n          WrapMode.NONE, // still clears garbage bits\r\n          operands[1]\r\n        );\r\n        type = typeArguments[0];\r\n      } else {\r\n        type = compiler.currentType;\r\n      }\r\n      let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n      if (offset < 0) { // reported in evaluateConstantOffset\r\n        return module.createUnreachable();\r\n      }\r\n      compiler.currentType = Type.void;\r\n      return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n    }\r\n    case \"sizeof\": { // sizeof<T!>() -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length != 0) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n      }\r\n      let byteSize = (<Type[]>typeArguments)[0].byteSize;\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          ret = module.createI32(byteSize);\r\n        } else {\r\n          ret = module.createI64(byteSize, 0);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          ret = module.createI64(byteSize, 0);\r\n        } else {\r\n          ret = module.createI32(byteSize);\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"alignof\": { // alignof<T!>() -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length != 0) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let byteSize = (<Type[]>typeArguments)[0].byteSize;\r\n      let alignLog2: i32;\r\n      switch (byteSize) {\r\n        case 1: { alignLog2 = 0; break; }\r\n        case 2: { alignLog2 = 1; break; }\r\n        case 4: { alignLog2 = 2; break; }\r\n        case 8: { alignLog2 = 3; break; }\r\n        default: { assert(false); return module.createUnreachable(); }\r\n      }\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          ret = module.createI32(alignLog2);\r\n        } else {\r\n          ret = module.createI64(alignLog2, 0);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          ret = module.createI64(alignLog2, 0);\r\n        } else {\r\n          ret = module.createI32(alignLog2);\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"offsetof\": { // offsetof<T!>(fieldName?: string) -> usize\r\n      compiler.currentType = compiler.options.usizeType;\r\n      if (operands.length > 1) {\r\n        if (!(typeArguments && typeArguments.length == 1)) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n          );\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let classType = typeArguments[0].classReference;\r\n      if (!classType) {\r\n        compiler.error( // TODO: better error\r\n          DiagnosticCode.Operation_not_supported,\r\n          reportNode.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let offset: i32;\r\n      if (operands.length) {\r\n        if (\r\n          operands[0].kind != NodeKind.LITERAL ||\r\n          (<LiteralExpression>operands[0]).literalKind != LiteralKind.STRING\r\n        ) {\r\n          compiler.error(\r\n            DiagnosticCode.String_literal_expected,\r\n            operands[0].range\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        let fieldName = (<StringLiteralExpression>operands[0]).value;\r\n        let field = classType.members ? classType.members.get(fieldName) : null;\r\n        if (!(field && field.kind == ElementKind.FIELD)) {\r\n          compiler.error(\r\n            DiagnosticCode.Type_0_has_no_property_1,\r\n            operands[0].range, classType.internalName, fieldName\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        offset = (<Field>field).memoryOffset;\r\n      } else {\r\n        offset = classType.currentMemoryOffset;\r\n      }\r\n      if (compiler.options.isWasm64) {\r\n        // implicitly wrap if contextual type is a 32-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n          compiler.currentType = Type.u32;\r\n          return module.createI32(offset);\r\n        } else {\r\n          return module.createI64(offset);\r\n        }\r\n      } else {\r\n        // implicitly extend if contextual type is a 64-bit integer\r\n        if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n          compiler.currentType = Type.u64;\r\n          return module.createI64(offset);\r\n        } else {\r\n          return module.createI32(offset);\r\n        }\r\n      }\r\n    }\r\n\r\n    // control flow\r\n\r\n    case \"select\": { // select<T?>(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n      if (operands.length != 3) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n      }\r\n      let type = compiler.currentType;\r\n      arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      arg2 = compiler.makeIsTrueish(\r\n        compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\r\n        compiler.currentType\r\n      );\r\n      compiler.currentType = type;\r\n      switch (compiler.currentType.kind) {\r\n        case TypeKind.I8:\r\n        case TypeKind.I16:\r\n        case TypeKind.U8:\r\n        case TypeKind.U16:\r\n        case TypeKind.BOOL: {\r\n          ret = module.createSelect(arg0, arg1, arg2);\r\n          break;\r\n        }\r\n        default: { // any other value type\r\n          ret = module.createSelect(arg0, arg1, arg2);\r\n          break;\r\n        }\r\n        case TypeKind.VOID: {\r\n          compiler.error(\r\n            DiagnosticCode.Operation_not_supported,\r\n            reportNode.range\r\n          );\r\n          ret = module.createUnreachable();\r\n          break;\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"unreachable\": { // unreachable() -> *\r\n      if (operands.length != 0) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createUnreachable();\r\n    }\r\n\r\n    // host operations\r\n\r\n    case \"current_memory\": { // current_memory() -> i32\r\n      compiler.currentType = Type.i32;\r\n      if (operands.length != 0) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createHost(HostOp.CurrentMemory);\r\n    }\r\n    case \"grow_memory\": { // grow_memory(pages: i32) -> i32\r\n      compiler.currentType = Type.i32;\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"0\", operands.length.toString(10)\r\n        );\r\n        arg0 = module.createUnreachable();\r\n      } else {\r\n        arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      }\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n    }\r\n    // see: https://github.com/WebAssembly/bulk-memory-operations\r\n    case \"move_memory\": { // move_memory(dest: usize, src: usize: n: usize) -> void\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 3) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg2 = compiler.compileExpression(\r\n        operands[2],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = Type.void;\r\n      throw new Error(\"not implemented\");\r\n      // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n    }\r\n    case \"set_memory\": { // set_memory(dest: usize, value: u8, n: usize) -> void\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 3) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"3\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.void;\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg1 = compiler.compileExpression(\r\n        operands[1],\r\n        Type.u32,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      arg2 = compiler.compileExpression(\r\n        operands[2],\r\n        compiler.options.usizeType,\r\n        ConversionKind.IMPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = Type.void;\r\n      throw new Error(\"not implemented\");\r\n      // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n    }\r\n\r\n    // other\r\n\r\n    case \"changetype\": { // changetype<T!>(value: *) -> T\r\n      if (!(typeArguments && typeArguments.length == 1)) {\r\n        if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n          reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = typeArguments[0];\r\n        return module.createUnreachable();\r\n      }\r\n      arg0 = compiler.compileExpressionRetainType(\r\n        operands[0],\r\n        typeArguments[0],\r\n        WrapMode.NONE\r\n      );\r\n      compiler.currentType = typeArguments[0];\r\n      if (compiler.currentType.size != typeArguments[0].size) {\r\n        compiler.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          reportNode.range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n      //  compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n      return arg0; // any usize to any usize\r\n    }\r\n    case \"assert\": { // assert<T?>(isTrueish: T, message?: string) -> T with T != null\r\n      if (operands.length < 1 || operands.length > 2) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        if (operands.length < 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n            reportNode.range, \"1\", operands.length.toString(10)\r\n          );\r\n        } else if (operands.length > 2) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_arguments_but_got_1,\r\n            reportNode.range, \"2\", operands.length.toString(10)\r\n          );\r\n        }\r\n        return module.createUnreachable();\r\n      }\r\n      if (typeArguments) {\r\n        if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n        if (typeArguments.length != 1) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n      } else {\r\n        arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\r\n      }\r\n\r\n      let type = compiler.currentType;\r\n      compiler.currentType = type.nonNullableType;\r\n\r\n      // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n      if (compiler.options.noAssert) {\r\n        if (contextualType == Type.void) {\r\n          compiler.currentType = Type.void;\r\n          return module.createNop();\r\n        }\r\n        return arg0;\r\n      }\r\n\r\n      let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n      compiler.currentType = type.nonNullableType;\r\n\r\n      if (contextualType == Type.void) { // simplify if dropped anyway\r\n        switch (compiler.currentType.kind) {\r\n          default: { // any integer up to 32-bits incl. bool\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI32,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI64,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE:\r\n          case TypeKind.USIZE: {\r\n            ret = module.createIf(\r\n              module.createUnary(\r\n                compiler.options.isWasm64\r\n                  ? UnaryOp.EqzI64\r\n                  : UnaryOp.EqzI32,\r\n                arg0\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n          case TypeKind.F32: {\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF32,\r\n                arg0,\r\n                module.createF32(0)\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF64,\r\n                arg0,\r\n                module.createF64(0)\r\n              ),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = abort;\r\n            break;\r\n          }\r\n        }\r\n        compiler.currentType = Type.void;\r\n      } else {\r\n        switch (compiler.currentType.kind) {\r\n          case TypeKind.I8:\r\n          case TypeKind.I16:\r\n          case TypeKind.U8:\r\n          case TypeKind.U16:\r\n          case TypeKind.BOOL: {\r\n            let flow = compiler.currentFunction.flow;\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(\r\n              compiler.currentType,\r\n              !flow.canOverflow(arg0, compiler.currentType)\r\n            );\r\n            ret = module.createIf(\r\n              module.createTeeLocal(tempLocal.index, arg0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I32:\r\n          case TypeKind.U32:\r\n          default: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\r\n            ret = module.createIf(\r\n              module.createTeeLocal(tempLocal.index, arg0),\r\n              module.createGetLocal(tempLocal.index, NativeType.I32),\r\n              abort\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.I64:\r\n          case TypeKind.U64: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n            ret = module.createIf(\r\n              module.createUnary(UnaryOp.EqzI64,\r\n                module.createTeeLocal(tempLocal.index, arg0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.I64)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.ISIZE:\r\n          case TypeKind.USIZE: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n            ret = module.createIf(\r\n              module.createUnary(\r\n                compiler.options.isWasm64\r\n                  ? UnaryOp.EqzI64\r\n                  : UnaryOp.EqzI32,\r\n                module.createTeeLocal(tempLocal.index, arg0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F32: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF32,\r\n                module.createTeeLocal(tempLocal.index, arg0),\r\n                module.createF32(0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.F32)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.F64: {\r\n            let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);\r\n            ret = module.createIf(\r\n              module.createBinary(BinaryOp.EqF64,\r\n                module.createTeeLocal(tempLocal.index, arg0),\r\n                module.createF64(0)\r\n              ),\r\n              abort,\r\n              module.createGetLocal(tempLocal.index, NativeType.F64)\r\n            );\r\n            break;\r\n          }\r\n          case TypeKind.VOID: {\r\n            compiler.error(\r\n              DiagnosticCode.Operation_not_supported,\r\n              reportNode.range\r\n            );\r\n            ret = abort;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      return ret;\r\n    }\r\n    case \"unchecked\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let flow = compiler.currentFunction.flow;\r\n      flow.set(FlowFlags.UNCHECKED_CONTEXT);\r\n      ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\r\n      flow.unset(FlowFlags.UNCHECKED_CONTEXT);\r\n      return ret;\r\n    }\r\n    case \"call_indirect\": { // call_indirect<T?>(target: Function | u32, ...args: *[]) -> T\r\n      if (operands.length < 1) {\r\n        if (typeArguments) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          if (typeArguments.length != 1) {\r\n            compiler.error(\r\n              DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n              reportNode.range, \"1\", typeArguments.length.toString(10)\r\n            );\r\n          }\r\n        }\r\n        compiler.error(\r\n          DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let returnType: Type;\r\n      if (typeArguments) {\r\n        if (typeArguments.length != 1) {\r\n          if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return module.createUnreachable();\r\n        }\r\n        returnType = typeArguments[0];\r\n      } else {\r\n        returnType = contextualType;\r\n      }\r\n      arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n      if (compiler.currentType.kind != TypeKind.U32) {\r\n        compiler.error(\r\n          DiagnosticCode.Operation_not_supported,\r\n          operands[0].range\r\n        );\r\n        return module.createUnreachable();\r\n      }\r\n      let numOperands = operands.length - 1;\r\n      let operandExprs = new Array<ExpressionRef>(numOperands);\r\n      let signatureParts = new Array<string>(numOperands + 1);\r\n      let nativeReturnType = returnType.toNativeType();\r\n      let nativeParamTypes = new Array<NativeType>(numOperands);\r\n      for (let i = 0; i < numOperands; ++i) {\r\n        operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\r\n        let operandType = compiler.currentType;\r\n        signatureParts[i] = operandType.toSignatureString();\r\n        nativeParamTypes[i] = operandType.toNativeType();\r\n      }\r\n      signatureParts[numOperands] = returnType.toSignatureString();\r\n      let typeName = signatureParts.join(\"\");\r\n      let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\r\n      if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\r\n      compiler.currentType = returnType;\r\n      // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\r\n      // thus must be used with care. it exists because it *might* be useful in specific scenarios.\r\n      return module.createCallIndirect(arg0, operandExprs, typeName);\r\n    }\r\n\r\n    // conversions\r\n\r\n    case \"i8\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i8;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i8,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i16\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i16;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i16,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"i64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.i64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.i64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"isize\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = compiler.options.isWasm64\r\n          ? Type.isize64\r\n          : Type.isize32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.isWasm64\r\n          ? Type.isize64\r\n          : Type.isize32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u8\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u8;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u8,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u16\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u16;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u16,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"u64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.u64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.u64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"usize\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = compiler.options.usizeType;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        compiler.options.usizeType,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"bool\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.bool;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.bool,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"f32\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.f32;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.f32,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n    case \"f64\": {\r\n      if (typeArguments) {\r\n        compiler.error(\r\n          DiagnosticCode.Type_0_is_not_generic,\r\n          reportNode.range, prototype.internalName\r\n        );\r\n      }\r\n      if (operands.length != 1) {\r\n        compiler.error(\r\n          DiagnosticCode.Expected_0_arguments_but_got_1,\r\n          reportNode.range, \"1\", operands.length.toString(10)\r\n        );\r\n        compiler.currentType = Type.f64;\r\n        return module.createUnreachable();\r\n      }\r\n      return compiler.compileExpression(\r\n        operands[0],\r\n        Type.f64,\r\n        ConversionKind.EXPLICIT,\r\n        WrapMode.NONE\r\n      );\r\n    }\r\n  }\r\n  var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\r\n  if (expr) {\r\n    if (typeArguments && typeArguments.length) {\r\n      compiler.error(\r\n        DiagnosticCode.Type_0_is_not_generic,\r\n        reportNode.range, prototype.internalName\r\n      );\r\n    }\r\n    return expr;\r\n  }\r\n  compiler.error(\r\n    DiagnosticCode.Operation_not_supported,\r\n    reportNode.range\r\n  );\r\n  return module.createUnreachable();\r\n}\r\n\r\n/** Defers an inline-assembler-like call to a built-in function. */\r\nfunction deferASMCall(\r\n  compiler: Compiler,\r\n  prototype: FunctionPrototype,\r\n  operands: Expression[],\r\n  contextualType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  switch (prototype.internalName) {\r\n\r\n    // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\r\n    //   add, sub, mul, div_s, div_u, rem_s, rem_u\r\n    //   and, or, xor, shl, shr_u, shr_s\r\n    //   eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\r\n\r\n    case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n    case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\r\n    case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\r\n    case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\r\n    case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\r\n\r\n    case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n    case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n    case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n    case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n    case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n    case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n    case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n    case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n    case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n    case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n    case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n    case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n    case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n    case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n    case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n    case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n    case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n    case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n    case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n    case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n    case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n  }\r\n  return 0;\r\n}\r\n\r\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\r\nfunction deferASM(\r\n  name: string,\r\n  compiler: Compiler,\r\n  typeArgument: Type,\r\n  operands: Expression[],\r\n  valueType: Type,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var prototype = assert(compiler.program.elementsLookup.get(name));\r\n  assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n  return compileCall(compiler, <FunctionPrototype>prototype, [ typeArgument ], operands, valueType, reportNode);\r\n}\r\n\r\n/** Evaluates the constant type of a type argument *or* expression. */\r\nfunction evaluateConstantType(\r\n  compiler: Compiler,\r\n  typeArguments: Type[] | null,\r\n  operands: Expression[],\r\n  reportNode: Node\r\n): Type | null {\r\n  if (operands.length == 0) { // requires type argument\r\n    if (!typeArguments || typeArguments.length != 1) {\r\n      compiler.error(\r\n        DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n        reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n      );\r\n      return null;\r\n    }\r\n    return typeArguments[0];\r\n  }\r\n  if (operands.length == 1) { // optional type argument\r\n    if (typeArguments) {\r\n      if (typeArguments.length == 1) {\r\n        compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n      } else {\r\n        if (typeArguments.length) {\r\n          compiler.error(\r\n            DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n            reportNode.range, \"1\", typeArguments.length.toString(10)\r\n          );\r\n          return null;\r\n        }\r\n        compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n      }\r\n    } else {\r\n      compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n    }\r\n    return compiler.currentType;\r\n  }\r\n  if (typeArguments && typeArguments.length > 1) {\r\n    compiler.error(\r\n      DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n      reportNode.range, \"1\", typeArguments.length.toString(10)\r\n    );\r\n  }\r\n  compiler.error(\r\n    DiagnosticCode.Expected_0_arguments_but_got_1,\r\n    reportNode.range, \"1\", operands.length.toString(10)\r\n  );\r\n  return null;\r\n}\r\n\r\n/** Evaluates a `constantOffset` argument.*/\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n  var expr: ExpressionRef;\r\n  var value: i32;\r\n  if (compiler.options.isWasm64) {\r\n    expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    if (\r\n      getExpressionId(expr) != ExpressionId.Const ||\r\n      getExpressionType(expr) != NativeType.I64 ||\r\n      getConstValueI64High(expr) != 0 ||\r\n      (value = getConstValueI64Low(expr)) < 0\r\n    ) {\r\n      compiler.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      value = -1;\r\n    }\r\n  } else {\r\n    expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n    if (\r\n      getExpressionId(expr) != ExpressionId.Const ||\r\n      getExpressionType(expr) != NativeType.I32 ||\r\n      (value = getConstValueI32(expr)) < 0\r\n    ) {\r\n      compiler.error(\r\n        DiagnosticCode.Operation_not_supported,\r\n        expression.range\r\n      );\r\n      value = -1;\r\n    }\r\n  }\r\n  return value;\r\n}\r\n\r\nconst allocateInternalName = \"allocate_memory\";\r\n\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nexport function compileAllocate(\r\n  compiler: Compiler,\r\n  classInstance: Class,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var program = compiler.program;\r\n  assert(classInstance.program == program);\r\n  var module = compiler.module;\r\n  var options = compiler.options;\r\n\r\n  var allocatePrototype = program.elementsLookup.get(allocateInternalName);\r\n  if (!allocatePrototype) {\r\n    program.error(\r\n      DiagnosticCode.Cannot_find_name_0,\r\n      reportNode.range, allocateInternalName\r\n    );\r\n    program.info(\r\n      DiagnosticCode.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf,\r\n      reportNode.range\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n  if (allocatePrototype.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n    program.error(\r\n      DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n      reportNode.range, allocatePrototype.internalName\r\n    );\r\n    return module.createUnreachable();\r\n  }\r\n\r\n  var allocateInstance = compiler.resolver.resolveFunction(<FunctionPrototype>allocatePrototype, null);\r\n  if (!(allocateInstance && compiler.compileFunction(allocateInstance))) return module.createUnreachable();\r\n\r\n  compiler.currentType = classInstance.type;\r\n  return module.createCall(\r\n    allocateInstance.internalName, [\r\n      options.isWasm64\r\n        ? module.createI64(classInstance.currentMemoryOffset)\r\n        : module.createI32(classInstance.currentMemoryOffset)\r\n    ],\r\n    options.nativeSizeType\r\n  );\r\n}\r\n\r\nconst abortInternalName = \"abort\";\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n  compiler: Compiler,\r\n  message: Expression | null,\r\n  reportNode: Node\r\n): ExpressionRef {\r\n  var program = compiler.program;\r\n  var module = compiler.module;\r\n\r\n  var stringType = program.typesLookup.get(\"string\"); // might be intended\r\n  if (!stringType) return module.createUnreachable();\r\n\r\n  var abortPrototype = program.elementsLookup.get(abortInternalName); // might be intended\r\n  if (!abortPrototype || abortPrototype.kind != ElementKind.FUNCTION_PROTOTYPE) return module.createUnreachable();\r\n\r\n  var abortInstance = compiler.resolver.resolveFunction(<FunctionPrototype>abortPrototype, null);\r\n  if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\r\n\r\n  var messageArg = message != null\r\n    ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n    : stringType.toNativeZero(module);\r\n\r\n  var filenameArg = compiler.compileStaticString(reportNode.range.source.normalizedPath);\r\n\r\n  compiler.currentType = Type.void;\r\n  return module.createBlock(null, [\r\n    module.createCallImport(\r\n      abortInstance.internalName, [\r\n        messageArg,\r\n        filenameArg,\r\n        module.createI32(reportNode.range.line),\r\n        module.createI32(reportNode.range.column)\r\n      ],\r\n      NativeType.None\r\n    ),\r\n    module.createUnreachable()\r\n  ]);\r\n}\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__24__;","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\n\r\nfor (var key in binaryen)\r\n  if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n    global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n  if (!size) return 0; // should be safe in our case\r\n  return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n  if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n  return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n  binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n  return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = require(\"../../module\").Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n  var previousPrint = binaryen.print;\r\n  var ret = \"\";\r\n  binaryen.print = function(x) { ret += x + \"\\n\" };\r\n  _BinaryenModulePrint(this.ref);\r\n  binaryen.print = previousPrint;\r\n  return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n  var previousPrint = binaryen.print;\r\n  var ret = \"\";\r\n  binaryen.print = function(x) { ret += x + \"\\n\" };\r\n  _BinaryenModulePrintAsmjs(this.ref);\r\n  binaryen.print = previousPrint;\r\n  return ret;\r\n};\r\n","module.exports = globalScope => {\r\n  var HEAP = new Uint8Array(0);\r\n  var HEAP_OFFSET = 0;\r\n\r\n  globalScope[\"allocate_memory\"] = function allocate_memory(size) {\r\n    if (!(size >>>= 0)) return 0;\r\n\r\n    if (HEAP_OFFSET + size > HEAP.length) {\r\n      var oldHeap = HEAP;\r\n      HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\r\n      HEAP.set(oldHeap);\r\n    }\r\n\r\n    var ptr = HEAP_OFFSET;\r\n    if ((HEAP_OFFSET += size) & 7)\r\n      HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\r\n\r\n    return ptr;\r\n  };\r\n\r\n  globalScope[\"free_memory\"] = function free_memory(ptr) {\r\n    // TODO\r\n  };\r\n\r\n  globalScope[\"move_memory\"] = function move_memory(dest, src, size) {\r\n    HEAP.copyWithin(dest, src, src + size);\r\n  };\r\n\r\n  globalScope[\"store\"] = function store(ptr, value, offset) {\r\n    HEAP[ptr + (offset | 0)] = value;\r\n  };\r\n\r\n  globalScope[\"load\"] = function load(ptr, offset) {\r\n    return HEAP[ptr + (offset | 0)];\r\n  };\r\n};\r\n","/** @module std/portable *//***/\r\n\r\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nglobalScope.ASC_TARGET = 0;\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n  \"MIN_VALUE\": { value: -128, writable: false },\r\n  \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n  \"MIN_VALUE\": { value: -32768, writable: false },\r\n  \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n  \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n  \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n  \"MIN_VALUE\": { value: 0, writable: false },\r\n  \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n  \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n  \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n  \"MIN_POSITIVE_VALUE\": { value: Math.fround(1.175494351e-38), writable: false },\r\n  \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n  \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n  \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n  globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n  \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n  \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n  \"MIN_POSITIVE_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\r\n  \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n  \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n  \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"ctz\"] = function ctz(value) {\r\n  var c = Math.clz32(value & -value);\r\n  return value ? 31 - c : c;\r\n};\r\n\r\nglobalScope[\"popcnt\"] = function popcnt(value) {\r\n  value -= value >>> 1 & 0x55555555;\r\n  value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\r\n  return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\r\n};\r\n\r\nglobalScope[\"rotl\"] = function rotl(value, shift) {\r\n  shift &= 31;\r\n  return (value << shift) | (value >>> (32 - shift));\r\n};\r\n\r\nglobalScope[\"rotr\"] = function rotr(value, shift) {\r\n  shift &= 31;\r\n  return (value >>> shift) | (value << (32 - shift));\r\n};\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\n// Adopt code from https://github.com/rfk/wasm-polyfill\r\nglobalScope[\"nearest\"] = function nearest(value) {\r\n  if (Math.abs(value - Math.trunc(value)) === 0.5) {\r\n    return 2.0 * Math.round(value * 0.5);\r\n  }\r\n  return Math.round(value);\r\n};\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n  return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"copysign\"] = function copysign(x, y) {\r\n  return Math.abs(x) * Math.sign(y);\r\n};\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n  var a = value >> 8 & 0x00FF00FF;\r\n  var b = (value & 0x00FF00FF) << 8;\r\n  value = a | b;\r\n  a = value >> 16 & 0x0000FFFF;\r\n  b = (value & 0x0000FFFF) << 16;\r\n  return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n  return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n  if (Error.captureStackTrace) {\r\n    Error.captureStackTrace(this, UnreachableError);\r\n  } else {\r\n    this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n  }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n  throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n  this.message = message || \"assertion failed\";\r\n  if (Error.captureStackTrace) {\r\n    Error.captureStackTrace(this, AssertionError);\r\n  } else {\r\n    this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n  }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n  if (isTrueish) return isTrueish;\r\n  throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n  return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n  return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n  return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n  return String.fromCodePoint.apply(String, arr);\r\n};\r\n\r\nglobalScope[\"isInteger\"] = Number.isInteger;\r\n\r\nglobalScope[\"isFloat\"] = function isFloat(arg) {\r\n  return typeof arg === \"number\";\r\n};\r\n\r\nglobalScope[\"isReference\"] = function isClass(arg) {\r\n  return typeof arg === \"object\" || typeof arg === \"string\";\r\n};\r\n\r\nglobalScope[\"isString\"] = function isString(arg) {\r\n  return typeof arg === \"string\" || arg instanceof String;\r\n};\r\n\r\nglobalScope[\"isArray\"] = Array.isArray;\r\n\r\nglobalScope[\"unchecked\"] = function(expr) {\r\n  return expr;\r\n};\r\n\r\nglobalScope[\"fmod\"] = function fmod(x, y) {\r\n  return x % y;\r\n};\r\n\r\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\r\n  return Math.fround(x % y);\r\n};\r\n\r\nglobalScope[\"JSMath\"] = Math;\r\n\r\nrequire(\"./memory\")(globalScope);\r\n","/**\r\n * JavaScript glue code.\r\n * @module glue/js\r\n * @preferred\r\n *//***/\r\n\r\n/// <reference path=\"./node.d.ts\" />\r\n\r\nimport \"../../../std/portable/index\";\r\nimport \"./binaryen\";\r\nimport \"./float\";\r\nimport \"./i64\";\r\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/builtins.ts b/src/builtins.ts
index f133cf95..6727e1c3 100644
--- a/src/builtins.ts
+++ b/src/builtins.ts
@@ -2794,7 +2794,7 @@ export function compileAllocate(
     return module.createUnreachable();
   }
 
-  var allocateInstance = (<FunctionPrototype>allocatePrototype).resolve(); // reports
+  var allocateInstance = compiler.resolver.resolveFunction(<FunctionPrototype>allocatePrototype, null);
   if (!(allocateInstance && compiler.compileFunction(allocateInstance))) return module.createUnreachable();
 
   compiler.currentType = classInstance.type;
@@ -2825,7 +2825,7 @@ export function compileAbort(
   var abortPrototype = program.elementsLookup.get(abortInternalName); // might be intended
   if (!abortPrototype || abortPrototype.kind != ElementKind.FUNCTION_PROTOTYPE) return module.createUnreachable();
 
-  var abortInstance = (<FunctionPrototype>abortPrototype).resolve(); // reports
+  var abortInstance = compiler.resolver.resolveFunction(<FunctionPrototype>abortPrototype, null);
   if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();
 
   var messageArg = message != null
diff --git a/src/compiler.ts b/src/compiler.ts
index 65f7a417..1db84ee8 100644
--- a/src/compiler.ts
+++ b/src/compiler.ts
@@ -73,6 +73,10 @@ import {
   DecoratorFlags
 } from "./program";
 
+import {
+  Resolver
+} from "./resolver";
+
 import {
   Token,
   operatorTokenToString
@@ -250,6 +254,8 @@ export class Compiler extends DiagnosticEmitter {
 
   /** Program reference. */
   program: Program;
+  /** Resolver reference. */
+  resolver: Resolver;
   /** Provided options. */
   options: Options;
   /** Module instance being compiled. */
@@ -288,6 +294,7 @@ export class Compiler extends DiagnosticEmitter {
   constructor(program: Program, options: Options | null = null) {
     super(program.diagnostics);
     this.program = program;
+    this.resolver = program.resolver;
     if (!options) options = new Options();
     this.options = options;
     this.memoryOffset = i64_new(
@@ -430,7 +437,7 @@ export class Compiler extends DiagnosticEmitter {
             (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&
             !(<ClassDeclaration>statement).isGeneric
           ) {
-            this.compileClassDeclaration(<ClassDeclaration>statement, []);
+            this.compileClassDeclaration(<ClassDeclaration>statement, [], null);
           }
           break;
         }
@@ -514,7 +521,7 @@ export class Compiler extends DiagnosticEmitter {
 
         // resolve now if annotated
         if (declaration.type) {
-          let resolvedType = this.program.resolveType(declaration.type); // reports
+          let resolvedType = this.resolver.resolveType(declaration.type); // reports
           if (!resolvedType) return false;
           if (resolvedType == Type.void) {
             this.error(
@@ -827,7 +834,8 @@ export class Compiler extends DiagnosticEmitter {
     outerScope: Flow | null,
     reportNode: Node
   ): Function | null {
-    var instance = prototype.resolveUsingTypeArguments( // reports
+    var instance = this.resolver.resolveFunctionInclTypeArguments(
+      prototype,
       typeArguments,
       contextualTypeArguments,
       reportNode
@@ -1203,8 +1211,7 @@ export class Compiler extends DiagnosticEmitter {
   compileClassDeclaration(
     declaration: ClassDeclaration,
     typeArguments: TypeNode[],
-    contextualTypeArguments: Map<string,Type> | null = null,
-    alternativeReportNode: Node | null = null
+    contextualTypeArguments: Map<string,Type> | null = null
   ): void {
     var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));
     assert(element.kind == ElementKind.CLASS_PROTOTYPE);
@@ -1212,7 +1219,7 @@ export class Compiler extends DiagnosticEmitter {
       <ClassPrototype>element,
       typeArguments,
       contextualTypeArguments,
-      alternativeReportNode
+      declaration
     );
   }
 
@@ -1222,10 +1229,11 @@ export class Compiler extends DiagnosticEmitter {
     contextualTypeArguments: Map<string,Type> | null = null,
     alternativeReportNode: Node | null = null
   ): void {
-    var instance = prototype.resolveUsingTypeArguments( // reports
+    var instance = this.resolver.resolveClassInclTypeArguments(
+      prototype,
       typeArguments,
       contextualTypeArguments,
-      alternativeReportNode
+      alternativeReportNode || prototype.declaration
     );
     if (!instance) return;
     this.compileClass(instance);
@@ -2002,13 +2010,14 @@ export class Compiler extends DiagnosticEmitter {
     // other variables become locals
     var initializers = new Array<ExpressionRef>();
     var flow = this.currentFunction.flow;
+    var resolver = this.resolver;
     for (let i = 0; i < numDeclarations; ++i) {
       let declaration = declarations[i];
       let name = declaration.name.text;
       let type: Type | null = null;
       let initExpr: ExpressionRef = 0;
       if (declaration.type) {
-        type = program.resolveType( // reports
+        type = resolver.resolveType( // reports
           declaration.type,
           flow.contextualTypeArguments
         );
@@ -2609,7 +2618,7 @@ export class Compiler extends DiagnosticEmitter {
   }
 
   compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {
-    var toType = this.program.resolveType( // reports
+    var toType = this.resolver.resolveType( // reports
       expression.toType,
       this.currentFunction.flow.contextualTypeArguments
     );
@@ -3585,7 +3594,7 @@ export class Compiler extends DiagnosticEmitter {
               break;
             }
             assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);
-            this.f32PowInstance = instance = (<FunctionPrototype>prototype).resolve();
+            this.f32PowInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);
           }
 
         // Math.pow otherwise (result is f64)
@@ -3627,7 +3636,7 @@ export class Compiler extends DiagnosticEmitter {
               break;
             }
             assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);
-            this.f64PowInstance = instance = (<FunctionPrototype>prototype).resolve();
+            this.f64PowInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);
           }
         }
         if (!(instance && this.compileFunction(instance))) {
@@ -3877,7 +3886,7 @@ export class Compiler extends DiagnosticEmitter {
                 break;
               }
               assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);
-              this.f32ModInstance = instance = (<FunctionPrototype>prototype).resolve();
+              this.f32ModInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);
             }
             if (!(instance && this.compileFunction(instance))) {
               expr = module.createUnreachable();
@@ -3908,7 +3917,7 @@ export class Compiler extends DiagnosticEmitter {
                 break;
               }
               assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);
-              this.f64ModInstance = instance = (<FunctionPrototype>prototype).resolve();
+              this.f64ModInstance = instance = this.resolver.resolveFunction(<FunctionPrototype>prototype, null);
             }
             if (!(instance && this.compileFunction(instance))) {
               expr = module.createUnreachable();
@@ -4577,8 +4586,9 @@ export class Compiler extends DiagnosticEmitter {
 
   compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {
     var program = this.program;
+    var resolver = program.resolver;
     var currentFunction = this.currentFunction;
-    var target = program.resolveExpression(expression, currentFunction); // reports
+    var target = resolver.resolveExpression(expression, currentFunction); // reports
     if (!target) return this.module.createUnreachable();
 
     // to compile just the value, we need to know the target's type
@@ -4597,9 +4607,9 @@ export class Compiler extends DiagnosticEmitter {
         break;
       }
       case ElementKind.PROPERTY: {
-        let prototype = (<Property>target).setterPrototype;
-        if (prototype) {
-          let instance = prototype.resolve(); // reports
+        let setterPrototype = (<Property>target).setterPrototype;
+        if (setterPrototype) {
+          let instance = this.resolver.resolveFunction(setterPrototype, null);
           if (!instance) return this.module.createUnreachable();
           assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this
           targetType = instance.signature.parameterTypes[0];
@@ -4612,7 +4622,7 @@ export class Compiler extends DiagnosticEmitter {
         return this.module.createUnreachable();
       }
       case ElementKind.CLASS: {
-        if (program.resolvedElementExpression) { // indexed access
+        if (resolver.resolvedElementExpression) { // indexed access
           let isUnchecked = currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);
           let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);
           if (!indexedSet) {
@@ -4661,7 +4671,7 @@ export class Compiler extends DiagnosticEmitter {
     tee: bool = false
   ): ExpressionRef {
     var module = this.module;
-    var target = this.program.resolveExpression(expression, this.currentFunction); // reports
+    var target = this.resolver.resolveExpression(expression, this.currentFunction); // reports
     if (!target) return module.createUnreachable();
 
     switch (target.kind) {
@@ -4725,7 +4735,7 @@ export class Compiler extends DiagnosticEmitter {
           );
           return module.createUnreachable();
         }
-        let thisExpression = assert(this.program.resolvedThisExpression);
+        let thisExpression = assert(this.resolver.resolvedThisExpression);
         let thisExpr = this.compileExpressionRetainType(
           thisExpression,
           this.options.usizeType,
@@ -4771,13 +4781,13 @@ export class Compiler extends DiagnosticEmitter {
       case ElementKind.PROPERTY: {
         let setterPrototype = (<Property>target).setterPrototype;
         if (setterPrototype) {
-          let setterInstance = setterPrototype.resolve(); // reports
+          let setterInstance = this.resolver.resolveFunction(setterPrototype, null);
           if (!setterInstance) return module.createUnreachable();
 
           // call just the setter if the return value isn't of interest
           if (!tee) {
             if (setterInstance.is(CommonFlags.INSTANCE)) {
-              let thisExpression = assert(this.program.resolvedThisExpression);
+              let thisExpression = assert(this.resolver.resolvedThisExpression);
               let thisExpr = this.compileExpressionRetainType(
                 thisExpression,
                 this.options.usizeType,
@@ -4792,12 +4802,12 @@ export class Compiler extends DiagnosticEmitter {
           // otherwise call the setter first, then the getter
           let getterPrototype = (<Property>target).getterPrototype;
           assert(getterPrototype != null); // must have one if there is a setter
-          let getterInstance = (<FunctionPrototype>getterPrototype).resolve(); // reports
+          let getterInstance = this.resolver.resolveFunction(<FunctionPrototype>getterPrototype, null);
           if (!getterInstance) return module.createUnreachable();
           let returnType = getterInstance.signature.returnType;
           let nativeReturnType = returnType.toNativeType();
           if (setterInstance.is(CommonFlags.INSTANCE)) {
-            let thisExpression = assert(this.program.resolvedThisExpression);
+            let thisExpression = assert(this.resolver.resolvedThisExpression);
             let thisExpr = this.compileExpressionRetainType(
               thisExpression,
               this.options.usizeType,
@@ -4830,7 +4840,7 @@ export class Compiler extends DiagnosticEmitter {
         return module.createUnreachable();
       }
       case ElementKind.CLASS: {
-        let elementExpression = this.program.resolvedElementExpression;
+        let elementExpression = this.resolver.resolvedElementExpression;
         if (elementExpression) {
           let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);
           let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);
@@ -4851,7 +4861,7 @@ export class Compiler extends DiagnosticEmitter {
             return module.createUnreachable();
           }
           let targetType = (<Class>target).type;
-          let thisExpression = assert(this.program.resolvedThisExpression);
+          let thisExpression = assert(this.resolver.resolvedThisExpression);
           let thisExpr = this.compileExpressionRetainType(
             thisExpression,
             this.options.usizeType,
@@ -4901,7 +4911,7 @@ export class Compiler extends DiagnosticEmitter {
   compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {
     var module = this.module;
     var currentFunction = this.currentFunction;
-    var target = this.program.resolveExpression(expression.expression, currentFunction); // reports
+    var target = this.resolver.resolveExpression(expression.expression, currentFunction); // reports
     if (!target) return module.createUnreachable();
 
     var signature: Signature | null;
@@ -4929,7 +4939,8 @@ export class Compiler extends DiagnosticEmitter {
             );
             return module.createUnreachable();
           }
-          instance = prototype.resolveUsingTypeArguments( // reports
+          instance = this.resolver.resolveFunctionInclTypeArguments(
+            prototype,
             typeArguments,
             this.currentFunction.flow.contextualTypeArguments,
             expression
@@ -4984,10 +4995,9 @@ export class Compiler extends DiagnosticEmitter {
               }
               inferredTypes.set(name, inferredType);
             } else {
-              let concreteType = this.program.resolveType(
+              let concreteType = this.resolver.resolveType(
                 parameterTypes[i].type,
-                this.currentFunction.flow.contextualTypeArguments,
-                true
+                this.currentFunction.flow.contextualTypeArguments
               );
               if (!concreteType) return module.createUnreachable();
               argumentExprs[i] = this.compileExpression(
@@ -5003,7 +5013,8 @@ export class Compiler extends DiagnosticEmitter {
             let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO
             resolvedTypeArguments[i] = inferredType;
           }
-          instance = prototype.resolve(
+          instance = this.resolver.resolveFunction(
+            prototype,
             resolvedTypeArguments,
             this.currentFunction.flow.contextualTypeArguments
           );
@@ -5015,7 +5026,8 @@ export class Compiler extends DiagnosticEmitter {
 
         // otherwise resolve the non-generic call as usual
         } else {
-          instance = prototype.resolve(
+          instance = this.resolver.resolveFunction(
+            prototype,
             null,
             this.currentFunction.flow.contextualTypeArguments
           );
@@ -5026,7 +5038,7 @@ export class Compiler extends DiagnosticEmitter {
         let thisExpr: ExpressionRef = 0;
         if (instance.is(CommonFlags.INSTANCE)) {
           thisExpr = this.compileExpressionRetainType(
-            assert(this.program.resolvedThisExpression),
+            assert(this.resolver.resolvedThisExpression),
             this.options.usizeType,
             WrapMode.NONE
           );
@@ -5069,7 +5081,7 @@ export class Compiler extends DiagnosticEmitter {
       case ElementKind.FIELD: {
         let type = (<Field>target).type;
         if (signature = type.signatureReference) {
-          let thisExpression = assert(this.program.resolvedThisExpression);
+          let thisExpression = assert(this.resolver.resolvedThisExpression);
           let thisExpr = this.compileExpressionRetainType(
             thisExpression,
             this.options.usizeType,
@@ -5125,13 +5137,31 @@ export class Compiler extends DiagnosticEmitter {
     expression: CallExpression,
     contextualType: Type
   ): ExpressionRef {
-    var expr = compileBuiltinCall( // reports
+    var typeArguments: Type[] | null = null;
+
+    // builtins handle omitted type arguments on their own. if present, however, resolve them here
+    // and pass them to the builtin, even if it's still up to the builtin how to handle them.
+    var typeArgumentNodes = expression.typeArguments;
+    if (expression.typeArguments) {
+      if (!prototype.is(CommonFlags.GENERIC)) {
+        this.error(
+          DiagnosticCode.Type_0_is_not_generic,
+          expression.range, prototype.internalName
+        );
+      }
+      typeArguments = this.resolver.resolveTypeArguments(
+        assert(prototype.declaration.typeParameters),
+        typeArgumentNodes,
+        this.currentFunction.flow.contextualTypeArguments,
+        expression
+      );
+    }
+
+    // now compile the builtin, which usually returns a block of code that replaces the call.
+    var expr = compileBuiltinCall(
       this,
       prototype,
-      prototype.resolveBuiltinTypeArguments(
-        expression.typeArguments,
-        this.currentFunction.flow.contextualTypeArguments
-      ),
+      typeArguments,
       expression.arguments,
       contextualType,
       expression
@@ -5733,7 +5763,7 @@ export class Compiler extends DiagnosticEmitter {
   }
 
   compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {
-    var target = this.program.resolveElementAccess(expression, this.currentFunction); // reports
+    var target = this.resolver.resolveElementAccess(expression, this.currentFunction); // reports
     if (!target) return this.module.createUnreachable();
     switch (target.kind) {
       case ElementKind.CLASS: {
@@ -5895,7 +5925,7 @@ export class Compiler extends DiagnosticEmitter {
     }
 
     // otherwise resolve
-    var target = this.program.resolveIdentifier( // reports
+    var target = this.resolver.resolveIdentifier( // reports
       expression,
       this.currentEnum || currentFunction
     );
@@ -5940,7 +5970,8 @@ export class Compiler extends DiagnosticEmitter {
         return this.module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);
       }
       case ElementKind.FUNCTION_PROTOTYPE: {
-        let instance = (<FunctionPrototype>target).resolve(
+        let instance = this.resolver.resolveFunction(
+          <FunctionPrototype>target,
           null,
           currentFunction.flow.contextualTypeArguments
         );
@@ -5967,7 +5998,7 @@ export class Compiler extends DiagnosticEmitter {
     // possible in AS anyway.
     var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);
     var type = this.currentType;
-    var isType = this.program.resolveType(expression.isType);
+    var isType = this.resolver.resolveType(expression.isType);
     this.currentType = Type.bool;
     if (!isType) return module.createUnreachable();
     return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)
@@ -6161,7 +6192,7 @@ export class Compiler extends DiagnosticEmitter {
     // obtain the array type
     var arrayPrototype = assert(this.program.arrayPrototype);
     if (!arrayPrototype || arrayPrototype.kind != ElementKind.CLASS_PROTOTYPE) return module.createUnreachable();
-    var arrayInstance = (<ClassPrototype>arrayPrototype).resolve([ elementType ]);
+    var arrayInstance = this.resolver.resolveClass(<ClassPrototype>arrayPrototype, [ elementType ]);
     if (!arrayInstance) return module.createUnreachable();
     var arrayType = arrayInstance.type;
 
@@ -6367,7 +6398,7 @@ export class Compiler extends DiagnosticEmitter {
     var currentFunction = this.currentFunction;
 
     // obtain the class being instantiated
-    var target = this.program.resolveExpression( // reports
+    var target = this.resolver.resolveExpression( // reports
       expression.expression,
       currentFunction
     );
@@ -6388,12 +6419,14 @@ export class Compiler extends DiagnosticEmitter {
       (classReference = contextualType.classReference) !== null &&
       classReference.is(CommonFlags.GENERIC)
     ) {
-      classInstance = classPrototype.resolve(
+      classInstance = this.resolver.resolveClass(
+        classPrototype,
         classReference.typeArguments,
         currentFunction.flow.contextualTypeArguments
       );
     } else {
-      classInstance = classPrototype.resolveUsingTypeArguments( // reports
+      classInstance = this.resolver.resolveClassInclTypeArguments(
+        classPrototype,
         typeArguments,
         currentFunction.flow.contextualTypeArguments,
         expression
@@ -6448,10 +6481,9 @@ export class Compiler extends DiagnosticEmitter {
     contextualType: Type,
     retainConstantType: bool
   ): ExpressionRef {
-    var program = this.program;
     var module = this.module;
 
-    var target = program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports
+    var target = this.resolver.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports
     if (!target) return module.createUnreachable();
 
     switch (target.kind) {
@@ -6480,7 +6512,7 @@ export class Compiler extends DiagnosticEmitter {
         return module.createGetGlobal((<EnumValue>target).internalName, NativeType.I32);
       }
       case ElementKind.FIELD: { // instance field
-        let thisExpression = assert(program.resolvedThisExpression);
+        let thisExpression = assert(this.resolver.resolvedThisExpression);
         assert((<Field>target).memoryOffset >= 0);
         let thisExpr = this.compileExpressionRetainType(
           thisExpression,
@@ -6499,7 +6531,7 @@ export class Compiler extends DiagnosticEmitter {
       case ElementKind.PROPERTY: { // instance property (here: getter)
         let prototype = (<Property>target).getterPrototype;
         if (prototype) {
-          let instance = prototype.resolve(null); // reports
+          let instance = this.resolver.resolveFunction(prototype, null);
           if (!instance) return module.createUnreachable();
           let signature = instance.signature;
           if (!this.checkCallSignature( // reports
@@ -6514,7 +6546,7 @@ export class Compiler extends DiagnosticEmitter {
           if (instance.is(CommonFlags.INSTANCE)) {
             let parent = assert(instance.parent);
             assert(parent.kind == ElementKind.CLASS);
-            let thisExpression = assert(program.resolvedThisExpression);
+            let thisExpression = assert(this.resolver.resolvedThisExpression);
             let thisExpr = this.compileExpressionRetainType(
               thisExpression,
               this.options.usizeType,
diff --git a/src/program.ts b/src/program.ts
index 071a5eef..b967b77b 100644
--- a/src/program.ts
+++ b/src/program.ts
@@ -29,8 +29,7 @@ import {
   Type,
   TypeKind,
   TypeFlags,
-  Signature,
-  typesToString
+  Signature
 } from "./types";
 
 import {
@@ -39,23 +38,15 @@ import {
   Source,
   Range,
   CommonTypeNode,
-  TypeNode,
   TypeParameterNode,
-  ParameterKind,
-  SignatureNode,
   DecoratorNode,
   DecoratorKind,
 
   Expression,
-  AssertionExpression,
-  ElementAccessExpression,
   IdentifierExpression,
   LiteralExpression,
   LiteralKind,
-  ParenthesizedExpression,
-  PropertyAccessExpression,
   StringLiteralExpression,
-  CallExpression,
 
   ClassDeclaration,
   DeclarationStatement,
@@ -116,6 +107,10 @@ import {
   CharCode
 } from "./util";
 
+import {
+  Resolver
+} from "./resolver";
+
 /** Represents a yet unresolved import. */
 class QueuedImport {
   localName: string;
@@ -306,7 +301,9 @@ export class Program extends DiagnosticEmitter {
 
   /** Array of source files. */
   sources: Source[];
-  /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */
+  /** Resolver instance. */
+  resolver: Resolver;
+  /** Diagnostic offset used where successively obtaining the next diagnostic. */
   diagnosticsOffset: i32 = 0;
   /** Compiler options. */
   options: Options;
@@ -333,16 +330,13 @@ export class Program extends DiagnosticEmitter {
   /** Main function reference, if present. */
   mainFunction: FunctionPrototype | null = null;
 
-  /** Target expression of the previously resolved property or element access. */
-  resolvedThisExpression: Expression | null = null;
-  /** Element expression of the previously resolved element access. */
-  resolvedElementExpression : Expression | null = null;
   /** Currently processing filespace. */
   currentFilespace: Filespace;
 
   /** Constructs a new program, optionally inheriting parser diagnostics. */
   constructor(diagnostics: DiagnosticMessage[] | null = null) {
     super(diagnostics);
+    this.resolver = new Resolver(this);
     this.sources = [];
   }
 
@@ -474,12 +468,12 @@ export class Program extends DiagnosticEmitter {
       let queuedImport = queuedImports[i];
       let declaration = queuedImport.declaration;
       if (declaration) { // named
-        let element = this.tryResolveImport(queuedImport.externalName, queuedExports);
+        let element = this.tryLocateImport(queuedImport.externalName, queuedExports);
         if (element) {
           this.elementsLookup.set(queuedImport.localName, element);
           queuedImports.splice(i, 1);
         } else {
-          if (element = this.tryResolveImport(queuedImport.externalNameAlt, queuedExports)) {
+          if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {
             this.elementsLookup.set(queuedImport.localName, element);
             queuedImports.splice(i, 1);
           } else {
@@ -556,11 +550,12 @@ export class Program extends DiagnosticEmitter {
     }
 
     // resolve base prototypes of derived classes
+    var resolver = this.resolver;
     for (let i = 0, k = queuedExtends.length; i < k; ++i) {
       let derivedPrototype = queuedExtends[i];
       let derivedDeclaration = derivedPrototype.declaration;
       let derivedType = assert(derivedDeclaration.extendsType);
-      let baseElement = this.resolveIdentifier(derivedType.name, null); // reports
+      let baseElement = resolver.resolveIdentifier(derivedType.name, null); // reports
       if (!baseElement) continue;
       if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {
         let basePrototype = <ClassPrototype>baseElement;
@@ -595,7 +590,7 @@ export class Program extends DiagnosticEmitter {
     var stringPrototype = this.elementsLookup.get("String");
     if (stringPrototype) {
       assert(stringPrototype.kind == ElementKind.CLASS_PROTOTYPE);
-      let stringInstance = (<ClassPrototype>stringPrototype).resolve(null); // reports
+      let stringInstance = resolver.resolveClass(<ClassPrototype>stringPrototype, null);
       if (stringInstance) {
         if (this.typesLookup.has("string")) {
           let declaration = (<ClassPrototype>stringPrototype).declaration;
@@ -648,8 +643,8 @@ export class Program extends DiagnosticEmitter {
     );
   }
 
-  /** Tries to resolve an import by traversing exports and queued exports. */
-  private tryResolveImport(
+  /** Tries to locate an import by traversing exports and queued exports. */
+  private tryLocateImport(
     externalName: string,
     queuedNamedExports: Map<string,QueuedExport>
   ): Element | null {
@@ -668,7 +663,11 @@ export class Program extends DiagnosticEmitter {
     return null;
   }
 
-  private filterDecorators(decorators: DecoratorNode[], acceptedFlags: DecoratorFlags): DecoratorFlags {
+  /** Checks that only supported decorators are present. */
+  private checkDecorators(
+    decorators: DecoratorNode[],
+    acceptedFlags: DecoratorFlags
+  ): DecoratorFlags {
     var presentFlags = DecoratorFlags.NONE;
     for (let i = 0, k = decorators.length; i < k; ++i) {
       let decorator = decorators[i];
@@ -693,15 +692,19 @@ export class Program extends DiagnosticEmitter {
     return presentFlags;
   }
 
-  /** Processes global options, if present. */
-  private checkGlobalOptions(
+  /** Checks and sets up global options of an element. */
+  private checkGlobal(
     element: Element,
     declaration: DeclarationStatement
   ): void {
     var parentNode = declaration.parent;
+    // alias the element globally if it is ...
     if (
+      // explicitly annotated with @global - or -
       (element.hasDecorator(DecoratorFlags.GLOBAL)) ||
+      // part of the special builtins library file - or -
       (declaration.range.source.is(CommonFlags.BUILTIN)) ||
+      // exported from a top-level library file
       (
         declaration.range.source.isLibrary &&
         element.is(CommonFlags.EXPORT) &&
@@ -721,11 +724,13 @@ export class Program extends DiagnosticEmitter {
         );
       } else {
         this.elementsLookup.set(globalName, element);
+        // builtins can use the global name directly instead of being just an alias
         if (element.is(CommonFlags.BUILTIN)) element.internalName = globalName;
       }
     }
   }
 
+  /** Initializes a class declaration. */
   private initializeClass(
     declaration: ClassDeclaration,
     queuedExtends: ClassPrototype[],
@@ -749,7 +754,7 @@ export class Program extends DiagnosticEmitter {
       internalName,
       declaration,
       decorators
-        ? this.filterDecorators(decorators,
+        ? this.checkDecorators(decorators,
             DecoratorFlags.GLOBAL |
             DecoratorFlags.SEALED |
             DecoratorFlags.UNMANAGED
@@ -848,14 +853,16 @@ export class Program extends DiagnosticEmitter {
           break;
         }
         default: {
-          throw new Error("class member expected");
+          assert(false); // should have been reported while parsing
+          return;
         }
       }
     }
 
-    this.checkGlobalOptions(prototype, declaration);
+    this.checkGlobal(prototype, declaration);
   }
 
+  /** Initializes a field of a class or interface. */
   private initializeField(
     declaration: FieldDeclaration,
     classPrototype: ClassPrototype
@@ -863,9 +870,14 @@ export class Program extends DiagnosticEmitter {
     var name = declaration.name.text;
     var internalName = declaration.fileLevelInternalName;
     var decorators = declaration.decorators;
+    var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;
 
     // static fields become global variables
     if (declaration.is(CommonFlags.STATIC)) {
+      if (isInterface) {
+        // should have been reported while parsing
+        assert(false);
+      }
       if (this.elementsLookup.has(internalName)) {
         this.error(
           DiagnosticCode.Duplicate_identifier_0,
@@ -891,7 +903,7 @@ export class Program extends DiagnosticEmitter {
         Type.void, // resolved later on
         declaration,
         decorators
-          ? this.filterDecorators(decorators, DecoratorFlags.NONE)
+          ? this.checkDecorators(decorators, DecoratorFlags.NONE)
           : DecoratorFlags.NONE
       );
       staticField.parent = classPrototype;
@@ -903,6 +915,10 @@ export class Program extends DiagnosticEmitter {
 
     // instance fields are remembered until resolved
     } else {
+      if (isInterface) {
+        // should have been reported while parsing
+        assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));
+      }
       if (classPrototype.instanceMembers) {
         if (classPrototype.instanceMembers.has(name)) {
           this.error(
@@ -920,12 +936,12 @@ export class Program extends DiagnosticEmitter {
         internalName,
         declaration
       );
-      if (decorators) this.filterDecorators(decorators, DecoratorFlags.NONE);
+      if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);
       classPrototype.instanceMembers.set(name, instanceField);
-      // TBD: no need to mark as MODULE_EXPORT
     }
   }
 
+  /** Initializes a method of a class or interface. */
   private initializeMethod(
     declaration: MethodDeclaration,
     classPrototype: ClassPrototype
@@ -937,7 +953,7 @@ export class Program extends DiagnosticEmitter {
     var decorators = declaration.decorators;
     var decoratorFlags = DecoratorFlags.NONE;
     if (decorators) {
-      decoratorFlags = this.filterDecorators(decorators,
+      decoratorFlags = this.checkDecorators(decorators,
         DecoratorFlags.OPERATOR_BINARY  |
         DecoratorFlags.OPERATOR_PREFIX  |
         DecoratorFlags.OPERATOR_POSTFIX |
@@ -1121,7 +1137,7 @@ export class Program extends DiagnosticEmitter {
     var decorators = declaration.decorators;
     var decoratorFlags = DecoratorFlags.NONE;
     if (decorators) {
-      decoratorFlags = this.filterDecorators(decorators,
+      decoratorFlags = this.checkDecorators(decorators,
         DecoratorFlags.INLINE
       );
     }
@@ -1269,7 +1285,7 @@ export class Program extends DiagnosticEmitter {
       this.initializeEnumValue(values[i], element);
     }
 
-    this.checkGlobalOptions(element, declaration);
+    this.checkGlobal(element, declaration);
   }
 
   private initializeEnumValue(
@@ -1471,7 +1487,7 @@ export class Program extends DiagnosticEmitter {
       declaration,
       null,
       decorators
-        ? this.filterDecorators(decorators,
+        ? this.checkDecorators(decorators,
             DecoratorFlags.GLOBAL |
             DecoratorFlags.INLINE |
             DecoratorFlags.EXTERNAL
@@ -1521,7 +1537,7 @@ export class Program extends DiagnosticEmitter {
       }
     }
 
-    this.checkGlobalOptions(prototype, declaration);
+    this.checkGlobal(prototype, declaration);
   }
 
   private initializeImports(
@@ -1637,7 +1653,7 @@ export class Program extends DiagnosticEmitter {
       internalName,
       declaration,
       decorators
-        ? this.filterDecorators(decorators, DecoratorFlags.GLOBAL)
+        ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)
         : DecoratorFlags.NONE
     );
     prototype.parent = namespace;
@@ -1705,7 +1721,7 @@ export class Program extends DiagnosticEmitter {
       }
     }
 
-    this.checkGlobalOptions(prototype, declaration);
+    this.checkGlobal(prototype, declaration);
   }
 
   private initializeNamespace(
@@ -1721,7 +1737,7 @@ export class Program extends DiagnosticEmitter {
       namespace = new Namespace(this, simpleName, internalName, declaration);
       namespace.parent = parentNamespace;
       this.elementsLookup.set(internalName, namespace);
-      this.checkGlobalOptions(namespace, declaration);
+      this.checkGlobal(namespace, declaration);
     }
 
     if (parentNamespace) {
@@ -1851,7 +1867,7 @@ export class Program extends DiagnosticEmitter {
         Type.void, // resolved later on
         declaration,
         decorators
-          ? this.filterDecorators(decorators,
+          ? this.checkDecorators(decorators,
               DecoratorFlags.GLOBAL |
               DecoratorFlags.EXTERNAL
             )
@@ -1898,570 +1914,9 @@ export class Program extends DiagnosticEmitter {
           this.moduleLevelExports.set(simpleName, global);
         }
       }
-      this.checkGlobalOptions(global, declaration);
+      this.checkGlobal(global, declaration);
     }
   }
-
-  /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */
-  resolveSignature(
-    node: SignatureNode,
-    contextualTypeArguments: Map<string,Type> | null = null,
-    reportNotFound: bool = true
-  ): Signature | null {
-    var explicitThisType = node.explicitThisType;
-    var thisType: Type | null = null;
-    if (explicitThisType) {
-      thisType = this.resolveType(
-        explicitThisType,
-        contextualTypeArguments,
-        reportNotFound
-      );
-      if (!thisType) return null;
-    }
-    var parameterTypeNodes = node.parameters;
-    var numParameters = parameterTypeNodes.length;
-    var parameterTypes = new Array<Type>(numParameters);
-    var parameterNames = new Array<string>(numParameters);
-    var requiredParameters = 0;
-    var hasRest = false;
-    for (let i = 0; i < numParameters; ++i) {
-      let parameterTypeNode = parameterTypeNodes[i];
-      switch (parameterTypeNode.parameterKind) {
-        case ParameterKind.DEFAULT: {
-          requiredParameters = i + 1;
-          break;
-        }
-        case ParameterKind.REST: {
-          assert(i == numParameters);
-          hasRest = true;
-          break;
-        }
-      }
-      let parameterType = this.resolveType(
-        assert(parameterTypeNode.type),
-        contextualTypeArguments,
-        reportNotFound
-      );
-      if (!parameterType) return null;
-      parameterTypes[i] = parameterType;
-      parameterNames[i] = parameterTypeNode.name.text;
-    }
-    var returnTypeNode = node.returnType;
-    var returnType: Type | null;
-    if (returnTypeNode) {
-      returnType = this.resolveType(
-        returnTypeNode,
-        contextualTypeArguments,
-        reportNotFound
-      );
-      if (!returnType) return null;
-    } else {
-      returnType = Type.void;
-    }
-    var signature = new Signature(parameterTypes, returnType, thisType);
-    signature.parameterNames = parameterNames;
-    signature.requiredParameters = requiredParameters;
-    signature.hasRest = hasRest;
-    return signature;
-  }
-
-  /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */
-  resolveType(
-    node: CommonTypeNode,
-    contextualTypeArguments: Map<string,Type> | null = null,
-    reportNotFound: bool = true
-  ): Type | null {
-    if (node.kind == NodeKind.SIGNATURE) {
-      let signature = this.resolveSignature(<SignatureNode>node, contextualTypeArguments, reportNotFound);
-      if (!signature) return null;
-      return node.isNullable
-        ? signature.type.asNullable()
-        : signature.type;
-    }
-    var typeNode = <TypeNode>node;
-    var simpleName = typeNode.name.text;
-    var globalName = simpleName;
-    var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName;
-
-    var element: Element | null;
-    if (
-      (element = this.elementsLookup.get(localName)) || // file-global
-      (element = this.elementsLookup.get(globalName))   // program-global
-    ) {
-      switch (element.kind) {
-        case ElementKind.ENUM: return Type.i32;
-        case ElementKind.CLASS_PROTOTYPE: {
-          let instance = (<ClassPrototype>element).resolveUsingTypeArguments(
-            typeNode.typeArguments,
-            contextualTypeArguments,
-            null
-          ); // reports
-          if (!instance) return null;
-          return node.isNullable
-            ? instance.type.asNullable()
-            : instance.type;
-        }
-      }
-    }
-
-    // check (global) type alias
-    var alias = this.typeAliases.get(simpleName);
-    if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportNotFound);
-
-    // resolve parameters
-    if (typeNode.typeArguments) {
-      let k = typeNode.typeArguments.length;
-      let paramTypes = new Array<Type>(k);
-      for (let i = 0; i < k; ++i) {
-        let paramType = this.resolveType( // reports
-          typeNode.typeArguments[i],
-          contextualTypeArguments,
-          reportNotFound
-        );
-        if (!paramType) return null;
-        paramTypes[i] = paramType;
-      }
-
-      if (k) { // can't be a placeholder if it has parameters
-        let instanceKey = typesToString(paramTypes);
-        if (instanceKey.length) {
-          localName += "<" + instanceKey + ">";
-          globalName += "<" + instanceKey + ">";
-        }
-      } else if (contextualTypeArguments) {
-        let placeholderType = contextualTypeArguments.get(globalName);
-        if (placeholderType) return placeholderType;
-      }
-    }
-
-    var type: Type | null;
-
-    // check file-global / program-global type
-    if ((type = this.typesLookup.get(localName)) || (type = this.typesLookup.get(globalName))) {
-      return type;
-    }
-
-    if (reportNotFound) {
-      this.error(
-        DiagnosticCode.Cannot_find_name_0,
-        typeNode.name.range, globalName
-      );
-    }
-    return null;
-  }
-
-  /** Resolves an array of type arguments to concrete types. */
-  resolveTypeArguments(
-    typeParameters: TypeParameterNode[],
-    typeArgumentNodes: CommonTypeNode[] | null,
-    contextualTypeArguments: Map<string,Type> | null = null,
-    alternativeReportNode: Node | null = null
-  ): Type[] | null {
-    var parameterCount = typeParameters.length;
-    var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;
-    if (parameterCount != argumentCount) {
-      if (argumentCount) {
-        this.error(
-          DiagnosticCode.Expected_0_type_arguments_but_got_1,
-          Range.join(
-            (<TypeNode[]>typeArgumentNodes)[0].range,
-            (<TypeNode[]>typeArgumentNodes)[argumentCount - 1].range
-          ),
-          parameterCount.toString(10), argumentCount.toString(10)
-        );
-      } else if (alternativeReportNode) {
-        this.error(
-          DiagnosticCode.Expected_0_type_arguments_but_got_1,
-          alternativeReportNode.range.atEnd, parameterCount.toString(10), "0"
-        );
-      }
-      return null;
-    }
-    var typeArguments = new Array<Type>(parameterCount);
-    for (let i = 0; i < parameterCount; ++i) {
-      let type = this.resolveType( // reports
-        (<TypeNode[]>typeArgumentNodes)[i],
-        contextualTypeArguments,
-        true
-      );
-      if (!type) return null;
-      // TODO: check extendsType
-      typeArguments[i] = type;
-    }
-    return typeArguments;
-  }
-
-  /** Resolves an identifier to the element it refers to. */
-  resolveIdentifier(
-    identifier: IdentifierExpression,
-    context: Element | null
-  ): Element | null {
-    var name = identifier.text;
-    var element: Element | null;
-
-    if (context) {
-
-      switch (context.kind) {
-        case ElementKind.FUNCTION: { // search locals, use prototype
-          element = (<Function>context).flow.getScopedLocal(name);
-          if (element) {
-            this.resolvedThisExpression = null;
-            this.resolvedElementExpression = null;
-            return element;
-          }
-          context = (<Function>context).prototype.parent;
-          break;
-        }
-        case ElementKind.CLASS: { // use prototype
-          context = (<Class>context).prototype.parent;
-          break;
-        }
-      }
-
-      // search context
-      while (context) {
-        let members = context.members;
-        if (members) {
-          if (element = members.get(name)) {
-            this.resolvedThisExpression = null;
-            this.resolvedElementExpression = null;
-            return element;
-          }
-        }
-        context = context.parent;
-      }
-    }
-
-    // search current file
-    if (element = this.elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {
-      this.resolvedThisExpression = null;
-      this.resolvedElementExpression = null;
-      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE
-    }
-
-    // search global scope
-    if (element = this.elementsLookup.get(name)) {
-      this.resolvedThisExpression = null;
-      this.resolvedElementExpression = null;
-      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE
-    }
-
-    this.error(
-      DiagnosticCode.Cannot_find_name_0,
-      identifier.range, name
-    );
-    return null;
-  }
-
-  /** Resolves a property access to the element it refers to. */
-  resolvePropertyAccess(
-    propertyAccess: PropertyAccessExpression,
-    contextualFunction: Function
-  ): Element | null {
-    // start by resolving the lhs target (expression before the last dot)
-    var targetExpression = propertyAccess.expression;
-    var target = this.resolveExpression(targetExpression, contextualFunction); // reports
-    if (!target) return null;
-
-    // at this point we know exactly what the target is, so look up the element within
-    var propertyName = propertyAccess.property.text;
-
-    // Resolve variable-likes to the class type they reference first
-    switch (target.kind) {
-      case ElementKind.GLOBAL:
-      case ElementKind.LOCAL:
-      case ElementKind.FIELD: {
-        let classReference = (<VariableLikeElement>target).type.classReference;
-        if (!classReference) {
-          this.error(
-            DiagnosticCode.Property_0_does_not_exist_on_type_1,
-            propertyAccess.property.range, propertyName, (<VariableLikeElement>target).type.toString()
-          );
-          return null;
-        }
-        target = classReference;
-        break;
-      }
-      case ElementKind.PROPERTY: {
-        let getter = assert((<Property>target).getterPrototype).resolve(); // reports
-        if (!getter) return null;
-        let classReference = getter.signature.returnType.classReference;
-        if (!classReference) {
-          this.error(
-            DiagnosticCode.Property_0_does_not_exist_on_type_1,
-            propertyAccess.property.range, propertyName, getter.signature.returnType.toString()
-          );
-          return null;
-        }
-        target = classReference;
-        break;
-      }
-      case ElementKind.CLASS: {
-        let elementExpression = this.resolvedElementExpression;
-        if (elementExpression) {
-          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
-          if (!indexedGet) {
-            this.error(
-              DiagnosticCode.Index_signature_is_missing_in_type_0,
-              elementExpression.range, (<Class>target).internalName
-            );
-            return null;
-          }
-          let returnType = indexedGet.signature.returnType;
-          if (!(target = returnType.classReference)) {
-            this.error(
-              DiagnosticCode.Property_0_does_not_exist_on_type_1,
-              propertyAccess.property.range, propertyName, returnType.toString()
-            );
-            return null;
-          }
-        }
-        break;
-      }
-    }
-
-    // Look up the member within
-    switch (target.kind) {
-      case ElementKind.CLASS_PROTOTYPE:
-      case ElementKind.CLASS: {
-        do {
-          let members = target.members;
-          let member: Element | null;
-          if (members && (member = members.get(propertyName))) {
-            this.resolvedThisExpression = targetExpression;
-            this.resolvedElementExpression = null;
-            return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...
-          }
-          // traverse inherited static members on the base prototype if target is a class prototype
-          if (target.kind == ElementKind.CLASS_PROTOTYPE) {
-            if ((<ClassPrototype>target).basePrototype) {
-              target = <ClassPrototype>(<ClassPrototype>target).basePrototype;
-            } else {
-              break;
-            }
-          // traverse inherited instance members on the base class if target is a class instance
-          } else if (target.kind == ElementKind.CLASS) {
-            if ((<Class>target).base) {
-              target = <Class>(<Class>target).base;
-            } else {
-              break;
-            }
-          } else {
-            break;
-          }
-        } while (true);
-        break;
-      }
-      default: { // enums or other namespace-like elements
-        let members = target.members;
-        if (members) {
-          let member = members.get(propertyName);
-          if (member) {
-            this.resolvedThisExpression = targetExpression;
-            this.resolvedElementExpression = null;
-            return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...
-          }
-        }
-        break;
-      }
-    }
-    this.error(
-      DiagnosticCode.Property_0_does_not_exist_on_type_1,
-      propertyAccess.property.range, propertyName, target.internalName
-    );
-    return null;
-  }
-
-  resolveElementAccess(
-    elementAccess: ElementAccessExpression,
-    contextualFunction: Function
-  ): Element | null {
-    var targetExpression = elementAccess.expression;
-    var target = this.resolveExpression(targetExpression, contextualFunction);
-    if (!target) return null;
-    switch (target.kind) {
-      case ElementKind.GLOBAL:
-      case ElementKind.LOCAL:
-      case ElementKind.FIELD: {
-        let type = (<VariableLikeElement>target).type;
-        if (target = type.classReference) {
-          this.resolvedThisExpression = targetExpression;
-          this.resolvedElementExpression = elementAccess.elementExpression;
-          return target;
-        }
-        break;
-      }
-      case ElementKind.CLASS: { // element access on element access
-        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
-        if (!indexedGet) {
-          this.error(
-            DiagnosticCode.Index_signature_is_missing_in_type_0,
-            elementAccess.range, (<Class>target).internalName
-          );
-          return null;
-        }
-        let returnType = indexedGet.signature.returnType;
-        if (target = returnType.classReference) {
-          this.resolvedThisExpression = targetExpression;
-          this.resolvedElementExpression = elementAccess.elementExpression;
-          return target;
-        }
-        break;
-      }
-    }
-    this.error(
-      DiagnosticCode.Operation_not_supported,
-      targetExpression.range
-    );
-    return null;
-  }
-
-  resolveExpression(
-    expression: Expression,
-    contextualFunction: Function
-  ): Element | null {
-    while (expression.kind == NodeKind.PARENTHESIZED) {
-      expression = (<ParenthesizedExpression>expression).expression;
-    }
-    switch (expression.kind) {
-      case NodeKind.ASSERTION: {
-        let type = this.resolveType((<AssertionExpression>expression).toType); // reports
-        if (type) {
-          let classType = type.classReference;
-          if (classType) {
-            this.resolvedThisExpression = null;
-            this.resolvedElementExpression = null;
-            return classType;
-          }
-        }
-        return null;
-      }
-      case NodeKind.BINARY: { // TODO: string concatenation, mostly
-        throw new Error("not implemented");
-      }
-      case NodeKind.THIS: { // -> Class / ClassPrototype
-        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {
-          let explicitLocal = contextualFunction.flow.getScopedLocal("this");
-          if (explicitLocal) {
-            this.resolvedThisExpression = null;
-            this.resolvedElementExpression = null;
-            return explicitLocal;
-          }
-        }
-        let parent = contextualFunction.parent;
-        if (parent) {
-          this.resolvedThisExpression = null;
-          this.resolvedElementExpression = null;
-          return parent;
-        }
-        this.error(
-          DiagnosticCode._this_cannot_be_referenced_in_current_location,
-          expression.range
-        );
-        return null;
-      }
-      case NodeKind.SUPER: { // -> Class
-        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {
-          let explicitLocal = contextualFunction.flow.getScopedLocal("super");
-          if (explicitLocal) {
-            this.resolvedThisExpression = null;
-            this.resolvedElementExpression = null;
-            return explicitLocal;
-          }
-        }
-        let parent = contextualFunction.parent;
-        if (parent && parent.kind == ElementKind.CLASS && (parent = (<Class>parent).base)) {
-          this.resolvedThisExpression = null;
-          this.resolvedElementExpression = null;
-          return parent;
-        }
-        this.error(
-          DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,
-          expression.range
-        );
-        return null;
-      }
-      case NodeKind.IDENTIFIER: {
-        return this.resolveIdentifier(<IdentifierExpression>expression, contextualFunction);
-      }
-      case NodeKind.LITERAL: {
-        switch ((<LiteralExpression>expression).literalKind) {
-          case LiteralKind.STRING: {
-            this.resolvedThisExpression = expression;
-            this.resolvedElementExpression = null;
-            return this.stringInstance;
-          }
-          // case LiteralKind.ARRAY: // TODO
-        }
-        break;
-      }
-      case NodeKind.PROPERTYACCESS: {
-        return this.resolvePropertyAccess(
-          <PropertyAccessExpression>expression,
-          contextualFunction
-        );
-      }
-      case NodeKind.ELEMENTACCESS: {
-        return this.resolveElementAccess(
-          <ElementAccessExpression>expression,
-          contextualFunction
-        );
-      }
-      case NodeKind.CALL: {
-        let targetExpression = (<CallExpression>expression).expression;
-        let target = this.resolveExpression(targetExpression, contextualFunction); // reports
-        if (!target) return null;
-        if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {
-          let instance = (<FunctionPrototype>target).resolveUsingTypeArguments( // reports
-            (<CallExpression>expression).typeArguments,
-            contextualFunction.flow.contextualTypeArguments,
-            expression
-          );
-          if (!instance) return null;
-          let returnType = instance.signature.returnType;
-          let classType = returnType.classReference;
-          if (classType) {
-            // reuse resolvedThisExpression (might be property access)
-            // reuse resolvedElementExpression (might be element access)
-            return classType;
-          } else {
-            let signature = returnType.signatureReference;
-            if (signature) {
-              let functionTarget = signature.cachedFunctionTarget;
-              if (!functionTarget) {
-                functionTarget = new FunctionTarget(this, signature);
-                signature.cachedFunctionTarget = functionTarget;
-              }
-              // reuse resolvedThisExpression (might be property access)
-              // reuse resolvedElementExpression (might be element access)
-              return functionTarget;
-            }
-          }
-          this.error(
-            DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,
-            targetExpression.range, target.internalName
-          );
-          return null;
-        }
-        break;
-      }
-    }
-    this.error(
-      DiagnosticCode.Operation_not_supported,
-      expression.range
-    );
-    return null;
-  }
-
-  // resolveExpressionType(
-  //   expression: Expression,
-  //   contextualFunction: Function
-  // ): Type {
-  //   var element = this.resolveExpression(expression, contextualFunction);
-  //   switch (element.kind) {
-
-  //   }
-  // }
 }
 
 /** Indicates the specific kind of an {@link Element}. */
@@ -2799,191 +2254,6 @@ export class FunctionPrototype extends Element {
     this.decoratorFlags = decoratorFlags;
   }
 
-  /** Resolves this prototype to an instance using the specified concrete type arguments. */
-  resolve(
-    functionTypeArguments: Type[] | null = null,
-    contextualTypeArguments: Map<string,Type> | null = null
-  ): Function | null {
-    var instanceKey = functionTypeArguments ? typesToString(functionTypeArguments) : "";
-    var instance = this.instances.get(instanceKey);
-    if (instance) return instance;
-
-    var declaration = this.declaration;
-    var isInstance = this.is(CommonFlags.INSTANCE);
-    var classPrototype = this.classPrototype;
-
-    // inherit contextual type arguments as provided. might be overridden.
-    var inheritedTypeArguments = contextualTypeArguments;
-    contextualTypeArguments = new Map();
-    if (inheritedTypeArguments) {
-      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {
-        contextualTypeArguments.set(
-          inheritedName,
-          inheritedType
-        );
-      }
-    }
-
-    // override with class type arguments if a partially resolved instance method
-    var classTypeArguments = this.classTypeArguments;
-    if (classTypeArguments) { // set only if partially resolved
-      assert(this.is(CommonFlags.INSTANCE));
-      let classDeclaration = assert(classPrototype).declaration;
-      let classTypeParameters = classDeclaration.typeParameters;
-      let numClassTypeParameters = classTypeParameters.length;
-      assert(numClassTypeParameters == classTypeArguments.length);
-      for (let i = 0; i < numClassTypeParameters; ++i) {
-        contextualTypeArguments.set(
-          classTypeParameters[i].name.text,
-          classTypeArguments[i]
-        );
-      }
-    } else {
-      assert(!classTypeArguments);
-    }
-
-    // override with function specific type arguments
-    var signatureNode = declaration.signature;
-    var functionTypeParameters = declaration.typeParameters;
-    var numFunctionTypeArguments: i32;
-    if (functionTypeArguments && (numFunctionTypeArguments = functionTypeArguments.length)) {
-      assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);
-      for (let i = 0; i < numFunctionTypeArguments; ++i) {
-        contextualTypeArguments.set(
-          (<TypeParameterNode[]>functionTypeParameters)[i].name.text,
-          functionTypeArguments[i]
-        );
-      }
-    } else {
-      assert(!functionTypeParameters || functionTypeParameters.length == 0);
-    }
-
-    // resolve class if an instance method
-    var classInstance: Class | null = null;
-    var thisType: Type | null = null;
-    if (isInstance) {
-      classInstance = assert(classPrototype).resolve(classTypeArguments, contextualTypeArguments); // reports
-      if (!classInstance) return null;
-      thisType = classInstance.type;
-      contextualTypeArguments.set("this", thisType);
-    }
-
-    // resolve signature node
-    var signatureParameters = signatureNode.parameters;
-    var signatureParameterCount = signatureParameters.length;
-    var parameterTypes = new Array<Type>(signatureParameterCount);
-    var parameterNames = new Array<string>(signatureParameterCount);
-    var requiredParameters = 0;
-    for (let i = 0; i < signatureParameterCount; ++i) {
-      let parameterDeclaration = signatureParameters[i];
-      if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {
-        requiredParameters = i + 1;
-      }
-      let typeNode = assert(parameterDeclaration.type);
-      let parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports
-      if (!parameterType) return null;
-      parameterTypes[i] = parameterType;
-      parameterNames[i] = parameterDeclaration.name.text;
-    }
-
-    var returnType: Type;
-    if (this.is(CommonFlags.SET)) {
-      returnType = Type.void; // not annotated
-    } else if (this.is(CommonFlags.CONSTRUCTOR)) {
-      returnType = assert(classInstance).type; // not annotated
-    } else {
-      let typeNode = assert(signatureNode.returnType);
-      let type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports
-      if (!type) return null;
-      returnType = type;
-    }
-
-    var signature = new Signature(parameterTypes, returnType, thisType);
-    signature.parameterNames = parameterNames;
-    signature.requiredParameters = requiredParameters;
-
-    var internalName = this.internalName;
-    if (instanceKey.length) internalName += "<" + instanceKey + ">";
-    instance = new Function(
-      this,
-      internalName,
-      signature,
-      classInstance
-        ? classInstance
-        : classPrototype,
-      contextualTypeArguments
-    );
-    this.instances.set(instanceKey, instance);
-    this.program.instancesLookup.set(internalName, instance);
-    return instance;
-  }
-
-  /** Resolves this prototype partially by applying the specified inherited class type arguments. */
-  resolvePartial(classTypeArguments: Type[] | null): FunctionPrototype | null {
-    assert(this.is(CommonFlags.INSTANCE));
-    var classPrototype = assert(this.classPrototype);
-
-    if (!(classTypeArguments && classTypeArguments.length)) return this; // no need to clone
-
-    var simpleName = this.simpleName;
-    var partialKey = typesToString(classTypeArguments);
-    var partialPrototype = new FunctionPrototype(
-      this.program,
-      simpleName,
-      classPrototype.internalName + "<" + partialKey + ">" + INSTANCE_DELIMITER + simpleName,
-      this.declaration,
-      classPrototype,
-      this.decoratorFlags
-    );
-    partialPrototype.flags = this.flags;
-    partialPrototype.operatorKind = this.operatorKind;
-    partialPrototype.classTypeArguments = classTypeArguments;
-    return partialPrototype;
-  }
-
-  /** Resolves the specified type arguments prior to resolving this prototype to an instance. */
-  resolveUsingTypeArguments(
-    typeArgumentNodes: CommonTypeNode[] | null,
-    contextualTypeArguments: Map<string,Type> | null,
-    reportNode: Node
-  ): Function | null {
-    var resolvedTypeArguments: Type[] | null = null;
-    if (this.is(CommonFlags.GENERIC)) {
-      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);
-      resolvedTypeArguments = this.program.resolveTypeArguments( // reports
-        assert(this.declaration.typeParameters),
-        typeArgumentNodes,
-        contextualTypeArguments,
-        reportNode
-      );
-      if (!resolvedTypeArguments) return null;
-    }
-    return this.resolve(resolvedTypeArguments, contextualTypeArguments);
-  }
-
-  /** Resolves the type arguments to use when compiling a built-in call. Must be a built-in. */
-  resolveBuiltinTypeArguments(
-    typeArgumentNodes: CommonTypeNode[] | null,
-    contextualTypeArguments: Map<string,Type> | null
-  ): Type[] | null {
-    assert(this.is(CommonFlags.BUILTIN));
-    var resolvedTypeArguments: Type[] | null = null;
-    if (typeArgumentNodes) {
-      let k = typeArgumentNodes.length;
-      resolvedTypeArguments = new Array<Type>(k);
-      for (let i = 0; i < k; ++i) {
-        let resolvedType = this.program.resolveType( // reports
-          typeArgumentNodes[i],
-          contextualTypeArguments,
-          true
-        );
-        if (!resolvedType) return null;
-        resolvedTypeArguments[i] = resolvedType;
-      }
-    }
-    return resolvedTypeArguments;
-  }
-
   toString(): string { return this.simpleName; }
 }
 
@@ -3383,226 +2653,6 @@ export class ClassPrototype extends Element {
     this.decoratorFlags = decoratorFlags;
   }
 
-  /** Resolves this prototype to an instance using the specified concrete type arguments. */
-  resolve(
-    typeArguments: Type[] | null,
-    contextualTypeArguments: Map<string,Type> | null = null
-  ): Class | null {
-    var instanceKey = typeArguments ? typesToString(typeArguments) : "";
-    var instance = this.instances.get(instanceKey);
-    if (instance) return instance;
-
-    // inherit contextual type arguments
-    var inheritedTypeArguments = contextualTypeArguments;
-    contextualTypeArguments = new Map();
-    if (inheritedTypeArguments) {
-      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {
-        contextualTypeArguments.set(inheritedName, inheritedType);
-      }
-    }
-
-    var declaration = this.declaration;
-    var baseClass: Class | null = null;
-    if (declaration.extendsType) {
-      let baseClassType = this.program.resolveType(declaration.extendsType, null); // reports
-      if (!baseClassType) return null;
-      if (!(baseClass = baseClassType.classReference)) {
-        this.program.error(
-          DiagnosticCode.A_class_may_only_extend_another_class,
-          declaration.extendsType.range
-        );
-        return null;
-      }
-      if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {
-        this.program.error(
-          DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,
-          declaration.extendsType.range, baseClass.internalName
-        );
-        return null;
-      }
-      if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != this.hasDecorator(DecoratorFlags.UNMANAGED)) {
-        this.program.error(
-          DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,
-          Range.join(declaration.name.range, declaration.extendsType.range)
-        );
-        return null;
-      }
-    }
-
-    // override call specific contextual type arguments if provided
-    var i: i32, k: i32;
-    if (typeArguments) {
-      if ((k = typeArguments.length) != declaration.typeParameters.length) {
-        throw new Error("type argument count mismatch");
-      }
-      for (i = 0; i < k; ++i) {
-        contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);
-      }
-    } else if (declaration.typeParameters.length) {
-      throw new Error("type argument count mismatch");
-    }
-
-    var simpleName = this.simpleName;
-    var internalName = this.internalName;
-    if (instanceKey.length) {
-      simpleName += "<" + instanceKey + ">";
-      internalName += "<" + instanceKey + ">";
-    }
-    instance = new Class(this, simpleName, internalName, typeArguments, baseClass);
-    instance.contextualTypeArguments = contextualTypeArguments;
-    this.instances.set(instanceKey, instance);
-    this.program.instancesLookup.set(internalName, instance);
-
-    var memoryOffset: u32 = 0;
-    if (baseClass) {
-      memoryOffset = baseClass.currentMemoryOffset;
-      if (baseClass.members) {
-        if (!instance.members) instance.members = new Map();
-        for (let inheritedMember of baseClass.members.values()) {
-          instance.members.set(inheritedMember.simpleName, inheritedMember);
-        }
-      }
-    }
-
-    // Resolve constructor
-    if (this.constructorPrototype) {
-      let partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports
-      if (partialConstructor) instance.constructorInstance = partialConstructor.resolve(); // reports
-    }
-
-    // Resolve instance members
-    if (this.instanceMembers) {
-      for (let member of this.instanceMembers.values()) {
-        switch (member.kind) {
-
-          // Lay out fields in advance
-          case ElementKind.FIELD_PROTOTYPE: {
-            if (!instance.members) instance.members = new Map();
-            let fieldDeclaration = (<FieldPrototype>member).declaration;
-            if (!fieldDeclaration.type) {
-              throw new Error("type expected"); // TODO: check if parent class defines a type
-            }
-            let fieldType = this.program.resolveType( // reports
-              fieldDeclaration.type,
-              instance.contextualTypeArguments
-            );
-            if (!fieldType) break;
-            let fieldInstance = new Field(
-              <FieldPrototype>member,
-              internalName + INSTANCE_DELIMITER + (<FieldPrototype>member).simpleName,
-              fieldType,
-              fieldDeclaration,
-              instance
-            );
-            switch (fieldType.byteSize) { // align
-              case 1: break;
-              case 2: {
-                if (memoryOffset & 1) ++memoryOffset;
-                break;
-              }
-              case 4: {
-                if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1;
-                break;
-              }
-              case 8: {
-                if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1;
-                break;
-              }
-              default: assert(false);
-            }
-            fieldInstance.memoryOffset = memoryOffset;
-            memoryOffset += fieldType.byteSize;
-            instance.members.set(member.simpleName, fieldInstance);
-            break;
-          }
-
-          // Partially resolve methods as these might have type arguments on their own
-          case ElementKind.FUNCTION_PROTOTYPE: {
-            if (!instance.members) instance.members = new Map();
-            let partialPrototype = (<FunctionPrototype>member).resolvePartial(typeArguments); // reports
-            if (partialPrototype) {
-              partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;
-              instance.members.set(member.simpleName, partialPrototype);
-            }
-            break;
-          }
-
-          // Clone properties and partially resolve the wrapped accessors for consistence with other methods
-          case ElementKind.PROPERTY: {
-            if (!instance.members) instance.members = new Map();
-            let getterPrototype = assert((<Property>member).getterPrototype);
-            let setterPrototype = (<Property>member).setterPrototype;
-            let instanceProperty = new Property(
-              this.program,
-              member.simpleName,
-              internalName + INSTANCE_DELIMITER + member.simpleName,
-              this
-            );
-            let partialGetterPrototype = getterPrototype.resolvePartial(typeArguments);
-            if (!partialGetterPrototype) return null;
-            partialGetterPrototype.internalName = (
-              internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName
-            );
-            instanceProperty.getterPrototype = partialGetterPrototype;
-            if (setterPrototype) {
-              let partialSetterPrototype = setterPrototype.resolvePartial(typeArguments);
-              if (!partialSetterPrototype) return null;
-              partialSetterPrototype.internalName = (
-                internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName
-              );
-              instanceProperty.setterPrototype = partialSetterPrototype;
-            }
-            instance.members.set(member.simpleName, instanceProperty);
-            break;
-          }
-          default: assert(false);
-        }
-      }
-    }
-
-    // Fully resolve operator overloads (don't have type parameters on their own)
-    for (let [kind, prototype] of this.overloadPrototypes) {
-      assert(kind != OperatorKind.INVALID);
-      let operatorInstance: Function | null;
-      if (prototype.is(CommonFlags.INSTANCE)) {
-        let operatorPartial = prototype.resolvePartial(typeArguments); // reports
-        if (!operatorPartial) continue;
-        operatorInstance = operatorPartial.resolve(); // reports
-      } else {
-        operatorInstance = prototype.resolve(); // reports
-      }
-      if (!operatorInstance) continue;
-      let overloads = instance.overloads;
-      if (!overloads) instance.overloads = overloads = new Map();
-      overloads.set(kind, operatorInstance);
-    }
-
-    instance.currentMemoryOffset = memoryOffset; // offsetof<this>() is the class' byte size in memory
-    return instance;
-  }
-
-  /** Resolves the specified type arguments prior to resolving this prototype to an instance. */
-  resolveUsingTypeArguments(
-    typeArgumentNodes: CommonTypeNode[] | null,
-    contextualTypeArguments: Map<string,Type> | null,
-    alternativeReportNode: Node | null
-  ): Class | null {
-    var resolvedTypeArguments: Type[] | null = null;
-    if (this.is(CommonFlags.GENERIC)) {
-      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);
-      resolvedTypeArguments = this.program.resolveTypeArguments(
-        this.declaration.typeParameters,
-        typeArgumentNodes,
-        contextualTypeArguments,
-        alternativeReportNode
-      );
-      if (!resolvedTypeArguments) return null;
-    } else {
-      assert(typeArgumentNodes == null || !typeArgumentNodes.length);
-    }
-    return this.resolve(resolvedTypeArguments, contextualTypeArguments);
-  }
-
   toString(): string {
     return this.simpleName;
   }
diff --git a/src/resolver.ts b/src/resolver.ts
new file mode 100644
index 00000000..8171a3a8
--- /dev/null
+++ b/src/resolver.ts
@@ -0,0 +1,1168 @@
+/**
+ * Resolve infrastructure to obtain types and elements.
+ * @module resolver
+ *//***/
+
+import {
+  DiagnosticEmitter,
+  DiagnosticCode
+} from "./diagnostics";
+
+import {
+  Program,
+  ElementKind,
+  OperatorKind,
+  FlowFlags,
+
+  Element,
+  Class,
+  ClassPrototype,
+  Function,
+  FunctionTarget,
+  FunctionPrototype,
+  VariableLikeElement,
+  Property,
+  DecoratorFlags,
+  FieldPrototype,
+  Field
+} from "./program";
+
+import {
+  SignatureNode,
+  ParameterKind,
+  CommonTypeNode,
+  NodeKind,
+  TypeNode,
+  TypeParameterNode,
+  Node,
+  Range,
+  IdentifierExpression,
+  CallExpression,
+  ElementAccessExpression,
+  PropertyAccessExpression,
+  LiteralExpression,
+  LiteralKind,
+  ParenthesizedExpression,
+  AssertionExpression,
+  Expression
+} from "./ast";
+
+import {
+  Type,
+  Signature,
+  typesToString
+} from "./types";
+
+import {
+  PATH_DELIMITER,
+  INSTANCE_DELIMITER,
+  CommonFlags
+} from "./common";
+
+/** Indicates whether errors are reported or not. */
+enum ReportMode {
+  /** Report errors. */
+  REPORT,
+  /** Swallow errors. */
+  SWALLOW
+}
+
+/** Provides tools to resolve types and expressions. */
+export class Resolver extends DiagnosticEmitter {
+
+  /** The program this resolver belongs to. */
+  program: Program;
+  /** Target expression of the previously resolved property or element access. */
+  resolvedThisExpression: Expression | null = null;
+  /** Element expression of the previously resolved element access. */
+  resolvedElementExpression : Expression | null = null;
+
+  /** Constructs the resolver for the specified program. */
+  constructor(program: Program) {
+    super(program.diagnostics);
+    this.program = program;
+  }
+
+  /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */
+  resolveType(
+    node: CommonTypeNode,
+    contextualTypeArguments: Map<string,Type> | null = null,
+    reportMode = ReportMode.REPORT
+  ): Type | null {
+
+    // handle signatures specifically
+    if (node.kind == NodeKind.SIGNATURE) {
+      let signature = this.resolveSignature(<SignatureNode>node, contextualTypeArguments, reportMode);
+      if (!signature) return null;
+      return node.isNullable ? signature.type.asNullable() : signature.type;
+    }
+
+    // now dealing with TypeNode
+    assert(node.kind == NodeKind.TYPE);
+    var typeNode = <TypeNode>node;
+    var simpleName = typeNode.name.text;
+    var globalName = simpleName;
+    var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache
+
+    // check file-global / program-global enum or class
+    {
+      let elementsLookup = this.program.elementsLookup;
+      let element: Element | null;
+      if (
+        (element = elementsLookup.get(localName)) || // file-global
+        (element = elementsLookup.get(globalName))   // program-global
+      ) {
+        switch (element.kind) {
+          case ElementKind.ENUM: {
+            if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {
+              if (reportMode == ReportMode.REPORT) {
+                this.error(
+                  DiagnosticCode.Type_0_is_not_generic,
+                  node.range, element.internalName
+                );
+              }
+              return null;
+            }
+            return Type.i32;
+          }
+          case ElementKind.CLASS_PROTOTYPE: {
+            let instance = this.resolveClassInclTypeArguments(
+              <ClassPrototype>element,
+              typeNode.typeArguments,
+              contextualTypeArguments,
+              node
+            ); // reports
+            if (!instance) return null;
+            return node.isNullable ? instance.type.asNullable() : instance.type;
+          }
+        }
+      }
+    }
+
+    // check (global) type alias
+    {
+      let alias = this.program.typeAliases.get(simpleName);
+      if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);
+    }
+
+    // resolve parameters
+    {
+      let typeArgumentNodes = typeNode.typeArguments;
+      if (typeArgumentNodes) {
+        let numTypeArguments = typeArgumentNodes.length;
+        let paramTypes = new Array<Type>(numTypeArguments);
+        for (let i = 0; i < numTypeArguments; ++i) {
+          let paramType = this.resolveType( // reports
+            typeArgumentNodes[i],
+            contextualTypeArguments,
+            reportMode
+          );
+          if (!paramType) return null;
+          paramTypes[i] = paramType;
+        }
+        if (numTypeArguments) { // can't be a placeholder if it has parameters
+          let instanceKey = typesToString(paramTypes);
+          if (instanceKey.length) {
+            localName += "<" + instanceKey + ">";
+            globalName += "<" + instanceKey + ">";
+          }
+        } else if (contextualTypeArguments) {
+          let placeholderType = contextualTypeArguments.get(globalName);
+          if (placeholderType) return placeholderType;
+        }
+      }
+    }
+
+    // check file-global / program-global type
+    {
+      let typesLookup = this.program.typesLookup;
+      let type: Type | null;
+      if (
+        (type = typesLookup.get(localName)) ||
+        (type = typesLookup.get(globalName))
+      ) {
+        return type;
+      }
+    }
+
+    if (reportMode == ReportMode.REPORT) {
+      this.error(
+        DiagnosticCode.Cannot_find_name_0,
+        typeNode.name.range, globalName
+      );
+    }
+    return null;
+  }
+
+  /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */
+  resolveSignature(
+    node: SignatureNode,
+    contextualTypeArguments: Map<string,Type> | null = null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Signature | null {
+    var explicitThisType = node.explicitThisType;
+    var thisType: Type | null = null;
+    if (explicitThisType) {
+      thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);
+      if (!thisType) return null;
+    }
+    var parameterTypeNodes = node.parameters;
+    var numParameters = parameterTypeNodes.length;
+    var parameterTypes = new Array<Type>(numParameters);
+    var parameterNames = new Array<string>(numParameters);
+    var requiredParameters = 0;
+    var hasRest = false;
+    for (let i = 0; i < numParameters; ++i) {
+      let parameterTypeNode = parameterTypeNodes[i];
+      switch (parameterTypeNode.parameterKind) {
+        case ParameterKind.DEFAULT: {
+          requiredParameters = i + 1;
+          break;
+        }
+        case ParameterKind.REST: {
+          assert(i == numParameters);
+          hasRest = true;
+          break;
+        }
+      }
+      let parameterType = this.resolveType(
+        assert(parameterTypeNode.type),
+        contextualTypeArguments,
+        reportMode
+      );
+      if (!parameterType) return null;
+      parameterTypes[i] = parameterType;
+      parameterNames[i] = parameterTypeNode.name.text;
+    }
+    var returnTypeNode = node.returnType;
+    var returnType: Type | null;
+    if (returnTypeNode) {
+      returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);
+      if (!returnType) return null;
+    } else {
+      returnType = Type.void;
+    }
+    var signature = new Signature(parameterTypes, returnType, thisType);
+    signature.parameterNames = parameterNames;
+    signature.requiredParameters = requiredParameters;
+    signature.hasRest = hasRest;
+    return signature;
+  }
+
+  /** Resolves an array of type arguments to concrete types. */
+  resolveTypeArguments(
+    typeParameters: TypeParameterNode[],
+    typeArgumentNodes: CommonTypeNode[] | null,
+    contextualTypeArguments: Map<string,Type> | null = null,
+    alternativeReportNode: Node | null = null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Type[] | null {
+    var parameterCount = typeParameters.length;
+    var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;
+    if (parameterCount != argumentCount) {
+      if (argumentCount) {
+        this.error(
+          DiagnosticCode.Expected_0_type_arguments_but_got_1,
+          Range.join(
+            (<TypeNode[]>typeArgumentNodes)[0].range,
+            (<TypeNode[]>typeArgumentNodes)[argumentCount - 1].range
+          ),
+          parameterCount.toString(10), argumentCount.toString(10)
+        );
+      } else if (alternativeReportNode) {
+        this.error(
+          DiagnosticCode.Expected_0_type_arguments_but_got_1,
+          alternativeReportNode.range.atEnd, parameterCount.toString(10), "0"
+        );
+      }
+      return null;
+    }
+    var typeArguments = new Array<Type>(parameterCount);
+    for (let i = 0; i < parameterCount; ++i) {
+      let type = this.resolveType( // reports
+        (<TypeNode[]>typeArgumentNodes)[i],
+        contextualTypeArguments,
+        reportMode
+      );
+      if (!type) return null;
+      // TODO: check extendsType
+      typeArguments[i] = type;
+    }
+    return typeArguments;
+  }
+
+  /** Resolves an identifier to the element it refers to. */
+  resolveIdentifier(
+    identifier: IdentifierExpression,
+    context: Element | null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Element | null {
+    var name = identifier.text;
+    var element: Element | null;
+
+    if (context) {
+
+      switch (context.kind) {
+        case ElementKind.FUNCTION: { // search locals, use prototype
+          element = (<Function>context).flow.getScopedLocal(name);
+          if (element) {
+            this.resolvedThisExpression = null;
+            this.resolvedElementExpression = null;
+            return element;
+          }
+          context = (<Function>context).prototype.parent;
+          break;
+        }
+        case ElementKind.CLASS: { // use prototype
+          context = (<Class>context).prototype.parent;
+          break;
+        }
+      }
+
+      // search context
+      while (context) {
+        let members = context.members;
+        if (members) {
+          if (element = members.get(name)) {
+            this.resolvedThisExpression = null;
+            this.resolvedElementExpression = null;
+            return element;
+          }
+        }
+        context = context.parent;
+      }
+    }
+
+    // search current file
+    var elementsLookup = this.program.elementsLookup;
+    if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {
+      this.resolvedThisExpression = null;
+      this.resolvedElementExpression = null;
+      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE
+    }
+
+    // search global scope
+    if (element = elementsLookup.get(name)) {
+      this.resolvedThisExpression = null;
+      this.resolvedElementExpression = null;
+      return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE
+    }
+
+    if (reportMode == ReportMode.REPORT) {
+      this.error(
+        DiagnosticCode.Cannot_find_name_0,
+        identifier.range, name
+      );
+    }
+    return null;
+  }
+
+  /** Resolves a property access to the element it refers to. */
+  resolvePropertyAccess(
+    propertyAccess: PropertyAccessExpression,
+    contextualFunction: Function,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Element | null {
+    // start by resolving the lhs target (expression before the last dot)
+    var targetExpression = propertyAccess.expression;
+    var target = this.resolveExpression(targetExpression, contextualFunction, reportMode); // reports
+    if (!target) return null;
+
+    // at this point we know exactly what the target is, so look up the element within
+    var propertyName = propertyAccess.property.text;
+
+    // Resolve variable-likes to the class type they reference first
+    switch (target.kind) {
+      case ElementKind.GLOBAL:
+      case ElementKind.LOCAL:
+      case ElementKind.FIELD: {
+        let classReference = (<VariableLikeElement>target).type.classReference;
+        if (!classReference) {
+          this.error(
+            DiagnosticCode.Property_0_does_not_exist_on_type_1,
+            propertyAccess.property.range, propertyName, (<VariableLikeElement>target).type.toString()
+          );
+          return null;
+        }
+        target = classReference;
+        break;
+      }
+      case ElementKind.PROPERTY: {
+        let getter = this.resolveFunction(
+          assert((<Property>target).getterPrototype),
+          null,
+          null,
+          reportMode
+        );
+        if (!getter) return null;
+        let classReference = getter.signature.returnType.classReference;
+        if (!classReference) {
+          this.error(
+            DiagnosticCode.Property_0_does_not_exist_on_type_1,
+            propertyAccess.property.range, propertyName, getter.signature.returnType.toString()
+          );
+          return null;
+        }
+        target = classReference;
+        break;
+      }
+      case ElementKind.CLASS: {
+        let elementExpression = this.resolvedElementExpression;
+        if (elementExpression) {
+          let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
+          if (!indexedGet) {
+            this.error(
+              DiagnosticCode.Index_signature_is_missing_in_type_0,
+              elementExpression.range, (<Class>target).internalName
+            );
+            return null;
+          }
+          let returnType = indexedGet.signature.returnType;
+          if (!(target = returnType.classReference)) {
+            this.error(
+              DiagnosticCode.Property_0_does_not_exist_on_type_1,
+              propertyAccess.property.range, propertyName, returnType.toString()
+            );
+            return null;
+          }
+        }
+        break;
+      }
+    }
+
+    // Look up the member within
+    switch (target.kind) {
+      case ElementKind.CLASS_PROTOTYPE:
+      case ElementKind.CLASS: {
+        do {
+          let members = target.members;
+          let member: Element | null;
+          if (members && (member = members.get(propertyName))) {
+            this.resolvedThisExpression = targetExpression;
+            this.resolvedElementExpression = null;
+            return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...
+          }
+          // traverse inherited static members on the base prototype if target is a class prototype
+          if (target.kind == ElementKind.CLASS_PROTOTYPE) {
+            if ((<ClassPrototype>target).basePrototype) {
+              target = <ClassPrototype>(<ClassPrototype>target).basePrototype;
+            } else {
+              break;
+            }
+          // traverse inherited instance members on the base class if target is a class instance
+          } else if (target.kind == ElementKind.CLASS) {
+            if ((<Class>target).base) {
+              target = <Class>(<Class>target).base;
+            } else {
+              break;
+            }
+          } else {
+            break;
+          }
+        } while (true);
+        break;
+      }
+      default: { // enums or other namespace-like elements
+        let members = target.members;
+        if (members) {
+          let member = members.get(propertyName);
+          if (member) {
+            this.resolvedThisExpression = targetExpression;
+            this.resolvedElementExpression = null;
+            return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...
+          }
+        }
+        break;
+      }
+    }
+    this.error(
+      DiagnosticCode.Property_0_does_not_exist_on_type_1,
+      propertyAccess.property.range, propertyName, target.internalName
+    );
+    return null;
+  }
+
+  resolveElementAccess(
+    elementAccess: ElementAccessExpression,
+    contextualFunction: Function,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Element | null {
+    var targetExpression = elementAccess.expression;
+    var target = this.resolveExpression(targetExpression, contextualFunction, reportMode);
+    if (!target) return null;
+    switch (target.kind) {
+      case ElementKind.GLOBAL:
+      case ElementKind.LOCAL:
+      case ElementKind.FIELD: {
+        let type = (<VariableLikeElement>target).type;
+        if (target = type.classReference) {
+          this.resolvedThisExpression = targetExpression;
+          this.resolvedElementExpression = elementAccess.elementExpression;
+          return target;
+        }
+        break;
+      }
+      case ElementKind.CLASS: { // element access on element access
+        let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
+        if (!indexedGet) {
+          if (reportMode == ReportMode.REPORT) {
+            this.error(
+              DiagnosticCode.Index_signature_is_missing_in_type_0,
+              elementAccess.range, (<Class>target).internalName
+            );
+          }
+          return null;
+        }
+        let returnType = indexedGet.signature.returnType;
+        if (target = returnType.classReference) {
+          this.resolvedThisExpression = targetExpression;
+          this.resolvedElementExpression = elementAccess.elementExpression;
+          return target;
+        }
+        break;
+      }
+    }
+    if (reportMode == ReportMode.REPORT) {
+      this.error(
+        DiagnosticCode.Operation_not_supported,
+        targetExpression.range
+      );
+    }
+    return null;
+  }
+
+  resolveExpression(
+    expression: Expression,
+    contextualFunction: Function,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Element | null {
+    while (expression.kind == NodeKind.PARENTHESIZED) {
+      expression = (<ParenthesizedExpression>expression).expression;
+    }
+    switch (expression.kind) {
+      case NodeKind.ASSERTION: {
+        let type = this.resolveType(
+          (<AssertionExpression>expression).toType,
+          contextualFunction.flow.contextualTypeArguments,
+          reportMode
+        );
+        if (type) {
+          let classType = type.classReference;
+          if (classType) {
+            this.resolvedThisExpression = null;
+            this.resolvedElementExpression = null;
+            return classType;
+          }
+        }
+        return null;
+      }
+      case NodeKind.BINARY: { // TODO: string concatenation, mostly
+        throw new Error("not implemented");
+      }
+      case NodeKind.THIS: { // -> Class / ClassPrototype
+        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {
+          let explicitLocal = contextualFunction.flow.getScopedLocal("this");
+          if (explicitLocal) {
+            this.resolvedThisExpression = null;
+            this.resolvedElementExpression = null;
+            return explicitLocal;
+          }
+        }
+        let parent = contextualFunction.parent;
+        if (parent) {
+          this.resolvedThisExpression = null;
+          this.resolvedElementExpression = null;
+          return parent;
+        }
+        if (reportMode == ReportMode.REPORT) {
+          this.error(
+            DiagnosticCode._this_cannot_be_referenced_in_current_location,
+            expression.range
+          );
+        }
+        return null;
+      }
+      case NodeKind.SUPER: { // -> Class
+        if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {
+          let explicitLocal = contextualFunction.flow.getScopedLocal("super");
+          if (explicitLocal) {
+            this.resolvedThisExpression = null;
+            this.resolvedElementExpression = null;
+            return explicitLocal;
+          }
+        }
+        let parent = contextualFunction.parent;
+        if (parent && parent.kind == ElementKind.CLASS && (parent = (<Class>parent).base)) {
+          this.resolvedThisExpression = null;
+          this.resolvedElementExpression = null;
+          return parent;
+        }
+        if (reportMode == ReportMode.REPORT) {
+          this.error(
+            DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,
+            expression.range
+          );
+        }
+        return null;
+      }
+      case NodeKind.IDENTIFIER: {
+        return this.resolveIdentifier(<IdentifierExpression>expression, contextualFunction, reportMode);
+      }
+      case NodeKind.LITERAL: {
+        switch ((<LiteralExpression>expression).literalKind) {
+          case LiteralKind.STRING: {
+            this.resolvedThisExpression = expression;
+            this.resolvedElementExpression = null;
+            return this.program.stringInstance;
+          }
+          // case LiteralKind.ARRAY: // TODO
+        }
+        break;
+      }
+      case NodeKind.PROPERTYACCESS: {
+        return this.resolvePropertyAccess(
+          <PropertyAccessExpression>expression,
+          contextualFunction,
+          reportMode
+        );
+      }
+      case NodeKind.ELEMENTACCESS: {
+        return this.resolveElementAccess(
+          <ElementAccessExpression>expression,
+          contextualFunction,
+          reportMode
+        );
+      }
+      case NodeKind.CALL: {
+        let targetExpression = (<CallExpression>expression).expression;
+        let target = this.resolveExpression(targetExpression, contextualFunction, reportMode);
+        if (!target) return null;
+        if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {
+          let instance = this.resolveFunctionInclTypeArguments(
+            <FunctionPrototype>target,
+            (<CallExpression>expression).typeArguments,
+            contextualFunction.flow.contextualTypeArguments,
+            expression,
+            reportMode
+          );
+          if (!instance) return null;
+          let returnType = instance.signature.returnType;
+          let classType = returnType.classReference;
+          if (classType) {
+            // reuse resolvedThisExpression (might be property access)
+            // reuse resolvedElementExpression (might be element access)
+            return classType;
+          } else {
+            let signature = returnType.signatureReference;
+            if (signature) {
+              let functionTarget = signature.cachedFunctionTarget;
+              if (!functionTarget) {
+                functionTarget = new FunctionTarget(this.program, signature);
+                signature.cachedFunctionTarget = functionTarget;
+              }
+              // reuse resolvedThisExpression (might be property access)
+              // reuse resolvedElementExpression (might be element access)
+              return functionTarget;
+            }
+          }
+          if (reportMode == ReportMode.REPORT) {
+            this.error(
+              DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,
+              targetExpression.range, target.internalName
+            );
+          }
+          return null;
+        }
+        break;
+      }
+    }
+    if (reportMode == ReportMode.REPORT) {
+      this.error(
+        DiagnosticCode.Operation_not_supported,
+        expression.range
+      );
+    }
+    return null;
+  }
+
+  /** Resolves a function prototype to an instance using the specified concrete type arguments. */
+  resolveFunction(
+    prototype: FunctionPrototype,
+    typeArguments: Type[] | null,
+    contextualTypeArguments: Map<string,Type> | null = null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Function | null {
+    var instanceKey = typeArguments ? typesToString(typeArguments) : "";
+    var instance = prototype.instances.get(instanceKey);
+    if (instance) return instance;
+
+    var declaration = prototype.declaration;
+    var isInstance = prototype.is(CommonFlags.INSTANCE);
+    var classPrototype = prototype.classPrototype;
+
+    // inherit contextual type arguments as provided. might be overridden.
+    var inheritedTypeArguments = contextualTypeArguments;
+    contextualTypeArguments = new Map();
+    if (inheritedTypeArguments) {
+      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {
+        contextualTypeArguments.set(
+          inheritedName,
+          inheritedType
+        );
+      }
+    }
+
+    // override with class type arguments if a partially resolved instance method
+    var classTypeArguments = prototype.classTypeArguments;
+    if (classTypeArguments) { // set only if partially resolved
+      assert(prototype.is(CommonFlags.INSTANCE));
+      let classDeclaration = assert(classPrototype).declaration;
+      let classTypeParameters = classDeclaration.typeParameters;
+      let numClassTypeParameters = classTypeParameters.length;
+      assert(numClassTypeParameters == classTypeArguments.length);
+      for (let i = 0; i < numClassTypeParameters; ++i) {
+        contextualTypeArguments.set(
+          classTypeParameters[i].name.text,
+          classTypeArguments[i]
+        );
+      }
+    } else {
+      assert(!classTypeArguments);
+    }
+
+    // override with function specific type arguments
+    var signatureNode = declaration.signature;
+    var functionTypeParameters = declaration.typeParameters;
+    var numFunctionTypeArguments: i32;
+    if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {
+      assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);
+      for (let i = 0; i < numFunctionTypeArguments; ++i) {
+        contextualTypeArguments.set(
+          (<TypeParameterNode[]>functionTypeParameters)[i].name.text,
+          typeArguments[i]
+        );
+      }
+    } else {
+      assert(!functionTypeParameters || functionTypeParameters.length == 0);
+    }
+
+    // resolve class if an instance method
+    var classInstance: Class | null = null;
+    var thisType: Type | null = null;
+    if (isInstance) {
+      classInstance = this.resolveClass(
+        assert(classPrototype),
+        classTypeArguments,
+        contextualTypeArguments,
+        reportMode
+      );
+      if (!classInstance) return null;
+      thisType = classInstance.type;
+      contextualTypeArguments.set("this", thisType);
+    }
+
+    // resolve signature node
+    var signatureParameters = signatureNode.parameters;
+    var signatureParameterCount = signatureParameters.length;
+    var parameterTypes = new Array<Type>(signatureParameterCount);
+    var parameterNames = new Array<string>(signatureParameterCount);
+    var requiredParameters = 0;
+    for (let i = 0; i < signatureParameterCount; ++i) {
+      let parameterDeclaration = signatureParameters[i];
+      if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {
+        requiredParameters = i + 1;
+      }
+      let typeNode = assert(parameterDeclaration.type);
+      let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);
+      if (!parameterType) return null;
+      parameterTypes[i] = parameterType;
+      parameterNames[i] = parameterDeclaration.name.text;
+    }
+
+    var returnType: Type;
+    if (prototype.is(CommonFlags.SET)) {
+      returnType = Type.void; // not annotated
+    } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {
+      returnType = assert(classInstance).type; // not annotated
+    } else {
+      let typeNode = assert(signatureNode.returnType);
+      let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);
+      if (!type) return null;
+      returnType = type;
+    }
+
+    var signature = new Signature(parameterTypes, returnType, thisType);
+    signature.parameterNames = parameterNames;
+    signature.requiredParameters = requiredParameters;
+
+    var internalName = prototype.internalName;
+    if (instanceKey.length) internalName += "<" + instanceKey + ">";
+    instance = new Function(
+      prototype,
+      internalName,
+      signature,
+      classInstance
+        ? classInstance
+        : classPrototype,
+      contextualTypeArguments
+    );
+    prototype.instances.set(instanceKey, instance);
+    this.program.instancesLookup.set(internalName, instance);
+    return instance;
+  }
+
+  /** Resolves a function prototype partially by applying the specified type arguments. */
+  resolveFunctionPartially(
+    prototype: FunctionPrototype,
+    typeArguments: Type[] | null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): FunctionPrototype | null {
+    assert(prototype.is(CommonFlags.INSTANCE));
+    var classPrototype = assert(prototype.classPrototype);
+
+    if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone
+
+    var simpleName = prototype.simpleName;
+    var partialKey = typesToString(typeArguments);
+    var partialPrototype = new FunctionPrototype(
+      this.program,
+      simpleName,
+      classPrototype.internalName + "<" + partialKey + ">" + INSTANCE_DELIMITER + simpleName,
+      prototype.declaration,
+      classPrototype,
+      prototype.decoratorFlags
+    );
+    partialPrototype.flags = prototype.flags;
+    partialPrototype.operatorKind = prototype.operatorKind;
+    partialPrototype.classTypeArguments = typeArguments;
+    return partialPrototype;
+  }
+
+  /** Resolves a function prototype to an instance by first resolving the specified type arguments. */
+  resolveFunctionInclTypeArguments(
+    prototype: FunctionPrototype,
+    typeArgumentNodes: CommonTypeNode[] | null,
+    contextualTypeArguments: Map<string,Type> | null,
+    reportNode: Node,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Function | null {
+    var resolvedTypeArguments: Type[] | null = null;
+    if (prototype.is(CommonFlags.GENERIC)) {
+      assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);
+      resolvedTypeArguments = this.resolveTypeArguments( // reports
+        assert(prototype.declaration.typeParameters),
+        typeArgumentNodes,
+        contextualTypeArguments,
+        reportNode,
+        reportMode
+      );
+      if (!resolvedTypeArguments) return null;
+    }
+    return this.resolveFunction(
+      prototype,
+      resolvedTypeArguments,
+      contextualTypeArguments,
+      reportMode
+    );
+  }
+
+  /** Resolves a class prototype using the specified concrete type arguments. */
+  resolveClass(
+    prototype: ClassPrototype,
+    typeArguments: Type[] | null,
+    contextualTypeArguments: Map<string,Type> | null = null,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Class | null {
+    var instanceKey = typeArguments ? typesToString(typeArguments) : "";
+
+    // Check if this exact instance has already been resolved
+    var instance = prototype.instances.get(instanceKey);
+    if (instance) return instance;
+
+    // Copy contextual type arguments so we don't pollute the original map
+    var inheritedTypeArguments = contextualTypeArguments;
+    contextualTypeArguments = new Map();
+    if (inheritedTypeArguments) {
+      for (let [inheritedName, inheritedType] of inheritedTypeArguments) {
+        contextualTypeArguments.set(inheritedName, inheritedType);
+      }
+    }
+
+    // Insert contextual type arguments for this operation. Internally, this method is always
+    // called with matching type parameter / argument counts.
+    var declaration = prototype.declaration;
+    if (typeArguments) {
+      let typeParameters = declaration.typeParameters;
+      let expectedTypeArguments = typeParameters.length;
+      let actualTypeArguments = typeArguments.length;
+      assert(actualTypeArguments == expectedTypeArguments);
+      for (let i = 0; i < actualTypeArguments; ++i) {
+        contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);
+      }
+    } else {
+      assert(declaration.typeParameters.length == 0);
+    }
+
+    // Resolve base class if applicable
+    var baseClass: Class | null = null;
+    if (declaration.extendsType) {
+      let baseClassType = this.resolveType(
+        declaration.extendsType,
+        contextualTypeArguments,
+        reportMode
+      );
+      if (!baseClassType) return null;
+      if (!(baseClass = baseClassType.classReference)) {
+        if (reportMode == ReportMode.REPORT) {
+          this.program.error(
+            DiagnosticCode.A_class_may_only_extend_another_class,
+            declaration.extendsType.range
+          );
+        }
+        return null;
+      }
+      if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {
+        if (reportMode == ReportMode.REPORT) {
+          this.program.error(
+            DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,
+            declaration.extendsType.range, baseClass.internalName
+          );
+        }
+        return null;
+      }
+      if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {
+        if (reportMode == ReportMode.REPORT) {
+          this.program.error(
+            DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,
+            Range.join(declaration.name.range, declaration.extendsType.range)
+          );
+        }
+        return null;
+      }
+    }
+
+    // Construct the instance and remember that it has been resolved already
+    var simpleName = prototype.simpleName;
+    var internalName = prototype.internalName;
+    if (instanceKey.length) {
+      simpleName += "<" + instanceKey + ">";
+      internalName += "<" + instanceKey + ">";
+    }
+    instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);
+    instance.contextualTypeArguments = contextualTypeArguments;
+    prototype.instances.set(instanceKey, instance);
+    this.program.instancesLookup.set(internalName, instance);
+
+    // Inherit base class members and set up the initial memory offset for own fields
+    var memoryOffset: u32 = 0;
+    if (baseClass) {
+      if (baseClass.members) {
+        if (!instance.members) instance.members = new Map();
+        for (let inheritedMember of baseClass.members.values()) {
+          instance.members.set(inheritedMember.simpleName, inheritedMember);
+        }
+      }
+      memoryOffset = baseClass.currentMemoryOffset;
+    }
+
+    // Resolve constructor by first applying the class type arguments
+    if (prototype.constructorPrototype) {
+      let constructorPartial = this.resolveFunctionPartially(
+        prototype.constructorPrototype,
+        typeArguments,
+        reportMode
+      );
+      if (!constructorPartial) return null;
+      instance.constructorInstance = this.resolveFunction(constructorPartial, null, null, reportMode);
+    }
+
+    // Resolve instance members
+    if (prototype.instanceMembers) {
+      for (let member of prototype.instanceMembers.values()) {
+        switch (member.kind) {
+
+          // Lay out fields in advance
+          case ElementKind.FIELD_PROTOTYPE: {
+            if (!instance.members) instance.members = new Map();
+            let fieldDeclaration = (<FieldPrototype>member).declaration;
+            let fieldType: Type | null = null;
+            // TODO: handle duplicate non-private fields
+            if (!fieldDeclaration.type) {
+              if (baseClass !== null && baseClass.members !== null) {
+                let baseField = baseClass.members.get((<FieldPrototype>member).simpleName);
+                if (baseField && !baseField.is(CommonFlags.PRIVATE)) {
+                  assert(baseField.kind == ElementKind.FIELD);
+                  fieldType = (<Field>baseField).type;
+                }
+              }
+              if (!fieldType) {
+                if (reportMode == ReportMode.REPORT) {
+                  this.error(
+                    DiagnosticCode.Type_expected,
+                    fieldDeclaration.name.range.atEnd
+                  );
+                }
+              }
+            } else {
+              fieldType = this.resolveType(
+                fieldDeclaration.type,
+                instance.contextualTypeArguments,
+                reportMode
+              );
+            }
+            if (!fieldType) break;
+            let fieldInstance = new Field(
+              <FieldPrototype>member,
+              internalName + INSTANCE_DELIMITER + (<FieldPrototype>member).simpleName,
+              fieldType,
+              fieldDeclaration,
+              instance
+            );
+            switch (fieldType.byteSize) { // align
+              case 1: break;
+              case 2: { if (memoryOffset & 1) ++memoryOffset; break; }
+              case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }
+              case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }
+              default: assert(false);
+            }
+            fieldInstance.memoryOffset = memoryOffset;
+            memoryOffset += fieldType.byteSize;
+            instance.members.set(member.simpleName, fieldInstance);
+            break;
+          }
+
+          // Partially resolve methods as these might have type arguments on their own
+          case ElementKind.FUNCTION_PROTOTYPE: {
+            if (!instance.members) instance.members = new Map();
+            let partialPrototype = this.resolveFunctionPartially(
+              <FunctionPrototype>member,
+              typeArguments,
+              reportMode
+            );
+            if (!partialPrototype) return null;
+            partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;
+            instance.members.set(member.simpleName, partialPrototype);
+            break;
+          }
+
+          // Clone properties and partially resolve the wrapped accessors for consistence with other methods
+          case ElementKind.PROPERTY: {
+            if (!instance.members) instance.members = new Map();
+            let getterPrototype = assert((<Property>member).getterPrototype); // must be present
+            let setterPrototype = (<Property>member).setterPrototype;         // might be present
+            let instanceProperty = new Property(
+              this.program,
+              member.simpleName,
+              internalName + INSTANCE_DELIMITER + member.simpleName,
+              prototype
+            );
+            let partialGetterPrototype = this.resolveFunctionPartially(
+              getterPrototype,
+              typeArguments,
+              reportMode
+            );
+            if (!partialGetterPrototype) return null;
+            partialGetterPrototype
+              .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;
+            instanceProperty.getterPrototype = partialGetterPrototype;
+            if (setterPrototype) {
+              let partialSetterPrototype = this.resolveFunctionPartially(
+                setterPrototype,
+                typeArguments,
+                reportMode
+              );
+              if (!partialSetterPrototype) return null;
+              partialSetterPrototype
+                .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;
+              instanceProperty.setterPrototype = partialSetterPrototype;
+            }
+            instance.members.set(member.simpleName, instanceProperty);
+            break;
+          }
+          default: assert(false);
+        }
+      }
+    }
+
+    // Finalize memory offset
+    instance.currentMemoryOffset = memoryOffset;
+
+    // Fully resolve operator overloads (don't have type parameters on their own)
+    for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {
+      assert(kind != OperatorKind.INVALID);
+      let operatorInstance: Function | null;
+      if (overloadPrototype.is(CommonFlags.INSTANCE)) {
+        let operatorPartial = this.resolveFunctionPartially(
+          overloadPrototype,
+          typeArguments,
+          reportMode
+        );
+        if (!operatorPartial) continue;
+        operatorInstance = this.resolveFunction(operatorPartial, null, null, reportMode);
+      } else {
+        operatorInstance = this.resolveFunction(overloadPrototype, null, null, reportMode);
+      }
+      if (!operatorInstance) continue;
+      let overloads = instance.overloads;
+      if (!overloads) instance.overloads = overloads = new Map();
+      overloads.set(kind, operatorInstance);
+    }
+    return instance;
+  }
+
+  /** Resolves a class prototype by first resolving the specified type arguments. */
+  resolveClassInclTypeArguments(
+    prototype: ClassPrototype,
+    typeArgumentNodes: CommonTypeNode[] | null,
+    contextualTypeArguments: Map<string,Type> | null,
+    reportNode: Node,
+    reportMode: ReportMode = ReportMode.REPORT
+  ): Class | null {
+    var resolvedTypeArguments: Type[] | null = null;
+
+    // Resolve type arguments if generic
+    if (prototype.is(CommonFlags.GENERIC)) {
+      let typeParameterNodes = prototype.declaration.typeParameters;
+      let expectedTypeArguments = typeParameterNodes.length;
+      assert(expectedTypeArguments > 0);
+      let actualTypeArguments = typeArgumentNodes !== null ? typeArgumentNodes.length : 0;
+      if (expectedTypeArguments != actualTypeArguments) {
+        if (reportMode == ReportMode.REPORT) {
+          this.error(
+            DiagnosticCode.Expected_0_type_arguments_but_got_1,
+            reportNode.range, expectedTypeArguments.toString(10), actualTypeArguments.toString(10)
+          );
+        }
+        return null;
+      }
+      resolvedTypeArguments = this.resolveTypeArguments(
+        typeParameterNodes,
+        typeArgumentNodes,
+        contextualTypeArguments,
+        reportNode,
+        reportMode
+      );
+      if (!resolvedTypeArguments) return null;
+
+    // Otherwise make sure that no type arguments have been specified
+    } else {
+      if (typeArgumentNodes !== null && typeArgumentNodes.length) {
+        if (reportMode == ReportMode.REPORT) {
+          this.error(
+            DiagnosticCode.Type_0_is_not_generic,
+            reportNode.range, prototype.internalName
+          );
+        }
+        return null;
+      }
+    }
+
+    // Continue with concrete types
+    return this.resolveClass(
+      prototype,
+      resolvedTypeArguments,
+      contextualTypeArguments,
+      reportMode
+    );
+  }
+}