import{IterMode as t,Tree as e,NodeProp as s,Parser as i,NodeType as r,NodeSet as h,DefaultBufferLength as n}from"@lezer/common";class Stack{constructor(t,e,s,i,r,h,n,o,a,l=0,c){this.p=t;this.stack=e;this.state=s;this.reducePos=i;this.pos=r;this.score=h;this.buffer=n;this.bufferBase=o;this.curContext=a;this.lookAhead=l;this.parent=c}toString(){return`[${this.stack.filter(((t,e)=>e%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,s=0){let i=t.parser.context;return new Stack(t,[],e,s,s,0,[],0,i?new StackContext(i,i.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length);this.state=t}reduce(t){var e;let s=t>>19,i=t&65535;let{parser:r}=this.p;let h=r.dynamicPrecedence(i);h&&(this.score+=h);if(s==0){this.pushState(r.getGoto(this.state,i,true),this.reducePos);i<r.minRepeatTerm&&this.storeNode(i,this.reducePos,this.reducePos,4,true);this.reduceContext(i,this.reducePos);return}let n=this.stack.length-3*(s-1)-(t&262144?6:0);let o=n?this.stack[n-2]:this.p.ranges[0].from,a=this.reducePos-o;if(a>=2e3&&!((e=this.p.parser.nodeSet.types[i])===null||e===void 0?void 0:e.isAnonymous))if(o==this.p.lastBigReductionStart){this.p.bigReductionCount++;this.p.lastBigReductionSize=a}else if(this.p.lastBigReductionSize<a){this.p.bigReductionCount=1;this.p.lastBigReductionStart=o;this.p.lastBigReductionSize=a}let l=n?this.stack[n-1]:0,c=this.bufferBase+this.buffer.length-l;if(i<r.minRepeatTerm||t&131072){let t=r.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(i,o,t,c+4,true)}if(t&262144)this.state=this.stack[n];else{let t=this.stack[n-3];this.state=r.getGoto(t,i,true)}while(this.stack.length>n)this.stack.pop();this.reduceContext(i,o)}storeNode(t,e,s,i=4,r=false){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let t=this,i=this.buffer.length;if(i==0&&t.parent){i=t.bufferBase-t.parent.bufferBase;t=t.parent}if(i>0&&t.buffer[i-4]==0&&t.buffer[i-1]>-1){if(e==s)return;if(t.buffer[i-2]>=e){t.buffer[i-2]=s;return}}}if(r&&this.pos!=s){let r=this.buffer.length;if(r>0&&this.buffer[r-4]!=0)while(r>0&&this.buffer[r-2]>s){this.buffer[r]=this.buffer[r-4];this.buffer[r+1]=this.buffer[r-3];this.buffer[r+2]=this.buffer[r-2];this.buffer[r+3]=this.buffer[r-1];r-=4;i>4&&(i-=4)}this.buffer[r]=t;this.buffer[r+1]=e;this.buffer[r+2]=s;this.buffer[r+3]=i}else this.buffer.push(t,e,s,i)}shift(t,e,s,i){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:h}=this.p;if(i>this.pos||e<=h.maxNode){this.pos=i;h.stateFlag(r,1)||(this.reducePos=i)}this.pushState(r,s);this.shiftContext(e,s);e<=h.maxNode&&this.buffer.push(e,s,i,4)}else{this.pos=i;this.shiftContext(e,s);e<=this.p.parser.maxNode&&this.buffer.push(e,s,i,4)}}apply(t,e,s,i){t&65536?this.reduce(t):this.shift(t,e,s,i)}useNode(t,e){let s=this.p.reused.length-1;if(s<0||this.p.reused[s]!=t){this.p.reused.push(t);s++}let i=this.pos;this.reducePos=this.pos=i+t.length;this.pushState(e,i);this.buffer.push(s,i,this.reducePos,-1);this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this;let e=t.buffer.length;while(e>0&&t.buffer[e-2]>t.reducePos)e-=4;let s=t.buffer.slice(e),i=t.bufferBase+e;while(t&&i==t.bufferBase)t=t.parent;return new Stack(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,s,i,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let s=t<=this.p.parser.maxNode;s&&this.storeNode(t,this.pos,e,4);this.storeNode(0,this.pos,e,s?8:4);this.pos=this.reducePos=e;this.score-=190}canShift(t){for(let e=new SimulatedStack(this);;){let s=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(s==0)return false;if((s&65536)==0)return true;e.reduce(s)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let s=[];for(let i,r=0;r<e.length;r+=2)(i=e[r+1])!=this.state&&this.p.parser.hasAction(i,t)&&s.push(e[r],i);if(this.stack.length<120)for(let t=0;s.length<8&&t<e.length;t+=2){let i=e[t+1];s.some(((t,e)=>e&1&&t==i))||s.push(e[t],i)}e=s}let s=[];for(let t=0;t<e.length&&s.length<4;t+=2){let i=e[t+1];if(i==this.state)continue;let r=this.split();r.pushState(i,this.pos);r.storeNode(0,r.pos,r.pos,4,true);r.shiftContext(e[t],this.pos);r.reducePos=this.pos;r.score-=200;s.push(r)}return s}forceReduce(){let{parser:t}=this.p;let e=t.stateSlot(this.state,5);if((e&65536)==0)return false;if(!t.validAction(this.state,e)){let s=e>>19,i=e&65535;let r=this.stack.length-s*3;if(r<0||t.getGoto(this.stack[r],i,false)<0){let t=this.findForcedReduction();if(t==null)return false;e=t}this.storeNode(0,this.pos,this.pos,4,true);this.score-=100}this.reducePos=this.pos;this.reduce(e);return true}findForcedReduction(){let{parser:t}=this.p,e=[];let explore=(s,i)=>{if(!e.includes(s)){e.push(s);return t.allActions(s,(e=>{if(e&393216);else if(e&65536){let s=(e>>19)-i;if(s>1){let i=e&65535,r=this.stack.length-s*3;if(r>=0&&t.getGoto(this.stack[r],i,false)>=0)return s<<19|65536|i}}else{let t=explore(e,i+1);if(t!=null)return t}}))}};return explore(this.state,0)}forceAll(){while(!this.p.parser.stateFlag(this.state,2))if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,true);break}return this}get deadEnd(){if(this.stack.length!=3)return false;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,true);this.state=this.stack[0];this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return false;for(let e=0;e<this.stack.length;e+=3)if(this.stack[e]!=t.stack[e])return false;return true}get parser(){return this.p.parser}dialectEnabled(t){return this.p.parser.dialect.flags[t]}shiftContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,t,this,this.p.stream.reset(e)))}reduceContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,t,this,this.p.stream.reset(e)))}emitContext(){let t=this.buffer.length-1;(t<0||this.buffer[t]!=-3)&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let t=this.buffer.length-1;(t<0||this.buffer[t]!=-4)&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(t){if(t!=this.curContext.context){let e=new StackContext(this.curContext.tracker,t);e.hash!=this.curContext.hash&&this.emitContext();this.curContext=e}}setLookAhead(t){if(t>this.lookAhead){this.emitLookAhead();this.lookAhead=t}}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext();this.lookAhead>0&&this.emitLookAhead()}}class StackContext{constructor(t,e){this.tracker=t;this.context=e;this.hash=t.strict?t.hash(e):0}}class SimulatedStack{constructor(t){this.start=t;this.state=t.state;this.stack=t.stack;this.base=this.stack.length}reduce(t){let e=t&65535,s=t>>19;if(s==0){this.stack==this.start.stack&&(this.stack=this.stack.slice());this.stack.push(this.state,0,0);this.base+=3}else this.base-=3*(s-1);let i=this.start.p.parser.getGoto(this.stack[this.base-3],e,true);this.state=i}}class StackBufferCursor{constructor(t,e,s){this.stack=t;this.pos=e;this.index=s;this.buffer=t.buffer;this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new StackBufferCursor(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;if(t!=null){this.index=this.stack.bufferBase-t.bufferBase;this.stack=t;this.buffer=t.buffer}}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4;this.pos-=4;this.index==0&&this.maybeNext()}fork(){return new StackBufferCursor(this.stack,this.pos,this.index)}}function decodeArray(t,e=Uint16Array){if(typeof t!="string")return t;let s=null;for(let i=0,r=0;i<t.length;){let h=0;for(;;){let e=t.charCodeAt(i++),s=false;if(e==126){h=65535;break}e>=92&&e--;e>=34&&e--;let r=e-32;if(r>=46){r-=46;s=true}h+=r;if(s)break;h*=46}s?s[r++]=h:s=new e(h)}return s}class CachedToken{constructor(){this.start=-1;this.value=-1;this.end=-1;this.extended=-1;this.lookAhead=0;this.mask=0;this.context=0}}const o=new CachedToken;class InputStream{constructor(t,e){this.input=t;this.ranges=e;this.chunk="";this.chunkOff=0;this.chunk2="";this.chunk2Pos=0;this.next=-1;this.token=o;this.rangeIndex=0;this.pos=this.chunkPos=e[0].from;this.range=e[0];this.end=e[e.length-1].to;this.readNext()}resolveOffset(t,e){let s=this.range,i=this.rangeIndex;let r=this.pos+t;while(r<s.from){if(!i)return null;let t=this.ranges[--i];r-=s.from-t.to;s=t}while(e<0?r>s.to:r>=s.to){if(i==this.ranges.length-1)return null;let t=this.ranges[++i];r+=t.from-s.to;s=t}return r}clipPos(t){if(t>=this.range.from&&t<this.range.to)return t;for(let e of this.ranges)if(e.to>t)return Math.max(t,e.from);return this.end}peek(t){let e,s,i=this.chunkOff+t;if(i>=0&&i<this.chunk.length){e=this.pos+t;s=this.chunk.charCodeAt(i)}else{let i=this.resolveOffset(t,1);if(i==null)return-1;e=i;if(e>=this.chunk2Pos&&e<this.chunk2Pos+this.chunk2.length)s=this.chunk2.charCodeAt(e-this.chunk2Pos);else{let t=this.rangeIndex,i=this.range;while(i.to<=e)i=this.ranges[++t];this.chunk2=this.input.chunk(this.chunk2Pos=e);e+this.chunk2.length>i.to&&(this.chunk2=this.chunk2.slice(0,i.to-e));s=this.chunk2.charCodeAt(0)}}e>=this.token.lookAhead&&(this.token.lookAhead=e+1);return s}acceptToken(t,e=0){let s=e?this.resolveOffset(e,-1):this.pos;if(s==null||s<this.token.start)throw new RangeError("Token end out of bounds");this.token.value=t;this.token.end=s}acceptTokenTo(t,e){this.token.value=t;this.token.end=e}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:t,chunkPos:e}=this;this.chunk=this.chunk2;this.chunkPos=this.chunk2Pos;this.chunk2=t;this.chunk2Pos=e;this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk;this.chunk2Pos=this.chunkPos;let t=this.input.chunk(this.pos);let e=this.pos+t.length;this.chunk=e>this.range.to?t.slice(0,this.range.to-this.pos):t;this.chunkPos=this.pos;this.chunkOff=0}}readNext(){if(this.chunkOff>=this.chunk.length){this.getChunk();if(this.chunkOff==this.chunk.length)return this.next=-1}return this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){this.chunkOff+=t;while(this.pos+t>=this.range.to){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos;this.range=this.ranges[++this.rangeIndex];this.pos=this.range.from}this.pos+=t;this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1);return this.readNext()}setDone(){this.pos=this.chunkPos=this.end;this.range=this.ranges[this.rangeIndex=this.ranges.length-1];this.chunk="";return this.next=-1}reset(t,e){if(e){this.token=e;e.start=t;e.lookAhead=t+1;e.value=e.extended=-1}else this.token=o;if(this.pos!=t){this.pos=t;if(t==this.end){this.setDone();return this}while(t<this.range.from)this.range=this.ranges[--this.rangeIndex];while(t>=this.range.to)this.range=this.ranges[++this.rangeIndex];if(t>=this.chunkPos&&t<this.chunkPos+this.chunk.length)this.chunkOff=t-this.chunkPos;else{this.chunk="";this.chunkOff=0}this.readNext()}return this}read(t,e){if(t>=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let s="";for(let i of this.ranges){if(i.from>=e)break;i.to>t&&(s+=this.input.read(Math.max(i.from,t),Math.min(i.to,e)))}return s}}class TokenGroup{constructor(t,e){this.data=t;this.id=e}token(t,e){let{parser:s}=e.p;readToken(this.data,t,e,this.id,s.data,s.tokenPrecTable)}}TokenGroup.prototype.contextual=TokenGroup.prototype.fallback=TokenGroup.prototype.extend=false;class LocalTokenGroup{constructor(t,e,s){this.precTable=e;this.elseToken=s;this.data=typeof t=="string"?decodeArray(t):t}token(t,e){let s=t.pos,i=0;for(;;){let s=t.next<0,r=t.resolveOffset(1,1);readToken(this.data,t,e,0,this.data,this.precTable);if(t.token.value>-1)break;if(this.elseToken==null)return;s||i++;if(r==null)break;t.reset(r,t.token)}if(i){t.reset(s,t.token);t.acceptToken(this.elseToken,i)}}}LocalTokenGroup.prototype.contextual=TokenGroup.prototype.fallback=TokenGroup.prototype.extend=false;class ExternalTokenizer{constructor(t,e={}){this.token=t;this.contextual=!!e.contextual;this.fallback=!!e.fallback;this.extend=!!e.extend}}function readToken(t,e,s,i,r,h){let n=0,o=1<<i,{dialect:a}=s.p.parser;t:for(;;){if((o&t[n])==0)break;let s=t[n+1];for(let i=n+3;i<s;i+=2)if((t[i+1]&o)>0){let s=t[i];if(a.allows(s)&&(e.token.value==-1||e.token.value==s||overrides(s,e.token.value,r,h))){e.acceptToken(s);break}}let i=e.next,l=0,c=t[n+2];if(!(e.next<0&&c>l&&t[s+c*3-3]==65535)){for(;l<c;){let r=l+c>>1;let h=s+r+(r<<1);let o=t[h],a=t[h+1]||65536;if(i<o)c=r;else{if(!(i>=a)){n=t[h+2];e.advance();continue t}l=r+1}}break}n=t[s+c*3-1]}}function findOffset(t,e,s){for(let i,r=e;(i=t[r])!=65535;r++)if(i==s)return r-e;return-1}function overrides(t,e,s,i){let r=findOffset(s,i,e);return r<0||findOffset(s,i,t)<r}const a=typeof process!="undefined"&&process.env&&/\bparse\b/.test(process.env.LOG);let l=null;function cutAt(e,s,i){let r=e.cursor(t.IncludeAnonymous);r.moveTo(s);for(;;)if(!(i<0?r.childBefore(s):r.childAfter(s)))for(;;){if((i<0?r.to<s:r.from>s)&&!r.type.isError)return i<0?Math.max(0,Math.min(r.to-1,s-25)):Math.min(e.length,Math.max(r.from+1,s+25));if(i<0?r.prevSibling():r.nextSibling())break;if(!r.parent())return i<0?0:e.length}}class FragmentCursor{constructor(t,e){this.fragments=t;this.nodeSet=e;this.i=0;this.fragment=null;this.safeFrom=-1;this.safeTo=-1;this.trees=[];this.start=[];this.index=[];this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){this.safeFrom=t.openStart?cutAt(t.tree,t.from+t.offset,1)-t.offset:t.from;this.safeTo=t.openEnd?cutAt(t.tree,t.to+t.offset,-1)-t.offset:t.to;while(this.trees.length){this.trees.pop();this.start.pop();this.index.pop()}this.trees.push(t.tree);this.start.push(-t.offset);this.index.push(0);this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(t<this.nextStart)return null;while(this.fragment&&this.safeTo<=t)this.nextFragment();if(!this.fragment)return null;for(;;){let i=this.trees.length-1;if(i<0){this.nextFragment();return null}let r=this.trees[i],h=this.index[i];if(h==r.children.length){this.trees.pop();this.start.pop();this.index.pop();continue}let n=r.children[h];let o=this.start[i]+r.positions[h];if(o>t){this.nextStart=o;return null}if(n instanceof e){if(o==t){if(o<this.safeFrom)return null;let t=o+n.length;if(t<=this.safeTo){let e=n.prop(s.lookAhead);if(!e||t+e<this.fragment.to)return n}}this.index[i]++;if(o+n.length>=Math.max(this.safeFrom,t)){this.trees.push(n);this.start.push(o);this.index.push(0)}}else{this.index[i]++;this.nextStart=o+n.length}}}}class TokenCache{constructor(t,e){this.stream=e;this.tokens=[];this.mainToken=null;this.actions=[];this.tokens=t.tokenizers.map((t=>new CachedToken))}getActions(t){let e=0;let s=null;let{parser:i}=t.p,{tokenizers:r}=i;let h=i.stateSlot(t.state,3);let n=t.curContext?t.curContext.hash:0;let o=0;for(let i=0;i<r.length;i++){if((1<<i&h)==0)continue;let a=r[i],l=this.tokens[i];if(!s||a.fallback){if(a.contextual||l.start!=t.pos||l.mask!=h||l.context!=n){this.updateCachedToken(l,a,t);l.mask=h;l.context=n}l.lookAhead>l.end+25&&(o=Math.max(l.lookAhead,o));if(l.value!=0){let i=e;l.extended>-1&&(e=this.addActions(t,l.extended,l.end,e));e=this.addActions(t,l.value,l.end,e);if(!a.extend){s=l;if(e>i)break}}}}while(this.actions.length>e)this.actions.pop();o&&t.setLookAhead(o);if(!s&&t.pos==this.stream.end){s=new CachedToken;s.value=t.p.parser.eofTerm;s.start=s.end=t.pos;e=this.addActions(t,s.value,s.end,e)}this.mainToken=s;return this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new CachedToken,{pos:s,p:i}=t;e.start=s;e.end=Math.min(s+1,i.stream.end);e.value=s==i.stream.end?i.parser.eofTerm:0;return e}updateCachedToken(t,e,s){let i=this.stream.clipPos(s.pos);e.token(this.stream.reset(i,t),s);if(t.value>-1){let{parser:e}=s.p;for(let i=0;i<e.specialized.length;i++)if(e.specialized[i]==t.value){let r=e.specializers[i](this.stream.read(t.start,t.end),s);if(r>=0&&s.p.parser.dialect.allows(r>>1)){(r&1)==0?t.value=r>>1:t.extended=r>>1;break}}}else{t.value=0;t.end=this.stream.clipPos(i+1)}}putAction(t,e,s,i){for(let e=0;e<i;e+=3)if(this.actions[e]==t)return i;this.actions[i++]=t;this.actions[i++]=e;this.actions[i++]=s;return i}addActions(t,e,s,i){let{state:r}=t,{parser:h}=t.p,{data:n}=h;for(let t=0;t<2;t++)for(let o=h.stateSlot(r,t?2:1);;o+=3){if(n[o]==65535){if(n[o+1]!=1){i==0&&n[o+1]==2&&(i=this.putAction(pair(n,o+2),e,s,i));break}o=pair(n,o+2)}n[o]==e&&(i=this.putAction(pair(n,o+1),e,s,i))}return i}}class Parse{constructor(t,e,s,i){this.parser=t;this.input=e;this.ranges=i;this.recovering=0;this.nextStackID=9812;this.minStackPos=0;this.reused=[];this.stoppedAt=null;this.lastBigReductionStart=-1;this.lastBigReductionSize=0;this.bigReductionCount=0;this.stream=new InputStream(e,i);this.tokens=new TokenCache(t,this.stream);this.topTerm=t.top[1];let{from:r}=i[0];this.stacks=[Stack.start(this,t.top[0],r)];this.fragments=s.length&&this.stream.end-r>t.bufferLength*4?new FragmentCursor(s,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos;let s=this.stacks=[];let i,r;if(this.bigReductionCount>300&&t.length==1){let[e]=t;while(e.forceReduce()&&e.stack.length&&e.stack[e.stack.length-2]>=this.lastBigReductionStart);this.bigReductionCount=this.lastBigReductionSize=0}for(let h=0;h<t.length;h++){let n=t[h];for(;;){this.tokens.mainToken=null;if(n.pos>e)s.push(n);else{if(this.advanceStack(n,s,t))continue;{if(!i){i=[];r=[]}i.push(n);let t=this.tokens.getMainToken(n);r.push(t.value,t.end)}}break}}if(!s.length){let t=i&&findFinished(i);if(t){a&&console.log("Finish with "+this.stackID(t));return this.stackToTree(t)}if(this.parser.strict){a&&i&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none"));throw new SyntaxError("No parse at "+e)}this.recovering||(this.recovering=5)}if(this.recovering&&i){let t=this.stoppedAt!=null&&i[0].pos>this.stoppedAt?i[0]:this.runRecovery(i,r,s);if(t){a&&console.log("Force-finish "+this.stackID(t));return this.stackToTree(t.forceAll())}}if(this.recovering){let t=this.recovering==1?1:this.recovering*3;if(s.length>t){s.sort(((t,e)=>e.score-t.score));while(s.length>t)s.pop()}s.some((t=>t.reducePos>e))&&this.recovering--}else if(s.length>1){t:for(let t=0;t<s.length-1;t++){let e=s[t];for(let i=t+1;i<s.length;i++){let r=s[i];if(e.sameState(r)||e.buffer.length>500&&r.buffer.length>500){if(!((e.score-r.score||e.buffer.length-r.buffer.length)>0)){s.splice(t--,1);continue t}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let t=1;t<s.length;t++)s[t].pos<this.minStackPos&&(this.minStackPos=s[t].pos);return null}stopAt(t){if(this.stoppedAt!=null&&this.stoppedAt<t)throw new RangeError("Can't move stoppedAt forward");this.stoppedAt=t}advanceStack(t,i,r){let h=t.pos,{parser:n}=this;let o=a?this.stackID(t)+" -> ":"";if(this.stoppedAt!=null&&h>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let i=t.curContext&&t.curContext.tracker.strict,r=i?t.curContext.hash:0;for(let l=this.fragments.nodeAt(h);l;){let h=this.parser.nodeSet.types[l.type.id]==l.type?n.getGoto(t.state,l.type.id):-1;if(h>-1&&l.length&&(!i||(l.prop(s.contextHash)||0)==r)){t.useNode(l,h);a&&console.log(o+this.stackID(t)+` (via reuse of ${n.getName(l.type.id)})`);return true}if(!(l instanceof e)||l.children.length==0||l.positions[0]>0)break;let c=l.children[0];if(!(c instanceof e&&l.positions[0]==0))break;l=c}}let l=n.stateSlot(t.state,4);if(l>0){t.reduce(l);a&&console.log(o+this.stackID(t)+` (via always-reduce ${n.getName(l&65535)})`);return true}if(t.stack.length>=8400)while(t.stack.length>6e3&&t.forceReduce());let c=this.tokens.getActions(t);for(let e=0;e<c.length;){let s=c[e++],l=c[e++],u=c[e++];let f=e==c.length||!r;let p=f?t:t.split();let d=this.tokens.mainToken;p.apply(s,l,d?d.start:p.pos,u);a&&console.log(o+this.stackID(p)+` (via ${(s&65536)==0?"shift":`reduce of ${n.getName(s&65535)}`} for ${n.getName(l)} @ ${h}${p==t?"":", split"})`);if(f)return true;p.pos>h?i.push(p):r.push(p)}return false}advanceFully(t,e){let s=t.pos;for(;;){if(!this.advanceStack(t,null,null))return false;if(t.pos>s){pushStackDedup(t,e);return true}}}runRecovery(t,e,s){let i=null,r=false;for(let h=0;h<t.length;h++){let n=t[h],o=e[h<<1],l=e[1+(h<<1)];let c=a?this.stackID(n)+" -> ":"";if(n.deadEnd){if(r)continue;r=true;n.restart();a&&console.log(c+this.stackID(n)+" (restarted)");let t=this.advanceFully(n,s);if(t)continue}let u=n.split(),f=c;for(let t=0;u.forceReduce()&&t<10;t++){a&&console.log(f+this.stackID(u)+" (via force-reduce)");let t=this.advanceFully(u,s);if(t)break;a&&(f=this.stackID(u)+" -> ")}for(let t of n.recoverByInsert(o)){a&&console.log(c+this.stackID(t)+" (via recover-insert)");this.advanceFully(t,s)}if(this.stream.end>n.pos){if(l==n.pos){l++;o=0}n.recoverByDelete(o,l);a&&console.log(c+this.stackID(n)+` (via recover-delete ${this.parser.getName(o)})`);pushStackDedup(n,s)}else(!i||i.score<n.score)&&(i=n)}return i}stackToTree(t){t.close();return e.build({buffer:StackBufferCursor.create(t),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:t.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(t){let e=(l||(l=new WeakMap)).get(t);e||l.set(t,e=String.fromCodePoint(this.nextStackID++));return e+t}}function pushStackDedup(t,e){for(let s=0;s<e.length;s++){let i=e[s];if(i.pos==t.pos&&i.sameState(t)){e[s].score<t.score&&(e[s]=t);return}}e.push(t)}class Dialect{constructor(t,e,s){this.source=t;this.flags=e;this.disabled=s}allows(t){return!this.disabled||this.disabled[t]==0}}const id=t=>t;class ContextTracker{constructor(t){this.start=t.start;this.shift=t.shift||id;this.reduce=t.reduce||id;this.reuse=t.reuse||id;this.hash=t.hash||(()=>0);this.strict=t.strict!==false}}class LRParser extends i{constructor(t){super();this.wrappers=[];if(t.version!=14)throw new RangeError(`Parser version (${t.version}) doesn't match runtime version (14)`);let e=t.nodeNames.split(" ");this.minRepeatTerm=e.length;for(let s=0;s<t.repeatNodeCount;s++)e.push("");let i=Object.keys(t.topRules).map((e=>t.topRules[e][1]));let o=[];for(let t=0;t<e.length;t++)o.push([]);function setProp(t,e,s){o[t].push([e,e.deserialize(String(s))])}if(t.nodeProps)for(let e of t.nodeProps){let t=e[0];typeof t=="string"&&(t=s[t]);for(let s=1;s<e.length;){let i=e[s++];if(i>=0)setProp(i,t,e[s++]);else{let r=e[s+-i];for(let h=-i;h>0;h--)setProp(e[s++],t,r);s++}}}this.nodeSet=new h(e.map(((e,s)=>r.define({name:s>=this.minRepeatTerm?void 0:e,id:s,props:o[s],top:i.indexOf(s)>-1,error:s==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(s)>-1}))));t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources));this.strict=false;this.bufferLength=n;let a=decodeArray(t.tokenData);this.context=t.context;this.specializerSpecs=t.specialized||[];this.specialized=new Uint16Array(this.specializerSpecs.length);for(let t=0;t<this.specializerSpecs.length;t++)this.specialized[t]=this.specializerSpecs[t].term;this.specializers=this.specializerSpecs.map(getSpecializer);this.states=decodeArray(t.states,Uint32Array);this.data=decodeArray(t.stateData);this.goto=decodeArray(t.goto);this.maxTerm=t.maxTerm;this.tokenizers=t.tokenizers.map((t=>typeof t=="number"?new TokenGroup(a,t):t));this.topRules=t.topRules;this.dialects=t.dialects||{};this.dynamicPrecedences=t.dynamicPrecedences||null;this.tokenPrecTable=t.tokenPrec;this.termNames=t.termNames||null;this.maxNode=this.nodeSet.types.length-1;this.dialect=this.parseDialect();this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,s){let i=new Parse(this,t,e,s);for(let r of this.wrappers)i=r(i,t,e,s);return i}getGoto(t,e,s=false){let i=this.goto;if(e>=i[0])return-1;for(let r=i[e+1];;){let e=i[r++],h=e&1;let n=i[r++];if(h&&s)return n;for(let s=r+(e>>1);r<s;r++)if(i[r]==t)return n;if(h)return-1}}hasAction(t,e){let s=this.data;for(let i=0;i<2;i++)for(let r,h=this.stateSlot(t,i?2:1);;h+=3){if((r=s[h])==65535){if(s[h+1]!=1){if(s[h+1]==2)return pair(s,h+2);break}r=s[h=pair(s,h+2)]}if(r==e||r==0)return pair(s,h+1)}return 0}stateSlot(t,e){return this.states[t*6+e]}stateFlag(t,e){return(this.stateSlot(t,0)&e)>0}validAction(t,e){return!!this.allActions(t,(t=>t==e||null))}allActions(t,e){let s=this.stateSlot(t,4);let i=s?e(s):void 0;for(let s=this.stateSlot(t,1);i==null;s+=3){if(this.data[s]==65535){if(this.data[s+1]!=1)break;s=pair(this.data,s+2)}i=e(pair(this.data,s+1))}return i}nextStates(t){let e=[];for(let s=this.stateSlot(t,1);;s+=3){if(this.data[s]==65535){if(this.data[s+1]!=1)break;s=pair(this.data,s+2)}if((this.data[s+2]&1)==0){let t=this.data[s+1];e.some(((e,s)=>s&1&&e==t))||e.push(this.data[s],t)}}return e}configure(t){let e=Object.assign(Object.create(LRParser.prototype),this);t.props&&(e.nodeSet=this.nodeSet.extend(...t.props));if(t.top){let s=this.topRules[t.top];if(!s)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=s}t.tokenizers&&(e.tokenizers=this.tokenizers.map((e=>{let s=t.tokenizers.find((t=>t.from==e));return s?s.to:e})));if(t.specializers){e.specializers=this.specializers.slice();e.specializerSpecs=this.specializerSpecs.map(((s,i)=>{let r=t.specializers.find((t=>t.from==s.external));if(!r)return s;let h=Object.assign(Object.assign({},s),{external:r.to});e.specializers[i]=getSpecializer(h);return h}))}t.contextTracker&&(e.context=t.contextTracker);t.dialect&&(e.dialect=this.parseDialect(t.dialect));t.strict!=null&&(e.strict=t.strict);t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap));t.bufferLength!=null&&(e.bufferLength=t.bufferLength);return e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),s=e.map((()=>false));if(t)for(let i of t.split(" ")){let t=e.indexOf(i);t>=0&&(s[t]=true)}let i=null;for(let t=0;t<e.length;t++)if(!s[t])for(let s,r=this.dialects[e[t]];(s=this.data[r++])!=65535;)(i||(i=new Uint8Array(this.maxTerm+1)))[s]=1;return new Dialect(t,s,i)}static deserialize(t){return new LRParser(t)}}function pair(t,e){return t[e]|t[e+1]<<16}function findFinished(t){let e=null;for(let s of t){let t=s.p.stoppedAt;(s.pos==s.p.stream.end||t!=null&&s.pos>t)&&s.p.parser.stateFlag(s.state,2)&&(!e||e.score<s.score)&&(e=s)}return e}function getSpecializer(t){if(t.external){let e=t.extend?1:0;return(s,i)=>t.external(s,i)<<1|e}return t.get}export{ContextTracker,ExternalTokenizer,InputStream,LRParser,LocalTokenGroup,Stack};