From 05c2f0ebfe5def7fcbd3b8f43ea622756fce60f3 Mon Sep 17 00:00:00 2001 From: Jeff Date: Thu, 17 Nov 2016 16:21:13 -0800 Subject: [PATCH] Fixed a double-trap MMU bug (both src and dst operands triggered a trap, but since the latter was an abort, the former needed to be ignored) --- modules/pdp11/lib/cpustate.js | 61 +++++++++++++++++------------- modules/pdp11/lib/defines.js | 5 ++- versions/pdpjs/1.30.3/pdp11-dbg.js | 12 +++--- versions/pdpjs/1.30.3/pdp11.js | 6 +-- 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/modules/pdp11/lib/cpustate.js b/modules/pdp11/lib/cpustate.js index 2f7ac3397..0e70fc06f 100644 --- a/modules/pdp11/lib/cpustate.js +++ b/modules/pdp11/lib/cpustate.js @@ -169,9 +169,10 @@ CPUStatePDP11.prototype.initRegs = function() /* * TODO: Verify the initial state of all PDP-11 flags and registers (are they well-documented?) */ + var f = 0xffff; this.flagC = 0x10000; // PSW C bit this.flagV = 0x8000; // PSW V bit - this.flagZ = 0xffff; // ~ PSW Z bit (TODO: Why do we clear instead of set Z, like other flags?) + this.flagZ = f; // ~ PSW Z bit (TODO: Why do we clear instead of set Z, like other flags?) this.flagN = 0x8000; // PSW N bit this.regPSW = 0x000f; // PSW other bits (TODO: What's the point of setting the flag bits here, too?) this.regsGen = [ // General R0 - R7 @@ -185,19 +186,18 @@ CPUStatePDP11.prototype.initRegs = function() ]; this.mmuMode = 0; // current memory management mode (see PDP11.MODE.KERNEL | SUPER | UNUSED | USER) this.mmuLastPage = 0; - // this.mmuLastVirtual = 0; this.mapMMR3 = [4,2,0,1]; // map from mode to MMR3 I/D bit this.mmuPDR = [ // memory management PDR registers by mode - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // kernel 0 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // super 1 - [0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff], // mode 2 with illegal PDRs - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // user 3 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // KERNEL (8 KIPDR regs followed by 8 KDPDR regs) + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // SUPER (8 SIPDR regs followed by 8 SDPDR regs) + [f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f], // mode 2 (not used) + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // USER (8 UIPDR regs followed by 8 UDPDR regs) ]; this.mmuPAR = [ // memory management PAR registers by mode - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // kernel 0 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // super 1 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // KERNEL (8 KIPAR regs followed by 8 KDPAR regs) + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // SUPER (8 SIPDR regs followed by 8 SDPDR regs) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // mode 2 (not used) - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // user 3 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // USER (8 UIPDR regs followed by 8 UDPDR regs) ]; this.unibusMap = [ // 32 unibus map registers 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -1541,7 +1541,6 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl */ if (!(accessFlags & this.mmuEnable)) { physicalAddress = virtualAddress & 0xffff; - // this.mmuLastVirtual = physicalAddress; if (physicalAddress >= BusPDP11.IOPAGE_16BIT) { physicalAddress |= this.addrIOPage; } @@ -1552,44 +1551,54 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl if (!(this.regMMR3 & this.mapMMR3[this.mmuMode])) page &= 7; pdr = this.mmuPDR[this.mmuMode][page]; physicalAddress = ((this.mmuPAR[this.mmuMode][page] << 6) + (virtualAddress & 0x1fff)) & this.mmuMask; - // this.mmuLastVirtual = virtualAddress; var newMMR0 = 0; - switch (pdr & 0x7) { - case 1: // read-only with trap + switch (pdr & PDP11.PDR.ACF.MASK) { + + case PDP11.PDR.ACF.RO1: // 0x1: read-only, abort on write attempt, memory management trap on read (11/70 only) newMMR0 = PDP11.MMR0.TRAP_MMU; /* falls through */ - case 2: // read-only - pdr |= 0x80; // Set A bit + + case PDP11.PDR.ACF.RO: // 0x2: read-only, abort on write attempt + pdr |= PDP11.PDR.ACCESSED; if (accessFlags & PDP11.ACCESS.WRITE) { newMMR0 = PDP11.MMR0.ABORT_RO; } break; - case 4: // read-write with read-write trap + + case PDP11.PDR.ACF.RW1: // 0x4: read/write, memory management trap upon completion of a read or write newMMR0 = PDP11.MMR0.TRAP_MMU; /* falls through */ - case 5: // read-write with write trap + + case PDP11.PDR.ACF.RW2: // 0x5: read/write, memory management trap upon completion of a write (11/70 only) if (accessFlags & PDP11.ACCESS.WRITE) { newMMR0 = PDP11.MMR0.TRAP_MMU; } /* falls through */ - case 6: // read-write: set A & W bits + + case PDP11.PDR.ACF.RW: // 0x6: read/write, no system trap/abort action pdr |= ((accessFlags & PDP11.ACCESS.WRITE) ? 0xc0 : 0x80); break; - default: + + default: // 0x0 (non-resident, abort all accesses) or 0x3 or 0x7 (unused, abort all accesses) newMMR0 = PDP11.MMR0.ABORT_NR; break; } - if ((pdr & 0x7f08) != 0x7f00) { // skip checking most common case (hopefully) - if (pdr & 0x8) { // expand downwards - if (pdr & 0x7f00) { - if ((virtualAddress & 0x1fc0) < ((pdr >> 2) & 0x1fc0)) { + if ((pdr & (PDP11.PDR.PLF | PDP11.PDR.ED)) != PDP11.PDR.PLF) { // skip checking most common case (hopefully) + /* + * The Page Descriptor Register (PDR) Page Length Field (PLF) is a 7-bit block number, where a block + * is 64 bytes. Since the bit 0 of the block number is located at bit 8 of the PDR, we shift the PDR + * right 2 bits and then clear the bottom 6 bits by masking it with 0x1FC0. + */ + if (pdr & PDP11.PDR.ED) { + if (pdr & PDP11.PDR.PLF) { + if ((virtualAddress & 0x1FC0) < ((pdr >> 2) & 0x1FC0)) { newMMR0 |= PDP11.MMR0.ABORT_PL; } } - } else { // expand upwards - if ((virtualAddress & 0x1fc0) > ((pdr >> 2) & 0x1fc0)) { + } else { + if ((virtualAddress & 0x1FC0) > ((pdr >> 2) & 0x1FC0)) { newMMR0 |= PDP11.MMR0.ABORT_PL; } } @@ -1619,7 +1628,7 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl * because otherwise we run the risk of infinitely looping; eg, we call trap(), which * calls mapVirtualToPhysical() on the trap vector, which faults again, etc. */ - this.trap(PDP11.TRAP.MMU, 0, PDP11.REASON.ABORT); + this.trap(PDP11.TRAP.MMU, PDP11.OPFLAG.TRAP_MMU, PDP11.REASON.ABORT); } } if (!(this.regMMR0 & (PDP11.MMR0.ABORT | PDP11.MMR0.TRAP_MMU))) { diff --git a/modules/pdp11/lib/defines.js b/modules/pdp11/lib/defines.js index da6fe83e7..3988fceaf 100644 --- a/modules/pdp11/lib/defines.js +++ b/modules/pdp11/lib/defines.js @@ -360,9 +360,10 @@ var PDP11 = { RW1: 0x4, // read/write, memory management trap upon completion of a read or write RW2: 0x5, // read/write, memory management trap upon completion of a write (11/70 only) RW: 0x6, // read/write, no system trap/abort action - U2: 0x7 // unused, abort all accesses--reserved for future use + U2: 0x7, // unused, abort all accesses--reserved for future use + MASK: 0x7 }, - ED: 0x0080, // expansion direction (if set, the page expands downward from block number 127) + ED: 0x0008, // expansion direction (if set, the page expands downward from block number 127) UNUSED: 0x0030, MODIFIED: 0x0040, // page has been written (bit cleared when either PDR or PAR is written) ACCESSED: 0x0080, // page has been accessed (bit cleared when either PDR or PAR is written) (11/70 only) diff --git a/versions/pdpjs/1.30.3/pdp11-dbg.js b/versions/pdpjs/1.30.3/pdp11-dbg.js index b750bc35c..57fc9ce65 100644 --- a/versions/pdpjs/1.30.3/pdp11-dbg.js +++ b/versions/pdpjs/1.30.3/pdp11-dbg.js @@ -117,17 +117,17 @@ k.ee=function(){if(this.A.W){this.Jb>=this.nb&&Bd(this,!0);this.Ma=0;this.lb=Ba( return}if(this.A.W){a=setTimeout;b=this.Fc;this.ba=Ba();var c=this.Cc;this.Ma&&(c=Math.round(c*this.Ma/this.pb));var c=c-(this.ba-this.lb),d=this.ba-this.T;d&&(this.na=Math.round(this.X/(10*d))/100,864E5<=d&&(this.ja=0,Ad(this)));if(0>c||this.nac&&(this.T-=c),c=0;this.Jb+=this.Ma;this.ba+=c;a(b,c)}}}; k.jb=function(a){if(yb(this))return!1;if(this.A.W)return this.j(this.toString()+" busy"),!1;Ad(this);this.A.W=!0;this.A.bc=!0;var b=this.G.run;b&&(b.textContent="Halt");this.C&&(a&&this.C.ub(!0),this.C.start(this.T,zd(this)));setTimeout(this.Fc,0);return!0};k.kb=function(){return 0};k.da=function(a){var b=!1;if(this.A.W){Cd(this);ec(this,this.X);this.X=0;this.A.W=!1;if(b=this.G.run)b.textContent="Run";this.C&&this.C.stop(Ba(),zd(this));b=!0}this.A.complete=a;return b}; function Ed(a){this.Xa=+a.model||1170;this.Ac=a.addrReset||0;sd.call(this,a,6666667);this.decode=1120==this.Xa?Fd.bind(this):Gd.bind(this);Hd(this);this.M=0;this.P=null;this.A.complete=!1}z(Ed,sd);k=Ed.prototype;k.reset=function(){this.status("model "+this.Xa);this.A.W&&this.da();Hd(this);vd(this);this.A.error=!1;this.parent.reset.call(this)}; -function Hd(a){a.U=65536;a.V=32768;a.$=65535;a.Z=32768;a.N=15;a.u=[0,0,0,0,0,0,0,a.Ac];a.Za=[0,0,0,0,0,0];a.La=[0,0,0,0];a.B=0;a.mb=0;a.$c=[4,2,0,1];a.O=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[65535,65535,65535,65535,65535,65535,65535,65535],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.ha=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.Tb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0];a.Jc=[0,0,0,0,0,0,0,0];a.Ic=0;a.J=0;a.D=a.H=0;a.g=a.f=a.yb=0;a.Aa=-1;Rb(a)}function Rb(a){a.Da=0;a.Kb=0;a.Mb=0;a.Ta=0;a.ua=0;a.Sb=0;a.sb=255;a.L=0;a.bb=0;a.Ea=262143;a.Nb=0;a.pa=0;a.P=null;a.v&&Id(a)}function Id(a){a.L?(a.S=65536,a.yc=a.Ta&16?4186112:253952,a.aa=a.Yc,a.sa=a.be,a.Vb=a.Ue,vc(a.v,a.Ta&16?22:18)):(a.S=0,a.yc=57344,a.aa=a.Xc,a.sa=a.Hc,a.Vb=a.Oc,vc(a.v,16))}function Uc(a){var b=a.Da;b&57344||(b=b&-3199|a.bb<<5|a.mb<<1);return b} -function Vc(a,b){b&=-3073;if(a.Da!=b){b&57344&&!(a.Da&57344)&&(a.Kb=a.pa>>16&65535,a.Mb=a.pa&65535);a.Da=b;a.bb=b>>5&3;a.mb=b>>1&15;var c=0;b&257&&(c=4,b&1&&(c|=2));a.L!=c&&(a.L=c,Id(a))}}function Wc(a){a.Da&57344||(a.Kb=a.pa>>16&65535);a=a.Kb;a&65280&&(a=(a<<8|a>>8)&65535);return a}function Xc(a){a.Da&57344||(a.Mb=a.pa&65535);return a.Mb}function Yc(a,b){1170>a.Xa&&(b&=-49);a.Ta!=b&&(a.Ta=b,a.Ea=b&16?4194303:262143,Id(a))}k.vc=function(){return 0}; -k.save=function(){var a=new O(this);a.set(0,[]);a.set(1,[this.ja,this.gb]);a.set(2,Ec(this.v));return a.data()};k.restore=function(a){var b=a[1];this.ja=b[1];Ad(this,b[3]);a:{b=this.v;a=a[2];var c;for(c=0;c>16&65535,a.Mb=a.pa&65535);a.Da=b;a.bb=b>>5&3;a.mb=b>>1&15;var c=0;b&257&&(c=4,b&1&&(c|=2));a.L!=c&&(a.L=c,Id(a))}}function Wc(a){a.Da&57344||(a.Kb=a.pa>>16&65535);a=a.Kb;a&65280&&(a=(a<<8|a>>8)&65535);return a}function Xc(a){a.Da&57344||(a.Mb=a.pa&65535);return a.Mb}function Yc(a,b){1170>a.Xa&&(b&=-49);a.Ta!=b&&(a.Ta=b,a.Ea=b&16?4194303:262143,Id(a))} +k.vc=function(){return 0};k.save=function(){var a=new O(this);a.set(0,[]);a.set(1,[this.ja,this.gb]);a.set(2,Ec(this.v));return a.data()};k.restore=function(a){var b=a[1];this.ja=b[1];Ad(this,b[3]);a:{b=this.v;a=a[2];var c;for(c=0;c>14&3;c=a.N>>14&3;a.B!=c&&(a.La[c]=a.u[6],a.u[6]=a.La[a.B]);a.N=b;a.J|=2}function Zc(a,b){if(b&=65024){var c=b>>9;do b+=34;while(c>>=1)}a.Sb=b;a.J|=2}function R(a,b){a.J&128||(a.Z=a.$=b,a.V=0)}function le(a,b,c){a.J&128||(a.Z=a.$=a.U=b,a.V=c||0)}function me(a,b,c,d){a.J&128||(a.Z=a.$=a.U=b,a.V=(c^b)&(d^b))} function ne(a,b){a.J&128||(a.Z=a.$=a.U=b,a.V=a.Z^a.U>>1)}function oe(a,b,c,d){a.J&128||(a.Z=a.$=a.U=b,a.V=(c^d)&(d^b))}k.wa=function(a,b,c){if(!this.M){0>this.Aa?this.Aa=$c(this):this.B||(a=4,this.ua|=4,this.u[6]=4,c=-3);this.pa=a;this.B=0;var d=this.sa(a|this.S),e=this.sa(a+2&65535|this.S);ad(this,e&-12289|this.Aa>>2&12288);pe(this,this.Aa);pe(this,this.u[7]);Q(this,d);this.J&=~(b|18);this.J|=9;this.Aa=-1;this.md=a;this.ld=c;if(-3<=c)throw a;}}; function qe(a){var b=re(a),c=re(a)&-1793;a.N&49152&&(c=c&-225|a.N&63712);Q(a,b);ad(a,c);a.J&=-17}function Dc(a,b){var c=b>>13&31;31>c&&(b=a.Ta&32?a.Tb[c]+(b&8190)&4194302:b&-3932161);return b} function se(a,b,c){var d,e,f;if(!(c&a.L))return f=b&65535,57344<=f&&(f|=a.yc),f;d=b>>13;a.Ta&a.$c[a.B]||(d&=7);e=a.O[a.B][d];f=(a.ha[a.B][d]<<6)+(b&8191)&a.Ea;var g=0;switch(e&7){case 1:g=4096;case 2:e|=128;c&4&&(g=8192);break;case 4:g=4096;case 5:c&4&&(g=4096);case 6:e|=c&4?192:128;break;default:g=32768}32512!=(e&32520)&&(e&8?e&32512&&(b&8128)<(e>>2&8128)&&(g|=16384):(b&8128)>(e>>2&8128)&&(g|=16384));a.O[a.B][d]=e;if(f!=(4194170&a.Ea)||a.B)a.bb=a.B,a.mb=d;g&&(g&57344&&(0<=a.Aa&&(g|=128),a.Da&57344|| -(g|=a.bb<<5|a.mb<<1,Vc(a,a.Da&-61695|g),a.wa(168,0,-1))),a.Da&61440||!(f<(4191360&a.Ea)||f>(4194239&a.Ea))||(a.Da|=4096,a.Da&512&&(a.J|=64)));return f}function te(a,b){return a.v.Lb(b)}function re(a){var b=a.sa(a.u[6]|a.S);a.u[6]=a.u[6]+2&65535;return b}function pe(a,b){var c=a.u[6]-2&65535;a.u[6]=c;a.pa=a.pa&65535|(a.pa&-65536)<<8|16121856;ue(a,0,c);a.Vb(c,b)}function ue(a,b,c){!a.B&&c<=a.sb&&(b||4(4194239&a.Ea))||(a.Da|=4096,a.Da&512&&(a.J|=64)));return f}function te(a,b){return a.v.Lb(b)}function re(a){var b=a.sa(a.u[6]|a.S);a.u[6]=a.u[6]+2&65535;return b}function pe(a,b){var c=a.u[6]-2&65535;a.u[6]=c;a.pa=a.pa&65535|(a.pa&-65536)<<8|16121856;ue(a,0,c);a.Vb(c,b)}function ue(a,b,c){!a.B&&c<=a.sb&&(b||4c&&d&1&&(f=1));a.b-=3;break;case 3:f=2;e=a.u[c];7!=c&&(e|=g);e=a.sa(e);e|=g;a.b-=7;break;case 4:f=-2;6>c&&d&1&&(f=-1);e=a.u[c]+f&65535;7!=c&&(e|=g);a.b-=4;break;case 5:f=-2;e=a.u[c]-2&65535;7!=c&&(e|=g);e=a.sa(e)|g;a.b-=8;break;case 6:return e=a.sa(Od(a,2)),e=e+a.u[c]&65535|g,a.b-=6,e;case 7:return e=a.sa(Od(a,2)),e=e+ a.u[c]&65535,e=a.sa(e|a.S)|g,a.b-=10,e}a.u[c]=a.u[c]+f&65535;a.pa=a.pa&65535|(a.pa&-65536)<<8|(f<<3&248|c)<<16;6==c&&0>f&&ue(a,b,a.u[6]);return e}k.Zb=function(a){if(!this.L)return this.v.Zb(a);this.M++;a=te(this,se(this,a,3));this.M--;return a};k.fb=function(a){if(!this.L)return this.v.fb(a);this.M++;a=this.Hc(se(this,a,2));this.M--;return a};k.tb=function(a,b){this.L?(this.M++,a=se(this,a,5),a&1&&this.b--,this.v.Eb(a,b),this.M--):this.v.tb(a,b)}; k.Fb=function(a,b){this.L?(this.M++,this.Oc(se(this,a,4),b),this.M--):this.v.Fb(a,b)};k.Xc=function(a,b,c){return ve(this,a,b,c)};k.Yc=function(a,b,c){return se(this,ve(this,a,b,c),c)};k.Hc=function(a){return this.v.oa(this.Nb=a)};k.be=function(a){return this.v.oa(this.Nb=se(this,a,2))};k.Oc=function(a,b){this.v.ib(this.Nb=a,b&65535)};k.Ue=function(a,b){this.v.ib(this.Nb=se(this,a,4),b)}; diff --git a/versions/pdpjs/1.30.3/pdp11.js b/versions/pdpjs/1.30.3/pdp11.js index ddd9aeea8..aea886e10 100644 --- a/versions/pdpjs/1.30.3/pdp11.js +++ b/versions/pdpjs/1.30.3/pdp11.js @@ -107,8 +107,8 @@ h.pd=function(){if(this.j.P){this.Cb>=this.jb&&yc(this,!0);this.Qa=0;this.eb=ra( this.l&&this.l.stop(ra(),wc(this));Wa(this,f.stack||f.message);return}if(this.j.P){a=setTimeout;b=this.bc;this.ra=ra();c=this.Ub;this.Qa&&(c=Math.round(c*this.Qa/this.lb));c-=this.ra-this.eb;if(d=this.ra-this.ba)this.Ga=Math.round(this.ma/(10*d))/100,864E5<=d&&(this.va=0,xc(this));if(0>c||this.Gac&&(this.ba-=c),c=0;this.Cb+=this.Qa;this.ra+=c;a(b,c)}}}; function mb(a){var b;a.j.error?(a.T(a.toString()+" error"),b=!0):b=!1;if(!b)if(a.j.P)a.T(a.toString()+" busy");else{xc(a);a.j.P=!0;a.j.Hb=!0;if(b=a.o.run)b.textContent="Halt";a.l&&a.l.start(a.ba,wc(a));setTimeout(a.bc,0)}}h.qb=function(){return 0};function G(a){var b=!1;if(a.j.P){Ac(a);ob(a,a.ma);a.ma=0;a.j.P=!1;if(b=a.o.run)b.textContent="Run";a.l&&a.l.stop(ra(),wc(a));b=!0}a.j.complete=void 0;return b} function Bc(a){this.Ea=+a.model||1170;this.Sb=a.addrReset||0;rc.call(this,a,6666667);this.decode=1120==this.Ea?Cc.bind(this):Dc.bind(this);Ec(this);this.ua=0;this.O=null;this.j.complete=!1}A(Bc,rc);h=Bc.prototype;h.reset=function(){this.status("model "+this.Ea);this.j.P&&G(this);Ec(this);uc(this);this.j.error=!1;this.parent.reset.call(this)}; -function Ec(a){a.m=65536;a.g=32768;a.i=65535;a.s=32768;a.C=15;a.f=[0,0,0,0,0,0,0,a.Sb];a.Fa=[0,0,0,0,0,0];a.pa=[0,0,0,0];a.v=0;a.cb=0;a.sd=[4,2,0,1];a.H=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[65535,65535,65535,65535,65535,65535,65535,65535],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.X=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.ab=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0];a.$b=[0,0,0,0,0,0,0,0];a.Zb=0;a.u=0;a.B=a.D=0;a.c=a.b=a.Ab=0;a.Ja=-1;lb(a)}function lb(a){a.Z=0;a.Db=0;a.Eb=0;a.Ba=0;a.fa=0;a.Gb=0;a.ob=255;a.aa=0;a.bb=0;a.Ra=262143;a.Xa=0;a.A=0;a.O=null;a.h&&Yb(a)}function Yb(a){a.aa?(a.R=65536,a.Rb=a.Ba&16?4186112:253952,a.M=a.nc,a.V=a.md,a.sb=a.he,Cb(a.h,a.Ba&16?22:18)):(a.R=0,a.Rb=57344,a.M=a.mc,a.V=a.Yb,a.sb=a.fc,Cb(a.h,16))} +function Ec(a){a.m=65536;a.g=32768;a.i=65535;a.s=32768;a.C=15;a.f=[0,0,0,0,0,0,0,a.Sb];a.Fa=[0,0,0,0,0,0];a.pa=[0,0,0,0];a.v=0;a.cb=0;a.sd=[4,2,0,1];a.H=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.X=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];a.ab= +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];a.$b=[0,0,0,0,0,0,0,0];a.Zb=0;a.u=0;a.B=a.D=0;a.c=a.b=a.Ab=0;a.Ja=-1;lb(a)}function lb(a){a.Z=0;a.Db=0;a.Eb=0;a.Ba=0;a.fa=0;a.Gb=0;a.ob=255;a.aa=0;a.bb=0;a.Ra=262143;a.Xa=0;a.A=0;a.O=null;a.h&&Yb(a)}function Yb(a){a.aa?(a.R=65536,a.Rb=a.Ba&16?4186112:253952,a.M=a.nc,a.V=a.md,a.sb=a.he,Cb(a.h,a.Ba&16?22:18)):(a.R=0,a.Rb=57344,a.M=a.mc,a.V=a.Yb,a.sb=a.fc,Cb(a.h,16))} function Xb(a,b){b&=-3073;if(a.Z!=b){b&57344&&!(a.Z&57344)&&(a.Db=a.A>>16&65535,a.Eb=a.A&65535);a.Z=b;a.bb=b>>5&3;a.cb=b>>1&15;var c=0;b&257&&(c=4,b&1&&(c|=2));a.aa!=c&&(a.aa=c,Yb(a))}}h.Ob=function(){return 0};h.save=function(){var a=new O(this);a.set(0,[]);a.set(1,[this.va,this.ta]);a.set(2,Pb(this.h));return a.data()}; h.restore=function(a){var b=a[1];this.va=b[1];xc(this,b[3]);a:{b=this.h;a=a[2];var c;for(c=0;c>1)}function Nc(a,b,c,d){a.u&128||(a.s=a.i=a.m=b,a.g=(c^d)&(d^b))}function K(a,b,c,d){if(!a.ua){0>a.Ja?a.Ja=Zb(a):a.v||(b=4,a.fa|=4,a.f[6]=4,d=-3);a.A=b;a.v=0;var e=a.V(b|a.R),f=a.V(b+2&65535|a.R);$b(a,f&-12289|a.Ja>>2&12288);Oc(a,a.Ja);Oc(a,a.f[7]);Q(a,e);a.u&=~(c|18);a.u|=9;a.Ja=-1;if(-3<=d)throw b;}}function Pc(a){var b=Qc(a),c=Qc(a)&-1793;a.C&49152&&(c=c&-225|a.C&63712);Q(a,b);$b(a,c);a.u&=-17} function Lb(a,b){var c=b>>13&31;31>c&&(b=a.Ba&32?a.ab[c]+(b&8190)&4194302:b&-3932161);return b} function Rc(a,b,c){var d,e,f;if(!(c&a.aa))return f=b&65535,57344<=f&&(f|=a.Rb),f;d=b>>13;a.Ba&a.sd[a.v]||(d&=7);e=a.H[a.v][d];f=(a.X[a.v][d]<<6)+(b&8191)&a.Ra;var g=0;switch(e&7){case 1:g=4096;case 2:e|=128;c&4&&(g=8192);break;case 4:g=4096;case 5:c&4&&(g=4096);case 6:e|=c&4?192:128;break;default:g=32768}32512!=(e&32520)&&(e&8?e&32512&&(b&8128)<(e>>2&8128)&&(g|=16384):(b&8128)>(e>>2&8128)&&(g|=16384));a.H[a.v][d]=e;if(f!=(4194170&a.Ra)||a.v)a.bb=a.v,a.cb=d;g&&(g&57344&&(0<=a.Ja&&(g|=128),a.Z&57344|| -(g|=a.bb<<5|a.cb<<1,Xb(a,a.Z&-61695|g),K(a,168,0,-1))),a.Z&61440||!(f<(4191360&a.Ra)||f>(4194239&a.Ra))||(a.Z|=4096,a.Z&512&&(a.u|=64)));return f}function Qc(a){var b=a.V(a.f[6]|a.R);a.f[6]=a.f[6]+2&65535;return b}function Oc(a,b){var c=a.f[6]-2&65535;a.f[6]=c;a.A=a.A&65535|(a.A&-65536)<<8|16121856;Sc(a,0,c);a.sb(c,b)}function Sc(a,b,c){!a.v&&c<=a.ob&&(b||4(4194239&a.Ra))||(a.Z|=4096,a.Z&512&&(a.u|=64)));return f}function Qc(a){var b=a.V(a.f[6]|a.R);a.f[6]=a.f[6]+2&65535;return b}function Oc(a,b){var c=a.f[6]-2&65535;a.f[6]=c;a.A=a.A&65535|(a.A&-65536)<<8|16121856;Sc(a,0,c);a.sb(c,b)}function Sc(a,b,c){!a.v&&c<=a.ob&&(b||4c&&d&1&&(f=1));a.a-=3;break;case 3:f=2;e=a.f[c];7!=c&&(e|=g);e=a.V(e);e|=g;a.a-=7;break;case 4:f=-2;6>c&&d&1&&(f=-1);e=a.f[c]+f&65535;7!=c&&(e|=g);a.a-=4;break;case 5:f=-2;e=a.f[c]-2&65535;7!=c&&(e|=g);e=a.V(e)|g;a.a-=8;break;case 6:return e=a.V(Hc(a,2)),e=e+a.f[c]&65535|g,a.a-=6,e;case 7:return e=a.V(Hc(a,2)),e=e+a.f[c]& 65535,e=a.V(e|a.R)|g,a.a-=10,e}a.f[c]=a.f[c]+f&65535;a.A=a.A&65535|(a.A&-65536)<<8|(f<<3&248|c)<<16;6==c&&0>f&&Sc(a,b,a.f[6]);return e}h.mb=function(a){if(!this.aa)return this.h.mb(a);this.ua++;a=this.Yb(Rc(this,a,2));this.ua--;return a};h.$a=function(a,b){this.aa?(this.ua++,a=Rc(this,a,5),a&1&&this.a--,Nb(this.h,a,b),this.ua--):this.h.$a(a,b)};h.pb=function(a,b){this.aa?(this.ua++,this.fc(Rc(this,a,4),b),this.ua--):this.h.pb(a,b)};h.mc=function(a,b,c){return Tc(this,a,b,c)}; h.nc=function(a,b,c){return Rc(this,Tc(this,a,b,c),c)};h.Yb=function(a){return Mb(this.h,this.Xa=a)};h.md=function(a){return Mb(this.h,this.Xa=Rc(this,a,2))};h.fc=function(a,b){Ob(this.h,this.Xa=a,b&65535)};h.he=function(a,b){Ob(this.h,this.Xa=Rc(this,a,4),b)};function Uc(a,b,c){var d=a.b=b&7;(b=a.c=(b&56)>>3)?(d=Tc(a,b,d,2),c&65536||61440!==(a.C&61440)&&(d&=65535),a.v=a.C>>12&3,c=a.V(d|c&a.R),a.v=a.C>>14&3):c=6!=d||(a.C>>2&12288)===(a.C&12288)?a.f[d]:a.pa[a.C>>12&3];return c}