{"version":3,"sources":["../src/index.ts","../src/LumaError.ts","../src/Tokenizer/Keywords.ts","../src/Tokenizer/Operators.ts","../src/Tokenizer/Punctuation.ts","../src/Tokenizer/TokenStream.ts","../src/Tokenizer/TokenType.ts","../src/Tokenizer/Tokenizer.ts","../src/Parser/Parser.ts","../src/Program/Opcodes.ts","../src/Program/Binary/BinaryReader.ts","../src/Program/ConstantPool.ts","../src/Program/Reader.ts","../src/Program/Binary/BinaryWriter.ts","../src/Program/Writer.ts","../src/Compiler/Compiler.ts","../src/LumaRuntimeError.ts","../src/Utility/ANSI.ts","../src/VM/Deserializer.ts","../src/VM/ForbiddenKeys.ts","../src/VM/NativeDispatcher.ts","../src/VM/InstructionSet.ts","../src/VM/Serializer.ts","../src/VM/State.ts","../src/VM/VirtualMachine.ts","../src/Debugger/Debugger.ts"],"sourcesContent":["export * from './core.js';\nexport * from './Debugger/index.js';\n","import { TokenPosition } from './Tokenizer/index.js';\n\nexport class LumaError extends Error\n{\n    public readonly moduleName?: string;\n    public readonly position?: TokenPosition;\n\n    constructor(options: LumaErrorOptions)\n    {\n        super(options.message, {\n            cause: options.cause,\n        });\n\n        this.moduleName = options.moduleName;\n        this.position   = options.position;\n    }\n}\n\nexport type LumaErrorOptions = {\n    message: string;\n    moduleName?: string;\n    position?: TokenPosition;\n    cause?: Error,\n}\n","export const Keywords = [\n    'fn',\n    'on',\n    'if',\n    'else',\n    'do',\n    'while',\n    'for',\n    'in',\n    'break',\n    'continue',\n    'return',\n    'true',\n    'false',\n    'null',\n    'not',\n    'this',\n    'and',\n    'or',\n    'local',\n    'public',\n    'import',\n    'wait',\n    'new',\n    'class',\n    'extends',\n    'parent',\n] as const;\n","export const Operators = {\n    ASSIGN:         '=',\n    PLUS:           '+',\n    MINUS:          '-',\n    MULTIPLY:       '*',\n    DIVIDE:         '/',\n    MODULO:         '%',\n    EXPONENTIATION: '^',\n    EQUALS:         '==',\n    NOT_EQUALS:     '!=',\n    GREATER_THAN:   '>',\n    LESS_THAN:      '<',\n    GREATER_EQUAL:  '>=',\n    LESS_EQUAL:     '<=',\n    NOT:            '!',\n    RANGE:          '..',\n    IS:             'is',\n} as const;\n","export const Punctuation = {\n    MEMBER_ACCESS: '.',\n    COMMA:         ',',\n    COLON:         ':',\n    QUESTION_MARK: '?',\n    OPEN_PAREN:    '(',\n    CLOSE_PAREN:   ')',\n    OPEN_BRACKET:  '[',\n    CLOSE_BRACKET: ']',\n    OPEN_BRACE:    '{',\n    CLOSE_BRACE:   '}',\n    BANG:          '!',\n} as const;\n","import { Token } from './Token.js';\n\nexport class TokenStream\n{\n    private readonly _tokens: Token[];\n    private _index: number = 0;\n\n    constructor(tokens: Token[])\n    {\n        this._tokens = tokens;\n    }\n\n    public get tokens(): Token[]\n    {\n        return [...this._tokens];\n    }\n\n    public get length(): number\n    {\n        return this._tokens.length;\n    }\n\n    public peek(offset: number = 0): Token | null\n    {\n        const targetIndex = this._index + offset;\n\n        if (targetIndex < 0 || targetIndex >= this._tokens.length) {\n            return null;\n        }\n\n        return this._tokens[targetIndex];\n    }\n\n    public consume(): Token\n    {\n        const token = this.peek(0);\n        if (! token) {\n            throw new Error('Unexpected End of File');\n        }\n        this._index++;\n        return token;\n    }\n\n    public get isEof(): boolean\n    {\n        return this._index >= this._tokens.length;\n    }\n}\n","export const TokenType = {\n    IDENTIFIER:    'IDENTIFIER',\n    KEYWORD:       'KEYWORD',\n    OPERATOR:      'OPERATOR',\n    PUNCTUATION:   'PUNCTUATION',\n    STRING:        'STRING',\n    NUMBER:        'NUMBER',\n    COMMENT:       'COMMENT',\n    BLOCK_COMMENT: 'BLOCK_COMMENT',\n    NEWLINE:       'NEWLINE',\n    INDENT:        'INDENT',\n    DEDENT:        'DEDENT',\n    EOF:           'EOF',\n} as const;\n","import { LumaError }   from '../LumaError.js';\nimport { Keywords }    from './Keywords.js';\nimport { Operators }   from './Operators.js';\nimport { Punctuation } from './Punctuation.js';\nimport { Token }       from './Token.js';\nimport { TokenStream } from './TokenStream.js';\nimport { TokenType }   from './TokenType.js';\n\nexport class Tokenizer\n{\n    private static readonly KEYWORD_SET     = new Set<string>(Keywords);\n    private static readonly PUNCTUATION_SET = new Set<string>(Object.values(Punctuation));\n    private static readonly SYMBOL_MAP      = new Map<string, string>([\n        ...Object.entries(Operators).map(([k, v]) => [v, k] as [string, string]),\n        ...Object.entries(Punctuation).map(([k, v]) => [v, k] as [string, string]),\n    ]);\n    private static readonly SORTED_SYMBOLS  = Array\n        .from(Tokenizer.SYMBOL_MAP.keys())\n        .sort((a, b) => b.length - a.length);\n\n    private readonly _tokens: Token[] = [];\n    private readonly _source: string;\n    private readonly _moduleName: string | undefined;\n\n    private index: number            = 0;\n    private line: number             = 1;\n    private col: number              = 1;\n    private indentStack: number[]    = [0];\n    private isAtStartOfLine: boolean = true;\n\n    private constructor(source: string, moduleName: string | undefined)\n    {\n        this._source     = source.replace(/\\r\\n/g, '\\n');\n        this._moduleName = moduleName;\n    }\n\n    public static tokenize(source: string, moduleName: string | undefined = undefined): TokenStream\n    {\n        if (! source.endsWith('\\n')) {\n            source += '\\n';\n        }\n\n        return new Tokenizer(source, moduleName).tokenize();\n    }\n\n    private tokenize(): TokenStream\n    {\n        while (! this.isEof) {\n            if (this.isAtStartOfLine) {\n                if (this.handleIndentation()) {\n                    continue;\n                }\n            }\n\n            const char = this._source[this.index];\n\n            if (char === '\\n') {\n                this.handleNewline();\n                continue;\n            }\n\n            if (char === ' ' || char === '\\t') {\n                this.advance(1);\n                continue;\n            }\n\n            if (this.parseComment()) continue;\n            if (this.parseBlockComment()) continue;\n            if (this.parseSymbol()) continue;\n            if (this.parseNumberLiteral()) continue;\n            if (this.parseStringLiteral()) continue;\n            if (this.parseWord()) continue;\n\n            this.throwUnexpectedCharacterError();\n        }\n\n        while (this.indentStack.length > 1) {\n            this.indentStack.pop();\n            this._tokens.push(this.createToken(TokenType.DEDENT, ''));\n        }\n\n        return new TokenStream(this._tokens);\n    }\n\n    private handleNewline()\n    {\n        const lastToken = this._tokens[this._tokens.length - 1];\n        if (lastToken && lastToken.type !== TokenType.NEWLINE && lastToken.type !== TokenType.INDENT && lastToken.type !== TokenType.DEDENT) {\n            this._tokens.push(this.createToken(TokenType.NEWLINE, '\\\\n'));\n        }\n\n        this.index++;\n        this.line++;\n        this.col             = 1;\n        this.isAtStartOfLine = true;\n    }\n\n    private handleIndentation(): boolean\n    {\n        let spaces    = 0;\n        let tempIndex = this.index;\n\n        while (tempIndex < this._source.length && (this._source[tempIndex] === ' ' || this._source[tempIndex] === '\\t')) {\n            spaces += this._source[tempIndex] === '\\t' ? 4 : 1;\n            tempIndex++;\n        }\n\n        const char = this._source[tempIndex];\n\n        if (tempIndex >= this._source.length || char === '\\n' || this._source.startsWith('//', tempIndex) || this._source.startsWith('/*', tempIndex)) {\n            this.isAtStartOfLine = false;\n            return false;\n        }\n\n        this.advance(tempIndex - this.index);\n\n        const currentIndent = this.indentStack[this.indentStack.length - 1];\n\n        if (spaces > currentIndent) {\n            this.indentStack.push(spaces);\n            this._tokens.push(this.createToken(TokenType.INDENT, spaces.toString()));\n        } else if (spaces < currentIndent) {\n            while (spaces < this.indentStack[this.indentStack.length - 1]) {\n                this.indentStack.pop();\n                this._tokens.push(this.createToken(TokenType.DEDENT, ''));\n            }\n            if (spaces !== this.indentStack[this.indentStack.length - 1]) {\n                this.throwError('Indentation error: Indent level does not match any outer block');\n            }\n        }\n\n        this.isAtStartOfLine = false;\n        return false;\n    }\n\n    private parseWord(): boolean\n    {\n        let tempIndex = this.index;\n        if (! /[a-zA-Z_]/.test(this._source[tempIndex])) return false;\n\n        while (tempIndex < this._source.length && /[a-zA-Z0-9_]/.test(this._source[tempIndex])) {\n            tempIndex++;\n        }\n\n        const value = this._source.slice(this.index, tempIndex);\n        const type  = Tokenizer.KEYWORD_SET.has(value) ? TokenType.KEYWORD : TokenType.IDENTIFIER;\n\n        this._tokens.push(this.createToken(type, value));\n        this.advance(value.length);\n        return true;\n    }\n\n    private parseSymbol(): boolean\n    {\n        for (const symbol of Tokenizer.SORTED_SYMBOLS) {\n            if (this._source.startsWith(symbol, this.index)) {\n                const type = Tokenizer.PUNCTUATION_SET.has(symbol)\n                    ? TokenType.PUNCTUATION\n                    : TokenType.OPERATOR;\n\n                this._tokens.push(this.createToken(type, symbol));\n                this.advance(symbol.length);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private parseNumberLiteral(): boolean\n    {\n        const char     = this._source[this.index];\n        const nextChar = this._source[this.index + 1];\n\n        // Check start: Digit OR Dot followed by Digit (e.g. .5)\n        // explicitly NOT matching \"..\" (Range) here because nextChar must be a digit\n        const isDigit    = char >= '0' && char <= '9';\n        const isDotStart = char === '.' && (nextChar >= '0' && nextChar <= '9');\n\n        if (! isDigit && ! isDotStart) return false;\n\n        let tempIndex = this.index;\n        let hasDot    = false; // Track if we've consumed a decimal point\n\n        // Manual loop instead of Regex to control the dot logic\n        while (tempIndex < this._source.length) {\n            const c    = this._source[tempIndex];\n            const next = this._source[tempIndex + 1];\n\n            if (c >= '0' && c <= '9') {\n                tempIndex++;\n                continue;\n            }\n\n            if (c === '_') {\n                tempIndex++;\n                continue;\n            }\n\n            if (c === '.') {\n                // CRITICAL FIX: If we see a dot, check if the NEXT char is also a dot.\n                // If it is, this is a Range operator (..), so the number stops HERE.\n                if (next === '.') {\n                    break;\n                }\n\n                // Standard float logic: Only one dot allowed per number\n                if (hasDot) {\n                    break; // We found a second dot (e.g. 1.2.3), stop parsing.\n                }\n\n                hasDot = true;\n                tempIndex++;\n                continue;\n            }\n\n            if (c === 'e' || c === 'E') {\n                // Ensure exponent handling doesn't break\n                // (You might want more robust logic here to ensure a digit follows the E)\n                tempIndex++;\n                if (this._source[tempIndex] === '+' || this._source[tempIndex] === '-') {\n                    tempIndex++;\n                }\n                continue;\n            }\n\n            // If it's not a digit, dot, underscore, or exponent, we are done.\n            break;\n        }\n\n        const value = this._source.substring(this.index, tempIndex);\n\n        this._tokens.push(this.createToken(TokenType.NUMBER, value));\n        this.advance(tempIndex - this.index);\n        return true;\n    }\n\n    private parseStringLiteral(): boolean\n    {\n        const quoteChar = this._source[this.index];\n        if (quoteChar !== '\"' && quoteChar !== '\\'') return false;\n\n        const startLine = this.line;\n        const startCol  = this.col;\n\n        this.advance(1); // Skip opening quote\n\n        let rawContent         = '';\n        let braceCount         = 0;\n        let maybeInterpolation = false;\n        let hasInterpolation   = false;\n        let isMultiLine        = false;\n\n        while (! this.isEof) {\n            const char = this._source[this.index];\n\n            if (char === '\\\\') {\n                rawContent += char;\n                this.advance(1);\n\n                if (! this.isEof) {\n                    const nextChar = this._source[this.index];\n                    rawContent += nextChar;\n                    this.advance(1);\n                }\n                continue;\n            }\n\n            if (char === '{') {\n                braceCount++;\n                maybeInterpolation = true;\n            } else if (char === '}' && braceCount > 0) {\n                braceCount--;\n            }\n\n            if (char === quoteChar) {\n                this.advance(1);\n\n                if (maybeInterpolation && braceCount === 0) {\n                    hasInterpolation = true;\n                }\n\n                if (maybeInterpolation && braceCount > 0) {\n                    rawContent += char;\n                    continue;\n                }\n\n                break;\n            }\n\n            if (char === '\\n') {\n                isMultiLine = true;\n                this.line++;\n                this.col = 1;\n            }\n\n            rawContent += char;\n            this.advance(1);\n        }\n\n        // Check for unterminated string\n        if (this.isEof && this._source[this.index - 1] !== quoteChar) {\n            this.throwError('Unterminated string literal');\n        }\n\n        if (isMultiLine) {\n            rawContent = this.stripIndentation(rawContent);\n        }\n\n        if (braceCount !== 0) {\n            throw new Error(`Unterminated interpolation expression in string literal at line ${startLine}, column ${startCol}`);\n        }\n\n        if (! hasInterpolation) {\n            this._tokens.push({\n                type:     TokenType.STRING,\n                value:    this.unescapeString(rawContent),\n                position: {lineStart: startLine, columnStart: startCol, lineEnd: this.line, columnEnd: this.col},\n            });\n\n            return true;\n        }\n\n        const segments = this.parseInterpolationSegments(rawContent);\n\n        let hasEmittedTokens = false;\n        for (const segment of segments) {\n            if (hasEmittedTokens) {\n                this._tokens.push({\n                    type:     TokenType.OPERATOR,\n                    value:    Operators.PLUS,\n                    position: this.currentPos(),\n                });\n            }\n\n            if (segment.type === 'text') {\n                const unescapedValue = this.unescapeString(segment.value);\n                hasEmittedTokens     = true;\n                this._tokens.push({\n                    type:     TokenType.STRING,\n                    value:    unescapedValue,\n                    position: {lineStart: startLine, columnStart: startCol, lineEnd: this.line, columnEnd: this.col},\n                });\n                continue;\n            }\n\n            if (segment.type === 'expr') {\n                hasEmittedTokens = true;\n                const tokens     = this.tokenizeExpression(segment.value);\n\n                if (tokens.length === 0) {\n                    this.throwError('Empty expression in string interpolation');\n                }\n\n                this._tokens.push({type: TokenType.PUNCTUATION, value: '(', position: {...this.currentPos()}});\n                for (const token of tokens) {\n                    this._tokens.push(token);\n                }\n                this._tokens.push({type: TokenType.PUNCTUATION, value: ')', position: {...this.currentPos()}});\n            }\n        }\n\n        return true;\n    }\n\n    private parseInterpolationSegments(rawInput: string): { type: 'text' | 'expr', value: string }[]\n    {\n        const segments: { type: 'text' | 'expr', value: string }[] = [];\n        let currentText                                            = '';\n        let i                                                      = 0;\n\n        let hasIndentedContent = false;\n\n        while (i < rawInput.length) {\n            const char = rawInput[i];\n\n            // 1. Handle Escapes (pass them through to text)\n            if (char === '\\\\') {\n                currentText += char;\n                i++;\n                if (i < rawInput.length) {\n                    currentText += rawInput[i];\n                    i++;\n                }\n                continue;\n            }\n\n            if (char === '{') {\n                const result = this.extractBalancedExpression(rawInput, i + 1);\n\n                if (result !== null) {\n                    hasIndentedContent = hasIndentedContent || currentText.trim().length > 0;\n\n                    segments.push({type: 'text', value: currentText});\n                    currentText = '';\n                    segments.push({type: 'expr', value: result.code});\n\n                    i = result.endIndex + 1;\n                    continue;\n                }\n            }\n\n            currentText += char;\n            hasIndentedContent = hasIndentedContent || currentText.trim().length > 0;\n            i++;\n        }\n\n        segments.push({type: 'text', value: currentText});\n\n        if (hasIndentedContent) {\n            this.stripInterpolatedIndentation(segments);\n        }\n\n        return segments;\n    }\n\n    private extractBalancedExpression(input: string, startIndex: number): { code: string, endIndex: number } | null\n    {\n        for (let i = startIndex, braceCount = 1; i < input.length; i++) {\n            const char = input[i];\n\n            if (char === '\\\\') {\n                i++;\n                continue;\n            }\n\n            if (char === '{') {\n                braceCount++;\n            } else if (char === '}') {\n                braceCount--;\n                if (braceCount === 0) {\n                    return {\n                        code:     input.slice(startIndex, i),\n                        endIndex: i,\n                    };\n                }\n            }\n        }\n\n        return null;\n    }\n\n    private unescapeString(raw: string): string\n    {\n        let result = '';\n        let i      = 0;\n        while (i < raw.length) {\n            if (raw[i] === '\\\\' && i + 1 < raw.length) {\n                const next = raw[i + 1];\n                switch (next) {\n                    case 'n':\n                        result += '\\n';\n                        break;\n                    case 't':\n                        result += '\\t';\n                        break;\n                    case 'r':\n                        result += '\\r';\n                        break;\n                    case '\"':\n                        result += '\"';\n                        break;\n                    case '\\'':\n                        result += '\\'';\n                        break;\n                    case '\\\\':\n                        result += '\\\\';\n                        break;\n                    case '{':\n                        result += '{';\n                        break;\n                    case '}':\n                        result += '}';\n                        break;\n                    default:\n                        result += '\\\\' + next; // Unknown escape, keep literal\n                }\n                i += 2;\n            } else {\n                result += raw[i];\n                i++;\n            }\n        }\n        return result;\n    }\n\n    private currentPos(): any\n    {\n        return {lineStart: this.line, columnStart: this.col, lineEnd: this.line, columnEnd: this.col + 1};\n    }\n\n    private stripInterpolatedIndentation(segments: { type: 'text' | 'expr', value: string }[])\n    {\n        let minIndent = Infinity;\n\n        // Calculate Minimum Indentation\n        for (const seg of segments) {\n            if (seg.type !== 'text') continue;\n\n            const lines = seg.value.split('\\n');\n\n            for (let i = 1; i < lines.length; i++) {\n                const line = lines[i];\n                if (line.trim().length === 0) continue; // Ignore empty lines\n\n                let indent = 0;\n                while (indent < line.length && (line[indent] === ' ' || line[indent] === '\\t')) {\n                    indent++;\n                }\n                if (indent < minIndent) minIndent = indent;\n            }\n        }\n\n        if (minIndent === Infinity) minIndent = 0;\n\n        // Strip Indentation\n        for (const seg of segments) {\n            if (seg.type !== 'text') continue;\n\n            const lines = seg.value.split('\\n');\n\n            for (let i = 1; i < lines.length; i++) {\n                if (lines[i].length >= minIndent) {\n                    lines[i] = lines[i].slice(minIndent);\n                }\n            }\n\n            seg.value = lines.join('\\n');\n        }\n\n        if (segments[0].type === 'text' && segments[0].value.startsWith('\\n')) {\n            segments[0].value = segments[0].value.slice(1);\n        }\n\n        const last = segments[segments.length - 1];\n\n        if (last.type === 'text') {\n            const lines = last.value.split('\\n');\n            if (lines.length > 0 && lines[lines.length - 1].trim() === '') {\n                lines.pop();\n                last.value = lines.join('\\n');\n            }\n        }\n    }\n\n    private stripIndentation(raw: string): string\n    {\n        const lines = raw.split('\\n');\n\n        if (lines.length > 0 && lines[0].trim() === '') {\n            lines.shift();\n        }\n\n        if (lines.length > 0) {\n            const lastLine = lines[lines.length - 1];\n            if (lastLine.trim() === '') {\n                lines.pop();\n            }\n        }\n\n        let minIndent = Infinity;\n\n        for (const line of lines) {\n            if (line.trim().length === 0) continue;\n\n            let indent = 0;\n            while (indent < line.length && (line[indent] === ' ' || line[indent] === '\\t')) {\n                indent++;\n            }\n\n            if (indent < minIndent) minIndent = indent;\n        }\n\n        if (minIndent === Infinity) minIndent = 0;\n\n        return lines.map(line => {\n            if (line.length < minIndent) return line.trim();\n            return line.slice(minIndent);\n        }).join('\\n');\n    }\n\n    private parseComment(): boolean\n    {\n        if (! this._source.startsWith('//', this.index)) return false;\n        while (! this.isEof && this._source[this.index] !== '\\n') {\n            this.advance(1);\n        }\n        return true;\n    }\n\n    private parseBlockComment(): boolean\n    {\n        if (! this._source.startsWith('/*', this.index)) return false;\n        this.advance(2);\n        while (! this.isEof && ! this._source.startsWith('*/', this.index)) {\n            if (this._source[this.index] === '\\n') {\n                this.line++;\n                this.col = 1;\n                this.index++;\n            } else {\n                this.advance(1);\n            }\n        }\n        if (! this.isEof) this.advance(2);\n        return true;\n    }\n\n    private createToken(type: keyof typeof TokenType, value: string): Token\n    {\n        return {\n            type,\n            value,\n            position: {\n                lineStart:   this.line,\n                columnStart: this.col,\n                lineEnd:     this.line,\n                columnEnd:   this.col + value.length,\n            },\n        };\n    }\n\n    private advance(n: number)\n    {\n        this.index += n;\n        this.col += n;\n    }\n\n    private get isEof(): boolean\n    {\n        return this.index >= this._source.length;\n    }\n\n    private throwError(msg: string): void\n    {\n        throw new LumaError({\n            message:    `${msg} at line ${this.line}, column ${this.col}`,\n            moduleName: this._moduleName,\n            position:   {\n                lineStart:   this.line,\n                columnStart: this.col,\n                lineEnd:     this.line,\n                columnEnd:   this.col + 1,\n            },\n        });\n    }\n\n    private throwUnexpectedCharacterError(): void\n    {\n        this.throwError(`Unexpected character \"${this._source[this.index]}\"`);\n    }\n\n    private tokenizeExpression(str: string): Token[]\n    {\n        const tokens = Tokenizer.tokenize(str.trim()).tokens;\n\n        return tokens.filter(t => (\n            t.type !== TokenType.NEWLINE &&\n            t.type !== TokenType.INDENT &&\n            t.type !== TokenType.DEDENT\n        ));\n    }\n}\n","import { LumaError }                                                 from '../LumaError.js';\nimport { Punctuation, Token, TokenPosition, TokenStream, TokenType } from '../Tokenizer/index.js';\nimport type * as AST                                                 from './AST.js';\nimport { Expr }                                                      from './AST.js';\n\nexport class Parser\n{\n    private stream: TokenStream;\n    private moduleName?: string;\n    private lastToken?: Token;\n\n    public static parse(tokens: TokenStream, moduleName: string | undefined = undefined): AST.Script\n    {\n        return new Parser(tokens, moduleName).parse();\n    }\n\n    private constructor(stream: TokenStream, moduleName?: string)\n    {\n        this.stream     = stream;\n        this.moduleName = moduleName;\n    }\n\n    public parse(): AST.Script\n    {\n        try {\n            const statements: AST.Stmt[] = [];\n            while (! this.stream.isEof) {\n                if (this.match(TokenType.NEWLINE)) continue;\n                statements.push(this.parseStatement());\n            }\n            return {\n                type:     'Script',\n                body:     statements,\n                position: {\n                    lineStart:   1,\n                    lineEnd:     1,\n                    columnStart: 1,\n                    columnEnd:   1,\n                },\n            };\n        } catch (e) {\n            if (! (e instanceof Error)) {\n                console.warn('Parser did not throw an instance of Error!', e);\n                throw e;\n            }\n\n            throw new LumaError({\n                message:    e.message,\n                moduleName: this.moduleName,\n                position:   this.lastToken?.position ?? {lineStart: 1, lineEnd: 1, columnStart: 1, columnEnd: 1},\n                cause:      e,\n            });\n        }\n    }\n\n    private parseStatement(): AST.Stmt\n    {\n        const token = this.stream.peek();\n        if (! token) throw new Error('Unexpected EOF');\n\n        let isPublic = false,\n            isLocal  = false;\n\n        // 1. Consume modifiers\n        if (this.match(TokenType.KEYWORD, 'public')) {\n            isPublic = true;\n        }\n\n        if (this.match(TokenType.KEYWORD, 'local')) {\n            isLocal = true;\n        }\n\n        // 2. Handle Functions (Supported: public fn, fn. Invalid: local fn)\n        if (this.check(TokenType.KEYWORD, 'fn')) {\n            if (isLocal) {\n                throw new Error('Functions cannot be declared as \\'local\\'. They are local by default unless marked \\'public\\'.');\n            }\n            return this.parseFunctionDeclaration(isPublic);\n        }\n\n        if (this.check(TokenType.KEYWORD, 'class')) {\n            if (isLocal) {\n                throw new Error('Classes cannot be declared as \\'local\\'. They are local by default unless marked \\'public\\'.');\n            }\n            return this.parseClassStatement(isPublic);\n        }\n\n        // If public or local are set, we know we are parsing an assignment expression.\n        if (isPublic || isLocal) {\n            return this.parseExpressionStatement(isPublic, isLocal);\n        }\n\n        if (token.type === TokenType.KEYWORD) {\n            switch (token.value) {\n                case 'import':\n                    return this.parseImportStatement();\n                case 'wait':\n                    return this.parseWaitStatement();\n                case 'on':\n                    return this.parseEventHook();\n                case 'return':\n                    return this.parseReturnStatement();\n                case 'if':\n                    return this.parseIfStatement();\n                case 'for':\n                    return this.parseForStatement();\n                case 'while':\n                    return this.parseWhileStatement();\n                case 'do':\n                    return this.parseDoWhileStatement();\n                case 'break':\n                    return this.parseBreakStatement();\n                case 'continue':\n                    return this.parseContinueStatement();\n            }\n        }\n\n        // 3. Default: Expression Statement\n        return this.parseExpressionStatement();\n    }\n\n    private parseEventHook(): AST.EventHook\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'on');\n\n        const name = this.parseIdentifier();\n\n        const params: AST.Identifier[] = [];\n\n        if (this.match(TokenType.PUNCTUATION, '(')) {\n            if (! this.check(TokenType.PUNCTUATION, ')')) {\n                do {\n                    params.push(this.parseIdentifier());\n                } while (this.match(TokenType.PUNCTUATION, ','));\n            }\n            this.consume(TokenType.PUNCTUATION, ')');\n        }\n        this.consume(TokenType.PUNCTUATION, ':');\n\n        const body = this.parseBlock();\n\n        return {type: 'EventHook', name, params, body, position};\n    }\n\n    private parseClassStatement(isPublic: boolean = false): AST.ClassStatement\n    {\n        const startPos = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'class');\n        const name = this.parseIdentifier();\n\n        // 1. Check for Primary Constructor Parameters \"(name, age)\"\n        const params: (AST.Identifier | AST.PromotedParameter)[] = [];\n        if (this.match(TokenType.PUNCTUATION, '(')) {\n            if (! this.check(TokenType.PUNCTUATION, ')')) {\n                do {\n                    // NEW: Check for 'this.' prefix\n                    if (this.match(TokenType.KEYWORD, 'this')) {\n                        this.consume(TokenType.PUNCTUATION, '.');\n                        const id = this.parseIdentifier();\n\n                        params.push({\n                            type:     'PromotedParameter',\n                            value:    id.value,\n                            position: id.position,\n                        });\n                    } else {\n                        // Existing: Standard parameter\n                        params.push(this.parseIdentifier());\n                    }\n                } while (this.match(TokenType.PUNCTUATION, ','));\n            }\n            this.consume(TokenType.PUNCTUATION, ')');\n        }\n\n        let parent: AST.Identifier | AST.MemberExpression | undefined = undefined,\n            parentArgs: AST.Expr[]                                    = [];\n\n        // Check for extends.\n        if (this.match(TokenType.KEYWORD, 'extends')) {\n            // 1. We expect at least an identifier\n            let primary = this.parsePrimary();\n\n            // 2. While there's a dot, keep wrapping it in MemberExpressions\n            while (this.match(TokenType.PUNCTUATION, '.')) {\n                const property = this.parseIdentifier();\n                primary        = {\n                    type:     'MemberExpression',\n                    object:   primary,\n                    property: property,\n                    computed: false,\n                    position: primary.position, // or combine positions\n                };\n            }\n\n            parent = primary as AST.Identifier | AST.MemberExpression;\n\n            if (this.match(TokenType.PUNCTUATION, '(')) {\n                if (! this.check(TokenType.PUNCTUATION, ')')) {\n                    do {\n                        parentArgs.push(this.parseExpression());\n                    } while (this.match(TokenType.PUNCTUATION, ','));\n                }\n                this.consume(TokenType.PUNCTUATION, ')');\n            }\n        }\n\n        // Body is optional.\n        if (! this.check(TokenType.PUNCTUATION, ':')) {\n            return {\n                type:       'ClassStatement',\n                name,\n                properties: [],\n                params,\n                methods:    [],\n                position:   startPos,\n                isPublic,\n                parent,\n                parentArgs,\n            };\n        }\n\n        this.consume(TokenType.PUNCTUATION, ':');\n        this.consume(TokenType.NEWLINE);\n        this.consume(TokenType.INDENT);\n\n        const properties: { key: AST.Identifier, value: AST.Expr }[] = [];\n        const methods: AST.FunctionDeclaration[]                     = [];\n\n        while (! this.match(TokenType.DEDENT) && ! this.stream.isEof) {\n            if (this.match(TokenType.NEWLINE)) {\n                continue;\n            }\n\n            // 2. Handle Methods\n            if (this.check(TokenType.KEYWORD, 'fn')) {\n                const method = this.parseFunctionDeclaration(false);\n                if (method.type !== 'FunctionDeclaration') {\n                    throw new Error('Methods inside classes cannot be defined as method definitions.');\n                }\n                methods.push(method);\n                continue;\n            }\n\n            // 3. Handle Properties\n            if (this.check(TokenType.IDENTIFIER)) {\n                const key = this.parseIdentifier();\n\n                if (this.match(TokenType.PUNCTUATION, ':') || this.match(TokenType.OPERATOR, '=')) {\n                    const value = this.parseExpression();\n                    properties.push({key, value});\n\n                    if (this.check(TokenType.NEWLINE)) {\n                        this.consume(TokenType.NEWLINE);\n                    }\n\n                    continue;\n                } else {\n                    throw new Error(`Expected ':' for property definition.`);\n                }\n            }\n\n            throw new Error('Expected \\'fn\\' or property definition inside class body');\n        }\n\n        return {\n            type:     'ClassStatement',\n            name,\n            properties,\n            params,\n            methods,\n            position: startPos,\n            isPublic,\n            parent,\n            parentArgs,\n        };\n    }\n\n    private parseFunctionDeclaration(isPublic: boolean = false): AST.FunctionDeclaration | AST.MethodDefinition\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'fn');\n\n        const name                    = this.parseIdentifier();\n        let methodName: string | null = null;\n        if (this.match(TokenType.PUNCTUATION, Punctuation.MEMBER_ACCESS)) {\n            methodName = this.consume(TokenType.IDENTIFIER).value;\n        }\n\n        const params: AST.Identifier[] = [];\n\n        if (this.match(TokenType.PUNCTUATION, '(')) {\n            if (! this.check(TokenType.PUNCTUATION, ')')) {\n                do {\n                    params.push(this.parseIdentifier());\n                } while (this.match(TokenType.PUNCTUATION, ','));\n            }\n            this.consume(TokenType.PUNCTUATION, ')');\n        }\n        this.consume(TokenType.PUNCTUATION, ':');\n\n        const body = this.parseBlock();\n\n        if (methodName && isPublic) {\n            throw new Error('Method definitions cannot be public. You should mark the object as public instead.');\n        }\n\n        return methodName\n            ? {type: 'MethodDefinition', objectName: name, methodName, params, body, position}\n            : {type: 'FunctionDeclaration', name, params, body, position, isPublic};\n    }\n\n    private parseBlock(): AST.Block\n    {\n        this.consume(TokenType.NEWLINE);\n\n        if (! this.check(TokenType.INDENT)) {\n            // Block is empty.\n            const position = this.currentPos();\n            return {type: 'Block', body: [], position};\n        }\n\n        const position = this.currentPos();\n        this.consume(TokenType.INDENT);\n        const statements: AST.Stmt[] = [];\n        while (! this.check(TokenType.DEDENT) && ! this.stream.isEof) {\n            if (this.match(TokenType.NEWLINE)) continue;\n            statements.push(this.parseStatement());\n        }\n        this.consume(TokenType.DEDENT);\n        return {type: 'Block', body: statements, position};\n    }\n\n    private parseImportStatement(): AST.ImportStatement\n    {\n        const position = this.currentPos();\n\n        this.consume(TokenType.KEYWORD, 'import');\n        const moduleNameToken = this.consume(TokenType.STRING);\n        const moduleName      = moduleNameToken.value;\n        this.consume(TokenType.NEWLINE);\n\n        return {type: 'ImportStatement', moduleName, position};\n    }\n\n    private parseWaitStatement(): AST.WaitStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'wait');\n        const duration = this.parseExpression();\n        this.consume(TokenType.NEWLINE);\n        return {type: 'WaitStatement', duration, position};\n    }\n\n    private parseReturnStatement(): AST.ReturnStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'return');\n        let argument: AST.Expr | undefined;\n        if (! this.check(TokenType.NEWLINE)) argument = this.parseExpression();\n        this.consume(TokenType.NEWLINE);\n        return {type: 'ReturnStatement', argument, position};\n    }\n\n    private parseIfStatement(): AST.IfStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'if');\n        const test = this.parseExpression();\n        this.consume(TokenType.PUNCTUATION, ':');\n        const consequent = this.parseBlock();\n        let alternate: AST.Block | AST.IfStatement | undefined;\n        if (this.match(TokenType.KEYWORD, 'else')) {\n            this.consume(TokenType.PUNCTUATION, ':');\n            alternate = this.parseBlock();\n        }\n        return {type: 'IfStatement', test, consequent, alternate, position};\n    }\n\n    private parseForStatement(): AST.ForStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'for');\n\n        const hasParen = this.match(TokenType.PUNCTUATION, '(');\n        const iterator = this.parseIdentifier();\n\n        if (! this.match(TokenType.KEYWORD, 'in')) {\n            throw new Error('Expected \\'in\\' after for-loop iterator');\n        }\n\n        const collection = this.parseExpression();\n\n        if (hasParen) {\n            this.consume(TokenType.PUNCTUATION, ')');\n        }\n\n        this.consume(TokenType.PUNCTUATION, ':');\n        const body = this.parseBlock();\n\n        return {type: 'ForStatement', iterator, collection, body, position};\n    }\n\n    private parseWhileStatement(): AST.WhileStatement\n    {\n        const startPos = this.currentPos();\n\n        this.consume(TokenType.KEYWORD, 'while');\n        const condition = this.parseExpression();\n        this.consume(TokenType.PUNCTUATION, ':');\n\n        const body = this.parseBlock();\n\n        return {type: 'WhileStatement', condition, body, position: startPos};\n    }\n\n    private parseDoWhileStatement(): AST.DoWhileStatement\n    {\n        const startPos = this.currentPos();\n\n        this.consume(TokenType.KEYWORD, 'do');\n        this.consume(TokenType.PUNCTUATION, ':');\n\n        const body = this.parseBlock();\n\n        this.consume(TokenType.KEYWORD, 'while');\n        const condition = this.parseExpression();\n\n        return {type: 'DoWhileStatement', body, condition, position: startPos};\n    }\n\n    private parseBreakStatement(): AST.BreakStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'break');\n\n        if (! this.stream.isEof) this.match(TokenType.NEWLINE);\n\n        return {type: 'BreakStatement', position};\n    }\n\n    private parseContinueStatement(): AST.ContinueStatement\n    {\n        const position = this.currentPos();\n        this.consume(TokenType.KEYWORD, 'continue');\n\n        if (! this.stream.isEof) this.match(TokenType.NEWLINE);\n        return {type: 'ContinueStatement', position};\n    }\n\n    private parseExpressionStatement(isPublic: boolean = false, isLocal: boolean = false): AST.ExpressionStatement\n    {\n        const position   = this.currentPos();\n        const expression = this.parseExpression(isPublic, isLocal);\n        if (! this.stream.isEof) this.consume(TokenType.NEWLINE);\n        return {type: 'ExpressionStatement', expression, position};\n    }\n\n    private parseExpression(isPublic: boolean = false, isLocal: boolean = false): AST.Expr\n    {\n        let left = this.parseLogicalOr();\n\n        if (isPublic || isLocal) {\n            if (left.type !== 'Identifier') {\n                throw new Error('Only identifiers can be marked as public or local in assignments.');\n            }\n\n            if (! this.check(TokenType.OPERATOR, '=')) {\n                throw new Error(`Expected assignment operator '=' after public/local identifier \"${left.value}\".`);\n            }\n        }\n\n        if (this.match(TokenType.OPERATOR, '=')) {\n            const right = this.parseExpression();\n            return {\n                type:     'AssignmentExpression',\n                left:     left,\n                operator: '=',\n                right:    right,\n                isPublic,\n                isLocal,\n            } as AST.AssignmentExpression;\n        }\n\n        return left;\n    }\n\n    private parseLogicalOr(): AST.Expr\n    {\n        let left = this.parseLogicalAnd();\n\n        while (this.match(TokenType.KEYWORD, 'or')) {\n            const right = this.parseLogicalAnd();\n            left        = {type: 'LogicalExpression', operator: 'or', left, right} as AST.LogicalExpression;\n        }\n        return left;\n    }\n\n    private parseLogicalAnd(): AST.Expr\n    {\n        let left = this.parseEquality();\n\n        while (this.match(TokenType.KEYWORD, 'and')) {\n            const right = this.parseEquality();\n            left        = {type: 'LogicalExpression', operator: 'and', left, right} as AST.LogicalExpression;\n        }\n        return left;\n    }\n\n    private parseEquality(): AST.Expr\n    {\n        let left = this.parseRelational();\n\n        while (this.check(TokenType.OPERATOR, '==') || this.check(TokenType.OPERATOR, '!=')) {\n            const operator = this.stream.consume().value;\n            const right    = this.parseRelational();\n            left           = {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parseRelational(): AST.Expr\n    {\n        let left = this.parseRange();\n\n        while (\n            this.check(TokenType.OPERATOR, '<') ||\n            this.check(TokenType.OPERATOR, '>') ||\n            this.check(TokenType.OPERATOR, '<=') ||\n            this.check(TokenType.OPERATOR, '>=') ||\n            this.check(TokenType.OPERATOR, 'is') ||\n            this.check(TokenType.KEYWORD, 'in') ||\n            this.check(TokenType.KEYWORD, 'not')\n            ) {\n            // 2. Handle 'not in' specifically\n            if (this.match(TokenType.KEYWORD, 'not')) {\n                if (! this.match(TokenType.KEYWORD, 'in')) {\n                    throw new Error('Unexpected token \\'not\\'. Did you mean \\'not in\\'?');\n                }\n\n                const operator = 'not in';\n                const right    = this.parseAdditive();\n                left           = {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n                continue;\n            }\n\n            // Standard operators\n            const token    = this.stream.consume();\n            const operator = token.value;\n            const right    = this.parseAdditive();\n\n            left = {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parseRange(): AST.Expr\n    {\n        let left = this.parseAdditive();\n\n        while (this.check(TokenType.OPERATOR, '..')) {\n            const operator = this.stream.consume().value; // Consumes \"..\"\n            const right    = this.parseAdditive();\n\n            left = {\n                type: 'BinaryExpression',\n                left,\n                operator,\n                right,\n            } as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parseAdditive(): AST.Expr\n    {\n        let left = this.parseMultiplicative();\n\n        while (this.check(TokenType.OPERATOR, '+') || this.check(TokenType.OPERATOR, '-')) {\n            const operator = this.stream.consume().value;\n            const right    = this.parseMultiplicative();\n            left           = {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parseMultiplicative(): AST.Expr\n    {\n        let left = this.parseUnary();\n\n        while (this.check(TokenType.OPERATOR, '*') || this.check(TokenType.OPERATOR, '/') || this.check(TokenType.OPERATOR, '%')) {\n            const operator = this.stream.consume().value;\n            const right    = this.parseUnary();\n            left           = {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parseUnary(): AST.Expr\n    {\n        if (this.match(TokenType.KEYWORD, 'not') || this.match(TokenType.PUNCTUATION, '!')) {\n            const argument = this.parseUnary();\n            return {type: 'UnaryExpression', operator: 'not', argument} as AST.UnaryExpression;\n        }\n\n        if (this.match(TokenType.OPERATOR, '-')) {\n            const argument = this.parseUnary();\n            return {type: 'UnaryExpression', operator: '-', argument} as AST.UnaryExpression;\n        }\n\n        return this.parseExponentiation();\n    }\n\n    private parseExponentiation(): AST.Expr\n    {\n        const left = this.parsePostfix();\n\n        if (this.match(TokenType.OPERATOR, '^')) {\n            const operator = '^';\n            // Recursively call parseUnary to handle:\n            // 1. Right Associativity: 2^3^4 -> 2^(3^4)\n            // 2. Unary in exponent: 2^-5\n            const right = this.parseUnary();\n            return {type: 'BinaryExpression', left, operator, right} as AST.BinaryExpression;\n        }\n\n        return left;\n    }\n\n    private parsePostfix(): AST.Expr\n    {\n        let left = this.parsePrimary();\n\n        while (true) {\n            if (this.match(TokenType.PUNCTUATION, '(')) {\n                const args: AST.Expr[] = [];\n                if (! this.check(TokenType.PUNCTUATION, ')')) {\n                    do {\n                        args.push(this.parseExpression());\n                    } while (this.match(TokenType.PUNCTUATION, ','));\n                }\n                this.consume(TokenType.PUNCTUATION, ')');\n                left = {type: 'CallExpression', callee: left, arguments: args} as AST.CallExpression;\n            } else if (this.match(TokenType.PUNCTUATION, '.')) {\n                const property = this.parseIdentifier();\n                left           = {\n                    type:     'MemberExpression',\n                    object:   left,\n                    property: property,\n                    computed: false,\n                } as AST.MemberExpression;\n            } else if (this.match(TokenType.PUNCTUATION, '[')) {\n                const property = this.parseExpression();\n                this.consume(TokenType.PUNCTUATION, ']');\n                left = {\n                    type:     'MemberExpression',\n                    object:   left,\n                    property: property,\n                    computed: true,\n                } as AST.MemberExpression;\n            } else {\n                break;\n            }\n        }\n\n        return left;\n    }\n\n    private parsePrimary(): AST.Expr\n    {\n        const token = this.stream.peek();\n\n        if (token?.type === TokenType.NUMBER) {\n            this.stream.consume();\n            return {\n                type:  'Literal',\n                value: Number(token.value),\n                raw:   token.value,\n            } as AST.Literal;\n        }\n\n        if (token?.type === TokenType.STRING) {\n            this.stream.consume();\n            return {\n                type:  'Literal',\n                value: token.value,\n                raw:   token.value,\n            } as AST.Literal;\n        }\n\n        if (token?.type === TokenType.KEYWORD) {\n            if (token.value === 'this') {\n                this.stream.consume();\n                return {type: 'ThisExpression'} as AST.ThisExpression;\n            }\n            if (token.value === 'parent') {\n                this.stream.consume();\n                const startPos = this.currentPos();\n                this.consume(TokenType.PUNCTUATION, '.');\n                const method = this.parseIdentifier();\n\n                const args: Expr[] = [];\n                this.consume(TokenType.PUNCTUATION, '(');\n                if (! this.check(TokenType.PUNCTUATION, ')')) { // Peek for ')'\n                    do {\n                        args.push(this.parseExpression());\n                    } while (this.match(TokenType.PUNCTUATION, ','));\n                }\n                this.consume(TokenType.PUNCTUATION, ')'); // consume ')'\n\n                return {\n                    type:       'ParentMethodCallExpression',\n                    methodName: method,\n                    arguments:  args,\n                    position:   startPos,\n                };\n            }\n            if (token.value === 'true') {\n                this.stream.consume();\n                return {type: 'Literal', value: true, raw: 'true'} as AST.Literal;\n            }\n            if (token.value === 'false') {\n                this.stream.consume();\n                return {type: 'Literal', value: false, raw: 'false'} as AST.Literal;\n            }\n            if (token.value === 'null') {\n                this.stream.consume();\n                return {type: 'Literal', value: null, raw: 'null'} as AST.Literal;\n            }\n            if (token.value === 'new') {\n                this.stream.consume();\n                const startPos = this.currentPos();\n\n                let className: AST.Identifier | AST.MemberExpression = this.parseIdentifier();\n\n                while (this.match(TokenType.PUNCTUATION, '.')) {\n                    const property = this.parseIdentifier();\n                    className      = {\n                        type:     'MemberExpression',\n                        object:   className,\n                        property: property,\n                        computed: false,\n                    } as AST.MemberExpression;\n                }\n\n                // Arguments are optional.\n                const args: Expr[] = [];\n                if (this.match(TokenType.PUNCTUATION, '(')) { // test & consume '('\n                    if (! this.check(TokenType.PUNCTUATION, ')')) { // Peek for ')'\n                        do {\n                            args.push(this.parseExpression());\n                        } while (this.match(TokenType.PUNCTUATION, ','));\n                    }\n                    this.consume(TokenType.PUNCTUATION, ')'); // consume ')'\n                }\n\n                return {\n                    type:      'NewExpression',\n                    className: className,\n                    arguments: args,\n                    position:  startPos,\n                };\n            }\n        }\n\n        if (this.match(TokenType.PUNCTUATION, '[')) {\n            return this.parseArrayExpression();\n        }\n\n        if (this.match(TokenType.PUNCTUATION, '{')) {\n            return this.parseObjectExpression();\n        }\n\n        if (token?.type === TokenType.IDENTIFIER) {\n            return this.parseIdentifier();\n        }\n\n        if (this.match(TokenType.PUNCTUATION, '(')) {\n            const expr = this.parseExpression();\n            this.consume(TokenType.PUNCTUATION, ')');\n            return expr;\n        }\n\n        throw new Error(`Unexpected token in Expression: ${token?.value}`);\n    }\n\n    private skipFormatting()\n    {\n        while (\n            this.match(TokenType.NEWLINE) ||\n            this.match(TokenType.INDENT) ||\n            this.match(TokenType.DEDENT)\n            ) {\n        }\n    }\n\n    private parseArrayExpression(): AST.ArrayExpression | AST.ArrayComprehension\n    {\n        this.skipFormatting();\n        const position = this.currentPos();\n\n        // Early exit on empty array []\n        if (this.check(TokenType.PUNCTUATION, ']')) {\n            this.consume(TokenType.PUNCTUATION, ']');\n            return {type: 'ArrayExpression', elements: [], position};\n        }\n\n        // Parse the first element/expression\n        const firstExpr = this.parseExpression();\n        this.skipFormatting();\n\n        // Is this an Array Comprehension? Syntax: [ expr FOR i IN collection ]\n        if (this.match(TokenType.KEYWORD, 'for')) {\n            const iteratorToken = this.consume(TokenType.IDENTIFIER);\n            this.consume(TokenType.KEYWORD, 'in');\n            const collection = this.parseExpression();\n\n            this.skipFormatting();\n            this.consume(TokenType.PUNCTUATION, ']');\n\n            return {\n                type:       'ArrayComprehension',\n                expression: firstExpr,\n                iterator:   {\n                    type:     'Identifier',\n                    value:    iteratorToken.value,\n                    position: iteratorToken.position,\n                },\n                collection: collection,\n                position,\n            } satisfies AST.ArrayComprehension;\n        }\n\n        // Standard Array List;  We already have the first element, now look for commas\n        const elements: AST.Expr[] = [firstExpr];\n\n        while (this.match(TokenType.PUNCTUATION, ',')) {\n            this.skipFormatting();\n\n            // Handle trailing comma: [1, 2, ]\n            if (this.check(TokenType.PUNCTUATION, ']')) break;\n\n            elements.push(this.parseExpression());\n            this.skipFormatting();\n        }\n\n        this.consume(TokenType.PUNCTUATION, ']');\n\n        return {type: 'ArrayExpression', elements, position};\n    }\n\n    private parseObjectExpression(): AST.ObjectExpression | AST.ObjectComprehension\n    {\n        this.skipFormatting();\n        const startPos = this.currentPos();\n\n        // Early exit on empty objects.\n        if (this.check(TokenType.PUNCTUATION, '}')) {\n            this.consume(TokenType.PUNCTUATION, '}');\n            return {type: 'ObjectExpression', properties: [], position: startPos};\n        }\n\n        // Parse the first Key-Value pair\n        const firstKey = this.parseIdentifier();\n        this.consume(TokenType.PUNCTUATION, ':');\n        const firstValue = this.parseExpression();\n\n        // Is this a Comprehension?\n        if (this.match(TokenType.KEYWORD, 'for')) {\n            const iterator = this.parseIdentifier();\n            this.consume(TokenType.KEYWORD, 'in');\n            const collection = this.parseExpression();\n            this.consume(TokenType.PUNCTUATION, '}');\n\n            return {\n                type:       'ObjectComprehension',\n                key:        firstKey,\n                value:      firstValue,\n                iterator:   iterator,\n                collection: collection,\n                position:   startPos,\n            };\n        }\n\n        const properties: AST.Property[] = [];\n\n        properties.push({\n            type:     'Property',\n            key:      firstKey,\n            value:    firstValue,\n            position: startPos,\n        });\n\n        while (! this.check(TokenType.PUNCTUATION, '}')) {\n            this.match(TokenType.PUNCTUATION, ',');\n            this.skipFormatting();\n\n            if (this.check(TokenType.PUNCTUATION, '}')) break;\n\n            const key = this.parseIdentifier();\n            this.consume(TokenType.PUNCTUATION, ':');\n            const value = this.parseExpression();\n\n            properties.push({type: 'Property', key, value, position: this.currentPos()});\n        }\n\n        this.consume(TokenType.PUNCTUATION, '}');\n        return {type: 'ObjectExpression', properties, position: startPos};\n    }\n\n    private parseIdentifier(): AST.Identifier\n    {\n        const position = this.currentPos();\n        const token    = this.consume(TokenType.IDENTIFIER);\n        return {type: 'Identifier', value: token.value, position};\n    }\n\n    private consume(type: keyof typeof TokenType, value?: string): Token\n    {\n        const token = this.stream.peek();\n\n        if (! token || token.type !== type || (value && token.value !== value)) {\n            const msg = `Expected ${type} ${value || ''}, but found ${token?.type} ${token?.value}`;\n            let pos   = '';\n            if (token?.position) {\n                pos = ` at line ${token.position.lineStart}, column ${token.position.columnStart}`;\n            }\n\n            throw new Error(msg + pos);\n        }\n\n        this.lastToken = token;\n\n        return this.stream.consume();\n    }\n\n    private match(type: keyof typeof TokenType, value?: string): boolean\n    {\n        if (this.check(type, value)) {\n            this.stream.consume();\n\n            return true;\n        }\n\n        return false;\n    }\n\n    private check(type: keyof typeof TokenType, value?: string): boolean\n    {\n        const token = this.stream.peek();\n\n        if (! token || token.type !== type) {\n            return false;\n        }\n\n        return ! (value && token.value !== value);\n    }\n\n    private currentPos(): TokenPosition\n    {\n        const token: Token | null = this.stream.peek();\n\n        return token\n            ? token.position\n            : {\n                lineStart:   0,\n                lineEnd:     0,\n                columnStart: 0,\n                columnEnd:   0,\n            };\n    }\n}\n","import { TokenPosition } from '../Tokenizer/index.js';\n\nexport enum Opcode\n{\n    HALT          = 'HALT',   // Stop execution\n    CONST         = 'CONST',  // Push a value onto the stack\n    SWAP          = 'SWAP',   // Swap top two values on the stack\n    EXPORT        = 'EXPORT', // Mark top of stack for export (2 values: name, value)\n    IMPORT        = 'IMPORT', // Import a module (arg: module name)\n    WAIT          = 'WAIT',   // Pause execution for X milliseconds (stack: [duration])\n    NEW           = 'NEW',    // Stack: [arg1, arg2..., class] -> Instance\n    SUPER         = 'SUPER',  // Invoke parent method ({name: string, args: number})\n\n    // Arithmetic\n    ADD           = 'ADD',\n    SUB           = 'SUB',\n    MUL           = 'MUL',\n    DIV           = 'DIV',\n    MOD           = 'MOD',\n    EXP           = 'EXP',\n    NEG           = 'NEG',\n\n    // Comparison\n    EQ            = 'EQ',\n    NEQ           = 'NEQ',\n    GT            = 'GT',\n    GTE           = 'GTE',\n    LT            = 'LT',\n    LTE           = 'LTE',\n    IN            = 'IN',\n    IS            = 'IS',\n\n    // Logical\n    NOT           = 'NOT',\n\n    // Logic\n    JMP           = 'JMP',          // Unconditional Jump\n    JMP_IF_FALSE  = 'JMP_IF_FALSE', // Jump if top of stack is false\n    JMP_IF_TRUE   = 'JMP_IF_TRUE',   // Jump if top is true (pops value)\n    DUP           = 'DUP',           // Duplicate top value (A -> A, A)\n    POP           = 'POP',           // Discard top value (A -> )\n\n    // Variables\n    LOAD          = 'LOAD',   // Load variable value onto stack\n    STORE         = 'STORE',  // Store top of stack into variable\n    LOAD_LOCAL    = 'LOAD_LOCAL',  // Load local slot value onto stack\n    STORE_LOCAL   = 'STORE_LOCAL', // Store top of stack into local slot\n\n    // Functions\n    CALL          = 'CALL',   // { name: string, addr: number, args: number }\n    CALL_METHOD   = 'CALL_METHOD', // { name: string, args: number }\n    CALL_PARENT   = 'CALL_PARENT', // arg: number of args\n    RET           = 'RET',\n\n    // Collections\n    MAKE_ARRAY    = 'MAKE_ARRAY',    // Stack: [arg1, arg2...] -> Array\n    MAKE_RANGE    = 'MAKE_RANGE',    // Stack: [start, end] -> Range\n    MAKE_OBJECT   = 'MAKE_OBJECT',   // Stack: [key1, val1...] -> Object\n    MAKE_FUNCTION = 'MAKE_FUNCTION', // { name: string, addr: number, args: number }\n    MAKE_CLASS    = 'MAKE_CLASS',    // [ name, startIndex ]\n    MAKE_METHOD   = 'MAKE_METHOD',   // Stack: [{ ... MAKE_FUNCTION result ... }]\n\n    // Property Access\n    GET_PROP      = 'GET_PROP',    // Stack: [Object, Key] -> [Value]\n    SET_PROP      = 'SET_PROP',    // Stack: [Object, Key, Value] -> [Value]\n\n    // Iteration\n    ITER_INIT     = 'ITER_INIT',   // Stack: [Array] -> [Iterator]\n    ITER_NEXT     = 'ITER_NEXT',   // Stack: [Iterator] -> [Value] (or Jump if done)\n    ARRAY_PUSH    = 'ARRAY_PUSH',  // Stack: [Array, Value] -> []\n}\n\nexport enum OpcodeBytes\n{\n    HALT          = 0x00,\n    CONST         = 0x01,\n    SWAP          = 0x02,\n    EXPORT        = 0x03,\n    IMPORT        = 0x04,\n    WAIT          = 0x05,\n    NEW           = 0x06,\n    SUPER         = 0x07,\n    ADD           = 0x10,\n    SUB           = 0x11,\n    MUL           = 0x12,\n    DIV           = 0x13,\n    MOD           = 0x14,\n    EXP           = 0x15,\n    NEG           = 0x16,\n    EQ            = 0x20,\n    NEQ           = 0x21,\n    GT            = 0x22,\n    GTE           = 0x23,\n    LT            = 0x24,\n    LTE           = 0x25,\n    IN            = 0x26,\n    IS            = 0x27,\n    NOT           = 0x30,\n    JMP           = 0x40,\n    JMP_IF_FALSE  = 0x41,\n    JMP_IF_TRUE   = 0x42,\n    DUP           = 0x43,\n    POP           = 0x44,\n    LOAD          = 0x50,\n    STORE         = 0x51,\n    LOAD_LOCAL    = 0x52,\n    STORE_LOCAL   = 0x53,\n    CALL          = 0x60,\n    CALL_METHOD   = 0x61,\n    CALL_PARENT   = 0x62,\n    RET           = 0x63,\n    MAKE_ARRAY    = 0x70,\n    MAKE_RANGE    = 0x71,\n    MAKE_OBJECT   = 0x72,\n    MAKE_FUNCTION = 0x73,\n    MAKE_CLASS    = 0x74,\n    MAKE_METHOD   = 0x75,\n    GET_PROP      = 0x80,\n    SET_PROP      = 0x81,\n    ITER_INIT     = 0x90,\n    ITER_NEXT     = 0x91,\n    ARRAY_PUSH    = 0x92,\n}\n","export class BinaryReader\n{\n    private buffer: Uint8Array;\n    private view: DataView;\n    private offset: number;\n    private decoder: TextDecoder;\n\n    constructor(buffer: Uint8Array)\n    {\n        this.buffer  = buffer;\n        this.view    = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n        this.offset  = 0;\n        this.decoder = new TextDecoder('utf-8');\n    }\n\n    public readUInt8(): number\n    {\n        const value = this.view.getUint8(this.offset);\n        this.offset += 1;\n        return value;\n    }\n\n    public readUInt16(): number\n    {\n        const value = this.view.getUint16(this.offset, true);\n        this.offset += 2;\n        return value;\n    }\n\n    public readUInt32(): number\n    {\n        const value = this.view.getUint32(this.offset, true);\n        this.offset += 4;\n        return value;\n    }\n\n    public readFloat64(): number\n    {\n        const value = this.view.getFloat64(this.offset, true);\n        this.offset += 8;\n        return value;\n    }\n\n    public readString(): string\n    {\n        // 1. Read the length prefix\n        const length = this.readUInt32();\n\n        if (length === 0) {\n            return '';\n        }\n\n        // 2. Slice the byte range directly\n        // We use subarray to avoid copying memory\n        const bytes = this.buffer.subarray(this.offset, this.offset + length);\n        this.offset += length;\n\n        // 3. Decode utf-8 bytes to string\n        return this.decoder.decode(bytes);\n    }\n\n    /**\n     * Peek at the current offset without advancing it.\n     */\n    public get position(): number\n    {\n        return this.offset;\n    }\n\n    /**\n     * Check if we have reached the end of the buffer.\n     */\n    public get isEof(): boolean\n    {\n        return this.offset >= this.buffer.byteLength;\n    }\n}\n","import { BinaryReader } from './Binary/BinaryReader.js';\nimport { Program }      from './Program.js';\n\nexport class ConstantPool\n{\n    public static fromProgram(program: Program): ConstantPool\n    {\n        const pool = new ConstantPool();\n\n        for (const instr of program.instructions) {\n            ConstantPool._add(pool, instr.arg);\n        }\n\n        for (const funcName of program.exported.functions) {\n            pool.add(funcName);\n        }\n\n        for (const varName of program.exported.variables) {\n            pool.add(varName);\n        }\n\n        return pool;\n    }\n\n    public static fromBinary(data: Uint8Array | BinaryReader): ConstantPool\n    {\n        const pool: ConstantPool   = new ConstantPool();\n        const reader: BinaryReader = data instanceof BinaryReader ? data : new BinaryReader(data);\n        const count: number        = reader.readUInt32();\n\n        for (let i = 0; i < count; i++) {\n            const type = reader.readUInt8(); // 0 = String, 1 = Number\n\n            if (type === 0) {\n                pool.add(reader.readString(), true);\n            } else if (type === 1) {\n                pool.add(reader.readFloat64(), true);\n            } else {\n                throw new Error(`Corrupt binary: Unknown constant type tag ${type} at offset ${reader.position}`);\n            }\n        }\n\n        return pool;\n    }\n\n    private static _add(pool: ConstantPool, value: any): void\n    {\n        if (value === null || value === undefined) {\n            return;\n        }\n\n        if (typeof value === 'string' || typeof value === 'number') {\n            pool.add(value);\n            return;\n        }\n\n        if (Array.isArray(value)) {\n            for (const item of value) {\n                ConstantPool._add(pool, item);\n            }\n\n            return;\n        }\n\n        if (typeof value === 'object') {\n            for (const key of Object.keys(value)) {\n                if (typeof key === 'string' || typeof key === 'number') {\n                    pool.add(key);\n                    ConstantPool._add(pool, value[key]);\n                }\n            }\n        }\n    }\n\n    private readonly valueToId: Map<string | number, number> = new Map();\n    private readonly idToValue: Map<number, string | number> = new Map();\n\n    /**\n     * Get constant pool ID by its value.\n     *\n     * @param {string | number} value\n     * @returns {number | null}\n     */\n    public getId(value: string | number): number | null\n    {\n        return this.valueToId.get(value) ?? null;\n    }\n\n    /**\n     * Get constant pool value by its ID.\n     *\n     * @param {number} id\n     * @returns {string | number | null}\n     */\n    public getValue(id: number): string | number | null\n    {\n        return this.idToValue.get(id) ?? null;\n    }\n\n    /**\n     * Get all constant pool values in order of their IDs.\n     */\n    public getAll(): (string | number | boolean)[]\n    {\n        return Array.from(this.idToValue.values());\n    }\n\n    public add(value: string | number, force: boolean = false): number\n    {\n        if (force) {\n            const id = this.valueToId.size;\n\n            this.valueToId.set(value, id);\n            this.idToValue.set(id, value);\n\n            return id;\n        }\n\n        if (this.valueToId.has(value)) {\n            return this.valueToId.get(value)!;\n        }\n\n        const id = this.valueToId.size;\n        this.valueToId.set(value, id);\n        this.idToValue.set(id, value);\n\n        return id;\n    }\n}\n","import { BinaryReader } from './Binary/BinaryReader.js';\nimport { ConstantPool }         from './ConstantPool.js';\nimport { Opcode, OpcodeBytes } from './Opcodes.js';\nimport { Instruction, Program } from './Program.js';\n\nexport class Reader\n{\n    /**\n     * Reads a Luma program from a binary Uint8Array.\n     *\n     * @param {Uint8Array} data\n     * @returns {Program}\n     */\n    public static read(data: Uint8Array): Program\n    {\n        return new Reader(data).read();\n    }\n\n    private readonly reader: BinaryReader;\n    private pool!: ConstantPool;\n    private withDebugInfo: boolean = false;\n\n    private constructor(data: Uint8Array)\n    {\n        this.reader = new BinaryReader(data);\n    }\n\n    private read(): Program\n    {\n        const { hash, moduleName } = this.readHeader();\n        this.readConstants();\n        const exported = this.readExports();\n        const references = this.readReferences();\n        const instructions = this.readInstructions();\n        const source = this.readSource();\n\n        return {\n            hash,\n            source: source,\n            moduleName: moduleName,\n            instructions: instructions,\n            references: references,\n            exported: exported\n        };\n    }\n\n    private readHeader(): { hash: string, moduleName?: string }\n    {\n        const magic = [\n            this.reader.readUInt8(),\n            this.reader.readUInt8(),\n            this.reader.readUInt8()\n        ];\n\n        if (magic[0] !== 0x4C || magic[1] !== 0x55 || magic[2] !== 0x58) {\n            throw new Error(\"Invalid file format.\");\n        }\n\n        const version = this.reader.readUInt8();\n        if (version !== 1) {\n            throw new Error(`Unsupported version ${version}. Expected 1.`);\n        }\n\n        this.withDebugInfo = this.reader.readUInt8() === 1;\n\n        // Module Name\n        const nameLen = this.reader.readUInt8();\n        const moduleName = nameLen > 0 ? this.reader.readString() : undefined;\n\n        // Module Hash\n        const hashLen = this.reader.readUInt8();\n        const hash = hashLen > 0 ? this.reader.readString() : '';\n\n        return { hash, moduleName };\n    }\n\n    private readConstants(): void\n    {\n        this.pool = new ConstantPool();\n        const count = this.reader.readUInt16();\n\n        for (let i = 0; i < count; i++) {\n            const type = this.reader.readUInt8();\n\n            if (type === 0x01) {\n                this.pool.add(this.reader.readFloat64(), true); // true = force add\n            } else if (type === 0x02) {\n                this.pool.add(this.reader.readString(), true);\n            } else {\n                throw new Error(`Corrupt binary: Unknown constant type tag ${type} at offset ${this.reader.position}`);\n            }\n        }\n    }\n\n    private readExports(): Program['exported']\n    {\n        const functions: string[] = [];\n        const variables: string[] = [];\n\n        // Functions\n        const funcCount = this.reader.readUInt16();\n        for (let i = 0; i < funcCount; i++) {\n            functions.push(this.getPoolString(this.reader.readUInt16()));\n        }\n\n        // Variables\n        const varCount = this.reader.readUInt16();\n        for (let i = 0; i < varCount; i++) {\n            variables.push(this.getPoolString(this.reader.readUInt16()));\n        }\n\n        return { functions, variables };\n    }\n\n    private readReferences(): Program['references']\n    {\n        const functions: Record<string, { address: number, numArgs: number }> = {};\n        const events: Record<string, { address: number, numArgs: number }> = {};\n\n        // Function References\n        const funcCount = this.reader.readUInt16();\n        for (let i = 0; i < funcCount; i++) {\n            const name = this.getPoolString(this.reader.readUInt16());\n            const address = this.reader.readUInt16();\n            const numArgs = this.reader.readUInt8();\n            functions[name] = { address, numArgs };\n        }\n\n        // Event References\n        const eventCount = this.reader.readUInt16();\n        for (let i = 0; i < eventCount; i++) {\n            const name = this.getPoolString(this.reader.readUInt16());\n            const address = this.reader.readUInt16();\n            const numArgs = this.reader.readUInt8();\n            events[name] = { address, numArgs };\n        }\n\n        return { functions, events };\n    }\n\n    private readInstructions(): Instruction[]\n    {\n        const count = this.reader.readUInt16();\n        const instructions: Instruction[] = [];\n\n        for (let i = 0; i < count; i++) {\n            const instr: Instruction = {\n                op: OpcodeBytes[this.reader.readUInt8()] as Opcode,\n            };\n\n            const arg = this.readValueArg();\n            if (arg !== undefined) {\n                instr.arg = arg;\n            }\n\n            if (this.withDebugInfo) {\n                // Position\n                const hasPos = this.reader.readUInt8() === 1;\n                if (hasPos) {\n                    instr.pos = {\n                        lineStart: this.reader.readUInt16(),\n                        columnStart: this.reader.readUInt16(),\n                        lineEnd: this.reader.readUInt16(),\n                        columnEnd: this.reader.readUInt16(),\n                    };\n                }\n\n                // Comment\n                const commentLen = this.reader.readUInt16();\n                if (commentLen > 0) {\n                    instr.comment = this.reader.readString();\n                }\n            }\n\n            instructions.push(instr);\n        }\n\n        return instructions;\n    }\n\n    private readSource(): string\n    {\n        if (!this.withDebugInfo) {\n            this.reader.readUInt32();\n            return \"\";\n        }\n\n        return this.reader.readString();\n    }\n\n    private readValueArg(): any\n    {\n        const type = this.reader.readUInt8();\n\n        switch (type) {\n            case 0: return undefined; // Null/Undefined\n            case 1: // String\n                return this.getPoolString(this.reader.readUInt16());\n            case 2: // Number\n                const id = this.reader.readUInt16();\n                return this.pool.getValue(id);\n            case 3: // Boolean\n                return this.reader.readUInt8() === 1;\n            case 4: // Array\n            {\n                const len = this.reader.readUInt16();\n                const arr: any[] = [];\n                for (let i = 0; i < len; i++) arr.push(this.readValueArg());\n                return arr;\n            }\n            case 5: // Object\n            {\n                const keysLen = this.reader.readUInt16();\n                const obj: any = {};\n                for (let i = 0; i < keysLen; i++) {\n                    obj[this.readValueArg()] = this.readValueArg();\n                }\n                return obj;\n            }\n            case 6: // null\n                return null;\n            default:\n                throw new Error(`Unknown argument type tag: ${type} at offset ${this.reader.position}`);\n        }\n    }\n\n    private getPoolString(id: number): string\n    {\n        const val = this.pool.getValue(id);\n        if (typeof val !== 'string') {\n            throw new Error(`Expected string constant at pool ID ${id}, got ${typeof val}`);\n        }\n        return val;\n    }\n}\n","export class BinaryWriter\n{\n    private buffer: Uint8Array;\n    private view: DataView;\n    private offset: number;\n\n    constructor(initialSize: number = 1024)\n    {\n        this.buffer = new Uint8Array(initialSize);\n        this.view   = new DataView(this.buffer.buffer);\n        this.offset = 0;\n    }\n\n    public writeUInt8(value: number): void\n    {\n        this.ensureCapacity(1);\n        this.view.setUint8(this.offset, value);\n        this.offset += 1;\n    }\n\n    public writeUInt16(value: number): void\n    {\n        this.ensureCapacity(2);\n        this.view.setUint16(this.offset, value, true); // true = Little Endian\n        this.offset += 2;\n    }\n\n    public writeUInt32(value: number): void\n    {\n        this.ensureCapacity(4);\n        this.view.setUint32(this.offset, value, true);\n        this.offset += 4;\n    }\n\n    public writeFloat64(value: number): void\n    {\n        this.ensureCapacity(8);\n        this.view.setFloat64(this.offset, value, true);\n        this.offset += 8;\n    }\n\n    public writeString(value: string): void\n    {\n        // We use TextEncoder, which is standard in Browsers and Node 11+\n        const encoder = new TextEncoder();\n        const bytes   = encoder.encode(value);\n\n        // Write length prefix (assume u32 for safety, or u16 if strings are short)\n        this.writeUInt32(bytes.length);\n\n        this.ensureCapacity(bytes.length);\n        this.buffer.set(bytes, this.offset);\n        this.offset += bytes.length;\n    }\n\n    public toBuffer(): Uint8Array\n    {\n        // Return only the used portion of the buffer\n        return this.buffer.slice(0, this.offset);\n    }\n\n    private ensureCapacity(bytesNeeded: number): void\n    {\n        if (this.offset + bytesNeeded > this.buffer.length) {\n            const newSize   = Math.max(this.buffer.length * 2, this.offset + bytesNeeded);\n            const newBuffer = new Uint8Array(newSize);\n            newBuffer.set(this.buffer);\n\n            this.buffer = newBuffer;\n            this.view   = new DataView(this.buffer.buffer);\n        }\n    }\n}\n","import { BinaryWriter } from './Binary/BinaryWriter.js';\nimport { ConstantPool } from './ConstantPool.js';\nimport { OpcodeBytes }  from './Opcodes.js';\nimport { Program }      from './Program.js';\n\nexport class Writer\n{\n    /**\n     * Writes the given program to a binary format.\n     *\n     * Includes an option to add debug information such as source code and\n     * instruction comments, as well as line/column positions. This may be\n     * useful for debugging, but increases the size of the output binary.\n     *\n     * @param {Program} program\n     * @param {boolean} withDebugInfo - Whether to include debug information.\n     * @returns {Uint8Array}\n     */\n    public static write(program: Program, withDebugInfo: boolean): Uint8Array\n    {\n        return new Writer(program, withDebugInfo).write();\n    }\n\n    private readonly program: Program;\n    private readonly writer: BinaryWriter;\n    private readonly pool: ConstantPool;\n    private readonly withDebugInfo: boolean;\n\n    private constructor(program: Program, withDebugInfo: boolean = false)\n    {\n        this.program       = program;\n        this.pool          = ConstantPool.fromProgram(program);\n        this.writer        = new BinaryWriter();\n        this.withDebugInfo = withDebugInfo;\n    }\n\n    private write(): Uint8Array\n    {\n        this.writeHeader();\n        this.writeConstants();\n        this.writeExports();\n        this.writeReferences();\n        this.writeInstructions();\n        this.writeSource();\n\n        return this.writer.toBuffer();\n    }\n\n    private writeHeader(): void\n    {\n        this.writer.writeUInt8(0x4C); // 'L'\n        this.writer.writeUInt8(0x55); // 'U'\n        this.writer.writeUInt8(0x58); // 'X'\n        this.writer.writeUInt8(0x01); // '1' (version 1)\n        this.writer.writeUInt8(this.withDebugInfo ? 1 : 0); // Debug info flag\n\n        // Module name.\n        this.writer.writeUInt8(this.program.moduleName?.length ?? 0);\n        if (this.program.moduleName) {\n            this.writer.writeString(this.program.moduleName);\n        }\n\n        // Module hash.\n        this.writer.writeUInt8(this.program.hash.length);\n        this.writer.writeString(this.program.hash);\n    }\n\n    private writeConstants(): void\n    {\n        const constants = this.pool.getAll();\n        this.writer.writeUInt16(constants.length);\n\n        for (const constant of constants) {\n            switch (typeof constant) {\n                case 'number':\n                    this.writer.writeUInt8(0x01); // Type: Number\n                    this.writer.writeFloat64(constant);\n                    break;\n\n                case 'string':\n                    this.writer.writeUInt8(0x02); // Type: String\n                    this.writer.writeString(constant);\n                    break;\n\n                default:\n                    throw new Error(`Unsupported constant type: ${typeof constant}`);\n            }\n        }\n    }\n\n    private writeExports(): void\n    {\n        this.writer.writeUInt16(this.program.exported.functions.length);\n        for (const funcName of this.program.exported.functions) {\n            this.writer.writeUInt16(this.getPoolId(funcName));\n        }\n\n        this.writer.writeUInt16(this.program.exported.variables.length);\n        for (const varName of this.program.exported.variables) {\n            this.writer.writeUInt16(this.getPoolId(varName));\n        }\n    }\n\n    private writeReferences(): void\n    {\n        // Functions.\n        const funcNames = Object.keys(this.program.references.functions);\n        this.writer.writeUInt16(funcNames.length);\n\n        for (const funcName of funcNames) {\n            const addr = this.program.references.functions[funcName];\n            this.writer.writeUInt16(this.getPoolId(funcName));\n            this.writer.writeUInt16(addr.address);\n            this.writer.writeUInt8(addr.numArgs);\n        }\n\n        // Events.\n        const eventNames = Object.keys(this.program.references.events);\n        this.writer.writeUInt16(eventNames.length);\n\n        for (const eventName of eventNames) {\n            const addr = this.program.references.events[eventName];\n            this.writer.writeUInt16(this.getPoolId(eventName));\n            this.writer.writeUInt16(addr.address);\n            this.writer.writeUInt8(addr.numArgs);\n        }\n    }\n\n    private writeInstructions(): void\n    {\n        this.writer.writeUInt16(this.program.instructions.length);\n\n        for (const instr of this.program.instructions) {\n            this.writer.writeUInt8(OpcodeBytes[instr.op]);\n            this.writeValueArg(instr.arg);\n\n            if (this.withDebugInfo) {\n                // Position info.\n                if (instr.pos) {\n                    this.writer.writeUInt8(1); // Has position info\n                    this.writer.writeUInt16(instr.pos.lineStart);\n                    this.writer.writeUInt16(instr.pos.columnStart);\n                    this.writer.writeUInt16(instr.pos.lineEnd);\n                    this.writer.writeUInt16(instr.pos.columnEnd);\n                } else {\n                    this.writer.writeUInt8(0); // No position info\n                }\n\n                // Comment.\n                this.writer.writeUInt16(instr.comment?.length ?? 0);\n                if (instr.comment) {\n                    this.writer.writeString(instr.comment);\n                }\n            }\n        }\n    }\n\n    private writeSource(): void\n    {\n        if (! this.withDebugInfo) {\n            this.writer.writeUInt32(0);\n            return;\n        }\n\n        this.writer.writeString(this.program.source);\n    }\n\n    private writeValueArg(value: any): void\n    {\n        if (value === undefined) {\n            this.writer.writeUInt8(0); // Arg type: Undefined\n            return;\n        }\n\n        if (value === null) {\n            this.writer.writeUInt8(6); // Arg type: Null\n            return;\n        }\n\n        if (typeof value === 'string') {\n            this.writer.writeUInt8(1); // Arg type: String\n            this.writer.writeUInt16(this.getPoolId(value));\n            return;\n        }\n\n        if (typeof value === 'number') {\n            this.writer.writeUInt8(2); // Arg type: Number\n            this.writer.writeUInt16(this.getPoolId(value));\n            return;\n        }\n\n        if (typeof value === 'boolean') {\n            this.writer.writeUInt8(3); // Arg type: Boolean\n            this.writer.writeUInt8(value ? 1 : 0);\n            return;\n        }\n\n        if (Array.isArray(value)) {\n            this.writer.writeUInt8(4); // Arg type: Array\n            this.writer.writeUInt16(value.length);\n\n            for (const item of value) {\n                this.writeValueArg(item);\n            }\n\n            return;\n        }\n\n        if (typeof value === 'object') {\n            this.writer.writeUInt8(5); // Arg type: Object\n            const keys = Object.keys(value);\n            this.writer.writeUInt16(keys.length);\n\n            for (const key of keys) {\n                this.writeValueArg(key);\n                this.writeValueArg(value[key]);\n            }\n\n            return;\n        }\n\n        throw new Error(`Unsupported instruction argument type: ${typeof value}`);\n    }\n\n    private getPoolId(value: string | number): number\n    {\n        const id = this.pool.getId(value);\n\n        if (id === null) {\n            throw new Error(`Value \"${value}\" not found in constant pool.`);\n        }\n\n        return id;\n    }\n}\n","import { LumaError }                    from '../LumaError.js';\nimport * as AST                         from '../Parser/AST.js';\nimport { Parser }                       from '../Parser/index.js';\nimport { Instruction, Opcode, Program } from '../Program/index.js';\nimport { Tokenizer, TokenPosition }     from '../Tokenizer/index.js';\n\nexport class Compiler\n{\n    private loopStack: LoopContext[]               = [];\n    private currentPos: TokenPosition | null       = null;\n    private pendingCalls: Record<string, number[]> = {};\n    private currentClassName: string | null        = null;\n    private localScopes: Array<Map<string, number>> = [];\n\n    private program: Program = {\n        hash:         '',\n        source:       '',\n        moduleName:   undefined,\n        instructions: [],\n        references:   {\n            functions: {},\n            events:    {},\n        },\n        exported:     {\n            functions: [],\n            variables: [],\n        },\n    };\n\n    public static compile(source: string, moduleName?: string): Program\n    {\n        const tokens = Tokenizer.tokenize(source, moduleName);\n        const ast    = Parser.parse(tokens, moduleName);\n\n        return new Compiler().compile(moduleName, source, ast);\n    }\n\n    private compile(moduleName: string | undefined, source: string, program: AST.Script): Program\n    {\n        this.program.moduleName = moduleName;\n        this.program.source     = source;\n\n        this.hoistFunctions(program);\n        this.hoistEventHooks(program);\n\n        for (const stmt of program.body) {\n            this.visit(stmt);\n        }\n\n        this.emit(Opcode.RET);\n\n        this.program.hash = this.createHash();\n\n        return this.program;\n    }\n\n    private visit(node: AST.Stmt | AST.Expr): void\n    {\n        if (node.position) this.currentPos = node.position;\n\n        switch (node.type) {\n            case 'Block':\n                (node as AST.Block).body.forEach(s => this.visit(s));\n                break;\n\n            case 'ExpressionStatement':\n                this.visit((node as AST.ExpressionStatement).expression);\n                this.emit(Opcode.POP);\n                break;\n\n            case 'ThisExpression':\n                this.emit(Opcode.LOAD, 'this');\n                break;\n\n            case 'ImportStatement': {\n                const moduleName = (node as AST.ImportStatement).moduleName;\n                this.emit(Opcode.IMPORT, moduleName); // Import the module.\n                this.emit(Opcode.STORE, [moduleName]);  // Store the public exports of the module in a variable.\n                break;\n            }\n\n            case 'ReturnStatement':\n                const ret = node as AST.ReturnStatement;\n                if (ret.argument) {\n                    this.visit(ret.argument);\n                } else {\n                    this.emit(Opcode.CONST, null); // void return.\n                }\n                this.emit(Opcode.RET);\n                break;\n\n            case 'IfStatement':\n                this.visitIfStatement(node as AST.IfStatement);\n                break;\n\n            case 'WaitStatement':\n                this.visit((node as AST.WaitStatement).duration);\n                this.emit(Opcode.WAIT);\n                break;\n\n            case 'FunctionDeclaration':\n            case 'EventHook':\n                // Handled in hoisting phase.\n                break;\n            case 'MethodDefinition':\n                this.visitMethodDefinition(node as AST.MethodDefinition);\n                break;\n\n            case 'Literal':\n                this.emit(Opcode.CONST, (node as AST.Literal).value);\n                break;\n\n            case 'Identifier':\n                this.emitLoadByName((node as AST.Identifier).value);\n                break;\n\n            case 'BinaryExpression':\n                this.visitBinaryExpression(node as AST.BinaryExpression);\n                break;\n\n            case 'LogicalExpression':\n                this.visitLogicalExpression(node as AST.LogicalExpression);\n                break;\n\n            case 'UnaryExpression':\n                this.visitUnaryExpression(node as AST.UnaryExpression);\n                break;\n\n            case 'CallExpression':\n                this.visitCallExpression(node as AST.CallExpression);\n                break;\n\n            case 'ForStatement':\n                this.visitForStatement(node as AST.ForStatement);\n                break;\n\n            case 'WhileStatement':\n                this.visitWhileStatement(node as AST.WhileStatement);\n                break;\n\n            case 'DoWhileStatement':\n                this.visitDoWhileStatement(node as AST.DoWhileStatement);\n                break;\n\n            case 'BreakStatement':\n                this.visitBreakStatement(node as AST.BreakStatement);\n                break;\n\n            case 'ContinueStatement':\n                this.visitContinueStatement(node as AST.ContinueStatement);\n                break;\n\n            case 'ArrayExpression':\n                this.visitArrayExpression(node as AST.ArrayExpression);\n                break;\n\n            case 'ArrayComprehension':\n                this.visitArrayComprehension(node as AST.ArrayComprehension);\n                break;\n\n            case 'ObjectExpression':\n                this.visitObjectExpression(node as AST.ObjectExpression);\n                break;\n\n            case 'ObjectComprehension':\n                this.visitObjectComprehension(node as AST.ObjectComprehension);\n                break;\n\n            case 'MemberExpression':\n                this.visitMemberExpression(node as AST.MemberExpression);\n                break;\n\n            case 'AssignmentExpression':\n                this.visitAssignmentExpression(node as AST.AssignmentExpression);\n                break;\n\n            case 'ClassStatement':\n                this.visitClassStatement(node as AST.ClassStatement);\n                break;\n\n            case 'NewExpression':\n                this.visitNewExpression(node as AST.NewExpression);\n                break;\n\n            case 'ParentMethodCallExpression':\n                this.visitParentMethodCallExpression(node as AST.ParentMethodCallExpression);\n                break;\n\n            default:\n                this.throwError(`Compiler: Unknown node type ${node.type}`, node);\n        }\n    }\n\n    private visitBinaryExpression(node: AST.BinaryExpression)\n    {\n        this.visit(node.left);\n        this.visit(node.right);\n\n        switch (node.operator) {\n            case '+':\n                this.emit(Opcode.ADD);\n                break;\n            case '-':\n                this.emit(Opcode.SUB);\n                break;\n            case '*':\n                this.emit(Opcode.MUL);\n                break;\n            case '/':\n                this.emit(Opcode.DIV);\n                break;\n            case '%':\n                this.emit(Opcode.MOD);\n                break;\n            case '^':\n                this.emit(Opcode.EXP);\n                break;\n            case '==':\n                this.emit(Opcode.EQ);\n                break;\n            case '!=':\n                this.emit(Opcode.NEQ);\n                break;\n            case '>=':\n                this.emit(Opcode.GTE);\n                break;\n            case '>':\n                this.emit(Opcode.GT);\n                break;\n            case '<=':\n                this.emit(Opcode.LTE);\n                break;\n            case '<':\n                this.emit(Opcode.LT);\n                break;\n            case 'in':\n                this.emit(Opcode.IN);\n                break;\n            case 'not in':\n                this.emit(Opcode.IN);\n                this.emit(Opcode.NOT);\n                break;\n            case '..':\n                this.emit(Opcode.MAKE_RANGE);\n                break;\n            case 'is':\n                this.visit(node.left);\n                this.visit(node.right);\n                this.emit(Opcode.IS);\n                break;\n            default:\n                this.throwError(`Compiler: Unknown binary operator ${node.operator}`, node);\n        }\n    }\n\n    private visitLogicalExpression(node: AST.LogicalExpression)\n    {\n        this.visit(node.left);\n        this.emit(Opcode.DUP);\n\n        if (node.operator === 'or') {\n            const jumpIndex = this.emit(Opcode.JMP_IF_TRUE, -1);\n\n            this.emit(Opcode.POP);\n            this.visit(node.right);\n\n            this.patch(jumpIndex, this.program.instructions.length);\n        } else if (node.operator === 'and') {\n            const jumpIndex = this.emit(Opcode.JMP_IF_FALSE, -1);\n\n            this.emit(Opcode.POP);\n            this.visit(node.right);\n\n            this.patch(jumpIndex, this.program.instructions.length);\n        }\n    }\n\n    private visitUnaryExpression(node: AST.UnaryExpression)\n    {\n        this.visit(node.argument);\n\n        switch (node.operator) {\n            case 'not':\n            case '!':\n                this.emit(Opcode.NOT);\n                break;\n            case '-':\n                this.emit(Opcode.NEG);\n                break;\n            default:\n                this.throwError(`Compiler: Unknown unary operator ${node.operator}`, node);\n        }\n    }\n\n    private visitMethodDefinition(node: AST.MethodDefinition)\n    {\n        const jumpOver  = this.emit(Opcode.JMP, 0); // Skip body during execution\n        const funcStart = this.program.instructions.length;\n\n        this.enterLocalScope();\n\n        for (let i = node.params.length - 1; i >= 0; i--) {\n            this.emitStoreByName(node.params[i].value, true);\n        }\n\n        this.visit(node.body);\n        this.exitLocalScope();\n        this.emit(Opcode.CONST, null);\n        this.emit(Opcode.RET);\n        this.patch(jumpOver, this.program.instructions.length);\n        this.emit(Opcode.LOAD, node.objectName.value);\n        this.emit(Opcode.CONST, node.methodName);\n        this.emit(Opcode.MAKE_FUNCTION, {name: node.methodName, addr: funcStart, args: node.params.length});\n        this.emit(Opcode.SET_PROP);\n        this.emit(Opcode.POP);\n    }\n\n    private visitIfStatement(node: AST.IfStatement)\n    {\n        this.visit(node.test);\n\n        const jumpToElseIndex = this.emit(Opcode.JMP_IF_FALSE, -1);\n\n        this.visit(node.consequent);\n\n        const jumpToEndIndex = this.emit(Opcode.JMP, -1);\n\n        this.patch(jumpToElseIndex, this.program.instructions.length);\n\n        if (node.alternate) {\n            this.visit(node.alternate);\n        }\n\n        this.patch(jumpToEndIndex, this.program.instructions.length);\n    }\n\n    private visitCallExpression(node: AST.CallExpression)\n    {\n        if (node.callee.type === 'MemberExpression') {\n            const propName = (node.callee.property as AST.Identifier).value;\n            node.arguments.forEach(arg => this.visit(arg));\n            this.visit((node.callee as AST.MemberExpression).object);\n            this.emit(Opcode.CALL_METHOD, {\n                name: propName,\n                args: node.arguments.length,\n            });\n            return;\n        }\n\n        node.arguments.forEach(arg => this.visit(arg));\n\n        const funcName = (node.callee as AST.Identifier).value;\n        const funcRef  = this.program.references.functions[funcName];\n\n        // 1. Get address (or -1 if not compiled yet, or null if dynamic/unknown)\n        const initialAddr = funcRef ? funcRef.address : null;\n\n        // 2. Emit CALL\n        const instrIndex = this.emit(Opcode.CALL, {\n            name: funcName,\n            addr: initialAddr,\n            args: node.arguments.length,\n        });\n\n        // 3. Register for Phase 3 Resolution if needed\n        if (funcRef && funcRef.address === -1) {\n            if (! this.pendingCalls[funcName]) {\n                this.pendingCalls[funcName] = [];\n            }\n            this.pendingCalls[funcName].push(instrIndex);\n        }\n    }\n\n    private visitArrayExpression(node: AST.ArrayExpression)\n    {\n        for (const element of node.elements) {\n            this.visit(element);\n        }\n\n        this.emit(Opcode.MAKE_ARRAY, node.elements.length);\n    }\n\n    private visitObjectExpression(node: AST.ObjectExpression)\n    {\n        for (const prop of node.properties) {\n            this.emit(Opcode.CONST, prop.key.value);\n            this.visit(prop.value);\n        }\n\n        this.emit(Opcode.MAKE_OBJECT, node.properties.length);\n    }\n\n    private visitObjectComprehension(node: AST.ObjectComprehension)\n    {\n        // 1. Unique Iterator Name\n        const uniqueIterName = `$comp_${this.program.instructions.length}`;\n\n        // 2. Clone expressions for variable renaming\n        const patchedKey   = structuredClone(node.key);\n        const patchedValue = structuredClone(node.value);\n\n        this.replaceIdentifier(patchedKey, node.iterator.value, uniqueIterName);\n        this.replaceIdentifier(patchedValue, node.iterator.value, uniqueIterName);\n\n        // 3. Setup Accumulator\n        this.emit(Opcode.MAKE_OBJECT);\n        this.emit(Opcode.STORE, ['$comp_obj_result', true]);\n\n        // 4. Loop Setup\n        this.visit(node.collection);\n        this.emit(Opcode.ITER_INIT);\n\n        const iterNextIndex = this.program.instructions.length;\n        const jumpToExit    = this.emit(Opcode.ITER_NEXT, -1);\n\n        this.emit(Opcode.STORE, [uniqueIterName, true]);\n\n        // 5. Body: Set Property\n        this.emit(Opcode.LOAD, '$comp_obj_result'); // Target Object\n\n        this.visit(patchedKey);                     // Key (Evaluated!)\n        this.visit(patchedValue);                   // Value (Evaluated!)\n\n        this.emit(Opcode.SET_PROP);                 // Stack: [Obj, Key, Val] -> [Obj]\n        this.emit(Opcode.POP);\n        this.emit(Opcode.JMP, iterNextIndex);\n\n        // 6. Cleanup\n        const loopEndIndex = this.program.instructions.length;\n        this.patch(jumpToExit, loopEndIndex);\n        this.emit(Opcode.POP);\n\n        // 7. Result\n        this.emit(Opcode.LOAD, '$comp_obj_result');\n    }\n\n    private visitMemberExpression(node: AST.MemberExpression)\n    {\n        this.visit(node.object);\n\n        if (node.computed) {\n            this.visit(node.property);\n        } else {\n            if (node.property.type !== 'Identifier') {\n                this.throwError('Dot notation requires an identifier.', node);\n            }\n\n            this.emit(Opcode.CONST, (node.property as AST.Identifier).value);\n        }\n\n        let debugName: string | undefined = undefined;\n        if (node.object.type === 'Identifier') {\n            debugName = (node.object as AST.Identifier).value;\n        }\n\n        this.emit(Opcode.GET_PROP, debugName);\n    }\n\n    private visitAssignmentExpression(node: AST.AssignmentExpression)\n    {\n        if (node.left.type === 'Identifier') {\n            this.visit(node.right);\n            this.emit(Opcode.DUP); // Duplicate value for STORE and possible EXPORT\n\n            this.emitStoreByName((node.left as AST.Identifier).value, node.isLocal);\n\n            if (node.isPublic) {\n                const varName: string = (node.left as AST.Identifier).value;\n                this.program.exported.variables.push(varName);\n\n                this.emit(Opcode.CONST, varName); // Internal variable name\n                this.emit(Opcode.CONST, varName); // External export name\n                this.emit(Opcode.EXPORT);\n            }\n            return;\n        }\n\n        if (node.left.type === 'MemberExpression') {\n            const member = node.left as AST.MemberExpression;\n\n            this.visit(member.object);\n\n            if (member.computed) {\n                this.visit(member.property);\n            } else {\n                this.emit(Opcode.CONST, (member.property as AST.Identifier).value);\n            }\n\n            this.visit(node.right);\n\n            this.emit(Opcode.SET_PROP);\n            return;\n        }\n\n        this.throwError('Invalid assignment target', node.left ?? node);\n    }\n\n    private visitArrayComprehension(node: AST.ArrayComprehension)\n    {\n        const uniqueIterName    = `$comp_${this.program.instructions.length}`;\n        const patchedExpression = structuredClone(node.expression);\n\n        this.replaceIdentifier(patchedExpression, node.iterator.value, uniqueIterName);\n\n        this.emit(Opcode.MAKE_ARRAY, 0);\n        this.emit(Opcode.STORE, ['$comp_result', true]);\n\n        this.visit(node.collection);\n\n        this.emit(Opcode.ITER_INIT);\n\n        const iterNextIndex = this.program.instructions.length;\n        const jumpToExit    = this.emit(Opcode.ITER_NEXT, -1);\n\n        this.emit(Opcode.STORE, [uniqueIterName, true]);\n        this.emit(Opcode.LOAD, '$comp_result');\n\n        this.visit(patchedExpression);\n\n        this.emit(Opcode.ARRAY_PUSH);\n        this.emit(Opcode.JMP, iterNextIndex);\n\n        const loopEndIndex = this.program.instructions.length;\n        this.patch(jumpToExit, loopEndIndex);\n\n        this.emit(Opcode.POP);\n        this.emit(Opcode.LOAD, '$comp_result');\n    }\n\n    private visitForStatement(node: AST.ForStatement)\n    {\n        const uniqueIterName = `$loop_${node.iterator.value}_${this.program.instructions.length}`;\n\n        this.visit(node.collection);\n        this.emit(Opcode.ITER_INIT);\n\n        const iterNextIndex = this.program.instructions.length;\n\n        this.loopStack.push({\n            type:            'for',\n            continueAddress: iterNextIndex,\n            breakPatchList:  [],\n        });\n\n        const jumpToExitIndex = this.emit(Opcode.ITER_NEXT, -1);\n\n        this.emit(Opcode.STORE, [uniqueIterName, true]);\n\n        const bodyClone = structuredClone(node.body);\n\n        this.replaceIdentifier(bodyClone, node.iterator.value, uniqueIterName);\n\n        this.visit(bodyClone);\n\n        this.emit(Opcode.JMP, iterNextIndex);\n\n        const loopEndIndex = this.program.instructions.length;\n        this.patch(jumpToExitIndex, loopEndIndex);\n\n        const context = this.loopStack.pop();\n        if (context) {\n            for (const breakIndex of context.breakPatchList) {\n                this.patch(breakIndex, loopEndIndex);\n            }\n        }\n    }\n\n    private visitWhileStatement(node: AST.WhileStatement)\n    {\n        const startAddress = this.program.instructions.length;\n\n        this.visit(node.condition);\n        const exitJump = this.emit(Opcode.JMP_IF_FALSE, 0);\n\n        // Push loop context\n        this.loopStack.push({\n            type:            'while',\n            continueAddress: startAddress,\n            breakPatchList:  [],\n        });\n\n        this.visit(node.body);\n\n        const loopCtx = this.loopStack.pop()!;\n        this.emit(Opcode.JMP, startAddress);\n\n        // Patch the main exit jump\n        this.patch(exitJump, this.program.instructions.length);\n\n        // Patch all 'break' statements found inside the loop\n        for (const breakIndex of loopCtx.breakPatchList) {\n            this.patch(breakIndex, this.program.instructions.length);\n        }\n    }\n\n    private visitDoWhileStatement(node: AST.DoWhileStatement)\n    {\n        const startAddress     = this.program.instructions.length;\n        const ctx: LoopContext = {\n            continueAddress:   -1,\n            breakPatchList:    [],\n            continuePatchList: [],\n            type:              'do-while',\n        };\n        this.loopStack.push(ctx);\n\n        this.visit(node.body);\n\n        // NOW we know where the condition is\n        const conditionAddress = this.program.instructions.length;\n\n        // Patch all 'continue' jumps to point here\n        for (const patchIdx of ctx.continuePatchList ?? []) {\n            this.patch(patchIdx, conditionAddress);\n        }\n\n        this.visit(node.condition);\n        this.emit(Opcode.JMP_IF_TRUE, startAddress);\n\n        this.loopStack.pop();\n\n        // Patch all 'break' jumps to point to the instruction AFTER the loop\n        const exitAddress = this.program.instructions.length;\n        for (const patchIdx of ctx.breakPatchList) {\n            this.patch(patchIdx, exitAddress);\n        }\n    }\n\n    private visitBreakStatement(node: AST.BreakStatement)\n    {\n        if (this.loopStack.length === 0) {\n            this.throwError('Compiler Error: \\'break\\' used outside of loop', node);\n        }\n\n        const ctx = this.loopStack[this.loopStack.length - 1];\n\n        // Only POP if we are breaking out of a 'for' loop that has an iterator on stack\n        if (ctx.type === 'for') {\n            this.emit(Opcode.POP);\n        }\n\n        const index = this.emit(Opcode.JMP, -1);\n        ctx.breakPatchList.push(index);\n    }\n\n    private visitContinueStatement(node: AST.ContinueStatement)\n    {\n        if (this.loopStack.length === 0) {\n            this.throwError('Compiler Error: \\'continue\\' used outside of loop', node);\n        }\n\n        const ctx = this.loopStack[this.loopStack.length - 1];\n\n        if (ctx.type === 'do-while') {\n            const index = this.emit(Opcode.JMP, -1);\n            if (! ctx.continuePatchList) {\n                ctx.continuePatchList = [];\n            }\n\n            ctx.continuePatchList.push(index);\n        } else {\n            this.emit(Opcode.JMP, ctx.continueAddress);\n        }\n    }\n\n    private visitClassStatement(node: AST.ClassStatement)\n    {\n        const jumpIndex             = this.emit(Opcode.JMP, 0);\n        const constructorStartIndex = this.program.instructions.length;\n\n        this.currentClassName = node.name.value;\n        this.enterLocalScope();\n\n        let constructorParams = node.params;\n\n        const initMethod    = node.methods.find(m => m.name.value === 'init');\n        const useInitParams = node.params.length === 0 && initMethod;\n\n        // AMBIGUITY CHECK\n        if (node.params.length > 0 && initMethod && initMethod.params.length > 0) {\n            this.throwError(\n                `Class '${node.name.value}' has an ambiguous constructor definition.\\n\\n` +\n                `It defines parameters in the class header (${node.params.length}) AND in the 'init' method (${initMethod.params.length}).\\n` +\n                `Please use only one style:\\n` +\n                `  1. Header params: class ${node.name.value}(...) + fn init()\\n` +\n                `  2. Init params:   class ${node.name.value} + fn init(...)`,\n                node\n            );\n        }\n\n        if (useInitParams) {\n            constructorParams = initMethod.params;\n        }\n\n        for (let i = constructorParams.length - 1; i >= 0; i--) {\n            this.emitStoreByName(constructorParams[i].value, true);\n        }\n\n        // Bind promoted parameters to 'this'.\n        for (const param of node.params) {\n            if (param.type === 'PromotedParameter') {\n                this.emit(Opcode.LOAD, 'this');      // 1. Object\n                this.emit(Opcode.CONST, param.value); // 2. Key\n                this.emitLoadByName(param.value);  // 3. Value (Load the local we just stored)\n                this.emit(Opcode.SET_PROP);\n                this.emit(Opcode.POP); // Consumes the set value\n            }\n        }\n\n        // Call Parent Constructor if applicable.\n        if (node.parent) {\n            this.emit(Opcode.LOAD, 'this'); // Push 'this'\n            for (const arg of node.parentArgs ?? []) {\n                this.visit(arg); // Push Args\n            }\n\n            this.visit(node.parent);\n            this.emit(Opcode.CALL_PARENT, node.parentArgs?.length ?? 0);\n            this.emit(Opcode.POP); // Pop the 'this' returned by RET\n        }\n\n        // Initialize properties.\n        for (const prop of node.properties) {\n            this.emit(Opcode.LOAD, 'this');          // 1. Object\n            this.emit(Opcode.CONST, prop.key.value); // 2. Key (Emit this BEFORE visiting value)\n            this.visit(prop.value);                  // 3. Value\n            this.emit(Opcode.SET_PROP);               // or SET_PROP\n            this.emit(Opcode.POP);\n        }\n\n        if (initMethod) {\n            let argCount = constructorParams.length;\n\n            if (useInitParams) {\n                for (const param of constructorParams) {\n                    this.emitLoadByName(param.value);\n                }\n                argCount = constructorParams.length;\n            }\n\n            this.emit(Opcode.LOAD, 'this');\n            this.emit(Opcode.CALL_METHOD, {\n                name: 'init',\n                args: argCount,\n            });\n\n            this.emit(Opcode.POP); // Discard init return value.\n        }\n\n        this.emit(Opcode.LOAD, 'this');\n        this.emit(Opcode.RET);\n        this.exitLocalScope();\n\n        const constructorEndIndex = this.program.instructions.length;\n        this.patch(jumpIndex, constructorEndIndex);\n\n        // Push the parent (or NULL) on the stack. Consumed by MAKE_CLASS.\n        if (node.parent) {\n            this.visit(node.parent);\n            // this.emit(Opcode.LOAD, node.parent.value);\n        } else {\n            this.emit(Opcode.CONST, null);\n        }\n\n        this.emit(Opcode.MAKE_CLASS, [node.name.value, constructorStartIndex, constructorParams.length]);\n        this.emit(Opcode.STORE, [node.name.value]);\n\n        // Attach methods.\n        for (const method of node.methods) {\n            const methodJump = this.emit(Opcode.JMP, 0);\n            const methodAddr = this.program.instructions.length;\n\n            this.enterLocalScope();\n            // ... Method Preamble (Store Params) ...\n            for (let i = method.params.length - 1; i >= 0; i--) {\n                this.emitStoreByName(method.params[i].value, true);\n            }\n\n            this.visit(method.body);\n            this.exitLocalScope();\n\n            // Ensure void return\n            if (this.program.instructions[this.program.instructions.length - 1].op !== Opcode.RET) {\n                this.emit(Opcode.CONST, 0); // Void return\n                this.emit(Opcode.RET);\n            }\n\n            const methodEnd = this.program.instructions.length;\n            this.patch(methodJump, methodEnd);\n\n            // Attach Method to Class\n            this.emit(Opcode.LOAD, node.name.value); // Load class\n            this.emit(Opcode.MAKE_FUNCTION, {name: method.name.value, addr: methodAddr, args: method.params.length});\n            this.emit(Opcode.MAKE_METHOD); // Pulls MAKE_FUNCTION & bp from the stack and glue it to the class.\n        }\n\n        // Clear current class context.\n        this.currentClassName = null;\n\n        if (node.isPublic) {\n            this.program.exported.functions.push(node.name.value);\n            this.emit(Opcode.CONST, node.name.value); // Internal\n            this.emit(Opcode.CONST, node.name.value); // External\n            this.emit(Opcode.EXPORT);\n        }\n    }\n\n    private visitNewExpression(node: AST.NewExpression)\n    {\n        for (const arg of node.arguments) {\n            this.visit(arg);\n        }\n\n        this.visit(node.className);\n        this.emit(Opcode.NEW, node.arguments.length);\n    }\n\n    private visitParentMethodCallExpression(node: AST.ParentMethodCallExpression)\n    {\n        this.emit(Opcode.LOAD, 'this');\n\n        for (const arg of node.arguments) {\n            this.visit(arg);\n        }\n\n        this.emit(Opcode.SUPER, {\n            name:   node.methodName.value,\n            args:   node.arguments.length,\n            callee: this.currentClassName,\n        });\n    }\n\n    private hoistFunctions(program: AST.Script)\n    {\n        const functions = program.body.filter(s => s.type === 'FunctionDeclaration') as AST.FunctionDeclaration[];\n        if (functions.length === 0) return;\n\n        this.currentPos     = {lineStart: 1, lineEnd: 1, columnStart: 1, columnEnd: 3};\n        const jumpOverIndex = this.emit(Opcode.JMP, -1);\n\n        for (const func of functions) {\n            this.program.references.functions[func.name.value] = {\n                address: -1,\n                numArgs: func.params.length,\n            };\n\n            if (func.isPublic) {\n                this.program.exported.functions.push(func.name.value);\n            }\n        }\n\n        for (const func of functions) {\n            const funcName = func.name.value;\n            const addr     = this.program.instructions.length;\n\n            this.program.references.functions[funcName].address = addr;\n\n            this.currentPos = func.position;\n            this.enterLocalScope();\n\n            const params: string[] = [];\n            const instrStartIndex  = this.program.instructions.length;\n\n            for (let i = func.params.length - 1; i >= 0; i--) {\n                const paramName = func.params[i].value;\n                params.push(paramName);\n                this.emitStoreByName(paramName, true);\n            }\n\n            this.visit(func.body);\n            this.exitLocalScope();\n\n            this.program.instructions[instrStartIndex].comment = `DECL ${funcName}(${params.reverse().join(', ')})`;\n\n            const lastStmt = func.body.body[func.body.body.length - 1];\n            if (! lastStmt || lastStmt.type !== 'ReturnStatement') {\n                this.emit(Opcode.CONST, null);\n                this.emit(Opcode.RET);\n            }\n        }\n\n        for (const [funcName, instructionIndices] of Object.entries(this.pendingCalls)) {\n            const realAddr = this.program.references.functions[funcName].address;\n\n            if (realAddr === -1) {\n                throw new Error(`Compiler Error: Function '${funcName}' was called but never defined.`);\n            }\n\n            for (const index of instructionIndices) {\n                this.program.instructions[index].arg.addr = realAddr;\n            }\n        }\n\n        this.pendingCalls = {};\n\n        this.patch(jumpOverIndex, this.program.instructions.length);\n\n        for (const func of functions) {\n            if (! func.isPublic) continue;\n            const funcName = func.name.value;\n            const ref      = this.program.references.functions[funcName];\n\n            this.emit(Opcode.MAKE_FUNCTION, {name: funcName, addr: ref.address, args: ref.numArgs});\n            this.emit(Opcode.DUP);\n            this.emit(Opcode.STORE, [funcName]);\n\n            this.emit(Opcode.CONST, funcName);   // Internal\n            this.emit(Opcode.CONST, funcName);   // External\n            this.emit(Opcode.EXPORT);\n        }\n    }\n\n    private hoistEventHooks(program: AST.Script)\n    {\n        const hooks = program.body.filter(s => s.type === 'EventHook') as AST.EventHook[];\n\n        if (hooks.length === 0) {\n            return;\n        }\n\n        const jumpOverIndex = this.emit(Opcode.JMP, -1);\n\n        for (const hook of hooks) {\n            this.program.references.events[hook.name.value] = {\n                address: this.program.instructions.length,\n                numArgs: hook.params.length,\n            };\n\n            this.enterLocalScope();\n            const params: string[] = [];\n            const instrStartIndex  = this.program.instructions.length;\n\n            for (let i = hook.params.length - 1; i >= 0; i--) {\n                const paramName = hook.params[i].value;\n                params.push(paramName);\n                this.emitStoreByName(paramName, true);\n            }\n\n            this.visit(hook.body);\n            this.exitLocalScope();\n\n            this.program.instructions[instrStartIndex].comment = `HOOK ${hook.name.value}(${params.reverse().join(', ')})`;\n\n            const lastStmt = hook.body.body[hook.body.body.length - 1];\n            if (! lastStmt || lastStmt.type !== 'ReturnStatement') {\n                this.emit(Opcode.CONST, null);\n                this.emit(Opcode.RET);\n            }\n        }\n\n        this.patch(jumpOverIndex, this.program.instructions.length);\n    }\n\n    private emit(op: Opcode, arg: any = null): number\n    {\n        const instr: Instruction = {op, arg, pos: this.currentPos ? {...this.currentPos} : undefined};\n        this.program.instructions.push(instr);\n\n        return this.program.instructions.length - 1;\n    }\n\n    private patch(index: number, value: any)\n    {\n        this.program.instructions[index].arg = value;\n    }\n\n    private replaceIdentifier(node: any, oldName: string, newName: string): void\n    {\n        if (! node || typeof node !== 'object') return;\n\n        if (node.type === 'ForStatement' && node.iterator?.value === oldName) {\n            this.replaceIdentifier(node.collection, oldName, newName);\n            return;\n        }\n\n        if ((node.type === 'FunctionDeclaration' || node.type === 'ScriptFunction') &&\n            node.params?.some((p: any) => p.value === oldName)) {\n            return;\n        }\n\n        if (node.type === 'Identifier' && node.value === oldName) {\n            node.value = newName;\n            return;\n        }\n\n        for (const key in node) {\n            if (key === 'position') continue;\n\n            if (node.type === 'MemberExpression' && key === 'property' && ! node.computed) {\n                continue;\n            }\n\n            if (node.type === 'Property' && key === 'key') {\n                continue;\n            }\n\n            const child = node[key];\n\n            if (Array.isArray(child)) {\n                child.forEach(c => this.replaceIdentifier(c, oldName, newName));\n            } else if (typeof child === 'object') {\n                this.replaceIdentifier(child, oldName, newName);\n            }\n        }\n    }\n\n    /**\n     * Creates a 32-character hash of the program source.\n     *\n     * @private\n     */\n    private createHash(): string\n    {\n        const str = (this.program.moduleName || '<main>') + this.program.source;\n\n        let h1 = 1779033703, h2 = 3144134277, h3 = 1013904242, h4 = 2773480762;\n\n        for (let i = 0, k; i < str.length; i++) {\n            k  = str.charCodeAt(i);\n            h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\n            h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\n            h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\n            h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\n        }\n\n        h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\n        h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\n        h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\n        h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\n\n        return [h1, h2, h3, h4]\n            .map(h => (h >>> 0).toString(16).padStart(8, '0'))\n            .join('');\n    }\n\n    private throwError(message: string, node: AST.Expr | AST.Stmt): never\n    {\n        throw new LumaError({\n            message:    message,\n            moduleName: this.program.moduleName,\n            position:   node.position,\n        });\n    }\n\n    private enterLocalScope(): void\n    {\n        this.localScopes.push(new Map());\n    }\n\n    private exitLocalScope(): void\n    {\n        this.localScopes.pop();\n    }\n\n    private get currentLocalScope(): Map<string, number> | null\n    {\n        if (this.localScopes.length === 0) {\n            return null;\n        }\n\n        return this.localScopes[this.localScopes.length - 1];\n    }\n\n    private ensureLocalSlot(name: string): number | null\n    {\n        const scope = this.currentLocalScope;\n        if (! scope) {\n            return null;\n        }\n\n        const current = scope.get(name);\n        if (typeof current === 'number') {\n            return current;\n        }\n\n        const index = scope.size;\n        scope.set(name, index);\n\n        return index;\n    }\n\n    private getLocalSlot(name: string): number | null\n    {\n        const scope = this.currentLocalScope;\n        if (! scope) {\n            return null;\n        }\n\n        const slot = scope.get(name);\n        if (typeof slot !== 'number') {\n            return null;\n        }\n\n        return slot;\n    }\n\n    private emitLoadByName(name: string): void\n    {\n        const slot = this.getLocalSlot(name);\n        if (typeof slot === 'number') {\n            this.emit(Opcode.LOAD_LOCAL, slot);\n            return;\n        }\n\n        this.emit(Opcode.LOAD, name);\n    }\n\n    private emitStoreByName(name: string, forceLocal: boolean = false): void\n    {\n        if (forceLocal) {\n            const slot = this.ensureLocalSlot(name);\n            if (typeof slot === 'number') {\n                this.emit(Opcode.STORE_LOCAL, slot);\n                return;\n            }\n\n            this.emit(Opcode.STORE, [name, true]);\n            return;\n        }\n\n        const slot = this.getLocalSlot(name);\n        if (typeof slot === 'number') {\n            this.emit(Opcode.STORE_LOCAL, slot);\n            return;\n        }\n\n        this.emit(Opcode.STORE, [name]);\n    }\n}\n\ninterface LoopContext\n{\n    type?: string;\n    continueAddress: number;\n    breakPatchList: number[];\n    continuePatchList?: number[];\n}\n","import { LumaError, LumaErrorOptions } from './LumaError.js';\nimport { Program }                     from './Program/index.js';\n\nexport class LumaRuntimeError extends LumaError\n{\n    public readonly address: number;\n    public readonly program: Program;\n\n    constructor(options: LumaRuntimeErrorOptions)\n    {\n        super(options);\n\n        this.address = options.address;\n        this.program = options.program;\n    }\n}\n\nexport type LumaRuntimeErrorOptions = LumaErrorOptions & {\n    address: number;\n    program: Program;\n}\n","const ANSI_CODES = {\n    reset: '\\x1b[0m',\n\n    // Standard Colors\n    black:   '\\x1b[30m',\n    red:     '\\x1b[31m',\n    green:   '\\x1b[32m',\n    yellow:  '\\x1b[33m',\n    blue:    '\\x1b[34m',\n    magenta: '\\x1b[35m',\n    cyan:    '\\x1b[36m',\n    white:   '\\x1b[37m',\n\n    // Bright/Bold Colors\n    gray:          '\\x1b[90m', // \"Bright Black\" acts as Gray\n    brightred:     '\\x1b[91m',\n    brightgreen:   '\\x1b[92m',\n    brightyellow:  '\\x1b[93m',\n    brightblue:    '\\x1b[94m',\n    brightmagenta: '\\x1b[95m',\n    brightcyan:    '\\x1b[96m',\n    brightwhite:   '\\x1b[97m',\n\n    // Text Styles\n    bold:      '\\x1b[1m',\n    dim:       '\\x1b[2m',\n    underline: '\\x1b[4m',\n};\n\nexport const ANSI = new class\n{\n    public enabled: boolean = false;\n\n    /**\n     * Wraps the given text with the specified ANSI code and resets the formatting at the end.\n     *\n     * Supported tags are: &lt;black&gt;, &lt;red&gt;, &lt;green&gt;, &lt;yellow&gt;, &lt;blue&gt;, &lt;magenta&gt;, &lt;cyan&gt;, &lt;white&gt;,\n     * &lt;gray&gt;, &lt;brightred&gt;, &lt;brightgreen&gt;, &lt;brightyellow&gt;, &lt;brightblue&gt;, &lt;brightmagenta&gt;, &lt;brightcyan&gt;, &lt;brightwhite&gt;,\n     * &lt;bold&gt;, &lt;dim&gt;, &lt;underline&gt; and their corresponding closing tags (e.g., &lt;/red&gt;).\n     *\n     * @param {string} text - The text to be wrapped.\n     * @param {string} code - The ANSI code to wrap the text with.\n     * @returns {string} The wrapped text with ANSI codes.\n     */\n    public wrap(text: string, code: keyof typeof ANSI_CODES): string\n    {\n        return this.enabled ? `${ANSI_CODES[code]}${text}${ANSI_CODES.reset}` : text;\n    }\n\n    /**\n     * Formats a string containing custom color/style tags into a string with ANSI escape codes.\n     *\n     * Supported tags are: &lt;black&gt;, &lt;red&gt;, &lt;green&gt;, &lt;yellow&gt;, &lt;blue&gt;, &lt;magenta&gt;, &lt;cyan&gt;, &lt;white&gt;,\n     * &lt;gray&gt;, &lt;brightred&gt;, &lt;brightgreen&gt;, &lt;brightyellow&gt;, &lt;brightblue&gt;, &lt;brightmagenta&gt;, &lt;brightcyan&gt;, &lt;brightwhite&gt;,\n     * &lt;bold&gt;, &lt;dim&gt;, &lt;underline&gt; and their corresponding closing tags (e.g., &lt;/red&gt;).\n     *\n     * @param {string} str - The input string with custom tags.\n     * @returns {string} The formatted string with ANSI escape codes.\n     */\n    public format(str: string): string\n    {\n        return str.replace(/<(\\/?)([a-z]+)>/gi, (match, isClosing, colorName) => {\n            const key: keyof typeof ANSI_CODES = colorName.toLowerCase();\n            if (! ANSI_CODES[key]) return match;\n            if (! this.enabled) return '';\n            if (isClosing) return ANSI_CODES.reset;\n            return ANSI_CODES[key];\n        });\n    }\n\n    public autoDetectSupport(): boolean\n    {\n        if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY !== undefined) {\n            return (process.stdout.isTTY && process.env['TERM'] !== 'dumb') || process.env['FORCE_COLOR'] !== undefined;\n        }\n\n        return false;\n    }\n};\n","import { State } from './State.js';\n\nexport class Deserializer\n{\n    private idToObject: Map<number, any> = new Map();\n    private heap: Record<number, any>    = {};\n    private state: State | null          = null;\n\n    public deserialize(hash: string, json: string, state: State): void\n    {\n        const data: any = JSON.parse(json);\n        this.heap       = data.heap;\n        this.state      = state;\n\n        this.idToObject.clear();\n\n        if (data.state.hash !== hash) {\n            throw new Error(`The state is incompatible with the current program. Hash mismatch: ${hash} !== ${data.state.hash}`);\n        }\n\n        state.ip = data.state.ip;\n\n        state.import({\n            scopes:    this.restore(data.state.scopes),\n            stack:     this.restore(data.state.stack),\n            frames:    this.restore(data.state.frames),\n            events:    this.restore(data.state.events),\n            sleepTime: data.state.sleepTime,\n            deltaTime: data.state.deltaTime,\n        });\n\n        this.state = null;\n    }\n\n    private restore(value: any): any\n    {\n        if (value && typeof value === 'object' && '$ref' in value) {\n            const id = value.$ref;\n\n            if (this.idToObject.has(id)) return this.idToObject.get(id);\n\n            const raw = this.heap[id];\n\n            if (raw && raw.$type === 'ModuleNamespace') {\n                const moduleObj: any = {};\n                this.idToObject.set(id, moduleObj);\n\n                const state = this.state!;\n\n                Object.defineProperty(moduleObj, '__vm_meta', {\n                    value:        {hash: raw.hash, bindings: raw.bindings},\n                    enumerable:   false,\n                    writable:     true,\n                    configurable: true,\n                });\n\n                for (const [exportName, sourceName] of Object.entries(raw.bindings)) {\n                    Object.defineProperty(moduleObj, exportName, {\n                        enumerable:   true,\n                        configurable: true,\n                        get:          () => {\n                            // [FIX] Use the local 'state' variable, NOT 'this.state'\n                            const scope = state.scopes[raw.hash];\n                            return scope ? scope[sourceName as string] : undefined;\n                        },\n                        set:          (val: any) => {\n                            // [FIX] Use the local 'state' variable, NOT 'this.state'\n                            const scope = state.scopes[raw.hash];\n                            if (scope) {\n                                scope[sourceName as string] = val;\n                            }\n                        },\n                    });\n                }\n\n                return moduleObj;\n            }\n\n            const instance = Array.isArray(raw) ? [] : {};\n            this.idToObject.set(id, instance);\n\n            for (const k in raw) {\n                (instance as any)[k] = this.restore(raw[k]);\n            }\n\n            return instance;\n        }\n\n        return value;\n    }\n}\n","export const ForbiddenKeys = new Set([\n    'constructor',\n    '__proto__',\n    'prototype',\n    'call',\n    'apply',\n    'bind',\n]);\n","// Allowed methods for Primitives (The \"Standard Lib\")\nconst ARRAY_ALLOWLIST  = new Set(['push', 'pop', 'shift', 'unshift', 'splice', 'slice', 'indexOf', 'reverse', 'sort', 'join']);\nconst STRING_ALLOWLIST = new Set(['substring', 'toLowerCase', 'toUpperCase', 'trim']);\nconst NUMBER_ALLOWLIST = new Set(['toFixed', 'toString']);\n\n// Forbidden methods on Objects (even if they exist)\nconst BANNED_OBJECT_METHODS = new Set([\n    'constructor', '__defineGetter__', '__defineSetter__',\n    'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n    'toLocaleString', 'toString', 'valueOf',\n]);\n\nexport function dispatchNative(receiver: any, name: string, args: any[]): any\n{\n    // Arrays (Intercept & Emulate)\n    if (Array.isArray(receiver)) {\n        if (! ARRAY_ALLOWLIST.has(name)) {\n            throw new Error(`Method '${name}' is not allowed on Arrays. Allowed methods: ${Array.from(ARRAY_ALLOWLIST).join(', ')}`);\n        }\n\n        return (Array.prototype as any)[name].apply(receiver, args);\n    }\n\n    // Strings (Intercept & Emulate)\n    if (typeof receiver === 'string') {\n        if (! STRING_ALLOWLIST.has(name)) {\n            throw new Error(`Method '${name}' is not allowed on Strings. Allowed methods: ${Array.from(STRING_ALLOWLIST).join(', ')}`);\n        }\n        return (String.prototype as any)[name].apply(receiver, args);\n    }\n\n    // Numbers (Intercept & Emulate)\n    if (typeof receiver === 'number') {\n        if (! NUMBER_ALLOWLIST.has(name)) {\n            throw new Error(`Method '${name}' is not allowed on Numbers. Allowed methods: ${Array.from(NUMBER_ALLOWLIST).join(', ')}`);\n        }\n\n        return (Number.prototype as any)[name].apply(receiver, args);\n    }\n\n    // Host Functions passed to the VirtualMachine options.\n    if (typeof receiver === 'object' && receiver !== null) {\n\n        if (BANNED_OBJECT_METHODS.has(name)) {\n            throw new Error(`Security Error: Call to '${name}' is forbidden.`);\n        }\n\n        const func = receiver[name];\n        if (typeof func !== 'function') {\n            throw new Error(`Property '${name}' is not a function.`);\n        }\n\n        return func.apply(receiver, args);\n    }\n\n    throw new Error(`Runtime Error: Cannot call method '${name}' on this type.`);\n}\n","// This file is auto-generated via \"scripts/generate.ts\". Do not edit directly.\nimport { Opcode, Program }   from '../Program/index.js';\nimport { ForbiddenKeys }     from './ForbiddenKeys.js';\nimport { dispatchNative }    from './NativeDispatcher.js';\nimport { State }             from './State.js';\nimport { HostClassContract } from './VirtualMachineOptions.js';\n\n/**\n * Handles instruction execution for the VM.\n *\n * This class is auto-generated. Do not edit directly.\n */\nexport abstract class InstructionSet\n{\n    protected abstract state: State;\n    protected abstract program: Program;\n    protected abstract hostFunctions: Map<string, Function>;\n    protected abstract hostClasses: Map<string, HostClassContract>;\n    protected abstract moduleCache: Record<string, any>;\n    protected abstract resolveModule: (moduleName: string) => Program | undefined;\n    protected abstract profilingEnabled: boolean;\n    protected abstract profileNow: () => number;\n    protected abstract recordOpcodeProfile: (opcode: Opcode, duration: number) => void;\n    \n    /**\n     * Executes instructions until the budget is exhausted or the VM halts.\n     *\n     * @param {number} budget The maximum number of instructions to execute.\n     * @param {number} deltaTime The time elapsed since the last execution (in milliseconds).\n     * @returns {boolean} True if the VM has halted, false otherwise.\n     */\n    protected execute(budget: number, deltaTime: number = 16.6): [number, boolean]\n    {\n        const state = this.state;\n\n        state.wallTime += deltaTime;\n        state.tickSleepTimers(deltaTime);\n\n        if (state.isSleeping) {\n            return [budget, false];\n        }\n\n        let sleeping = false;\n\n        while (budget > 0 && ! state.isHalted && ! state.isAwaitingPromise && ! sleeping) {\n            budget--;\n\n            // Note: Don't use the cached version of program/instructions here,\n            //       as the currentProgram may change due to CALL/CALL_METHOD/IMPORT.\n            const instructions = state.currentProgram.instructions;\n            if (state.ip >= instructions.length) {\n                state.isHalted = true;\n                break;\n            }\n\n            const instr = instructions[state.ip];\n            if (! instr?.op) {\n                throw new Error(`Instruction format invalid: ${JSON.stringify(instr)}`);\n            }\n\n            state.ip++; // Automatic IP Increment (Standard VM behavior)\n\n            if (this.profilingEnabled) {\n                const __profileStart = this.profileNow();\n\n                switch (instr.op) {\n                    case Opcode.ADD: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a + b);\n                        break;\n                    }\n                    case Opcode.ARRAY_PUSH: this.__op_arrayPush(instr.arg); break;\n                    case Opcode.CALL: {\n                        const operand = instr.arg;\n                        if (operand.addr !== null && operand.addr !== undefined) {\n                            state.pushCallFrame(state.ip, operand.name);\n                            state.ip = operand.addr;\n                            break;\n                        }\n                        this.__op_call(operand);\n                        break;\n                    }\n                    case Opcode.CALL_METHOD: this.__op_callMethod(instr.arg); break;\n                    case Opcode.CALL_PARENT: this.__op_callParent(instr.arg); break;\n                    case Opcode.SUPER: this.__op__super(instr.arg); break;\n                    case Opcode.CONST: state.stack.push(instr.arg); break;\n                    case Opcode.DIV: this.__op_div(instr.arg); break;\n                    case Opcode.DUP: this.__op_dup(instr.arg); break;\n                    case Opcode.EQ: this.__op_eq(instr.arg); break;\n                    case Opcode.EXP: this.__op_exp(instr.arg); break;\n                    case Opcode.EXPORT: this.__op__export(instr.arg); break;\n                    case Opcode.GET_PROP: this.__op_getProp(instr.arg); break;\n                    case Opcode.GT: this.__op_gt(instr.arg); break;\n                    case Opcode.GTE: this.__op_gte(instr.arg); break;\n                    case Opcode.HALT: this.__op_halt(instr.arg); break;\n                    case Opcode.IMPORT: this.__op__import(instr.arg); break;\n                    case Opcode.IN: this.__op__in(instr.arg); break;\n                    case Opcode.IS: this.__op_is(instr.arg); break;\n                    case Opcode.ITER_INIT: this.__op_iterInit(instr.arg); break;\n                    case Opcode.ITER_NEXT: this.__op_iterNext(instr.arg); break;\n                    case Opcode.JMP: this.__op_jmp(instr.arg); break;\n                    case Opcode.JMP_IF_FALSE: {\n                        const condition = state.stack.pop();\n                        const isTruthy = condition !== null\n                            && condition !== undefined\n                            && condition !== false\n                            && (! Array.isArray(condition) || condition.length > 0)\n                            && (typeof condition !== 'number' || condition !== 0)\n                            && (typeof condition !== 'string' || condition.length > 0);\n                        if (! isTruthy) {\n                            state.ip = instr.arg;\n                        }\n                        break;\n                    }\n                    case Opcode.JMP_IF_TRUE: this.__op_jmpIfTrue(instr.arg); break;\n                    case Opcode.LOAD: this.__op_load(instr.arg); break;\n                    case Opcode.LOAD_LOCAL: state.stack.push(state.currentLocalSlots[instr.arg]); break;\n                    case Opcode.LT: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a < b);\n                        break;\n                    }\n                    case Opcode.LTE: this.__op_lte(instr.arg); break;\n                    case Opcode.MAKE_ARRAY: this.__op_makeArray(instr.arg); break;\n                    case Opcode.MAKE_CLASS: this.__op_makeClass(instr.arg); break;\n                    case Opcode.MAKE_FUNCTION: this.__op_makeFunction(instr.arg); break;\n                    case Opcode.MAKE_METHOD: this.__op_makeMethod(instr.arg); break;\n                    case Opcode.MAKE_OBJECT: this.__op_makeObject(instr.arg); break;\n                    case Opcode.MAKE_RANGE: this.__op_makeRange(instr.arg); break;\n                    case Opcode.MOD: this.__op_mod(instr.arg); break;\n                    case Opcode.MUL: this.__op_mul(instr.arg); break;\n                    case Opcode.NEG: this.__op_neg(instr.arg); break;\n                    case Opcode.NEQ: this.__op_neq(instr.arg); break;\n                    case Opcode.NEW: this.__op__new(instr.arg); break;\n                    case Opcode.NOT: this.__op_not(instr.arg); break;\n                    case Opcode.POP: this.__op_pop(instr.arg); break;\n                    case Opcode.RET: {\n                        const fastReturnIp = state.popFastCallFrame();\n                        if (typeof fastReturnIp === 'number') {\n                            state.ip = fastReturnIp;\n                            break;\n                        }\n                        this.__op_ret(instr.arg);\n                        break;\n                    }\n                    case Opcode.SET_PROP: this.__op_setProp(instr.arg); break;\n                    case Opcode.STORE: this.__op_store(instr.arg); break;\n                    case Opcode.STORE_LOCAL: state.currentLocalSlots[instr.arg] = state.stack.pop(); break;\n                    case Opcode.SUB: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a - b);\n                        break;\n                    }\n                    case Opcode.SWAP: this.__op_swap(instr.arg); break;\n                    case Opcode.WAIT: this.__op_wait(instr.arg); break;\n                    default:\n                        throw new Error(`Unknown opcode: ${instr.op}`);\n                }\n\n                this.recordOpcodeProfile(instr.op, this.profileNow() - __profileStart);\n            } else {\n                switch (instr.op) {\n                    case Opcode.ADD: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a + b);\n                        break;\n                    }\n                    case Opcode.ARRAY_PUSH: this.__op_arrayPush(instr.arg); break;\n                    case Opcode.CALL: {\n                        const operand = instr.arg;\n                        if (operand.addr !== null && operand.addr !== undefined) {\n                            state.pushCallFrame(state.ip, operand.name);\n                            state.ip = operand.addr;\n                            break;\n                        }\n                        this.__op_call(operand);\n                        break;\n                    }\n                    case Opcode.CALL_METHOD: this.__op_callMethod(instr.arg); break;\n                    case Opcode.CALL_PARENT: this.__op_callParent(instr.arg); break;\n                    case Opcode.SUPER: this.__op__super(instr.arg); break;\n                    case Opcode.CONST: state.stack.push(instr.arg); break;\n                    case Opcode.DIV: this.__op_div(instr.arg); break;\n                    case Opcode.DUP: this.__op_dup(instr.arg); break;\n                    case Opcode.EQ: this.__op_eq(instr.arg); break;\n                    case Opcode.EXP: this.__op_exp(instr.arg); break;\n                    case Opcode.EXPORT: this.__op__export(instr.arg); break;\n                    case Opcode.GET_PROP: this.__op_getProp(instr.arg); break;\n                    case Opcode.GT: this.__op_gt(instr.arg); break;\n                    case Opcode.GTE: this.__op_gte(instr.arg); break;\n                    case Opcode.HALT: this.__op_halt(instr.arg); break;\n                    case Opcode.IMPORT: this.__op__import(instr.arg); break;\n                    case Opcode.IN: this.__op__in(instr.arg); break;\n                    case Opcode.IS: this.__op_is(instr.arg); break;\n                    case Opcode.ITER_INIT: this.__op_iterInit(instr.arg); break;\n                    case Opcode.ITER_NEXT: this.__op_iterNext(instr.arg); break;\n                    case Opcode.JMP: this.__op_jmp(instr.arg); break;\n                    case Opcode.JMP_IF_FALSE: {\n                        const condition = state.stack.pop();\n                        const isTruthy = condition !== null\n                            && condition !== undefined\n                            && condition !== false\n                            && (! Array.isArray(condition) || condition.length > 0)\n                            && (typeof condition !== 'number' || condition !== 0)\n                            && (typeof condition !== 'string' || condition.length > 0);\n                        if (! isTruthy) {\n                            state.ip = instr.arg;\n                        }\n                        break;\n                    }\n                    case Opcode.JMP_IF_TRUE: this.__op_jmpIfTrue(instr.arg); break;\n                    case Opcode.LOAD: this.__op_load(instr.arg); break;\n                    case Opcode.LOAD_LOCAL: state.stack.push(state.currentLocalSlots[instr.arg]); break;\n                    case Opcode.LT: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a < b);\n                        break;\n                    }\n                    case Opcode.LTE: this.__op_lte(instr.arg); break;\n                    case Opcode.MAKE_ARRAY: this.__op_makeArray(instr.arg); break;\n                    case Opcode.MAKE_CLASS: this.__op_makeClass(instr.arg); break;\n                    case Opcode.MAKE_FUNCTION: this.__op_makeFunction(instr.arg); break;\n                    case Opcode.MAKE_METHOD: this.__op_makeMethod(instr.arg); break;\n                    case Opcode.MAKE_OBJECT: this.__op_makeObject(instr.arg); break;\n                    case Opcode.MAKE_RANGE: this.__op_makeRange(instr.arg); break;\n                    case Opcode.MOD: this.__op_mod(instr.arg); break;\n                    case Opcode.MUL: this.__op_mul(instr.arg); break;\n                    case Opcode.NEG: this.__op_neg(instr.arg); break;\n                    case Opcode.NEQ: this.__op_neq(instr.arg); break;\n                    case Opcode.NEW: this.__op__new(instr.arg); break;\n                    case Opcode.NOT: this.__op_not(instr.arg); break;\n                    case Opcode.POP: this.__op_pop(instr.arg); break;\n                    case Opcode.RET: {\n                        const fastReturnIp = state.popFastCallFrame();\n                        if (typeof fastReturnIp === 'number') {\n                            state.ip = fastReturnIp;\n                            break;\n                        }\n                        this.__op_ret(instr.arg);\n                        break;\n                    }\n                    case Opcode.SET_PROP: this.__op_setProp(instr.arg); break;\n                    case Opcode.STORE: this.__op_store(instr.arg); break;\n                    case Opcode.STORE_LOCAL: state.currentLocalSlots[instr.arg] = state.stack.pop(); break;\n                    case Opcode.SUB: {\n                        const stack = state.stack;\n                        const b = stack.pop();\n                        const a = stack.pop();\n                        stack.push(a - b);\n                        break;\n                    }\n                    case Opcode.SWAP: this.__op_swap(instr.arg); break;\n                    case Opcode.WAIT: this.__op_wait(instr.arg); break;\n                    default:\n                        throw new Error(`Unknown opcode: ${instr.op}`);\n                }\n            }\n\n            if (instr.op === Opcode.WAIT) {\n                sleeping = state.isSleeping;\n            }\n        }\n\n        return [budget, state.isHalted];\n    }\n    \n    protected __op_add(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a + b);\n    }\n\n    protected __op_arrayPush(arg: any): void\n    {\n        const value = this.state.pop();\n        const array = this.state.pop(); // Pop the array reference\n    \n        if (! Array.isArray(array)) throw new Error('Expected array');\n    \n        array.push(value);\n    }\n\n    protected __op_call(arg: any): void\n    {\n        const operand: {\n            name: string,\n            addr: number | null, // explicitly allow null\n            args: number,\n        } = arg;\n    \n        if (operand.addr !== null && operand.addr !== undefined) {\n            this.state.pushCallFrame(this.state.ip, operand.name);\n            this.state.ip = operand.addr;\n            return;\n        }\n    \n        const hostFunction = operand.name ? this.hostFunctions.get(operand.name) : undefined;\n        if (hostFunction) {\n            const args = new Array(operand.args);\n            for (let i = operand.args - 1; i >= 0; i--) {\n                args[i] = this.state.pop();\n            }\n    \n            const result = hostFunction(...args);\n    \n            if (result instanceof Promise) {\n                this.state.isAwaitingPromise = true;\n    \n                result.then((resolved) => {\n                    this.state.push(resolved ?? null);\n                    this.state.isAwaitingPromise = false;\n                }).catch((e) => {\n                    this.state.isAwaitingPromise = false;\n                    throw e;\n                });\n    \n                return;\n            }\n    \n            this.state.push(result ?? null);\n            return;\n        }\n    \n        throw new Error(`The function \"${operand.name}\" does not exist.`);\n    }\n\n    protected __op_callMethod(arg: any): void\n    {\n        const name: string      = arg.name;\n        const argsCount: number = arg.args;\n        const receiver: any     = this.state.pop();\n    \n        if (! receiver || typeof receiver !== 'object') {\n            throw new Error(receiver\n                ? `Attempt to call method '${name}' on ${typeof receiver}.`\n                : `Attempt to call method '${name}' on an undefined value.`,\n            );\n        }\n    \n        const func = receiver[name];\n    \n        // Method is a user-defined function (bytecode).\n        if (typeof func === 'object' && func.addr !== undefined && func.prog !== undefined) {\n            const currentFrame = this.state.pushFrame(this.state.ip, {\n                name:    func.name,\n                program: func.prog,\n            });\n    \n            currentFrame.locals['this'] = receiver;\n            this.state.ip                    = func.addr;\n            return;\n        }\n    \n        // Native method call.\n        if (typeof func === 'function') {\n            const args: any[] = [];\n    \n            for (let i = 0; i < argsCount; i++) {\n                args.unshift(this.state.pop());\n            }\n    \n            const result = dispatchNative(receiver, name, args);\n            this.state.push(result);\n            return;\n        }\n    \n        throw new Error(`The method \"${name}\" does not exist on the receiver object.`);\n    }\n\n    protected __op_callParent(arg: any): void\n    {\n        const argCount: number = arg;\n        const cls: any         = this.state.pop(); // Pop \"Point\"\n    \n        if (! cls || cls.type !== 'class') {\n            throw new Error(`'super' call requires a class.`);\n        }\n    \n        if (cls.isHostClass) {\n            const hostArgs: any[] = [];\n    \n            for (let i = 0; i < argCount; i++) {\n                hostArgs.unshift(this.state.pop());\n            }\n    \n            const instance = this.state.pop();\n            const hostInstance = new cls.constructor(...hostArgs);\n    \n            Object.defineProperty(instance, '__host_target__', {\n                value:        hostInstance,\n                enumerable:   false,\n                writable:     false,\n                configurable: false,\n            });\n    \n            const allowedProperties = cls.properties ?? [];\n            for (const prop of allowedProperties) {\n                Object.defineProperty(instance, prop, {\n                    get: () => hostInstance[prop],\n                    set: (value) => { hostInstance[prop] = value; },\n                    enumerable:   true,\n                    configurable: true,\n                });\n            }\n    \n            const allowedMethods = cls.methods ?? [];\n            for (const method of allowedMethods) {\n                if (! instance?.__class?.methods[method]) {\n                    instance[method] = (...args: any[]) => hostInstance[method](...args);\n                }\n            }\n    \n            this.state.push(null);\n            return;\n        }\n    \n        if (argCount !== cls.paramCount) {\n            throw new Error(`Class \"${cls.name}\" expects ${cls.paramCount} argument${cls.paramCount === 1 ? '' : 's'}, but got ${argCount}.`);\n        }\n    \n        const thisIndex = this.state.stack.length - argCount - 1;\n        const instance  = this.state.stack[thisIndex];\n    \n        this.state.stack.splice(thisIndex, 1); // Remove 'this' from the stack.\n    \n        const frame = this.state.pushFrame(this.state.ip, {\n            name:    `super ${cls.name}`,\n            program: cls.prog,\n        });\n    \n        frame.locals['this'] = instance;\n        this.state.ip             = cls.constructorAddr;\n    }\n\n    protected __op__super(arg: any): void\n    {\n        const operand: { name: string, args: number, callee: string } = arg;\n        const {name, args, callee}                                    = operand;\n    \n        const thisIndex = this.state.stack.length - args - 1;\n    \n        const instance = this.state.stack[thisIndex];\n        if (! instance) {\n            throw new Error(`Attempt to call parent method \"${name}\" on an undefined value.`);\n        }\n    \n        const cls = instance.__class;\n        if (! cls) {\n            throw new Error(`Instance has no class to call super method \"${name}\" on.`);\n        }\n    \n        const ownerClass = this.state.getVar(callee);\n        const parent     = ownerClass.parent;\n    \n        if (! parent) {\n            throw new Error(`Class \"${cls.name}\" has no parent to call \"${name}\" on.`);\n        }\n    \n        if (parent.isHostClass) {\n            if (! parent.methods.includes(name)) {\n                throw new Error(`Method \"${name}\" not found in parent host class \"${parent.name}\".`);\n            }\n    \n            const hostArgs: any[] = [];\n    \n            for (let i = 0; i < args; i++) {\n                hostArgs.unshift(this.state.pop());\n            }\n    \n            this.state.pop(); // Pop 'this'\n            this.state.push(instance.__host_target__[name](...hostArgs));\n            return;\n        }\n    \n        const method = parent.methods[name];\n        if (! method) {\n            throw new Error(`Method \"${name}\" not found in parent class \"${parent.name}\".`);\n        }\n    \n        const frame = this.state.pushFrame(this.state.ip, {\n            program: method.prog,\n            name:    `parent.${name}`,\n        });\n    \n        frame.locals['this'] = instance;\n        this.state.ip             = method.addr;\n    }\n\n    protected __op_constant(arg: any): void\n    {\n        this.state.push(arg);\n    }\n\n    protected __op_div(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a / b);\n    }\n\n    protected __op_dup(arg: any): void\n    {\n        const val = this.state.peek();\n    \n        this.state.push(val);\n    }\n\n    protected __op_eq(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a == b);\n    }\n\n    protected __op_exp(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a ** b);\n    }\n\n    protected __op__export(arg: any): void\n    {\n        const exportName = this.state.pop();\n        const sourceName = this.state.pop();\n        const frame      = this.state.topMutableFrame;\n    \n        if (! frame) return;\n    \n        const moduleHash = frame.program.hash;\n        const exports    = frame.exports;\n    \n        // 1. Metadata setup (Same as before)\n        if (! Object.prototype.hasOwnProperty.call(exports, '__vm_meta')) {\n            Object.defineProperty(exports, '__vm_meta', {\n                value:        {\n                    hash:     moduleHash,\n                    bindings: {} as Record<string, string>,\n                },\n                enumerable:   false,\n                writable:     true,\n                configurable: true,\n            });\n        }\n    \n        exports.__vm_meta.bindings[exportName] = sourceName;\n    \n        // 2. Define Getter AND Setter\n        Object.defineProperty(exports, exportName, {\n            enumerable:   true,\n            configurable: true,\n            get:          () => {\n                const scope = this.state.scopes[moduleHash];\n                return scope ? scope[sourceName] : undefined;\n            },\n            set:          (val: any) => {\n                const scope = this.state.scopes[moduleHash];\n                if (scope) {\n                    scope[sourceName] = val;\n                }\n            },\n        });\n    }\n\n    protected __op_getProp(arg: any): void\n    {\n        const key: string = this.state.pop();\n        const obj: any    = this.state.pop();\n    \n        if (ForbiddenKeys.has(key)) {\n            throw new Error(`Access to property \"${key}\" is forbidden.`);\n        }\n    \n        if (Array.isArray(obj)) {\n            if (key === 'length' || key === 'size') {\n                this.state.push(obj.length);\n                return;\n            }\n    \n            const index = Number(key);\n            if (isNaN(index)) throw new Error(`Array index must be a number, got \"${key}\".`);\n            if (index < 0 || index >= obj.length) throw new Error(`The index #${index} is out of bounds [0] - [${obj.length - 1}].`);\n    \n            this.state.push(obj[index]);\n        } else if (obj instanceof Map) {\n            const val = obj.get(key);\n            this.state.push(val === undefined ? null : val);\n        } else if (obj && typeof obj === 'object') {\n            if (! (key in obj)) {\n                const o = arg ? `\"${arg}\"` : '\"object\"';\n                throw new Error(`The property \"${key}\" does not exist on ${o}.`);\n            }\n    \n            const val = obj[key];\n            this.state.push(val === undefined ? null : val);\n        } else {\n            const target = arg ? `'${arg}'` : 'object';\n            throw new Error(`Cannot access property \"${key}\" of \"${target}\" because \"${target}\" is not defined.`);\n        }\n    }\n\n    protected __op_gt(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a > b);\n    }\n\n    protected __op_gte(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a >= b);\n    }\n\n    protected __op_halt(arg: any): void\n    {\n        this.state.isHalted = true;\n    }\n\n    protected __op__import(arg: any): void\n    {\n        // 1. Cache Check\n        if (this.moduleCache[arg]) {\n            const moduleExports = this.moduleCache[arg];\n    \n            if (typeof moduleExports !== 'object') {\n                throw new Error(`Cached module is invalid: ${arg}`);\n            }\n    \n            // 2. Handle Cached Module (No instructions)\n            if (! moduleExports.instructions) {\n                this.state.push(moduleExports);\n                return;\n            }\n    \n            // 3. Execution Setup (The Context Switch)\n            this.state.pushFrame(this.state.ip, {\n                isModule:   true,\n                program:    moduleExports,\n                moduleName: arg,\n            });\n    \n            this.state.ip = 0;\n            return;\n        }\n    \n        const moduleProgram = this.resolveModule(arg);\n        if (! moduleProgram || typeof moduleProgram !== 'object') {\n            throw new Error(`The module \"${arg}\" does not exist.`);\n        }\n    \n        // 3. Handle Native/JSON Modules (No instructions)\n        if (! moduleProgram.instructions) {\n            this.state.push(moduleProgram);\n            // Save to cache immediately since there is no execution step\n            this.moduleCache[arg] = moduleProgram;\n            return;\n        }\n    \n        // 4. Execution Setup (The Context Switch)\n        this.state.pushFrame(this.state.ip, {\n            isModule:   true,\n            program:    moduleProgram,\n            moduleName: arg,\n        });\n    \n        this.state.ip = 0;\n    }\n\n    protected __op__in(arg: any): void\n    {\n        const container = this.state.pop(); // The haystack (array, string, object)\n        const item      = this.state.pop(); // The needle\n    \n        if (container == null) {\n            throw new Error('Argument \\'in\\' null/undefined is invalid.');\n        }\n    \n        if (Array.isArray(container)) {\n            this.state.push(container.includes(item));\n            return;\n        }\n    \n        if (typeof container === 'string') {\n            // Enforce string-to-string comparison to avoid \"true\" in \"string\" weirdness\n            this.state.push(container.includes(String(item)));\n            return;\n        }\n    \n        if (container instanceof Map) {\n            this.state.push(container.has(item));\n            return;\n        }\n    \n        if (typeof container === 'object') {\n            this.state.push(item in container);\n            return;\n        }\n    \n        throw new Error(`Runtime Error: 'in' operator not supported for type '${typeof container}'`);\n    }\n\n    protected __op_is(arg: any): void\n    {\n        const targetClass = this.state.pop(); // The Class (RHS)\n        const instance    = this.state.pop(); // The Object (LHS)\n    \n        // 1. Safety Check: If LHS is null/undefined, it is not an instance of anything.\n        if (instance === null || instance === undefined) {\n            this.state.push(false);\n            return;\n        }\n    \n        // 2. Validation: RHS must be a Class (Luma or Host)\n        if (!targetClass || (targetClass.type !== 'class' && targetClass.type !== 'Blueprint')) {\n            // Optional: Support \"is String\" / \"is Number\" if you expose those as globals later.\n            throw new Error(\"Right-hand side of 'is' must be a Class.\");\n        }\n    \n        // --- CASE A: Host Class Check ---\n        if (targetClass.isHostClass) {\n            // 1. Is the instance a raw JS object?\n            if (instance instanceof targetClass.constructor) {\n                this.state.push(true);\n                return;\n            }\n    \n            // 2. Is it a Luma Wrapper around a Host Object? (created via new HostClass)\n            if (instance.__host_target__ && instance.__host_target__ instanceof targetClass.constructor) {\n                this.state.push(true);\n                return;\n            }\n    \n            this.state.push(false);\n            return;\n        }\n    \n        // --- CASE B: Luma Class Check (Walk the Chain) ---\n    \n        // Get the class of the instance\n        // Note: Adjust property name based on your exact object structure (__class vs __blueprint)\n        let currentClass = instance.__class || instance.__blueprint;\n    \n        while (currentClass) {\n            // Found a match?\n            // We compare references (memory addresses) of the class objects.\n            if (currentClass === targetClass) {\n                this.state.push(true);\n                return;\n            }\n    \n            // Move up the chain\n            currentClass = currentClass.parent;\n        }\n    \n        this.state.push(false);\n    }\n\n    protected __op_iterInit(arg: any): void\n    {\n        this.state.push({items: this.state.pop(), index: 0});\n    }\n\n    protected __op_iterNext(arg: any): void\n    {\n        const iterator = this.state.peek();\n    \n        if (! iterator) {\n            throw new Error('Iterator expected on stack');\n        }\n    \n        if (iterator.index >= iterator.items.length) {\n            this.state.pop();\n            this.state.ip = arg;\n            return;\n        }\n    \n        const item = iterator.items[iterator.index];\n        iterator.index++;\n        this.state.push(item);\n    }\n\n    protected __op_jmp(arg: any): void\n    {\n        this.state.ip = arg;\n    }\n\n    protected __op_jmpIfFalse(arg: any): void\n    {\n        const condition = this.state.pop();\n        const isTruthy = condition !== null\n            && condition !== undefined\n            && condition !== false\n            && (! Array.isArray(condition) || condition.length > 0)\n            && (typeof condition !== 'number' || condition !== 0)\n            && (typeof condition !== 'string' || condition.length > 0);\n    \n        if (! isTruthy) {\n            this.state.ip = arg;\n        }\n    }\n\n    protected __op_jmpIfTrue(arg: any): void\n    {\n        const condition = this.state.pop();\n        const isTruthy = condition !== null\n            && condition !== undefined\n            && condition !== false\n            && (! Array.isArray(condition) || condition.length > 0)\n            && (typeof condition !== 'number' || condition !== 0)\n            && (typeof condition !== 'string' || condition.length > 0);\n    \n        if (isTruthy) {\n            this.state.ip = arg;\n        }\n    }\n\n    protected __op_load(arg: any): void\n    {\n        const hostClass = this.hostClasses.get(arg);\n        if (hostClass) {\n            this.state.push({\n                type:        'class',\n                name:        arg,\n                isHostClass: true,\n                ...hostClass,\n            });\n    \n            return;\n        }\n    \n        this.state.push(this.state.getVar(arg));\n    }\n\n    protected __op_loadLocal(arg: any): void\n    {\n        this.state.push(this.state.currentLocalSlots[arg]);\n    }\n\n    protected __op_lt(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a < b);\n    }\n\n    protected __op_lte(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a <= b);\n    }\n\n    protected __op_makeArray(arg: any): void\n    {\n        const arr: any[] = [];\n    \n        for (let i: number = 0; i < arg; i++) {\n            arr.unshift(this.state.pop());\n        }\n    \n        this.state.push(arr);\n    }\n\n    protected __op_makeClass(arg: any): void\n    {\n        const [name, addr, paramCount] = arg;\n    \n        const parent = this.state.pop();\n    \n        if (parent !== null && parent.type !== 'class') {\n            throw new Error(`Runtime Error: Class '${name}' extends a non-class value (${parent?.type || 'null'}).`);\n        }\n    \n        const cls = {\n            type:            'class',\n            name:            name,\n            constructorAddr: addr,\n            paramCount:      paramCount || 0,\n            methods:         {},\n            prog:            this.state.currentProgram,\n            parent:          undefined,\n        };\n    \n        if (parent) {\n            Object.setPrototypeOf(cls.methods, parent.methods);\n            cls.parent = parent;\n        }\n    \n        this.state.push(cls);\n    }\n\n    protected __op_makeFunction(arg: any): void\n    {\n        this.state.push({\n            type: 'ScriptFunction',\n            addr: arg.addr,\n            args: arg.args,\n            name: arg.name,\n            prog: this.state.currentProgram,\n        });\n    }\n\n    protected __op_makeMethod(arg: any): void\n    {\n        const methodFunc = this.state.pop(); // The ScriptFunction object\n        const cls        = this.state.pop(); // The Class object\n    \n        if (! cls || ! cls.methods) {\n            throw new Error('Runtime Error: Cannot add method to non-class.');\n        }\n    \n        cls.methods[methodFunc.name] = methodFunc;\n    }\n\n    protected __op_makeObject(arg: any): void\n    {\n        const obj: Record<string, any> = {};\n    \n        // Mark this object as a VM object with a hidden property\n        Object.defineProperty(obj, '__is_vm_object__', {\n            value:        true,\n            enumerable:   false,\n            writable:     false,\n            configurable: false,\n        });\n    \n        for (let i = 0; i < arg; i++) {\n            const val = this.state.pop();\n            const key = this.state.pop();\n            obj[key]  = val;\n        }\n    \n        this.state.push(obj);\n    }\n\n    protected __op_makeRange(arg: any): void\n    {\n        const end: number   = this.state.pop();\n        const start: number = this.state.pop();\n        const arr: number[] = [];\n    \n        for (let i: number = start; i < end; i++) {\n            arr.push(i);\n        }\n    \n        this.state.push(arr);\n    }\n\n    protected __op_mod(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a % b);\n    }\n\n    protected __op_mul(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a * b);\n    }\n\n    protected __op_neg(arg: any): void\n    {\n        const value = this.state.pop();\n        this.state.push(-value);\n    }\n\n    protected __op_neq(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a != b);\n    }\n\n    protected __op__new(arg: any): void\n    {\n        const cls: any        = this.state.pop();\n        const numArgs: number = arg;\n    \n        if (! cls || cls.type !== 'class') {\n            throw new Error('\\'new\\' requires a class.');\n        }\n    \n        if (cls.isHostClass) {\n            const hostArgs: any[] = [];\n    \n            for (let i = 0; i < numArgs; i++) {\n                hostArgs.unshift(this.state.pop());\n            }\n    \n            const allowedProperties = cls.properties ?? [];\n            const allowedMethods    = cls.methods ?? [];\n            const hostInstance      = new cls.constructor(...hostArgs);\n            const instance: any     = {};\n    \n            // Add live bindings for allowed properties and methods.\n            for (const prop of allowedProperties) {\n                Object.defineProperty(instance, prop, {\n                    get:          () => hostInstance[prop],\n                    set:          (value) => {\n                        hostInstance[prop] = value;\n                    },\n                    enumerable:   true,\n                    configurable: false,\n                });\n            }\n    \n            for (const method of allowedMethods) {\n                if (typeof hostInstance[method] === 'function') {\n                    instance[method] = (...args: any[]) => hostInstance[method](...args);\n                }\n            }\n    \n            instance.__class = cls;\n            this.state.push(instance);\n            return;\n        }\n    \n        const instance: any = Object.create(cls.methods);\n        instance.__class    = cls;\n    \n        // Mark this object as a VM object with a hidden property\n        Object.defineProperty(instance, '__is_vm_object__', {\n            value:        true,\n            enumerable:   false,\n            writable:     false,\n            configurable: false,\n        });\n    \n        const frame = this.state.pushFrame(this.state.ip, {\n            program: cls.prog,\n            name:    `new ${cls.name}`,\n        });\n    \n        frame.locals['this'] = instance;\n        this.state.ip             = cls.constructorAddr;\n    }\n\n    protected __op_not(arg: any): void\n    {\n        const value = this.state.pop();\n        this.state.push(! value);\n    }\n\n    protected __op_pop(arg: any): void\n    {\n        this.state.pop();\n    }\n\n    protected __op_ret(arg: any): void\n    {\n        const fastReturnIp = this.state.popFastCallFrame();\n        if (typeof fastReturnIp === 'number') {\n            this.state.ip = fastReturnIp;\n            return;\n        }\n    \n        const frame = this.state.popFrame();\n    \n        if (! frame) {\n            this.state.isHalted = true;\n            return;\n        }\n    \n        this.state.ip = frame.returnIp;\n    \n        if (frame.isInterrupt) {\n            this.state.pop(); // Clean the returned value from the stack.\n    \n            if (this.state.eventQueue.length > 0) {\n                // A. Get the next event\n                const nextEvent = this.state.eventQueue.shift()!;\n                const eventInfo =this.program.references.events[nextEvent.name];\n    \n                    // B. Push Args for the NEXT event\n                    for (let i = 0; i < eventInfo.numArgs; i++) {\n                        this.state.push(nextEvent.args[i] ?? null);\n                    }\n    \n                // C. Push a NEW Interrupt Frame\n                // CRITICAL: We reuse the 'returnIp' from the frame we JUST popped.\n                // This ensures that when the chain finally ends, we go back to the Main Script.\n                this.state.pushFrame(frame.returnIp, {\n                    name:        `<interrupt:${nextEvent.name}>`,\n                    isInterrupt: true,\n                });\n    \n                // D. Jump to the next event\n                this.state.ip = eventInfo.address;\n    \n                // We are done. We do NOT restore this.state.ip from the old frame yet.\n                return;\n            }\n    \n            // 3. Chain Empty? Now we actually return to the Main Script.\n            this.state.ip = frame.returnIp;\n            return;\n        }\n    \n        if (frame.isModule) {\n            const exports     = {};\n            const descriptors = Object.getOwnPropertyDescriptors(frame.exports);\n            Object.defineProperties(exports, descriptors);\n    \n            if (frame.moduleName) {\n                this.moduleCache[frame.moduleName] = exports;\n            }\n    \n            this.state.push(exports);\n        }\n    }\n\n    protected __op_setProp(arg: any): void\n    {\n        const val = this.state.pop();\n        const key = this.state.pop();\n        const obj = this.state.pop();\n    \n        if (ForbiddenKeys.has(key)) {\n            throw new Error(`Access to property \"${key}\" is forbidden.`);\n        }\n    \n        if (Array.isArray(obj)) {\n            const index = Number(key);\n    \n            if (isNaN(index)) {\n                throw new Error(`Runtime Error: Array index must be a number, got '${key}'`);\n            }\n    \n            obj[index] = val;\n        } else if (obj instanceof Map) {\n            obj.set(key, val);\n        } else if (obj && typeof obj === 'object') {\n            if (! obj.__is_vm_object__ && ! (key in obj)) {\n                throw new Error(`Cannot create new property \"${key}\" on host-provided object.`);\n            }\n    \n            obj[key] = val;\n        } else {\n            const target = arg ? `'${arg}'` : 'object';\n            throw new Error(`Cannot set property \"${key}\" of \"${target}\" because \"${target}\" is not defined.`);\n        }\n    \n        this.state.push(val);\n    }\n\n    protected __op_store(arg: any): void\n    {\n        const [name, isLocal] = arg;\n        const value           = this.state.pop();\n    \n        this.state.setVar(name, value, isLocal ?? false);\n    }\n\n    protected __op_storeLocal(arg: any): void\n    {\n        this.state.currentLocalSlots[arg] = this.state.pop();\n    }\n\n    protected __op_sub(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(a - b);\n    }\n\n    protected __op_swap(arg: any): void\n    {\n        const b = this.state.pop();\n        const a = this.state.pop();\n    \n        this.state.push(b);\n        this.state.push(a);\n    }\n\n    protected __op_wait(arg: any): void\n    {\n        const duration = this.state.pop();\n    \n        if (typeof duration !== 'number' || duration < 0) {\n            throw new Error(`Invalid duration for WAIT: ${duration}`);\n        }\n    \n        // Check if we are inside a function/interrupt\n        if (this.state.hasFrames) {\n            this.state.setTopSleepTimer(duration);\n        } else {\n            // Otherwise, we are pausing the Main Script\n            this.state.sleepTime = duration;\n        }\n    }\n}\n","import { State } from './State.js';\n\nexport class Serializer\n{\n    private idCounter: number            = 0;\n    private objectToId: Map<any, number> = new Map();\n    private heap: Record<number, any>    = {};\n\n    public serialize(hash: string, state: State): string\n    {\n        this.reset();\n\n        const serializedState = {\n            hash,\n            ip:        state.ip,\n            stack:     this.process(state.stack),\n            scopes:    this.process(state.scopes),\n            frames:    this.process(state.frames),\n            events:    this.process(state.eventQueue),\n            sleepTime: state.sleepTime,\n            deltaTime: state.deltaTime,\n        };\n\n        return JSON.stringify({\n            state: serializedState,\n            heap:  this.heap,\n        });\n    }\n\n    private reset(): void\n    {\n        this.idCounter = 0;\n        this.objectToId.clear();\n        this.heap = {};\n    }\n\n    private process(value: any): any\n    {\n        if (! value || typeof value !== 'object') return value;\n\n        if (this.objectToId.has(value)) {\n            return {$ref: this.objectToId.get(value)};\n        }\n\n        const id = ++this.idCounter;\n        this.objectToId.set(value, id);\n\n        if (Object.prototype.hasOwnProperty.call(value, '__vm_meta')) {\n            const meta = value.__vm_meta;\n\n            this.heap[id] = {\n                $type:    'ModuleNamespace',\n                hash:     meta.hash,\n                bindings: meta.bindings,\n            };\n\n            return {$ref: id};\n        }\n\n        const data: any = Array.isArray(value) ? [] : {};\n        for (const k in value) {\n            data[k] = this.process(value[k]);\n        }\n\n        this.heap[id] = data;\n\n        return {$ref: id};\n    }\n}\n","import { Program } from '../Program/index.js';\n\nexport type StackFrame = {\n    ip: number;\n    program: Program;\n    returnIp: number;\n    name: string;\n    isInterrupt: boolean;\n    isModule: boolean;\n    moduleName?: string;\n    locals: Record<string, any>;\n    localSlots: any[];\n    exports: Record<string, any>;\n    sleepTimer: number;\n    isFastCall?: boolean;\n}\n\ntype VMEvent = {\n    name: string;\n    args: any[];\n}\n\ntype ModuleScopeMap = Record<string, Record<string, any>>;\n\nconst FRAME_KIND_SLOW = 0;\nconst FRAME_KIND_FAST = 1;\n\n/**\n * Represents the current state of the virtual machine.\n *\n * All data inside the State must be considered volatile and can change at any\n * time.\n */\nexport class State\n{\n    public ip: number = 0;\n    public isHalted: boolean = false;\n    public sleepTime: number = 0;\n    public deltaTime: number = 0;\n    public wallTime: number = 0;\n    public isAwaitingPromise: boolean = false;\n\n    private _program: Program;\n    private _mainScope: Record<string, any>;\n    private _programs: Record<string, Program> = {};\n    private _stack: any[]                      = [];\n    private _frames: StackFrame[]              = [];\n    private _eventQueue: VMEvent[]             = [];\n    private _scopes: ModuleScopeMap            = {};\n\n    // Mixed frame stack:\n    // - Slow frames are stored as full objects in _frames.\n    // - Fast call frames are stored in compact parallel arrays.\n    private _frameKinds: number[]              = [];\n    private _fastReturnIps: number[]           = [];\n    private _fastIps: number[]                 = [];\n    private _fastPrograms: Program[]           = [];\n    private _fastNames: string[]               = [];\n    private _fastModuleNames: (string | undefined)[] = [];\n    private _fastSleepTimers: number[]         = [];\n    private _fastLocalSlots: any[][]           = [];\n    private _fastLocals: Array<Record<string, any> | null> = [];\n\n    private _topSlowFrame: StackFrame | null   = null;\n    private _currentProgram: Program;\n    private _currentScope: Record<string, any>;\n    public currentLocalSlots: any[];\n\n    constructor(program: Program, globals: Record<string, any> = {})\n    {\n        this._program                = program;\n        this._programs[program.hash] = program;\n        this._scopes[program.hash]   = globals;\n        this._mainScope              = globals;\n        this._currentProgram         = program;\n        this._currentScope           = globals;\n        this.currentLocalSlots       = [];\n    }\n\n    public get currentProgram(): Program\n    {\n        return this._currentProgram;\n    }\n\n    public import(data: {\n        stack?: any[];\n        programs?: Record<string, Program>,\n        frames?: StackFrame[];\n        scopes?: Record<string, any>,\n        events?: VMEvent[],\n        sleepTime?: number\n        deltaTime?: number\n    })\n    {\n        if (data.stack) {\n            this._stack = data.stack;\n        }\n\n        if (data.programs) {\n            this._programs = data.programs;\n        }\n\n        if (data.scopes) {\n            this._scopes = data.scopes;\n            this._mainScope = this._scopes[this._program.hash] ?? {};\n        }\n\n        if (data.events) {\n            this._eventQueue = data.events;\n        }\n\n        if (typeof data.sleepTime === 'number') {\n            this.sleepTime = data.sleepTime;\n        }\n\n        if (typeof data.deltaTime === 'number') {\n            this.deltaTime = data.deltaTime;\n        }\n\n        if (data.frames) {\n            this._frames = [];\n            this._frameKinds = [];\n            this._fastReturnIps = [];\n            this._fastIps = [];\n            this._fastPrograms = [];\n            this._fastNames = [];\n            this._fastModuleNames = [];\n            this._fastSleepTimers = [];\n            this._fastLocalSlots = [];\n            this._fastLocals = [];\n\n            for (const frame of data.frames) {\n                if (frame.isFastCall) {\n                    this._frameKinds.push(FRAME_KIND_FAST);\n                    this._fastReturnIps.push(frame.returnIp);\n                    this._fastIps.push(frame.ip);\n                    this._fastPrograms.push(frame.program);\n                    this._fastNames.push(frame.name);\n                    this._fastModuleNames.push(frame.moduleName);\n                    this._fastSleepTimers.push(frame.sleepTimer ?? 0);\n                    this._fastLocalSlots.push(Array.isArray(frame.localSlots) ? frame.localSlots : []);\n                    this._fastLocals.push(frame.locals ?? null);\n                } else {\n                    if (! Array.isArray(frame.localSlots)) frame.localSlots = [];\n                    if (! frame.locals) frame.locals = {};\n                    if (! frame.exports) frame.exports = {};\n                    this._frames.push(frame);\n                    this._frameKinds.push(FRAME_KIND_SLOW);\n                }\n            }\n        }\n\n        this._topSlowFrame = this._frames.length > 0 ? this._frames[this._frames.length - 1] : null;\n        this.refreshExecutionContext();\n    }\n\n    public get stack(): any[]\n    {\n        return this._stack;\n    }\n\n    public get frames(): StackFrame[]\n    {\n        const result: StackFrame[] = [];\n        let slowIndex = 0;\n        let fastIndex = 0;\n\n        for (const kind of this._frameKinds) {\n            if (kind === FRAME_KIND_SLOW) {\n                result.push(this._frames[slowIndex++]);\n            } else {\n                result.push({\n                    returnIp:    this._fastReturnIps[fastIndex],\n                    ip:          this._fastIps[fastIndex],\n                    program:     this._fastPrograms[fastIndex],\n                    name:        this._fastNames[fastIndex],\n                    isInterrupt: false,\n                    isModule:    false,\n                    moduleName:  this._fastModuleNames[fastIndex],\n                    sleepTimer:  this._fastSleepTimers[fastIndex],\n                    locals:      this._fastLocals[fastIndex] ?? {},\n                    localSlots:  this._fastLocalSlots[fastIndex],\n                    exports:     {},\n                    isFastCall:  true,\n                });\n                fastIndex++;\n            }\n        }\n\n        return result;\n    }\n\n    public get scopes(): Record<string, any>\n    {\n        return this._scopes;\n    }\n\n    public get eventQueue(): VMEvent[]\n    {\n        return this._eventQueue;\n    }\n\n    public get programs(): Record<string, Program>\n    {\n        return this._programs;\n    }\n\n    public push(val: any)\n    {\n        this._stack.push(val);\n    }\n\n    public pop(): any\n    {\n        return this._stack.pop();\n    }\n\n    public peek(): any\n    {\n        return this._stack[this._stack.length - 1];\n    }\n\n    public pushFrame(returnIp: number, options: PushFrameOptions | string = {}): StackFrame\n    {\n        if (typeof options === 'string') {\n            this.pushCallFrame(returnIp, options);\n\n            return this.topFrame!;\n        }\n\n        const currentProgram = this._currentProgram;\n        const program        = options.program ?? currentProgram;\n        const scopeName      = program.hash;\n        if (typeof this._scopes[scopeName] === 'undefined') {\n            this._scopes[scopeName] = {};\n        }\n\n        if (typeof this._programs[scopeName] === 'undefined') {\n            this._programs[scopeName] = program;\n        } else if (options.program && this._programs[scopeName] !== options.program) {\n            throw new Error(`Program hash collision detected: ${scopeName}`);\n        }\n\n        const frame = {\n            returnIp,\n            ip:          this.ip,\n            program,\n            name:        options.name ?? '<anonymous>',\n            isInterrupt: options.isInterrupt ?? false,\n            isModule:    options.isModule ?? false,\n            moduleName:  options.moduleName ?? options.program?.moduleName ?? this.topModuleName,\n            sleepTimer:  0,\n            locals:      {},\n            localSlots:  [],\n            exports:     {},\n            isFastCall:  false,\n        } satisfies StackFrame;\n\n        this._frames.push(frame);\n        this._frameKinds.push(FRAME_KIND_SLOW);\n        this._topSlowFrame = frame;\n\n        this._currentProgram = frame.program;\n        this._currentScope = this._scopes[scopeName];\n        this.currentLocalSlots = frame.localSlots;\n\n        return frame;\n    }\n\n    public pushCallFrame(returnIp: number, name: string): void\n    {\n        const program   = this._currentProgram;\n        const scopeName = program.hash;\n\n        this._frameKinds.push(FRAME_KIND_FAST);\n        this._fastReturnIps.push(returnIp);\n        this._fastIps.push(this.ip);\n        this._fastPrograms.push(program);\n        this._fastNames.push(name);\n        this._fastModuleNames.push(this.topModuleName);\n        this._fastSleepTimers.push(0);\n        this._fastLocalSlots.push([]);\n        this._fastLocals.push(null);\n\n        this._currentProgram = program;\n        this._currentScope = this._scopes[scopeName] ?? this._mainScope;\n        this.currentLocalSlots = this._fastLocalSlots[this._fastLocalSlots.length - 1];\n    }\n\n    public popFastCallFrame(): number | undefined\n    {\n        if (this._frameKinds.length === 0 || this._frameKinds[this._frameKinds.length - 1] !== FRAME_KIND_FAST) {\n            return undefined;\n        }\n\n        this._frameKinds.pop();\n        this._fastIps.pop();\n        this._fastPrograms.pop();\n        this._fastNames.pop();\n        this._fastModuleNames.pop();\n        this._fastSleepTimers.pop();\n        this._fastLocalSlots.pop();\n        this._fastLocals.pop();\n        const returnIp = this._fastReturnIps.pop();\n\n        this.refreshExecutionContext();\n\n        return returnIp;\n    }\n\n    public popFrame(): StackFrame | undefined\n    {\n        if (this._frameKinds.length === 0) {\n            return undefined;\n        }\n\n        const kind = this._frameKinds[this._frameKinds.length - 1];\n        if (kind === FRAME_KIND_FAST) {\n            const returnIp = this.popFastCallFrame();\n            if (typeof returnIp !== 'number') {\n                return undefined;\n            }\n\n            return {\n                returnIp,\n                ip:          this.ip,\n                program:     this._currentProgram,\n                name:        '<fast>',\n                isInterrupt: false,\n                isModule:    false,\n                moduleName:  this.topModuleName,\n                sleepTimer:  0,\n                locals:      {},\n                localSlots:  [],\n                exports:     {},\n                isFastCall:  true,\n            };\n        }\n\n        this._frameKinds.pop();\n        const popped = this._frames.pop();\n        this._topSlowFrame = this._frames.length > 0 ? this._frames[this._frames.length - 1] : null;\n        this.refreshExecutionContext();\n\n        return popped;\n    }\n\n    public get topFrame(): StackFrame | null\n    {\n        if (this._frameKinds.length === 0) {\n            return null;\n        }\n\n        const topKind = this._frameKinds[this._frameKinds.length - 1];\n        if (topKind === FRAME_KIND_SLOW) {\n            return this._topSlowFrame;\n        }\n\n        const i = this._fastReturnIps.length - 1;\n\n        return {\n            returnIp:    this._fastReturnIps[i],\n            ip:          this._fastIps[i],\n            program:     this._fastPrograms[i],\n            name:        this._fastNames[i],\n            isInterrupt: false,\n            isModule:    false,\n            moduleName:  this._fastModuleNames[i],\n            sleepTimer:  this._fastSleepTimers[i],\n            locals:      this._fastLocals[i] ?? {},\n            localSlots:  this._fastLocalSlots[i],\n            exports:     {},\n            isFastCall:  true,\n        };\n    }\n\n    public get topMutableFrame(): StackFrame | null\n    {\n        if (this._frameKinds.length === 0) {\n            return null;\n        }\n\n        const topKind = this._frameKinds[this._frameKinds.length - 1];\n        if (topKind !== FRAME_KIND_SLOW) {\n            return null;\n        }\n\n        return this._topSlowFrame;\n    }\n\n    public get numFrames(): number\n    {\n        return this._frameKinds.length;\n    }\n\n    public get hasFrames(): boolean\n    {\n        return this._frameKinds.length > 0;\n    }\n\n    public getVar(name: string): any\n    {\n        if (this._frameKinds.length > 0) {\n            const topKind = this._frameKinds[this._frameKinds.length - 1];\n\n            if (topKind === FRAME_KIND_SLOW) {\n                const locals = this._topSlowFrame?.locals;\n                if (locals && name in locals) {\n                    return locals[name];\n                }\n            } else {\n                const locals = this._fastLocals[this._fastLocals.length - 1];\n                if (locals && name in locals) {\n                    return locals[name];\n                }\n            }\n        }\n\n        const scope = this._currentScope;\n        if (scope && name in scope) {\n            return scope[name];\n        }\n\n        if (name in this._mainScope) {\n            return this._mainScope[name];\n        }\n\n        throw new Error(`The variable \"${name}\" is not defined.`);\n    }\n\n    public setVar(name: string, value: any, local: boolean = false)\n    {\n        const topKind = this._frameKinds.length > 0 ? this._frameKinds[this._frameKinds.length - 1] : null;\n        const scope   = this._currentScope;\n        const topSlowFrame = this._topSlowFrame;\n\n        if (local && topKind !== null) {\n            if (topKind === FRAME_KIND_SLOW) {\n                topSlowFrame!.locals[name] = value;\n            } else {\n                let locals = this._fastLocals[this._fastLocals.length - 1];\n                if (! locals) {\n                    locals = {};\n                    this._fastLocals[this._fastLocals.length - 1] = locals;\n                }\n                locals[name] = value;\n            }\n            return;\n        }\n\n        // Module top-level bindings must live in module scope so EXPORT accessors\n        // can resolve them reliably across imports.\n        if (topKind === FRAME_KIND_SLOW && topSlowFrame?.isModule) {\n            if (scope) {\n                scope[name] = value;\n                return;\n            }\n        }\n\n        if (topKind === FRAME_KIND_SLOW) {\n            const locals = topSlowFrame!.locals;\n            if (typeof locals[name] !== 'undefined') {\n                locals[name] = value;\n                return;\n            }\n        } else if (topKind === FRAME_KIND_FAST) {\n            const locals = this._fastLocals[this._fastLocals.length - 1];\n            if (locals && typeof locals[name] !== 'undefined') {\n                locals[name] = value;\n                return;\n            }\n        }\n\n        if (scope && typeof scope[name] !== 'undefined') {\n            scope[name] = value;\n            return;\n        }\n\n        if (topKind === FRAME_KIND_SLOW) {\n            topSlowFrame!.locals[name] = value;\n        } else if (topKind === FRAME_KIND_FAST) {\n            let locals = this._fastLocals[this._fastLocals.length - 1];\n            if (! locals) {\n                locals = {};\n                this._fastLocals[this._fastLocals.length - 1] = locals;\n            }\n            locals[name] = value;\n        } else if (scope) {\n            scope[name] = value;\n        }\n    }\n\n    public get isInsideInterrupt(): boolean\n    {\n        for (let i = this._frames.length - 1; i >= 0; i--) {\n            if (this._frames[i].isInterrupt) return true;\n        }\n\n        return false;\n    }\n\n    public tickSleepTimers(deltaTime: number): void\n    {\n        for (const frame of this._frames) {\n            if (frame.sleepTimer > 0) {\n                frame.sleepTimer -= deltaTime;\n                if (frame.sleepTimer < 0) frame.sleepTimer = 0;\n            }\n        }\n\n        for (let i = 0; i < this._fastSleepTimers.length; i++) {\n            if (this._fastSleepTimers[i] > 0) {\n                this._fastSleepTimers[i] -= deltaTime;\n                if (this._fastSleepTimers[i] < 0) this._fastSleepTimers[i] = 0;\n            }\n        }\n\n        if (this.sleepTime > 0) {\n            this.sleepTime -= deltaTime;\n            if (this.sleepTime < 0) this.sleepTime = 0;\n        }\n    }\n\n    public setTopSleepTimer(duration: number): void\n    {\n        if (this._frameKinds.length === 0) {\n            this.sleepTime = duration;\n            return;\n        }\n\n        const topKind = this._frameKinds[this._frameKinds.length - 1];\n        if (topKind === FRAME_KIND_SLOW) {\n            this._topSlowFrame!.sleepTimer = duration;\n            return;\n        }\n\n        this._fastSleepTimers[this._fastSleepTimers.length - 1] = duration;\n    }\n\n    public get isSleeping(): boolean\n    {\n        if (this._frameKinds.length > 0) {\n            const topKind = this._frameKinds[this._frameKinds.length - 1];\n            if (topKind === FRAME_KIND_SLOW) {\n                return (this._topSlowFrame?.sleepTimer ?? 0) > 0;\n            }\n\n            return this._fastSleepTimers[this._fastSleepTimers.length - 1] > 0;\n        }\n\n        return this.sleepTime > 0;\n    }\n\n    public findProgramByHash(hash: string): Program | null\n    {\n        return this._programs[hash] || null;\n    }\n\n    private get topModuleName(): string | undefined\n    {\n        if (this._frameKinds.length === 0) {\n            return undefined;\n        }\n\n        const topKind = this._frameKinds[this._frameKinds.length - 1];\n        if (topKind === FRAME_KIND_SLOW) {\n            return this._topSlowFrame?.moduleName;\n        }\n\n        return this._fastModuleNames[this._fastModuleNames.length - 1];\n    }\n\n    private refreshExecutionContext(): void\n    {\n        if (this._frameKinds.length === 0) {\n            this._currentProgram = this._program;\n            this._currentScope = this._scopes[this._program.hash] ?? this._mainScope;\n            this.currentLocalSlots = [];\n            return;\n        }\n\n        const topKind = this._frameKinds[this._frameKinds.length - 1];\n        if (topKind === FRAME_KIND_SLOW) {\n            this._currentProgram = this._topSlowFrame!.program;\n            this._currentScope = this._scopes[this._currentProgram.hash] ?? this._mainScope;\n            this.currentLocalSlots = this._topSlowFrame!.localSlots;\n            return;\n        }\n\n        this._currentProgram = this._fastPrograms[this._fastPrograms.length - 1];\n        this._currentScope = this._scopes[this._currentProgram.hash] ?? this._mainScope;\n        this.currentLocalSlots = this._fastLocalSlots[this._fastLocalSlots.length - 1];\n    }\n\n    public isTruthy(value: any): boolean\n    {\n        if (value === null || value === undefined || value === false) {\n            return false;\n        }\n\n        if (Array.isArray(value)) {\n            return value.length > 0;\n        }\n\n        if (typeof value === 'number') {\n            return value !== 0;\n        }\n\n        if (typeof value === 'string') {\n            return value.length > 0;\n        }\n\n        return true;\n    }\n}\n\ntype PushFrameOptions = {\n    program?: Program,\n    isInterrupt?: boolean;\n    isModule?: boolean;\n    name?: string;\n    moduleName?: string;\n}\n","import { LumaRuntimeError }                                 from '../LumaRuntimeError.js';\nimport { Opcode, Program }                                  from '../Program/index.js';\nimport { ANSI }                                             from '../Utility/ANSI.js';\nimport { Deserializer }                                     from './Deserializer.js';\nimport { DiagnosticInfo, ExecutionResult, StackTraceFrame } from './ExecutionResult.js';\nimport { InstructionSet }                                   from './InstructionSet.js';\nimport { Serializer }                                       from './Serializer.js';\nimport { StackFrame, State }                                from './State.js';\nimport { HostClassContract, VirtualMachineOptions }         from './VirtualMachineOptions.js';\n\nexport type OpcodeProfileEntry = {\n    count: number;\n    totalTime: number;\n    minTime: number;\n    maxTime: number;\n}\n\nexport type OpcodeProfileStats = {\n    opcode: string;\n    count: number;\n    totalTime: number;\n    averageTime: number;\n    minTime: number;\n    maxTime: number;\n    percentage: number;\n}\n\nexport type VirtualMachineProfile = {\n    enabled: boolean;\n    totalInstructions: number;\n    totalTime: number;\n    byOpcode: OpcodeProfileStats[];\n}\n\nexport class VirtualMachine extends InstructionSet\n{\n    public readonly state: State;\n\n    public budget: number;\n    public throwOnError: boolean;\n\n    protected readonly program: Program;\n    protected readonly hostFunctions: Map<string, Function>;\n    protected readonly hostClasses: Map<string, HostClassContract>;\n    protected readonly resolveModule: (moduleName: string) => Program | undefined;\n    protected readonly moduleCache: Record<string, any>;\n    protected readonly profilingEnabled: boolean;\n    protected readonly profileNow: () => number;\n    protected readonly recordOpcodeProfile: (opcode: Opcode, duration: number) => void;\n\n    private readonly serializer: Serializer;\n    private readonly deserializer: Deserializer;\n    private readonly result: ExecutionResult;\n    private readonly opcodeProfile: Map<Opcode, OpcodeProfileEntry>;\n    private totalProfiledInstructions: number;\n    private totalProfiledTime: number;\n\n    constructor(program: Program, options: VirtualMachineOptions = {})\n    {\n        super();\n\n        ANSI.enabled = options.colors ?? ANSI.autoDetectSupport();\n\n        this.budget        = options.budget ?? Infinity;\n        this.program       = program;\n        this.hostFunctions = new Map();\n        this.hostClasses   = new Map();\n        this.serializer    = new Serializer();\n        this.deserializer  = new Deserializer();\n        this.state         = new State(program, options.variables ?? {});\n        this.throwOnError  = options.throwOnError ?? true;\n        this.moduleCache   = options.moduleCache ?? {};\n        this.profilingEnabled = options.profile ?? false;\n        this.profileNow = options.now ?? (() => {\n            if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n                return performance.now();\n            }\n\n            return Date.now();\n        });\n        this.resolveModule = options.resolveModule ?? (() => {\n            throw new Error('Module resolution is not supported.');\n        });\n        this.opcodeProfile             = new Map();\n        this.totalProfiledInstructions = 0;\n        this.totalProfiledTime         = 0;\n        this.recordOpcodeProfile       = (opcode: Opcode, duration: number): void => {\n            if (! this.profilingEnabled) {\n                return;\n            }\n\n            const elapsed = Math.max(0, duration);\n            let entry     = this.opcodeProfile.get(opcode);\n            if (! entry) {\n                entry = {\n                    count:     0,\n                    totalTime: 0,\n                    minTime:   Number.POSITIVE_INFINITY,\n                    maxTime:   0,\n                };\n\n                this.opcodeProfile.set(opcode, entry);\n            }\n\n            entry.count++;\n            entry.totalTime += elapsed;\n            entry.minTime = Math.min(entry.minTime, elapsed);\n            entry.maxTime = Math.max(entry.maxTime, elapsed);\n\n            this.totalProfiledInstructions++;\n            this.totalProfiledTime += elapsed;\n        };\n\n        options.functions = options.functions ?? {};\n        if (! ('print' in options.functions)) {\n            options.functions.print = (...args: any[]) => {\n                console.log(...args);\n            };\n        }\n\n        for (const [name, fn] of Object.entries(options.functions)) {\n            this.registerFunction(name, fn);\n        }\n\n        for (const [name, cls] of Object.entries(options.classes ?? {})) {\n            this.hostClasses.set(name, cls);\n        }\n\n        this.result = {\n            isCompleted:     false,\n            isSleeping:      false,\n            error:           undefined,\n            remainingBudget: this.budget,\n        };\n    }\n\n    /**\n     * Register a native function that can be called from the VM.\n     *\n     * @param {string} name\n     * @param {Function} fn\n     */\n    public registerFunction(name: string, fn: Function): this\n    {\n        this.hostFunctions.set(name, fn);\n\n        return this;\n    }\n\n    /**\n     * Register a native class that can be instantiated or extended from the VM.\n     *\n     * @param {string} name\n     * @param {HostClassContract} contract\n     */\n    public registerClass(name: string, contract: HostClassContract): this\n    {\n        this.hostClasses.set(name, contract);\n\n        return this;\n    }\n\n    /**\n     * Returns opcode profiling metrics ordered by total execution time.\n     */\n    public getProfile(): Readonly<VirtualMachineProfile>\n    {\n        const byOpcode: OpcodeProfileStats[] = [];\n\n        for (const [opcode, entry] of this.opcodeProfile.entries()) {\n            byOpcode.push({\n                opcode,\n                count:       entry.count,\n                totalTime:   entry.totalTime,\n                averageTime: entry.count > 0 ? entry.totalTime / entry.count : 0,\n                minTime:     Number.isFinite(entry.minTime) ? entry.minTime : 0,\n                maxTime:     entry.maxTime,\n                percentage:  this.totalProfiledTime > 0 ? (entry.totalTime / this.totalProfiledTime) * 100 : 0,\n            });\n        }\n\n        byOpcode.sort((a, b) => b.totalTime - a.totalTime);\n\n        return {\n            enabled:           this.profilingEnabled,\n            totalInstructions: this.totalProfiledInstructions,\n            totalTime:         this.totalProfiledTime,\n            byOpcode,\n        };\n    }\n\n    /**\n     * Clears all collected profiling samples.\n     */\n    public resetProfile(): void\n    {\n        this.opcodeProfile.clear();\n        this.totalProfiledInstructions = 0;\n        this.totalProfiledTime = 0;\n    }\n\n    /**\n     * Run the VM for a specific number of \"ops\".\n     *\n     * @returns TRUE if the script finished, FALSE if it paused (ran out of budget or crashed).\n     */\n    public run(deltaTime: number = 16.6): Readonly<ExecutionResult>\n    {\n        if (this.state.isAwaitingPromise) {\n            return this.result;\n        }\n\n        // Reset execution result.\n        this.result.isCompleted     = false;\n        this.result.isSleeping      = false;\n        this.result.error           = undefined;\n        this.result.remainingBudget = this.budget;\n\n        try {\n            if (! this.state.isInsideInterrupt && this.state.eventQueue.length > 0) {\n                this.executeNextEvent();\n            }\n\n            const [b, c]                = this.execute(this.budget, deltaTime);\n            this.result.remainingBudget = b;\n            this.result.isCompleted     = c;\n            this.result.isSleeping      = this.state.isSleeping;\n            this.result.remainingBudget = this.budget;\n        } catch (e) {\n            if (! (e instanceof Error)) {\n                throw e;\n            }\n\n            this.result.error       = this.createErrorDiagnosticInfo(e);\n            this.result.isCompleted = true;\n\n            if (this.throwOnError) {\n                throw new LumaRuntimeError({\n                    message:    this.createErrorMessageFromDiagnostic(this.result.error),\n                    moduleName: this.state.currentProgram.moduleName,\n                    position:   this.state.currentProgram.instructions[this.state.ip]?.pos,\n                    program:    this.state.currentProgram,\n                    address:    Math.max(0, this.state.ip - 1),\n                    cause:      e,\n                });\n            }\n        }\n\n        return this.result;\n    }\n\n    /**\n     * Returns a list of event names that can be dispatched to the VM.\n     *\n     * @returns {string[]}\n     */\n    public get eventNames(): string[]\n    {\n        return Object.keys(this.program.references.events);\n    }\n\n    /**\n     * Dispatch an event to the VM.\n     *\n     * Returns true if a hook for the given event name exists and that the\n     * event was successfully queued, false otherwise.\n     *\n     * @param {string} name - The name of the event.\n     * @param {any[]} args  - Arguments to pass to the event handler.\n     * @returns {boolean}\n     */\n    public dispatch(name: string, args: any[] = []): boolean\n    {\n        const eventInfo = this.program.references.events[name];\n        if (! eventInfo) {\n            return false;\n        }\n\n        this.state.eventQueue.push({name, args});\n        this.state.isHalted = false;\n\n        return true;\n    }\n\n    /**\n     * Saves the current state of the VM to a string.\n     *\n     * @returns {string}\n     */\n    public save(): string\n    {\n        return this.serializer.serialize(this.romHash, this.state);\n    }\n\n    /**\n     * Restores the VM state from a string.\n     *\n     * @param {string} state\n     */\n    public load(state: string): void\n    {\n        this.deserializer.deserialize(this.romHash, state, this.state);\n    }\n\n    /**\n     * Returns a ROM hash based on the loaded instructions.\n     *\n     * @returns {string}\n     */\n    public get romHash(): string\n    {\n        let hash = 0;\n\n        for (const instr of this.program.instructions) {\n            const opStr = `${instr.op}:${JSON.stringify(instr.arg)}`;\n            for (let i = 0; i < opStr.length; i++) {\n                const char = opStr.charCodeAt(i);\n                hash       = ((hash << 5) - hash) + char;\n                hash |= 0; // Convert to 32bit integer\n            }\n        }\n\n        return hash.toString(16);\n    }\n\n    private executeNextEvent(): void\n    {\n        const event = this.state.eventQueue.shift();\n        if (! event) return;\n\n        const eventInfo = this.program.references.events[event.name];\n\n        for (let i = 0; i < eventInfo.numArgs; i++) {\n            this.state.push(event.args[i] ?? null);\n        }\n\n        this.state.pushFrame(this.state.ip, {\n            name:        `<interrupt:${event.name}>`,\n            isInterrupt: true,\n        });\n\n        this.state.ip = eventInfo.address;\n    }\n\n    private createErrorDiagnosticInfo(e: Error): DiagnosticInfo\n    {\n        return {\n            message: e.message,\n            source:  this.createErrorSourceLines(this.state.currentProgram, this.state.ip).join('\\n'),\n            trace:   this.createStackTrace(),\n        } satisfies DiagnosticInfo;\n    }\n\n    private createStackTrace(): StackTraceFrame[]\n    {\n        const frames: StackTraceFrame[] = [];\n        const stack: StackFrame[]       = [\n            ...[...this.state.frames].reverse(),\n        ];\n\n        for (const frame of stack) {\n            if (frame.ip >= frame.program.instructions.length) continue;\n\n            frames.push({\n                type:         frame.isModule ? 'module' : frame.isInterrupt ? 'interrupt' : 'function',\n                line:         frame.program.instructions[frame.ip].pos?.lineStart ?? -1,\n                column:       frame.program.instructions[frame.ip].pos?.columnStart ?? -1,\n                functionName: frame.name,\n                moduleName:   frame.moduleName,\n                source:       this.createErrorSourceLines(frame.program, frame.ip).join('\\n'),\n            });\n        }\n\n        return frames;\n    }\n\n    private createErrorSourceLines(program: Program, ip: number): string[]\n    {\n        const instr = program.instructions[ip];\n        if (! instr?.pos) {\n            return [];\n        }\n\n        const {lineStart, columnStart} = instr.pos;\n        const sourceLines              = program.source.split('\\n');\n\n        // Grab the 3 last lines before the error line, the error line itself.\n        const result: string[] = [];\n        for (let i = Math.max(0, lineStart - 4); i < Math.min(sourceLines.length, lineStart); i++) {\n            const prefix = (i + 1 === lineStart) ? '<red>>></red> ' : '   ';\n            result.push(`${prefix}<gray>${i + 1}|</gray> ${sourceLines[i]}`.trimEnd());\n        }\n\n        // Add a caret pointing to the error column.\n        const caretLine = '<gray>' + ('-'.repeat(columnStart + lineStart.toString().length + 4) + '</gray>') + '<red>^</red>';\n        result.push(caretLine);\n\n        return result;\n    }\n\n    /**\n     * Create a human-readable error message from a DiagnosticInfo object.\n     *\n     * @param {DiagnosticInfo} diag - The diagnostic information.\n     * @returns {string} - The formatted error message.\n     */\n    public createErrorMessageFromDiagnostic(diag: DiagnosticInfo): string\n    {\n        let msg = `<red>${diag.message}</red>\\n`;\n\n        if (diag.source) {\n            msg += `\\nSource:\\n${diag.source}\\n`;\n        }\n\n        if (diag.trace && diag.trace.length > 0) {\n            msg += `\\nStack Trace:\\n`;\n            let id = diag.trace.length;\n            for (const frame of diag.trace) {\n                id--;\n                msg += ` <gray>#${id}: [${frame.type}]</gray> `;\n                if (frame.moduleName) {\n                    msg += `Module: <cyan>${frame.moduleName}</cyan> `;\n                }\n                if (frame.functionName && frame.functionName !== '<anonymous>') {\n                    msg += `Function: <green>${frame.functionName}</green> `;\n                }\n                msg += `at line <cyan>${frame.line}</cyan>, column <cyan>${frame.column}</cyan>\\n`;\n            }\n        }\n\n        return ANSI.format(msg);\n    }\n}\n","import * as Readline                       from 'node:readline';\nimport { Instruction, Program }            from '../Program/index.js';\nimport { ANSI }                            from '../Utility/ANSI.js';\nimport { ExecutionResult, VirtualMachine } from '../VM/index.js';\nimport { StackFrame }                      from '../VM/State.js';\n\nexport class Debugger\n{\n    private readonly keys: DebuggerKey[] = [\n        {key: 'Q', name: 'Quit', fn: this.quit.bind(this)},\n        {key: 'H', name: 'Display a list of commands', fn: this.printHelp.bind(this)},\n        {key: 'Return', name: 'Executes all instructions in the current frame.', fn: this.continue.bind(this)},\n        {key: 'Space', name: 'Executes a single instruction.', fn: this.step.bind(this)},\n        {key: 'S', name: 'Show the values currently in the stack', fn: this.showStack.bind(this)},\n        {key: 'F', name: 'Show the stack frames.', fn: this.showFrames.bind(this)},\n        {\n            key:  'B',\n            name: 'Show the bytecode surrounding the current instruction. (Hold shift to show all)',\n            fn:   this.showBytecode.bind(this),\n        },\n        {key: 'G', name: 'Show global module scopes.', fn: this.showModuleScopes.bind(this)},\n    ];\n\n    private lastFrame: StackFrame | null       = null;\n    private lastResult: ExecutionResult | null = null;\n\n    public static create(vm: VirtualMachine): void\n    {\n        if (! process.stdin.isTTY) {\n            console.error('Debugger can only be started from a TTY.');\n            return process.exit(1);\n        }\n\n        new Debugger(vm).prompt();\n    }\n\n    private constructor(private readonly vm: VirtualMachine)\n    {\n        Readline.emitKeypressEvents(process.stdin);\n        process.stdin.setRawMode(true);\n\n        this.print(`Debugger started. Press ${this.printKey('H')} for help.`);\n\n        this.vm.budget       = 1;\n        this.vm.throwOnError = false;\n    }\n\n    /**\n     * Steps the VM by one instruction.\n     *\n     * @private\n     */\n    private step(): void\n    {\n        if (this.lastResult?.isCompleted) {\n            this.print(`<green>Program halted.</green> Press [<yellow>Q</yellow>] to quit.`);\n            return;\n        }\n\n        if (this.lastFrame !== this.vm.state.topFrame) {\n            this.lastFrame = this.vm.state.topFrame;\n            if (null === this.lastFrame) {\n                this.print('<yellow>--- Returned to Global Frame ---</yellow>');\n            } else {\n                this.print(`<yellow>--- New Call Frame ---</yellow>`);\n                this.printStackFrame(this.lastFrame, this.vm.state.numFrames - 1);\n            }\n        }\n\n        this.printInstruction(this.vm.state.currentProgram, this.vm.state.ip);\n\n        this.lastResult = this.vm.run(1);\n\n        if (this.lastResult.error) {\n            this.printError();\n        }\n    }\n\n    private continue(): void\n    {\n        let lastFrame = this.lastFrame;\n        this.step();\n\n        if (lastFrame === this.lastFrame && ! this.lastResult?.isCompleted) {\n            this.continue();\n        }\n    }\n\n    private showStack(): void\n    {\n        const stack = this.vm.state.stack;\n        if (stack.length === 0) {\n            this.print('<gray>[Empty Stack]</gray>');\n            return;\n        }\n\n        this.print('<yellow>Stack:</yellow>');\n        for (let i = stack.length - 1; i >= 0; i--) {\n            this.print(`  <cyan>[${i}]</cyan> ${this.formatObject(stack[i])}`);\n        }\n    }\n\n    private showFrames(): void\n    {\n        const frames = this.vm.state.frames;\n        if (frames.length === 0) {\n            this.print('<gray>[No Call Frames]</gray>');\n            return;\n        }\n\n        this.print('<yellow>Stack Frames:</yellow>');\n        for (let i = frames.length - 1; i >= 0; i--) {\n            this.printStackFrame(frames[i], i);\n        }\n    }\n\n    private showBytecode(key: any): void\n    {\n        const program: Program            = this.vm.state.currentProgram;\n        const instructions: Instruction[] = program.instructions;\n        const ip: number                  = this.vm.state.ip;\n        const start: number               = key.shift ? 0 : Math.max(0, ip - 5);\n        const end: number                 = key.shift ? instructions.length : Math.min(instructions.length, ip + 5);\n\n        const termWidth = process.stdout.columns || 80;\n        const title     = `Bytecode for module '${program.moduleName || 'MAIN'}'`;\n\n        this.print('<gray>' + '─'.repeat(2) + `</gray> <yellow>${title}</yellow> <gray>` + '─'.repeat(termWidth - title.length - 4) + '</gray>');\n        this.print('');\n\n        for (let i = start; i < end; i++) {\n            this.printInstruction(program, i, ip - 1);\n        }\n\n        this.print('');\n\n        if (! key.shift) {\n            this.print(`<gray>Press</gray> ${this.printKey('SHIFT + B')} <gray>to show all bytecode for this module.</gray>`);\n        }\n\n        this.print('<gray>' + '─'.repeat(termWidth) + '</gray>');\n    }\n\n    private showModuleScopes(): void\n    {\n        const modules = this.vm.state.scopes;\n\n        this.print('');\n        this.print('<yellow>Module Scopes:</yellow>');\n        Object.keys(modules).forEach(key => {\n            const program = this.vm.state.findProgramByHash(key);\n            if (! program) {\n                this.print(`<red>Could not find program for module hash: ${key}</red>`);\n                return;\n            }\n\n            this.print(`  Module: <yellow>${program.moduleName || 'MAIN'}</yellow> <gray>(${key})</gray>`);\n            Object.keys(modules[key]).forEach(varName => {\n                this.print(`    - <cyan>${varName}</cyan> : ${this.formatObject(modules[key][varName])}`);\n            });\n            this.print('');\n        });\n    }\n\n    /**\n     * Prompts the user for input.\n     *\n     * @private\n     */\n    private prompt(): void\n    {\n        process.stdout.write('> ');\n\n        process.stdin.once('keypress', (_: string, key: InputKey) => {\n            process.stdout.write('\\r\\x1b[K');\n\n            // Find the command to run.\n            const cmd = this.keys.find(k => k.key.toLowerCase() === key.name.toLowerCase());\n            if (! cmd) {\n                return this.prompt();\n            }\n\n            try {\n                cmd.fn(key);\n            } catch (e: any) {\n                console.error(e);\n            } finally {\n                this.prompt();\n            }\n        });\n    }\n\n    /**\n     * Quits the debugger.\n     *\n     * @private\n     */\n    private quit(): void\n    {\n        process.stdin.setRawMode(false);\n        process.stdin.resume();\n        process.exit(0);\n    }\n\n    /**\n     * Prints the given string to the console.\n     *\n     * @private\n     */\n    private print(str: string): void\n    {\n        console.log(ANSI.format(str));\n    }\n\n    /**\n     * Prints a single instruction.\n     *\n     * @private\n     */\n    private printInstruction(program: Program, ip: number, cursor?: number): void\n    {\n        const instr            = program.instructions[ip];\n        const addr             = ip.toString().padStart(8, '0');\n        const color            = ip === cursor ? 'white' : 'gray';\n        const result: string[] = [\n            ip === cursor ? '<brightCyan>→</brightCyan>' : ' ',\n            `<${color}>[${program.moduleName ?? 'MAIN'}]</${color}>`,\n            `<${color}>${addr}</${color}>`,\n        ];\n\n        if (! instr) {\n            result.push(`<red>[No Instruction Found]</red>`);\n        } else {\n            const iLength: number = instr.op.length;\n            const mLength: number = 16;\n            const pLength: number = mLength - iLength;\n\n            result.push(\n                `<gray>${'·'.repeat(pLength)}</gray> <green>${instr.op}</green>`,\n                `${this.formatObject(instr.arg)}`,\n            );\n\n            if (instr.comment) {\n                result.push(`<gray>// ${instr.comment}</gray>`);\n            }\n        }\n\n        this.print(result.join(' '));\n    }\n\n    /**\n     * Prints a stack frame.\n     *\n     * @private\n     */\n    private printStackFrame(frame: StackFrame, index: number): void\n    {\n        const type    = frame.isModule ? 'Module' : frame.isInterrupt ? 'Interrupt' : 'Function';\n        const subType = frame.moduleName ? ` (${frame.moduleName})` : '';\n        this.print(`  <cyan>[${index}]</cyan> ${type}${subType} - IP: <magenta>${frame.ip}</magenta> - Return IP: <magenta>${frame.returnIp}</magenta>`);\n        this.print(`       Locals  : ${this.formatObject(frame.locals)}`);\n        this.print(`       Exports : ${this.formatObject(frame.exports)}`);\n    }\n\n    /**\n     * Prints the last error message.\n     *\n     * @private\n     */\n    private printError(): void\n    {\n        if (! this.lastResult?.error) return;\n        console.error(this.vm.createErrorMessageFromDiagnostic(this.lastResult.error));\n    }\n\n    /**\n     * Formats the given object for colored output.\n     *\n     * @private\n     */\n    private formatObject(obj: any, depth: number = 0): string\n    {\n        depth++;\n\n        if (depth > 3) {\n            return '<red>[RECURSION]</red>';\n        }\n\n        if (typeof obj === 'string') {\n            return ANSI.format(`<cyan>\"${obj}\"</cyan>`);\n        }\n\n        if (typeof obj === 'number') {\n            return ANSI.format(`<magenta>${obj}</magenta>`);\n        }\n\n        if (typeof obj === 'boolean') {\n            return ANSI.format(`<yellow>${obj}</yellow>`);\n        }\n\n        if (typeof obj === 'function') {\n            return ANSI.format(`<red><fn:${obj.name}></red>`);\n        }\n\n        if (obj === null || typeof obj === 'undefined') {\n            return '<gray>~</gray>';\n        }\n\n        if (Array.isArray(obj)) {\n            return [\n                `<gray>[</gray>`,\n                obj.map(v => this.formatObject(v, depth)).join(', '),\n                `<gray>]</gray>`,\n            ].join('');\n        }\n\n        if (obj && typeof obj === 'object' && typeof obj.type === 'string') {\n            switch (obj.type) {\n                case 'class':\n                    return `<blue>[Class: ${obj.name || 'anonymous'}]</blue>`;\n                case 'ScriptFunction':\n                    return `<yellow>[Function: ${obj.name || 'anonymous'}]</yellow>`;\n            }\n        }\n\n        const result: string[] = [];\n        for (const key of Object.keys(obj)) {\n            if (key === 'prog' && typeof obj[key] === 'object' && obj[key]?.instructions) {\n                result.push(`${key}: <gray>[Program: ${obj[key].moduleName || 'MAIN'}]</gray>`);\n                continue;\n            }\n\n            result.push(`${key}: ${this.formatObject(obj[key], depth)}`);\n        }\n\n        return [\n            `<gray>{</gray>`,\n            result.join(', '),\n            `<gray>}</gray>`,\n        ].join('');\n    }\n\n    private printKey(key: string): string\n    {\n        return ANSI.format(`<gray>[</gray><yellow>${key.toUpperCase()}</yellow><gray>]</gray>`);\n    }\n\n    private printHelp(): void\n    {\n        this.print('');\n        this.print('<yellow>Debugger Commands:</yellow>');\n\n        for (const cmd of this.keys) {\n            this.print(`  ${this.printKey(cmd.key)} : ${cmd.name}`);\n        }\n\n        this.print('');\n    }\n}\n\ntype DebuggerKey = {\n    key: string;   // Key name.\n    name: string;  // Command name.\n    fn: (key: InputKey) => any; // Callback.\n}\n\ntype InputKey = {\n    sequence: string,\n    name: string,\n    ctrl: boolean,\n    meta: boolean,\n    shift: boolean\n};\n"],"mappings":"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","names":["position","operator","right","Opcode","OpcodeBytes","id","slot","instance","exports"]}