=0;)p<8?(d=(this[i]&(1<>(p+=this.DB-8)):(d=this[i]>>(p-=8)&255,p<=0&&(p+=this.DB,--i)),0!=(128&d)&&(d|=-256),0==k&&(128&this.s)!=(128&d)&&++k,(k>0||d!=this.s)&&(r[k++]=d);return r},BigInteger.prototype.equals=function(a){return 0==this.compareTo(a)},BigInteger.prototype.min=function(a){return this.compareTo(a)<0?this:a},BigInteger.prototype.max=function(a){return this.compareTo(a)>0?this:a},BigInteger.prototype.and=function(a){var r=nbi();return this.bitwiseTo(a,op_and,r),r},BigInteger.prototype.or=function(a){var r=nbi();return this.bitwiseTo(a,op_or,r),r},BigInteger.prototype.xor=function(a){var r=nbi();return this.bitwiseTo(a,op_xor,r),r},BigInteger.prototype.andNot=function(a){var r=nbi();return this.bitwiseTo(a,op_andnot,r),r},BigInteger.prototype.not=function(){for(var r=nbi(),i=0;i=this.t?0!=this.s:0!=(this[j]&1<1){var g2=nbi();for(z.sqrTo(g[1],g2);n<=km;)g[n]=nbi(),z.mulTo(g2,g[n-2],g[n]),n+=2}var w,t,j=e.t-1,is1=!0,r2=nbi();for(i=nbits(e[j])-1;j>=0;){for(i>=k1?w=e[j]>>i-k1&km:(w=(e[j]&(1<0&&(w|=e[j-1]>>this.DB+i-k1)),n=k;0==(1&w);)w>>=1,--n;if((i-=n)<0&&(i+=this.DB,--j),is1)g[w].copyTo(r),is1=!1;else{for(;n>1;)z.sqrTo(r,r2),z.sqrTo(r2,r),n-=2;n>0?z.sqrTo(r,r2):(t=r,r=r2,r2=t),z.mulTo(r2,g[w],r)}for(;j>=0&&0==(e[j]&1<=0?(u.subTo(v,u),ac&&a.subTo(c,a),b.subTo(d,b)):(v.subTo(u,v),ac&&c.subTo(a,c),d.subTo(b,d))}if(0!=v.compareTo(BigInteger.ONE))return BigInteger.ZERO;for(;d.compareTo(m)>=0;)d.subTo(m,d);for(;d.signum()<0;)d.addTo(m,d);return d},BigInteger.prototype.pow=function(e){return this.exp(e,new NullExp)},BigInteger.prototype.gcd=function(a){var x=this.s<0?this.negate():this.clone(),y=a.s<0?a.negate():a.clone();if(x.compareTo(y)<0){var t=x;x=y,y=t}var i=x.getLowestSetBit(),g=y.getLowestSetBit();if(g<0)return x;for(i0&&(x.rShiftTo(g,x),y.rShiftTo(g,y));x.signum()>0;)(i=x.getLowestSetBit())>0&&x.rShiftTo(i,x),(i=y.getLowestSetBit())>0&&y.rShiftTo(i,y),x.compareTo(y)>=0?(x.subTo(y,x),x.rShiftTo(1,x)):(y.subTo(x,y),y.rShiftTo(1,y));return g>0&&y.lShiftTo(g,y),y},BigInteger.prototype.isProbablePrime=function(t){var i,x=this.abs();if(1==x.t&&x[0]<=lowprimes[lowprimes.length-1]){for(i=0;i=0?x.mod(this.m):x},Classic.prototype.revert=function(x){return x},Classic.prototype.reduce=function(x){x.divRemTo(this.m,null,x)},Classic.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r),this.reduce(r)},Classic.prototype.sqrTo=function(x,r){x.squareTo(r),this.reduce(r)};var Montgomery=GLOBAL.Montgomery=function(m){this.m=m,this.mp=m.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(r,r),r},Montgomery.prototype.revert=function(x){var r=nbi();return x.copyTo(r),this.reduce(r),r},Montgomery.prototype.reduce=function(x){for(;x.t<=this.mt2;)x[x.t++]=0;for(var i=0;i>15)*this.mpl&this.um)<<15)&x.DM;for(x[j=i+this.m.t]+=this.m.am(0,u0,x,i,0,this.m.t);x[j]>=x.DV;)x[j]-=x.DV,x[++j]++}x.clamp(),x.drShiftTo(this.m.t,x),x.compareTo(this.m)>=0&&x.subTo(this.m,x)},Montgomery.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r),this.reduce(r)},Montgomery.prototype.sqrTo=function(x,r){x.squareTo(r),this.reduce(r)};var NullExp=GLOBAL.NullExp=function(){};NullExp.prototype.convert=function(x){return x},NullExp.prototype.revert=function(x){return x},NullExp.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r)},NullExp.prototype.sqrTo=function(x,r){x.squareTo(r)};var Barrett=GLOBAL.Barrett=function(m){this.r2=nbi(),this.q3=nbi(),BigInteger.ONE.dlShiftTo(2*m.t,this.r2),this.mu=this.r2.divide(m),this.m=m};Barrett.prototype.convert=function(x){if(x.s<0||x.t>2*this.m.t)return x.mod(this.m);if(x.compareTo(this.m)<0)return x;var r=nbi();return x.copyTo(r),this.reduce(r),r},Barrett.prototype.revert=function(x){return x},Barrett.prototype.reduce=function(x){for(x.drShiftTo(this.m.t-1,this.r2),x.t>this.m.t+1&&(x.t=this.m.t+1,x.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);x.compareTo(this.r2)<0;)x.dAddOffset(1,this.m.t+1);for(x.subTo(this.r2,x);x.compareTo(this.m)>=0;)x.subTo(this.m,x)},Barrett.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r),this.reduce(r)},Barrett.prototype.sqrTo=function(x,r){x.squareTo(r),this.reduce(r)}}(),(ec=GLOBAL.EllipticCurve=function(){}).FieldElementFp=function(q,x){this.x=x,this.q=q},ec.FieldElementFp.prototype.equals=function(other){return other==this||this.q.equals(other.q)&&this.x.equals(other.x)},ec.FieldElementFp.prototype.toBigInteger=function(){return this.x},ec.FieldElementFp.prototype.negate=function(){return new ec.FieldElementFp(this.q,this.x.negate().mod(this.q))},ec.FieldElementFp.prototype.add=function(b){return new ec.FieldElementFp(this.q,this.x.add(b.toBigInteger()).mod(this.q))},ec.FieldElementFp.prototype.subtract=function(b){return new ec.FieldElementFp(this.q,this.x.subtract(b.toBigInteger()).mod(this.q))},ec.FieldElementFp.prototype.multiply=function(b){return new ec.FieldElementFp(this.q,this.x.multiply(b.toBigInteger()).mod(this.q))},ec.FieldElementFp.prototype.square=function(){return new ec.FieldElementFp(this.q,this.x.square().mod(this.q))},ec.FieldElementFp.prototype.divide=function(b){return new ec.FieldElementFp(this.q,this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q))},ec.FieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)},ec.FieldElementFp.prototype.sqrt=function(){if(!this.q.testBit(0))throw new Error("even value of q");if(this.q.testBit(1)){var z=new ec.FieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q));return z.square().equals(this)?z:null}var qMinusOne=this.q.subtract(BigInteger.ONE),legendreExponent=qMinusOne.shiftRight(1);if(!this.x.modPow(legendreExponent,this.q).equals(BigInteger.ONE))return null;var U,V,k=qMinusOne.shiftRight(2).shiftLeft(1).add(BigInteger.ONE),Q=this.x,fourQ=Q.shiftLeft(2).mod(this.q);do{var P,rand=new SecureRandom;do{P=new BigInteger(this.q.bitLength(),rand)}while(P.compareTo(this.q)>=0||!P.multiply(P).subtract(fourQ).modPow(legendreExponent,this.q).equals(qMinusOne));var result=ec.FieldElementFp.fastLucasSequence(this.q,P,Q,k);if(U=result[0],(V=result[1]).multiply(V).mod(this.q).equals(fourQ))return V.testBit(0)&&(V=V.add(this.q)),V=V.shiftRight(1),new ec.FieldElementFp(this.q,V)}while(U.equals(BigInteger.ONE)||U.equals(qMinusOne));return null},
+/*!
+ * Crypto-JS 2.5.4 BlockModes.js
+ * contribution from Simon Greatrix
+ */
+function(C){var C_pad=C.pad={};function _requiredPadding(cipher,message){var blockSizeInBytes=4*cipher._blocksize;return blockSizeInBytes-message.length%blockSizeInBytes}var _unpadLength=function(cipher,message,alg,padding){var pad=message.pop();if(0==pad)throw new Error("Invalid zero-length padding specified for "+alg+". Wrong cipher specification or key used?");if(pad>4*cipher._blocksize)throw new Error("Invalid padding length of "+pad+" specified for "+alg+". Wrong cipher specification or key used?");for(var i=1;i0;reqd--)message.push(0)},unpad:function(cipher,message){for(;0==message[message.length-1];)message.pop()}},C_pad.iso7816={pad:function(cipher,message){var reqd=_requiredPadding(cipher,message);for(message.push(128);reqd>1;reqd--)message.push(0)},unpad:function(cipher,message){var padLength;for(padLength=4*cipher._blocksize;padLength>0;padLength--){var b=message.pop();if(128==b)return;if(0!=b)throw new Error("ISO-7816 padding byte must be 0, not 0x"+b.toString(16)+". Wrong cipher specification or key used?")}throw new Error("ISO-7816 padded beyond cipher block size. Wrong cipher specification or key used?")}},C_pad.ansix923={pad:function(cipher,message){for(var reqd=_requiredPadding(cipher,message),i=1;i 0 and a power of 2");if(N>2147483647/128/r)throw Error("Parameter N is too large");if(r>2147483647/128/p)throw Error("Parameter r is too large");var PBKDF2_opts={iterations:1,hasher:Crypto.SHA256,asBytes:!0},B=Crypto.PBKDF2(passwd,salt,128*p*r,PBKDF2_opts);try{var i=0,worksDone=0,makeWorker=function(){if(!workerUrl){var blob,code="("+scryptCore.toString()+")()";try{blob=new Blob([code],{type:"text/javascript"})}catch(e){GLOBAL.BlobBuilder=GLOBAL.BlobBuilder||GLOBAL.WebKitBlobBuilder||GLOBAL.MozBlobBuilder||GLOBAL.MSBlobBuilder,(blob=new BlobBuilder).append(code),blob=blob.getBlob("text/javascript")}workerUrl=URL.createObjectURL(blob)}var worker=new Worker(workerUrl);return worker.onmessage=function(event){var Bi=event.data[0],Bslice=event.data[1];worksDone++,i1&&workers[1].postMessage([N,r,p,B,i++])}catch(e){GLOBAL.setTimeout((function(){scryptCore(),callback(Crypto.PBKDF2(passwd,B,dkLen,PBKDF2_opts))}),0)}function scryptCore(){var XY=[],V=[];if(void 0===B)onmessage=function(event){var data=event.data,N=data[0],r=data[1],B=(data[2],data[3]),i=data[4],Bslice=[];arraycopy32(B,128*i*r,Bslice,0,128*r),smix(Bslice,0,r,N,V,XY),postMessage([i,Bslice])};else for(var i=0;i
>>32-b}function salsa20_8(B){var i,B32=new Array(32),x=new Array(32);for(i=0;i<16;i++)B32[i]=(255&B[4*i+0])<<0,B32[i]|=(255&B[4*i+1])<<8,B32[i]|=(255&B[4*i+2])<<16,B32[i]|=(255&B[4*i+3])<<24;for(function(src,srcPos,dest,destPos,length){for(;length--;)dest[destPos++]=src[srcPos++]}(B32,0,x,0,16),i=8;i>0;i-=2)x[4]^=R(x[0]+x[12],7),x[8]^=R(x[4]+x[0],9),x[12]^=R(x[8]+x[4],13),x[0]^=R(x[12]+x[8],18),x[9]^=R(x[5]+x[1],7),x[13]^=R(x[9]+x[5],9),x[1]^=R(x[13]+x[9],13),x[5]^=R(x[1]+x[13],18),x[14]^=R(x[10]+x[6],7),x[2]^=R(x[14]+x[10],9),x[6]^=R(x[2]+x[14],13),x[10]^=R(x[6]+x[2],18),x[3]^=R(x[15]+x[11],7),x[7]^=R(x[3]+x[15],9),x[11]^=R(x[7]+x[3],13),x[15]^=R(x[11]+x[7],18),x[1]^=R(x[0]+x[3],7),x[2]^=R(x[1]+x[0],9),x[3]^=R(x[2]+x[1],13),x[0]^=R(x[3]+x[2],18),x[6]^=R(x[5]+x[4],7),x[7]^=R(x[6]+x[5],9),x[4]^=R(x[7]+x[6],13),x[5]^=R(x[4]+x[7],18),x[11]^=R(x[10]+x[9],7),x[8]^=R(x[11]+x[10],9),x[9]^=R(x[8]+x[11],13),x[10]^=R(x[9]+x[8],18),x[12]^=R(x[15]+x[14],7),x[13]^=R(x[12]+x[15],9),x[14]^=R(x[13]+x[12],13),x[15]^=R(x[14]+x[13],18);for(i=0;i<16;++i)B32[i]=x[i]+B32[i];for(i=0;i<16;i++){var bi=4*i;B[bi+0]=B32[i]>>0&255,B[bi+1]=B32[i]>>8&255,B[bi+2]=B32[i]>>16&255,B[bi+3]=B32[i]>>24&255}}function blockxor(S,Si,D,Di,len){for(var i=len>>6;i--;)D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++],D[Di++]^=S[Si++]}function integerify(B,bi,r){var n;return n=(255&B[(bi+=64*(2*r-1))+0])<<0,n|=(255&B[bi+1])<<8,n|=(255&B[bi+2])<<16,n|=(255&B[bi+3])<<24}function arraycopy32(src,srcPos,dest,destPos,length){for(var i=length>>5;i--;)dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++],dest[destPos++]=src[srcPos++]}}},
+/*!
+ * Crypto-JS v2.5.4 AES.js
+ * http://code.google.com/p/crypto-js/
+ * Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
+ * http://code.google.com/p/crypto-js/wiki/License
+ */
+function(){for(var C=Crypto,util=C.util,UTF8=C.charenc.UTF8,SBOX=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22],INVSBOX=[],i=0;i<256;i++)INVSBOX[SBOX[i]]=i;var MULT2=[],MULT3=[],MULT9=[],MULTB=[],MULTD=[],MULTE=[];function xtime(a,b){for(var result=0,i=0;i<8;i++){1&b&&(result^=a);var hiBitSet=128&a;a=a<<1&255,hiBitSet&&(a^=27),b>>>=1}return result}for(i=0;i<256;i++)MULT2[i]=xtime(i,2),MULT3[i]=xtime(i,3),MULT9[i]=xtime(i,9),MULTB[i]=xtime(i,11),MULTD[i]=xtime(i,13),MULTE[i]=xtime(i,14);var keylength,nrounds,keyschedule,RCON=[0,1,2,4,8,16,32,64,128,27,54],state=[[],[],[],[]],AES=C.AES={encrypt:function(message,password,options){var mode=(options=options||{}).mode||new C.mode.OFB;mode.fixOptions&&mode.fixOptions(options);var m=message.constructor==String?UTF8.stringToBytes(message):message,iv=options.iv||util.randomBytes(4*AES._blocksize),k=password.constructor==String?C.PBKDF2(password,iv,32,{asBytes:!0}):password;return AES._init(k),mode.encrypt(AES,m,iv),m=options.iv?m:iv.concat(m),options&&options.asBytes?m:util.bytesToBase64(m)},decrypt:function(ciphertext,password,options){var mode=(options=options||{}).mode||new C.mode.OFB;mode.fixOptions&&mode.fixOptions(options);var c=ciphertext.constructor==String?util.base64ToBytes(ciphertext):ciphertext,iv=options.iv||c.splice(0,4*AES._blocksize),k=password.constructor==String?C.PBKDF2(password,iv,32,{asBytes:!0}):password;return AES._init(k),mode.decrypt(AES,c,iv),options&&options.asBytes?c:UTF8.bytesToString(c)},_blocksize:4,_encryptblock:function(m,offset){for(var row=0;row6&&row%keylength==4&&(temp[0]=SBOX[temp[0]],temp[1]=SBOX[temp[1]],temp[2]=SBOX[temp[2]],temp[3]=SBOX[temp[3]]),keyschedule[row]=[keyschedule[row-keylength][0]^temp[0],keyschedule[row-keylength][1]^temp[1],keyschedule[row-keylength][2]^temp[2],keyschedule[row-keylength][3]^temp[3]]}}}}(),ec.FieldElementFp.fastLucasSequence=function(p,P,Q,k){for(var n=k.bitLength(),s=k.getLowestSetBit(),Uh=BigInteger.ONE,Vl=BigInteger.TWO,Vh=P,Ql=BigInteger.ONE,Qh=BigInteger.ONE,j=n-1;j>=s+1;--j)Ql=Ql.multiply(Qh).mod(p),k.testBit(j)?(Qh=Ql.multiply(Q).mod(p),Uh=Uh.multiply(Vh).mod(p),Vl=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p),Vh=Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p)):(Qh=Ql,Uh=Uh.multiply(Vl).subtract(Ql).mod(p),Vh=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p),Vl=Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p));for(Qh=(Ql=Ql.multiply(Qh).mod(p)).multiply(Q).mod(p),Uh=Uh.multiply(Vl).subtract(Ql).mod(p),Vl=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p),Ql=Ql.multiply(Qh).mod(p),j=1;j<=s;++j)Uh=Uh.multiply(Vl).mod(p),Vl=Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p),Ql=Ql.multiply(Ql).mod(p);return[Uh,Vl]},ec.PointFp=function(curve,x,y,z,compressed){this.curve=curve,this.x=x,this.y=y,this.z=null==z?BigInteger.ONE:z,this.zinv=null,this.compressed=!!compressed},ec.PointFp.prototype.getX=function(){null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q));var r=this.x.toBigInteger().multiply(this.zinv);return this.curve.reduce(r),this.curve.fromBigInteger(r)},ec.PointFp.prototype.getY=function(){null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q));var r=this.y.toBigInteger().multiply(this.zinv);return this.curve.reduce(r),this.curve.fromBigInteger(r)},ec.PointFp.prototype.equals=function(other){return other==this||(this.isInfinity()?other.isInfinity():other.isInfinity()?this.isInfinity():!!other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q).equals(BigInteger.ZERO)&&other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q).equals(BigInteger.ZERO))},ec.PointFp.prototype.isInfinity=function(){return null==this.x&&null==this.y||this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)},ec.PointFp.prototype.negate=function(){return new ec.PointFp(this.curve,this.x,this.y.negate(),this.z)},ec.PointFp.prototype.add=function(b){if(this.isInfinity())return b;if(b.isInfinity())return this;var u=b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q),v=b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(v))return BigInteger.ZERO.equals(u)?this.twice():this.curve.getInfinity();var THREE=new BigInteger("3"),x1=this.x.toBigInteger(),y1=this.y.toBigInteger(),v2=(b.x.toBigInteger(),b.y.toBigInteger(),v.square()),v3=v2.multiply(v),x1v2=x1.multiply(v2),zu2=u.square().multiply(this.z),x3=zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q),y3=x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q),z3=v3.multiply(this.z).multiply(b.z).mod(this.curve.q);return new ec.PointFp(this.curve,this.curve.fromBigInteger(x3),this.curve.fromBigInteger(y3),z3)},ec.PointFp.prototype.twice=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var THREE=new BigInteger("3"),x1=this.x.toBigInteger(),y1=this.y.toBigInteger(),y1z1=y1.multiply(this.z),y1sqz1=y1z1.multiply(y1).mod(this.curve.q),a=this.curve.a.toBigInteger(),w=x1.square().multiply(THREE);BigInteger.ZERO.equals(a)||(w=w.add(this.z.square().multiply(a)));var x3=(w=w.mod(this.curve.q)).square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q),y3=w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q),z3=y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);return new ec.PointFp(this.curve,this.curve.fromBigInteger(x3),this.curve.fromBigInteger(y3),z3)},ec.PointFp.prototype.multiply=function(k){if(this.isInfinity())return this;if(0==k.signum())return this.curve.getInfinity();var i,e=k,h=e.multiply(new BigInteger("3")),neg=this.negate(),R=this;for(i=h.bitLength()-2;i>0;--i){R=R.twice();var hBit=h.testBit(i);hBit!=e.testBit(i)&&(R=R.add(hBit?this:neg))}return R},ec.PointFp.prototype.multiplyTwo=function(j,x,k){var i;i=j.bitLength()>k.bitLength()?j.bitLength()-1:k.bitLength()-1;for(var R=this.curve.getInfinity(),both=this.add(x);i>=0;)R=R.twice(),j.testBit(i)?R=k.testBit(i)?R.add(both):R.add(this):k.testBit(i)&&(R=R.add(x)),--i;return R},ec.PointFp.prototype.getEncoded=function(compressed){var x=this.getX().toBigInteger(),y=this.getY().toBigInteger(),enc=ec.integerToBytes(x,32);return compressed?y.isEven()?enc.unshift(2):enc.unshift(3):(enc.unshift(4),enc=enc.concat(ec.integerToBytes(y,32))),enc},ec.PointFp.decodeFrom=function(curve,enc){enc[0];var dataLen=enc.length-1,xBa=enc.slice(1,1+dataLen/2),yBa=enc.slice(1+dataLen/2,1+dataLen);xBa.unshift(0),yBa.unshift(0);var x=new BigInteger(xBa),y=new BigInteger(yBa);return new ec.PointFp(curve,curve.fromBigInteger(x),curve.fromBigInteger(y))},ec.PointFp.prototype.add2D=function(b){if(this.isInfinity())return b;if(b.isInfinity())return this;if(this.x.equals(b.x))return this.y.equals(b.y)?this.twice():this.curve.getInfinity();var x_x=b.x.subtract(this.x),gamma=b.y.subtract(this.y).divide(x_x),x3=gamma.square().subtract(this.x).subtract(b.x),y3=gamma.multiply(this.x.subtract(x3)).subtract(this.y);return new ec.PointFp(this.curve,x3,y3)},ec.PointFp.prototype.twice2D=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var TWO=this.curve.fromBigInteger(BigInteger.valueOf(2)),THREE=this.curve.fromBigInteger(BigInteger.valueOf(3)),gamma=this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO)),x3=gamma.square().subtract(this.x.multiply(TWO)),y3=gamma.multiply(this.x.subtract(x3)).subtract(this.y);return new ec.PointFp(this.curve,x3,y3)},ec.PointFp.prototype.multiply2D=function(k){if(this.isInfinity())return this;if(0==k.signum())return this.curve.getInfinity();var i,e=k,h=e.multiply(new BigInteger("3")),neg=this.negate(),R=this;for(i=h.bitLength()-2;i>0;--i){R=R.twice();var hBit=h.testBit(i);hBit!=e.testBit(i)&&(R=R.add2D(hBit?this:neg))}return R},ec.PointFp.prototype.isOnCurve=function(){var x=this.getX().toBigInteger(),y=this.getY().toBigInteger(),a=this.curve.getA().toBigInteger(),b=this.curve.getB().toBigInteger(),n=this.curve.getQ(),lhs=y.multiply(y).mod(n),rhs=x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n);return lhs.equals(rhs)},ec.PointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"},ec.PointFp.prototype.validate=function(){var n=this.curve.getQ();if(this.isInfinity())throw new Error("Point is at infinity.");var x=this.getX().toBigInteger(),y=this.getY().toBigInteger();if(x.compareTo(BigInteger.ONE)<0||x.compareTo(n.subtract(BigInteger.ONE))>0)throw new Error("x coordinate out of bounds");if(y.compareTo(BigInteger.ONE)<0||y.compareTo(n.subtract(BigInteger.ONE))>0)throw new Error("y coordinate out of bounds");if(!this.isOnCurve())throw new Error("Point is not on the curve.");if(this.multiply(n).isInfinity())throw new Error("Point is not a scalar multiple of G.");return!0},ec.CurveFp=function(q,a,b){this.q=q,this.a=this.fromBigInteger(a),this.b=this.fromBigInteger(b),this.infinity=new ec.PointFp(this,null,null),this.reducer=new Barrett(this.q)},ec.CurveFp.prototype.getQ=function(){return this.q},ec.CurveFp.prototype.getA=function(){return this.a},ec.CurveFp.prototype.getB=function(){return this.b},ec.CurveFp.prototype.equals=function(other){return other==this||this.q.equals(other.q)&&this.a.equals(other.a)&&this.b.equals(other.b)},ec.CurveFp.prototype.getInfinity=function(){return this.infinity},ec.CurveFp.prototype.fromBigInteger=function(x){return new ec.FieldElementFp(this.q,x)},ec.CurveFp.prototype.reduce=function(x){this.reducer.reduce(x)},ec.CurveFp.prototype.decodePointHex=function(s){var firstByte=parseInt(s.substr(0,2),16);switch(firstByte){case 0:return this.infinity;case 2:case 3:var yTilde=1&firstByte,xHex=s.substr(2,s.length-2),X1=new BigInteger(xHex,16);return this.decompressPoint(yTilde,X1);case 4:case 6:case 7:var len=(s.length-2)/2,yHex=(xHex=s.substr(2,len),s.substr(len+2,len));return new ec.PointFp(this,this.fromBigInteger(new BigInteger(xHex,16)),this.fromBigInteger(new BigInteger(yHex,16)));default:return null}},ec.CurveFp.prototype.encodePointHex=function(p){if(p.isInfinity())return"00";var xHex=p.getX().toBigInteger().toString(16),yHex=p.getY().toBigInteger().toString(16),oLen=this.getQ().toString(16).length;for(oLen%2!=0&&oLen++;xHex.lengthbytes.length;)bytes.unshift(0);return bytes},ec.X9Parameters=function(curve,g,n,h){this.curve=curve,this.g=g,this.n=n,this.h=h},ec.X9Parameters.prototype.getCurve=function(){return this.curve},ec.X9Parameters.prototype.getG=function(){return this.g},ec.X9Parameters.prototype.getN=function(){return this.n},ec.X9Parameters.prototype.getH=function(){return this.h},ec.secNamedCurves={secp256k1:function(){var p=ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"),a=BigInteger.ZERO,b=ec.fromHex("7"),n=ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"),h=BigInteger.ONE,curve=new ec.CurveFp(p,a,b),G=curve.decodePointHex("0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");return new ec.X9Parameters(curve,G,n,h)}},ec.getSECCurveByName=function(name){return null==ec.secNamedCurves[name]?null:ec.secNamedCurves[name]()},function(){var bitjs=GLOBAL.bitjs=function(){};"FLO"==GLOBAL.cryptocoin&&(bitjs.pub=35,bitjs.priv=163,bitjs.multisig=8,bitjs.compressed=!1),"FLO_TEST"==GLOBAL.cryptocoin&&(bitjs.pub=115,bitjs.priv=239,bitjs.multisig=198),"BTC"==GLOBAL.cryptocoin&&(bitjs.pub=0,bitjs.priv=128,bitjs.multisig=5),"BTC_TESTNET"==GLOBAL.cryptocoin&&(bitjs.pub=111,bitjs.priv=239,bitjs.multisig=196),bitjs.privkey2wif=function(h){var r=Crypto.util.hexToBytes(h);1==bitjs.compressed&&r.push(1),r.unshift(bitjs.priv);var checksum=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0}).slice(0,4);return B58.encode(r.concat(checksum))},bitjs.wif2privkey=function(wif){var compressed=!1,decode=B58.decode(wif),key=decode.slice(0,decode.length-4);return(key=key.slice(1,key.length)).length>=33&&1==key[key.length-1]&&(key=key.slice(0,key.length-1),compressed=!0),{privkey:Crypto.util.bytesToHex(key),compressed:compressed}},bitjs.wif2pubkey=function(wif){var compressed=bitjs.compressed,r=bitjs.wif2privkey(wif);bitjs.compressed=r.compressed;var pubkey=bitjs.newPubkey(r.privkey);return bitjs.compressed=compressed,{pubkey:pubkey,compressed:r.compressed}},bitjs.wif2address=function(wif){var r=bitjs.wif2pubkey(wif);return{address:bitjs.pubkey2address(r.pubkey),compressed:r.compressed}},bitjs.newPubkey=function(hash){var privateKeyBigInt=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(hash)),curvePt=EllipticCurve.getSECCurveByName("secp256k1").getG().multiply(privateKeyBigInt),x=curvePt.getX().toBigInteger(),y=curvePt.getY().toBigInteger(),publicKeyBytes=EllipticCurve.integerToBytes(x,32);if((publicKeyBytes=publicKeyBytes.concat(EllipticCurve.integerToBytes(y,32))).unshift(4),1==bitjs.compressed){var publicKeyBytesCompressed=EllipticCurve.integerToBytes(x,32);return y.isEven()?publicKeyBytesCompressed.unshift(2):publicKeyBytesCompressed.unshift(3),Crypto.util.bytesToHex(publicKeyBytesCompressed)}return Crypto.util.bytesToHex(publicKeyBytes)},bitjs.pubkey2address=function(h,byte){var r=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(h),{asBytes:!0}));r.unshift(byte||bitjs.pub);var checksum=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0}).slice(0,4);return B58.encode(r.concat(checksum))},bitjs.pubkeys2multisig=function(pubkeys,required){var s=[];s.push(80+required);for(var i=0;i520)throw Error(`redeemScript size(=${s.length}) too large`);var x=ripemd160(Crypto.SHA256(s,{asBytes:!0}),{asBytes:!0});x.unshift(bitjs.multisig);var r=x,checksum=(r=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0})).slice(0,4),redeemScript=Crypto.util.bytesToHex(s);return{address:B58.encode(x.concat(checksum)),redeemScript:redeemScript,size:s.length}},bitjs.transaction=function(tx_data=void 0){var btrx={};return btrx.version=2,btrx.inputs=[],btrx.outputs=[],btrx.locktime=0,btrx.floData="",btrx.addinput=function(txid,index,scriptPubKey,sequence){var o={};return o.outpoint={hash:txid,index:index},o.script=Crypto.util.hexToBytes(scriptPubKey),o.sequence=sequence||(0==btrx.locktime?4294967295:0),this.inputs.push(o)},btrx.addoutput=function(address,value){var o={},buf=[],addr=this.addressDecode(address);return o.value=new BigInteger(""+Math.round(1*value*1e8),10),addr.version===bitjs.pub?(buf.push(118),buf.push(169),(buf=this.writeBytesToScriptBuffer(buf,addr.bytes)).push(136),buf.push(172)):addr.version===bitjs.multisig&&(buf.push(169),(buf=this.writeBytesToScriptBuffer(buf,addr.bytes)).push(135)),o.script=buf,this.outputs.push(o)},btrx.addflodata=function(data){if("string"!=typeof data)throw Error("floData should be String");if(data.length>1040)throw Error("floData Character Limit Exceeded");if(bitjs.strToBytes(data).some((c=>c<32||c>127)))throw Error("floData contains Invalid characters (only ASCII characters allowed");return this.floData=data,this.floData},btrx.addressDecode=function(address){var bytes=B58.decode(address),front=bytes.slice(0,bytes.length-4),back=bytes.slice(bytes.length-4);if(Crypto.SHA256(Crypto.SHA256(front,{asBytes:!0}),{asBytes:!0}).slice(0,4)+""==back+"")return{version:front[0],bytes:front.slice(1)}},btrx.transactionHash=function(index,sigHashType){for(var clone=bitjs.clone(this),shType=sigHashType||1,i=0;i=128)if(clone.inputs=[clone.inputs[index]],129==shType);else if(130==shType)clone.outputs=[];else if(131==shType){clone.outputs.length=index+1;for(i=0;i0&&(s=n.subtract(s));var sig=function(r,s){var rBa=r.toByteArraySigned(),sBa=s.toByteArraySigned(),sequence=[];return sequence.push(2),sequence.push(rBa.length),(sequence=sequence.concat(rBa)).push(2),sequence.push(sBa.length),(sequence=sequence.concat(sBa)).unshift(sequence.length),sequence.unshift(48),sequence}(r,s);return sig.push(parseInt(shType,10)),Crypto.util.bytesToHex(sig)}return!1},btrx.deterministicK=function(wif,hash,badrs){badrs=badrs||0;var key=bitjs.wif2privkey(wif),x=Crypto.util.hexToBytes(key.privkey),N=EllipticCurve.getSECCurveByName("secp256k1").getN(),v=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],k=[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];k=Crypto.HMAC(Crypto.SHA256,v.concat([0]).concat(x).concat(hash),k,{asBytes:!0}),v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0}),k=Crypto.HMAC(Crypto.SHA256,v.concat([1]).concat(x).concat(hash),k,{asBytes:!0}),v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});var T=[];T=v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});for(var KBigInt=BigInteger.fromByteArrayUnsigned(T),i=0;KBigInt.compareTo(N)>=0||KBigInt.compareTo(BigInteger.ZERO)<=0||i>>8&255)):(buf.push(78),buf.push(255&bytes.length),buf.push(bytes.length>>>8&255),buf.push(bytes.length>>>16&255),buf.push(bytes.length>>>24&255)),buf=buf.concat(bytes)},btrx.parseScript=function(script){var chunks=[],i=0;function readChunk(n){chunks.push(script.slice(i,i+n)),i+=n}for(;i=240&&(opcode=opcode<<8|script[i++]),opcode>0&&opcode<76?readChunk(opcode):76==opcode?readChunk(script[i++]):77==opcode?readChunk(script[i++]<<8|script[i++]):78==opcode?readChunk(script[i++]<<24|script[i++]<<16|script[i++]<<8|script[i++]):chunks.push(opcode),i<0)break}return chunks},btrx.decodeRedeemScript=function(rs){"string"==typeof rs&&(rs=Crypto.util.hexToBytes(rs));var script=this.parseScript(rs);if(!(script[0]>80&&script[script.length-2]>80&&174==script[script.length-1]))throw"Invalid RedeemScript";var r={};r.required=script[0]-80,r.pubkeys=[];for(var i=1;i=80&&174==script[i][script[i].length-1]&&(redeemScript=script[i]))}else redeemScript=script;var pubkeyList=this.decodeRedeemScript(redeemScript).pubkeys,pubkey=bitjs.wif2pubkey(wif).pubkey;if(!pubkeyList.includes(pubkey))return!1;pubkeyList=pubkeyList.map((pub=>Crypto.util.hexToBytes(bitjs.pubkeydecompress(pub))));var shType=sigHashType||1;this.inputs[index].script=redeemScript;var signature=Crypto.util.hexToBytes(this.transactionSig(index,wif,shType));sigsList.push(signature);var buf=[];buf.push(0);for(let x in pubkeyList)for(let y in sigsList){var sighash=Crypto.util.hexToBytes(this.transactionHash(index,1*sigsList[y].slice(-1)[0]));if(bitjs.verifySignature(sighash,sigsList[y],pubkeyList[x])){buf=this.writeBytesToScriptBuffer(buf,sigsList[y]);break}}return buf=this.writeBytesToScriptBuffer(buf,redeemScript),this.inputs[index].script=buf,!0},btrx.sign=function(wif,sigHashType){for(var shType=sigHashType||1,i=0;i=80&&174==script[script.length-1]?{type:"multisig",rs:Array.from(this.inputs[index].script)}:void 0},btrx.serialize=function(){var buffer=[];buffer=(buffer=buffer.concat(bitjs.numToBytes(parseInt(this.version),4))).concat(bitjs.numToVarInt(this.inputs.length));for(var i=0;iString.fromCharCode(b))).join("")}(tx_data),btrx},bitjs.numToBytes=function(num,bytes){return void 0===bytes&&(bytes=8),0==bytes?[]:-1==num?Crypto.util.hexToBytes("ffffffffffffffff"):[num%256].concat(bitjs.numToBytes(Math.floor(num/256),bytes-1))},bitjs.numToByteArray=function(num){return num<=256?[num]:[num%256].concat(bitjs.numToByteArray(Math.floor(num/256)))},bitjs.numToVarInt=function(num){return num<253?[num]:num<65536?[253].concat(bitjs.numToBytes(num,2)):num<4294967296?[254].concat(bitjs.numToBytes(num,4)):[255].concat(bitjs.numToBytes(num,8))},bitjs.bytesToNum=function(bytes){return 0==bytes.length?0:bytes[0]+256*bitjs.bytesToNum(bytes.slice(1))},bitjs.strToBytes=function(str){return str.split("").map((c=>c.charCodeAt(0)))},bitjs.pubkeydecompress=function(pubkey){if("string"==typeof pubkey&&pubkey.match(/^[a-f0-9]+$/i)){var curve=EllipticCurve.getSECCurveByName("secp256k1");try{var pt=curve.curve.decodePointHex(pubkey),x=pt.getX().toBigInteger(),y=pt.getY().toBigInteger(),publicKeyBytes=EllipticCurve.integerToBytes(x,32);return(publicKeyBytes=publicKeyBytes.concat(EllipticCurve.integerToBytes(y,32))).unshift(4),Crypto.util.bytesToHex(publicKeyBytes)}catch(e){return!1}}return!1},bitjs.verifySignature=function(hash,sig,pubkey){return Bitcoin.ECDSA.verify(hash,sig,pubkey)},bitjs.clone=function(obj){if(null==obj||"object"!=typeof obj)return obj;var temp=new obj.constructor;for(var key in obj)obj.hasOwnProperty(key)&&(temp[key]=bitjs.clone(obj[key]));return temp};var B58=bitjs.Base58={alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",validRegex:/^[1-9A-HJ-NP-Za-km-z]+$/,base:BigInteger.valueOf(58),encode:function(input){for(var bi=BigInteger.fromByteArrayUnsigned(input),chars=[];bi.compareTo(B58.base)>=0;){var mod=bi.mod(B58.base);chars.unshift(B58.alphabet[mod.intValue()]),bi=bi.subtract(mod).divide(B58.base)}chars.unshift(B58.alphabet[bi.intValue()]);for(var i=0;i=0;i--){var alphaIndex=B58.alphabet.indexOf(input[i]);if(alphaIndex<0)throw"Invalid character";bi=bi.add(BigInteger.valueOf(alphaIndex).multiply(B58.base.pow(input.length-1-i))),"1"==input[i]?leadingZerosNum++:leadingZerosNum=0}for(var bytes=bi.toByteArrayUnsigned();leadingZerosNum-- >0;)bytes.unshift(0);return bytes}}}(),function(){var ecparams,rng,P_OVER_FOUR,ECDSA,Bip38,Bitcoin=GLOBAL.Bitcoin={},B58=Bitcoin.Base58={alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",validRegex:/^[1-9A-HJ-NP-Za-km-z]+$/,base:BigInteger.valueOf(58),encode:function(input){for(var bi=BigInteger.fromByteArrayUnsigned(input),chars=[];bi.compareTo(B58.base)>=0;){var mod=bi.mod(B58.base);chars.unshift(B58.alphabet[mod.intValue()]),bi=bi.subtract(mod).divide(B58.base)}chars.unshift(B58.alphabet[bi.intValue()]);for(var i=0;i=0;i--){var alphaIndex=B58.alphabet.indexOf(input[i]);if(alphaIndex<0)throw"Invalid character";bi=bi.add(BigInteger.valueOf(alphaIndex).multiply(B58.base.pow(input.length-1-i))),"1"==input[i]?leadingZerosNum++:leadingZerosNum=0}for(var bytes=bi.toByteArrayUnsigned();leadingZerosNum-- >0;)bytes.unshift(0);return bytes}};Bitcoin.Address=function(bytes){if("string"==typeof bytes){var d=Bitcoin.Address.decodeString(bytes);if(bytes=d.hash,d.version!=Bitcoin.Address.standardVersion&&d.version!=Bitcoin.Address.multisigVersion)throw"Version (prefix) "+d.version+" not supported!";this.version=d.version}else this.version=Bitcoin.Address.standardVersion;this.hash=bytes},Bitcoin.Address.standardVersion=35,Bitcoin.Address.multisigVersion=94,"FLO_TEST"==GLOBAL.cryptocoin&&(Bitcoin.Address.standardVersion=115,Bitcoin.Address.multisigVersion=198),Bitcoin.Address.prototype.toString=function(version=null){var hash=this.hash.slice(0);hash.unshift(null!==version?version:this.version);var checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0}),bytes=hash.concat(checksum.slice(0,4));return Bitcoin.Base58.encode(bytes)},Bitcoin.Address.prototype.getHashBase64=function(){return Crypto.util.bytesToBase64(this.hash)},Bitcoin.Address.decodeString=function(string){var bytes=Bitcoin.Base58.decode(string),hash=bytes.slice(0,21),checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[21]||checksum[1]!=bytes[22]||checksum[2]!=bytes[23]||checksum[3]!=bytes[24])throw"Checksum validation failed!";return{version:hash.shift(),hash:hash}},Bitcoin.ECDSA=(ecparams=EllipticCurve.getSECCurveByName("secp256k1"),rng=new SecureRandom,P_OVER_FOUR=null,ECDSA={getBigRandom:function(limit){return new BigInteger(limit.bitLength(),rng).mod(limit.subtract(BigInteger.ONE)).add(BigInteger.ONE)},sign:function(hash,priv){var d=priv,n=ecparams.getN(),e=BigInteger.fromByteArrayUnsigned(hash);do{var k=ECDSA.getBigRandom(n),r=ecparams.getG().multiply(k).getX().toBigInteger().mod(n)}while(r.compareTo(BigInteger.ZERO)<=0);var s=k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);return ECDSA.serializeSig(r,s)},verify:function(hash,sig,pubkey){var r,s,Q;if(Bitcoin.Util.isArray(sig)){var obj=ECDSA.parseSig(sig);r=obj.r,s=obj.s}else{if("object"!=typeof sig||!sig.r||!sig.s)throw"Invalid value for signature";r=sig.r,s=sig.s}if(pubkey instanceof EllipticCurve.PointFp)Q=pubkey;else{if(!Bitcoin.Util.isArray(pubkey))throw"Invalid format for pubkey value, must be byte array or ec.PointFp";Q=EllipticCurve.PointFp.decodeFrom(ecparams.getCurve(),pubkey)}var e=BigInteger.fromByteArrayUnsigned(hash);return ECDSA.verifyRaw(e,r,s,Q)},verifyRaw:function(e,r,s,Q){var n=ecparams.getN(),G=ecparams.getG();if(r.compareTo(BigInteger.ONE)<0||r.compareTo(n)>=0)return!1;if(s.compareTo(BigInteger.ONE)<0||s.compareTo(n)>=0)return!1;var c=s.modInverse(n),u1=e.multiply(c).mod(n),u2=r.multiply(c).mod(n);return G.multiply(u1).add(Q.multiply(u2)).getX().toBigInteger().mod(n).equals(r)},serializeSig:function(r,s){var rBa=r.toByteArraySigned(),sBa=s.toByteArraySigned(),sequence=[];return sequence.push(2),sequence.push(rBa.length),(sequence=sequence.concat(rBa)).push(2),sequence.push(sBa.length),(sequence=sequence.concat(sBa)).unshift(sequence.length),sequence.unshift(48),sequence},parseSig:function(sig){var cursor;if(48!=sig[0])throw new Error("Signature not a valid DERSequence");if(2!=sig[cursor=2])throw new Error("First element in signature must be a DERInteger");var rBa=sig.slice(cursor+2,cursor+2+sig[cursor+1]);if(2!=sig[cursor+=2+sig[cursor+1]])throw new Error("Second element in signature must be a DERInteger");var sBa=sig.slice(cursor+2,cursor+2+sig[cursor+1]);return cursor+=2+sig[cursor+1],{r:BigInteger.fromByteArrayUnsigned(rBa),s:BigInteger.fromByteArrayUnsigned(sBa)}},parseSigCompact:function(sig){if(65!==sig.length)throw"Signature has the wrong length";var i=sig[0]-27;if(i<0||i>7)throw"Invalid signature type";var n=ecparams.getN();return{r:BigInteger.fromByteArrayUnsigned(sig.slice(1,33)).mod(n),s:BigInteger.fromByteArrayUnsigned(sig.slice(33,65)).mod(n),i:i}},recoverPubKey:function(r,s,hash,i){var isYEven=1&(i&=3),isSecondKey=i>>1,n=ecparams.getN(),G=ecparams.getG(),curve=ecparams.getCurve(),p=curve.getQ(),a=curve.getA().toBigInteger(),b=curve.getB().toBigInteger();P_OVER_FOUR||(P_OVER_FOUR=p.add(BigInteger.ONE).divide(BigInteger.valueOf(4)));var x=isSecondKey?r.add(n):r,beta=x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p).modPow(P_OVER_FOUR,p),y=(beta.isEven(),(beta.isEven()?!isYEven:isYEven)?beta:p.subtract(beta)),R=new EllipticCurve.PointFp(curve,curve.fromBigInteger(x),curve.fromBigInteger(y));R.validate();var e=BigInteger.fromByteArrayUnsigned(hash),eNeg=BigInteger.ZERO.subtract(e).mod(n),rInv=r.modInverse(n),Q=function(P,k,Q,l){for(var m=Math.max(k.bitLength(),l.bitLength()),Z=P.add2D(Q),R=P.curve.getInfinity(),i=m-1;i>=0;--i)(R=R.twice2D()).z=BigInteger.ONE,k.testBit(i)?R=l.testBit(i)?R.add2D(Z):R.add2D(P):l.testBit(i)&&(R=R.add2D(Q));return R}(R,s,G,eNeg).multiply(rInv);if(Q.validate(),!ECDSA.verifyRaw(e,r,s,Q))throw"Pubkey recovery unsuccessful";var pubKey=new Bitcoin.ECKey;return pubKey.pub=Q,pubKey},calcPubkeyRecoveryParam:function(address,r,s,hash){for(var i=0;i<4;i++)try{if(Bitcoin.ECDSA.recoverPubKey(r,s,hash,i).getBitcoinAddress().toString()==address)return i}catch(e){}throw"Unable to find valid recovery factor"}}),Bitcoin.KeyPool=new function(){return this.keyArray=[],this.push=function(item){if(null!=item&&null!=item.priv){var doAdd=!0;for(var index in this.keyArray){var currentItem=this.keyArray[index];if(null!=currentItem&&null!=currentItem.priv&&item.getBitcoinAddress()==currentItem.getBitcoinAddress()){doAdd=!1;break}}doAdd&&this.keyArray.push(item)}},this.reset=function(){this.keyArray=[]},this.getArray=function(){return this.keyArray.slice(0)},this.setArray=function(ka){this.keyArray=ka},this.length=function(){return this.keyArray.length},this.toString=function(){var keyPoolString="# = "+this.length()+"\n",pool=this.getArray();for(var index in pool){var item=pool[index];Bitcoin.Util.hasMethods(item,"getBitcoinAddress","toString")&&null!=item&&(keyPoolString+='"'+item.getBitcoinAddress()+'", "'+item.toString("wif")+'"\n')}return keyPoolString},this},Bitcoin.Bip38Key=((Bip38=function(address,encryptedKey){this.address=address,this.priv=encryptedKey}).prototype.getBitcoinAddress=function(){return this.address},Bip38.prototype.toString=function(){return this.priv},Bip38),Bitcoin.ECKey=function(){var ECDSA=Bitcoin.ECDSA,KeyPool=Bitcoin.KeyPool,ecparams=EllipticCurve.getSECCurveByName("secp256k1"),ECKey=function(input){if(input){if(input instanceof BigInteger)this.priv=input;else if(Bitcoin.Util.isArray(input))this.priv=BigInteger.fromByteArrayUnsigned(input);else if("string"==typeof input){var bytes=null;try{/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{52}$/.test(input)?(bytes=ECKey.decodeCompressedWalletImportFormat(input),this.compressed=!0):ECKey.isHexFormat(input)&&(bytes=Crypto.util.hexToBytes(input))}catch(exc1){this.setError(exc1)}ECKey.isBase6Format(input)?this.priv=new BigInteger(input,6):null==bytes||32!=bytes.length?this.priv=null:this.priv=BigInteger.fromByteArrayUnsigned(bytes)}}else{var n=ecparams.getN();this.priv=ECDSA.getBigRandom(n)}this.compressed=null==this.compressed?!!ECKey.compressByDefault:this.compressed;try{null!=this.priv&&0==BigInteger.ZERO.compareTo(this.priv)&&this.setError("Error: BigInteger equal to zero.");var rangeLimitBytes=Crypto.util.hexToBytes("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140"),limitBigInt=BigInteger.fromByteArrayUnsigned(rangeLimitBytes);null!=this.priv&&limitBigInt.compareTo(this.priv)<0&&this.setError("Error: BigInteger outside of curve range."),null!=this.priv&&KeyPool.push(this)}catch(exc2){this.setError(exc2)}};return"FLO"==GLOBAL.cryptocoin?ECKey.privateKeyPrefix=163:"FLO_TEST"==GLOBAL.cryptocoin?ECKey.privateKeyPrefix=239:"BTC"==GLOBAL.cryptocoin?ECKey.privateKeyPrefix=128:"BTC_TEST"==GLOBAL.cryptocoin&&(ECKey.privateKeyPrefix=239),ECKey.compressByDefault=!1,ECKey.prototype.setError=function(err){return this.error=err,this.priv=null,this},ECKey.prototype.setCompressed=function(v){return this.compressed=!!v,this.pubPoint&&(this.pubPoint.compressed=this.compressed),this},ECKey.prototype.getPub=function(){return this.compressed?this.pubComp?this.pubComp:this.pubComp=this.getPubPoint().getEncoded(1):this.pubUncomp?this.pubUncomp:this.pubUncomp=this.getPubPoint().getEncoded(0)},ECKey.prototype.getPubPoint=function(){return this.pubPoint||(this.pubPoint=ecparams.getG().multiply(this.priv),this.pubPoint.compressed=this.compressed),this.pubPoint},ECKey.prototype.getPubKeyHex=function(){return this.compressed?this.pubKeyHexComp?this.pubKeyHexComp:this.pubKeyHexComp=Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase():this.pubKeyHexUncomp?this.pubKeyHexUncomp:this.pubKeyHexUncomp=Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase()},ECKey.prototype.getPubKeyHash=function(){return this.compressed?this.pubKeyHashComp?this.pubKeyHashComp:this.pubKeyHashComp=Bitcoin.Util.sha256ripe160(this.getPub()):this.pubKeyHashUncomp?this.pubKeyHashUncomp:this.pubKeyHashUncomp=Bitcoin.Util.sha256ripe160(this.getPub())},ECKey.prototype.getBitcoinAddress=function(){var hash=this.getPubKeyHash();return new Bitcoin.Address(hash).toString()},ECKey.prototype.setPub=function(pub){Bitcoin.Util.isArray(pub)&&(pub=Crypto.util.bytesToHex(pub).toString().toUpperCase());var ecPoint=ecparams.getCurve().decodePointHex(pub);return this.setCompressed(ecPoint.compressed),this.pubPoint=ecPoint,this},ECKey.prototype.getBitcoinWalletImportFormat=function(){var bytes=this.getBitcoinPrivateKeyByteArray();if(null==bytes)return"";bytes.unshift(ECKey.privateKeyPrefix),this.compressed&&bytes.push(1);var checksum=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0});return bytes=bytes.concat(checksum.slice(0,4)),Bitcoin.Base58.encode(bytes)},ECKey.prototype.getBitcoinHexFormat=function(){return Crypto.util.bytesToHex(this.getBitcoinPrivateKeyByteArray()).toString().toUpperCase()},ECKey.prototype.getBitcoinBase64Format=function(){return Crypto.util.bytesToBase64(this.getBitcoinPrivateKeyByteArray())},ECKey.prototype.getBitcoinPrivateKeyByteArray=function(){if(null==this.priv)return null;for(var bytes=this.priv.toByteArrayUnsigned();bytes.length<32;)bytes.unshift(0);return bytes},ECKey.prototype.toString=function(format){return"base64"==(format=format||"").toString().toLowerCase()||"b64"==format.toString().toLowerCase()?this.getBitcoinBase64Format():"wif"==format.toString().toLowerCase()?this.getBitcoinWalletImportFormat():this.getBitcoinHexFormat()},ECKey.prototype.sign=function(hash){return ECDSA.sign(hash,this.priv)},ECKey.prototype.verify=function(hash,sig){return ECDSA.verify(hash,sig,this.getPub())},ECKey.decodeWalletImportFormat=function(privStr){var bytes=Bitcoin.Base58.decode(privStr),hash=bytes.slice(0,33),checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[33]||checksum[1]!=bytes[34]||checksum[2]!=bytes[35]||checksum[3]!=bytes[36])throw"Checksum validation failed!";hash.shift();return hash},ECKey.decodeCompressedWalletImportFormat=function(privStr){var bytes=Bitcoin.Base58.decode(privStr),hash=bytes.slice(0,34),checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[34]||checksum[1]!=bytes[35]||checksum[2]!=bytes[36]||checksum[3]!=bytes[37])throw"Checksum validation failed!";hash.shift();return hash.pop(),hash},ECKey.isHexFormat=function(key){return key=key.toString(),/^[A-Fa-f0-9]{64}$/.test(key)},ECKey.isWalletImportFormat=function(key){return key=key.toString(),128==ECKey.privateKeyPrefix?/^5[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key):/^R[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key)},ECKey.isCompressedWalletImportFormat=function(key){return key=key.toString(),128==ECKey.privateKeyPrefix?/^[LK][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key):/^R[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key)},ECKey.isBase64Format=function(key){return key=key.toString(),/^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=+\/]{44}$/.test(key)},ECKey.isBase6Format=function(key){return key=key.toString(),/^[012345]{99}$/.test(key)},ECKey.isMiniFormat=function(key){key=key.toString();var validChars22=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}$/.test(key),validChars26=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}$/.test(key),validChars30=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}$/.test(key),testBytes=Crypto.SHA256(key+"?",{asBytes:!0});return(0===testBytes[0]||1===testBytes[0])&&(validChars22||validChars26||validChars30)},ECKey}(),Bitcoin.Util={isArray:Array.isArray||function(o){return"[object Array]"===Object.prototype.toString.call(o)},makeFilledArray:function(len,val){for(var array=[],i=0;i>>8,255&i]:i<=1?[254].concat(Crypto.util.wordsToBytes([i])):[255].concat(Crypto.util.wordsToBytes([i>>>32,i]))},valueToBigInt:function(valueBuffer){return valueBuffer instanceof BigInteger?valueBuffer:BigInteger.fromByteArrayUnsigned(valueBuffer)},formatValue:function(valueBuffer){for(var value=this.valueToBigInt(valueBuffer).toString(),integerPart=value.length>8?value.substr(0,value.length-8):"0",decimalPart=value.length>8?value.substr(value.length-8):value;decimalPart.length<8;)decimalPart="0"+decimalPart;for(decimalPart=decimalPart.replace(/0*$/,"");decimalPart.length<2;)decimalPart+="0";return integerPart+"."+decimalPart},parseValue:function(valueString){for(var valueComp=valueString.split("."),integralPart=valueComp[0],fractionalPart=valueComp[1]||"0";fractionalPart.length<8;)fractionalPart+="0";fractionalPart=fractionalPart.replace(/^0+/g,"");var value=BigInteger.valueOf(parseInt(integralPart));return value=(value=value.multiply(BigInteger.valueOf(1e8))).add(BigInteger.valueOf(parseInt(fractionalPart)))},sha256ripe160:function(data){return ripemd160(Crypto.SHA256(data,{asBytes:!0}),{asBytes:!0})},dsha256:function(data){return Crypto.SHA256(Crypto.SHA256(data,{asBytes:!0}),{asBytes:!0})},hasMethods:function(obj){for(var methodName,i=1;methodName=arguments[i++];)if("function"!=typeof obj[methodName])return!1;return!0}}}(),(ellipticEncryption=GLOBAL.ellipticCurveEncryption=function(){}).rng=new SecureRandom,ellipticEncryption.getCurveParameters=function(curveName){curveName=void 0!==curveName?curveName:"secp256k1";var c=EllipticCurve.getSECCurveByName(curveName),curveDetails={Q:"",A:"",B:"",GX:"",GY:"",N:""};return curveDetails.Q=c.getCurve().getQ().toString(),curveDetails.A=c.getCurve().getA().toBigInteger().toString(),curveDetails.B=c.getCurve().getB().toBigInteger().toString(),curveDetails.GX=c.getG().getX().toBigInteger().toString(),curveDetails.GY=c.getG().getY().toBigInteger().toString(),curveDetails.N=c.getN().toString(),curveDetails},ellipticEncryption.selectedCurve=ellipticEncryption.getCurveParameters("secp256k1"),ellipticEncryption.get_curve=function(){return new EllipticCurve.CurveFp(new BigInteger(this.selectedCurve.Q),new BigInteger(this.selectedCurve.A),new BigInteger(this.selectedCurve.B))},ellipticEncryption.get_G=function(curve){return new EllipticCurve.PointFp(curve,curve.fromBigInteger(new BigInteger(this.selectedCurve.GX)),curve.fromBigInteger(new BigInteger(this.selectedCurve.GY)))},ellipticEncryption.pick_rand=function(){var n=new BigInteger(this.selectedCurve.N),n1=n.subtract(BigInteger.ONE);return new BigInteger(n.bitLength(),this.rng).mod(n1).add(BigInteger.ONE)},ellipticEncryption.senderRandom=function(){return this.pick_rand().toString()},ellipticEncryption.receiverRandom=function(){return this.pick_rand().toString()},ellipticEncryption.senderPublicString=function(senderPrivateKey){var senderKeyECData={},curve=this.get_curve(),G=this.get_G(curve),a=new BigInteger(senderPrivateKey),P=G.multiply(a);return senderKeyECData.XValuePublicString=P.getX().toBigInteger().toString(),senderKeyECData.YValuePublicString=P.getY().toBigInteger().toString(),senderKeyECData},ellipticEncryption.receiverPublicString=function(receiverPublicKey){var receiverKeyECData={},curve=this.get_curve(),G=this.get_G(curve),a=new BigInteger(receiverPublicKey),P=G.multiply(a);return receiverKeyECData.XValuePublicString=P.getX().toBigInteger().toString(),receiverKeyECData.YValuePublicString=P.getY().toBigInteger().toString(),receiverKeyECData},ellipticEncryption.senderSharedKeyDerivation=function(receiverPublicStringXValue,receiverPublicStringYValue,senderPrivateKey){var senderDerivedKey={},curve=this.get_curve(),P=new EllipticCurve.PointFp(curve,curve.fromBigInteger(new BigInteger(receiverPublicStringXValue)),curve.fromBigInteger(new BigInteger(receiverPublicStringYValue))),a=new BigInteger(senderPrivateKey),S=P.multiply(a);return senderDerivedKey.XValue=S.getX().toBigInteger().toString(),senderDerivedKey.YValue=S.getY().toBigInteger().toString(),senderDerivedKey},ellipticEncryption.receiverSharedKeyDerivation=function(senderPublicStringXValue,senderPublicStringYValue,receiverPrivateKey){var receiverDerivedKey={},curve=this.get_curve(),P=new EllipticCurve.PointFp(curve,curve.fromBigInteger(new BigInteger(senderPublicStringXValue)),curve.fromBigInteger(new BigInteger(senderPublicStringYValue))),a=new BigInteger(receiverPrivateKey),S=P.multiply(a);return receiverDerivedKey.XValue=S.getX().toBigInteger().toString(),receiverDerivedKey.YValue=S.getY().toBigInteger().toString(),receiverDerivedKey},function(){function n(a){throw a}var q=null;function s(a,b){this.a=a,this.b=b}function u(a,b){var g,d=[],h=(1<>>5]|=(a.charCodeAt(g/b)&h)<<32-b-g%32;return{value:d,binLen:f}}function x(a){var h,f,b=[],d=a.length;for(0!=d%2&&n("String of HEX type must be in byte increments"),h=0;h>>3]|=f<<24-h%8*4;return{value:b,binLen:4*d}}function B(a){var h,f,g,k,m,b=[],d=0;for(-1===a.search(/^[a-zA-Z0-9=+\/]+$/)&&n("Invalid character in base-64 string"),h=a.indexOf("="),a=a.replace(/\=/g,""),-1!==h&&h>2]|=(k>>>16-8*g&255)<<24-d%4*8,d+=1}return{value:b,binLen:8*d}}function E(a,b){var f,g,d="",h=4*a.length;for(f=0;f>>2]>>>8*(3-f%4),d+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(15&g);return b.outputUpper?d.toUpperCase():d}function F(a,b){var f,g,k,d="",h=4*a.length;for(f=0;f>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255,g=0;4>g;g+=1)d=8*f+6*g<=32*a.length?d+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>>6*(3-g)&63):d+b.b64Pad;return d}function G(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(d){}return"boolean"!=typeof b.outputUpper&&n("Invalid outputUpper formatting option"),"string"!=typeof b.b64Pad&&n("Invalid b64Pad formatting option"),b}function H(a,b){var d=q;d=new s(a.a,a.b);return 32>=b?new s(d.a>>>b|d.b<<32-b&4294967295,d.b>>>b|d.a<<32-b&4294967295):new s(d.b>>>b-32|d.a<<64-b&4294967295,d.a>>>b-32|d.b<<64-b&4294967295)}function I(a,b){return 32>=b?new s(a.a>>>b,a.b>>>b|a.a<<32-b&4294967295):new s(0,a.a>>>b-32)}function J(a,b,d){return new s(a.a&b.a^~a.a&d.a,a.b&b.b^~a.b&d.b)}function U(a,b,d){return new s(a.a&b.a^a.a&d.a^b.a&d.a,a.b&b.b^a.b&d.b^b.b&d.b)}function V(a){var b=H(a,28),d=H(a,34);return a=H(a,39),new s(b.a^d.a^a.a,b.b^d.b^a.b)}function W(a){var b=H(a,14),d=H(a,18);return a=H(a,41),new s(b.a^d.a^a.a,b.b^d.b^a.b)}function X(a){var b=H(a,1),d=H(a,8);return a=I(a,7),new s(b.a^d.a^a.a,b.b^d.b^a.b)}function Y(a){var b=H(a,19),d=H(a,61);return a=I(a,6),new s(b.a^d.a^a.a,b.b^d.b^a.b)}function Z(a,b){var d,h,f;return d=(65535&a.b)+(65535&b.b),f=(65535&(h=(a.b>>>16)+(b.b>>>16)+(d>>>16)))<<16|65535&d,d=(65535&a.a)+(65535&b.a)+(h>>>16),new s((65535&(h=(a.a>>>16)+(b.a>>>16)+(d>>>16)))<<16|65535&d,f)}function aa(a,b,d,h){var f,g,k;return f=(65535&a.b)+(65535&b.b)+(65535&d.b)+(65535&h.b),k=(65535&(g=(a.b>>>16)+(b.b>>>16)+(d.b>>>16)+(h.b>>>16)+(f>>>16)))<<16|65535&f,f=(65535&a.a)+(65535&b.a)+(65535&d.a)+(65535&h.a)+(g>>>16),new s((65535&(g=(a.a>>>16)+(b.a>>>16)+(d.a>>>16)+(h.a>>>16)+(f>>>16)))<<16|65535&f,k)}function ba(a,b,d,h,f){var g,k,m;return g=(65535&a.b)+(65535&b.b)+(65535&d.b)+(65535&h.b)+(65535&f.b),m=(65535&(k=(a.b>>>16)+(b.b>>>16)+(d.b>>>16)+(h.b>>>16)+(f.b>>>16)+(g>>>16)))<<16|65535&g,g=(65535&a.a)+(65535&b.a)+(65535&d.a)+(65535&h.a)+(65535&f.a)+(k>>>16),new s((65535&(k=(a.a>>>16)+(b.a>>>16)+(d.a>>>16)+(h.a>>>16)+(f.a>>>16)+(g>>>16)))<<16|65535&g,m)}function $(a,b,d){var h,f,g,k,m,j,A,C,K,e,L,v,l,M,t,p,y,z,r,N,O,P,Q,R,c,S,T,D,w=[];for("SHA-384"===d||"SHA-512"===d?(L=80,h=31+(b+128>>>10<<5),M=32,t=2,p=Z,y=aa,z=ba,r=X,N=Y,O=V,P=W,R=U,Q=J,S=[new(c=s)(1116352408,3609767458),new c(1899447441,602891725),new c(3049323471,3964484399),new c(3921009573,2173295548),new c(961987163,4081628472),new c(1508970993,3053834265),new c(2453635748,2937671579),new c(2870763221,3664609560),new c(3624381080,2734883394),new c(310598401,1164996542),new c(607225278,1323610764),new c(1426881987,3590304994),new c(1925078388,4068182383),new c(2162078206,991336113),new c(2614888103,633803317),new c(3248222580,3479774868),new c(3835390401,2666613458),new c(4022224774,944711139),new c(264347078,2341262773),new c(604807628,2007800933),new c(770255983,1495990901),new c(1249150122,1856431235),new c(1555081692,3175218132),new c(1996064986,2198950837),new c(2554220882,3999719339),new c(2821834349,766784016),new c(2952996808,2566594879),new c(3210313671,3203337956),new c(3336571891,1034457026),new c(3584528711,2466948901),new c(113926993,3758326383),new c(338241895,168717936),new c(666307205,1188179964),new c(773529912,1546045734),new c(1294757372,1522805485),new c(1396182291,2643833823),new c(1695183700,2343527390),new c(1986661051,1014477480),new c(2177026350,1206759142),new c(2456956037,344077627),new c(2730485921,1290863460),new c(2820302411,3158454273),new c(3259730800,3505952657),new c(3345764771,106217008),new c(3516065817,3606008344),new c(3600352804,1432725776),new c(4094571909,1467031594),new c(275423344,851169720),new c(430227734,3100823752),new c(506948616,1363258195),new c(659060556,3750685593),new c(883997877,3785050280),new c(958139571,3318307427),new c(1322822218,3812723403),new c(1537002063,2003034995),new c(1747873779,3602036899),new c(1955562222,1575990012),new c(2024104815,1125592928),new c(2227730452,2716904306),new c(2361852424,442776044),new c(2428436474,593698344),new c(2756734187,3733110249),new c(3204031479,2999351573),new c(3329325298,3815920427),new c(3391569614,3928383900),new c(3515267271,566280711),new c(3940187606,3454069534),new c(4118630271,4000239992),new c(116418474,1914138554),new c(174292421,2731055270),new c(289380356,3203993006),new c(460393269,320620315),new c(685471733,587496836),new c(852142971,1086792851),new c(1017036298,365543100),new c(1126000580,2618297676),new c(1288033470,3409855158),new c(1501505948,4234509866),new c(1607167915,987167468),new c(1816402316,1246189591)],e="SHA-384"===d?[new c(3418070365,3238371032),new c(1654270250,914150663),new c(2438529370,812702999),new c(355462360,4144912697),new c(1731405415,4290775857),new c(41048885895,1750603025),new c(3675008525,1694076839),new c(1203062813,3204075428)]:[new c(1779033703,4089235720),new c(3144134277,2227873595),new c(1013904242,4271175723),new c(2773480762,1595750129),new c(1359893119,2917565137),new c(2600822924,725511199),new c(528734635,4215389547),new c(1541459225,327033209)]):n("Unexpected error in SHA-2 implementation"),a[b>>>5]|=128<<24-b%32,a[h]=b,T=a.length,v=0;vl?new c(a[l*t+v],a[l*t+v+1]):y(N(w[l-2]),w[l-7],r(w[l-15]),w[l-16]),C=z(A,P(k),Q(k,m,j),S[l],w[l]),K=p(O(b),R(b,h,f)),A=j,j=m,m=k,k=p(g,C),g=f,f=h,h=b,b=p(C,K);e[0]=p(b,e[0]),e[1]=p(h,e[1]),e[2]=p(f,e[2]),e[3]=p(g,e[3]),e[4]=p(k,e[4]),e[5]=p(m,e[5]),e[6]=p(j,e[6]),e[7]=p(A,e[7])}return"SHA-384"===d?D=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b]:"SHA-512"===d?D=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b,e[6].a,e[6].b,e[7].a,e[7].b]:n("Unexpected error in SHA-2 implementation"),D}GLOBAL.jsSHA=function(a,b,d){var h=q,f=q,g=0,k=[0],m=0,j=q;8===(m=void 0!==d?d:8)||16===m||n("charSize must be 8 or 16"),"HEX"===b?(0!=a.length%2&&n("srcString of HEX type must be in byte increments"),j=x(a),g=j.binLen,k=j.value):"ASCII"===b||"TEXT"===b?(j=u(a,m),g=j.binLen,k=j.value):"B64"===b?(j=B(a),g=j.binLen,k=j.value):n("inputFormat must be HEX, TEXT, ASCII, or B64"),this.getHash=function(a,b,d){var e=q,m=k.slice(),j="";switch(b){case"HEX":e=E;break;case"B64":e=F;break;default:n("format must be HEX or B64")}return"SHA-384"===a?(q===h&&(h=$(m,g,a)),j=e(h,G(d))):"SHA-512"===a?(q===f&&(f=$(m,g,a)),j=e(f,G(d))):n("Chosen SHA variant is not supported"),j},this.getHMAC=function(a,b,d,e,f){var h,l,j,t,p,y=[],z=[],r=q;switch(e){case"HEX":h=E;break;case"B64":h=F;break;default:n("outputFormat must be HEX or B64")}for("SHA-384"===d?(j=128,p=384):"SHA-512"===d?(j=128,p=512):n("Chosen SHA variant is not supported"),"HEX"===b?(t=(r=x(a)).binLen,l=r.value):"ASCII"===b||"TEXT"===b?(t=(r=u(a,m)).binLen,l=r.value):"B64"===b?(t=(r=B(a)).binLen,l=r.value):n("inputFormat must be HEX, TEXT, ASCII, or B64"),a=8*j,b=j/4-1,jt/8&&(l[b]&=4294967040),j=0;j<=b;j+=1)y[j]=909522486^l[j],z[j]=1549556828^l[j];return h(d=$(z.concat($(y.concat(k),a+g,d)),a+p,d),G(f))}}}(),function(){var bech32=GLOBAL.bech32={},segwit_addr=GLOBAL.segwit_addr={},CHARSET="qpzry9x8gf2tvdw0s3jn54khce6mua7l",GENERATOR=[996825010,642813549,513874426,1027748829,705979059];function getEncodingConst(enc){return enc==bech32.encodings.BECH32?1:enc==bech32.encodings.BECH32M?734539939:null}function polymod(values){for(var chk=1,p=0;p>25;chk=(33554431&chk)<<5^values[p];for(var i=0;i<5;++i)top>>i&1&&(chk^=GENERATOR[i])}return chk}function hrpExpand(hrp){var p,ret=[];for(p=0;p>5);for(ret.push(0),p=0;p>frombits!=0)return null;for(acc=acc<=tobits;)bits-=tobits,ret.push(acc>>bits&maxv)}if(pad)bits>0&&ret.push(acc<=frombits||acc<16)return null;var res=convertbits(dec.data.slice(1),5,8,!1);return null===res||res.length<2||res.length>40||0===dec.data[0]&&20!==res.length&&32!==res.length||0===dec.data[0]&&bech32m?null:0===dec.data[0]||bech32m?{version:dec.data[0],program:res}:null}bech32.encodings={BECH32:"bech32",BECH32M:"bech32m"},bech32.encode=function(hrp,data,enc){for(var combined=data.concat(function(hrp,data,enc){for(var mod=polymod(hrpExpand(hrp).concat(data).concat([0,0,0,0,0,0]))^getEncodingConst(enc),ret=[],p=0;p<6;++p)ret.push(mod>>5*(5-p)&31);return ret}(hrp,data,enc)),ret=hrp+"1",p=0;p126)return null;bechString.charCodeAt(p)>=97&&bechString.charCodeAt(p)<=122&&(has_lower=!0),bechString.charCodeAt(p)>=65&&bechString.charCodeAt(p)<=90&&(has_upper=!0)}if(has_lower&&has_upper)return null;var pos=(bechString=bechString.toLowerCase()).lastIndexOf("1");if(pos<1||pos+7>bechString.length||bechString.length>90)return null;var hrp=bechString.substring(0,pos),data=[];for(p=pos+1;p0&&(enc=bech32.encodings.BECH32M);var ret=bech32.encode(hrp,[version].concat(convertbits(program,8,5,!0)),enc);return null===segwit_addr_decode(hrp,ret)?null:ret},segwit_addr.isTaprootAddress=function(address){try{const taprootDecoded=segwit_addr.decode("bc",address);return null!==taprootDecoded&&1===taprootDecoded.version}catch(error){return!1}}}(),(coinjs=GLOBAL.coinjs=function(){}).pub=0,coinjs.priv=128,coinjs.multisig=5,coinjs.hdkey={prv:76066276,pub:76067358},coinjs.bech32={charset:"qpzry9x8gf2tvdw0s3jn54khce6mua7l",version:0,hrp:"bc"},coinjs.compressed=!0,coinjs.developer="33tht1bKDgZVxb39MnZsWa8oxHXHvUYE4G",coinjs.newKeys=function(input){var privkey=input?Crypto.SHA256(input):this.newPrivkey(),pubkey=this.newPubkey(privkey);return{privkey:privkey,pubkey:pubkey,address:this.pubkey2address(pubkey),wif:this.privkey2wif(privkey),compressed:this.compressed}},coinjs.newPrivkey=function(){var x=GLOBAL.location;x+=GLOBAL.screen.height*GLOBAL.screen.width*GLOBAL.screen.colorDepth,x+=coinjs.random(64),x+=GLOBAL.screen.availHeight*GLOBAL.screen.availWidth*GLOBAL.screen.pixelDepth,x+=navigator.language,x+=GLOBAL.history.length,x+=coinjs.random(64),x+=navigator.userAgent,x+="coinb.in",x+=Crypto.util.randomBytes(64).join(""),x+=x.length,x+=(new Date).getTimezoneOffset(),x+=coinjs.random(64),x+=document.getElementById("entropybucket")?document.getElementById("entropybucket").innerHTML:"";var r=x+=x+""+x;for(let i=0;i=0||checkrBigInt.equals(BigInteger.ZERO)||checkrBigInt.equals(BigInteger.ONE);)r=Crypto.SHA256(r.concat(x)),checkrBigInt=new BigInteger(r);return r},coinjs.newPubkey=function(hash){var privateKeyBigInt=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(hash)),curvePt=EllipticCurve.getSECCurveByName("secp256k1").getG().multiply(privateKeyBigInt),x=curvePt.getX().toBigInteger(),y=curvePt.getY().toBigInteger(),publicKeyBytes=EllipticCurve.integerToBytes(x,32);if((publicKeyBytes=publicKeyBytes.concat(EllipticCurve.integerToBytes(y,32))).unshift(4),1==coinjs.compressed){var publicKeyBytesCompressed=EllipticCurve.integerToBytes(x,32);return y.isEven()?publicKeyBytesCompressed.unshift(2):publicKeyBytesCompressed.unshift(3),Crypto.util.bytesToHex(publicKeyBytesCompressed)}return Crypto.util.bytesToHex(publicKeyBytes)},coinjs.pubkey2address=function(h,byte){var r=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(h),{asBytes:!0}));r.unshift(byte||coinjs.pub);var checksum=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0}).slice(0,4);return coinjs.base58encode(r.concat(checksum))},coinjs.scripthash2address=function(h){var x=Crypto.util.hexToBytes(h);x.unshift(coinjs.pub);var r=x,checksum=(r=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0})).slice(0,4);return coinjs.base58encode(x.concat(checksum))},coinjs.pubkeys2MultisigAddress=function(pubkeys,required){var s=coinjs.script();s.writeOp(81+1*required-1);for(var i=0;i520&&(address="invalid",redeemScript="invalid"),{address:address,redeemScript:redeemScript,size:s.buffer.length}},coinjs.pubkeys2MultisigAddressBech32=function(pubkeys,required){var r=coinjs.pubkeys2MultisigAddress(pubkeys,required),program=Crypto.SHA256(Crypto.util.hexToBytes(r.redeemScript),{asBytes:!0});return{address:coinjs.bech32_encode(coinjs.bech32.hrp,[coinjs.bech32.version].concat(coinjs.bech32_convert(program,8,5,!0))),redeemScript:r.redeemScript,scripthash:Crypto.util.bytesToHex(program),size:r.size}},coinjs.simpleHodlAddress=function(pubkey,checklocktimeverify){if(checklocktimeverify<0)throw"Parameter for OP_CHECKLOCKTIMEVERIFY is negative.";var s=coinjs.script();checklocktimeverify<=16&&checklocktimeverify>=1?s.writeOp(80+checklocktimeverify):s.writeBytes(coinjs.numToScriptNumBytes(checklocktimeverify)),s.writeOp(177),s.writeOp(117),s.writeBytes(Crypto.util.hexToBytes(pubkey)),s.writeOp(172);var x=ripemd160(Crypto.SHA256(s.buffer,{asBytes:!0}),{asBytes:!0});x.unshift(coinjs.multisig);var r=x,checksum=(r=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0})).slice(0,4),redeemScript=Crypto.util.bytesToHex(s.buffer);return{address:coinjs.base58encode(x.concat(checksum)),redeemScript:redeemScript}},coinjs.segwitAddress=function(pubkey){var keyhash=[0,20].concat(ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubkey),{asBytes:!0}),{asBytes:!0})),x=ripemd160(Crypto.SHA256(keyhash,{asBytes:!0}),{asBytes:!0});x.unshift(coinjs.multisig);var r=x,checksum=(r=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0})).slice(0,4);return{address:coinjs.base58encode(x.concat(checksum)),type:"segwit",redeemscript:Crypto.util.bytesToHex(keyhash)}},coinjs.bech32Address=function(pubkey){var program=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubkey),{asBytes:!0}),{asBytes:!0});return{address:coinjs.bech32_encode(coinjs.bech32.hrp,[coinjs.bech32.version].concat(coinjs.bech32_convert(program,8,5,!0))),type:"bech32",redeemscript:Crypto.util.bytesToHex(program)}},coinjs.multisigBech32Address=function(redeemscript){var program=Crypto.SHA256(Crypto.util.hexToBytes(redeemscript),{asBytes:!0});return{address:coinjs.bech32_encode(coinjs.bech32.hrp,[coinjs.bech32.version].concat(coinjs.bech32_convert(program,8,5,!0))),type:"multisigBech32",redeemScript:redeemscript,scripthash:Crypto.util.bytesToHex(program)}},coinjs.bech32redeemscript=function(address){var decode=coinjs.bech32_decode(address);return!!decode&&(decode.data.shift(),Crypto.util.bytesToHex(coinjs.bech32_convert(decode.data,5,8,!1)))},coinjs.privkey2wif=function(h){var r=Crypto.util.hexToBytes(h);1==coinjs.compressed&&r.push(1),r.unshift(coinjs.priv);var checksum=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0}).slice(0,4);return coinjs.base58encode(r.concat(checksum))},coinjs.wif2privkey=function(wif){var compressed=!1,decode=coinjs.base58decode(wif),key=decode.slice(0,decode.length-4);return(key=key.slice(1,key.length)).length>=33&&1==key[key.length-1]&&(key=key.slice(0,key.length-1),compressed=!0),{privkey:Crypto.util.bytesToHex(key),compressed:compressed}},coinjs.wif2pubkey=function(wif){var compressed=coinjs.compressed,r=coinjs.wif2privkey(wif);coinjs.compressed=r.compressed;var pubkey=coinjs.newPubkey(r.privkey);return coinjs.compressed=compressed,{pubkey:pubkey,compressed:r.compressed}},coinjs.wif2address=function(wif){var r=coinjs.wif2pubkey(wif);return{address:coinjs.pubkey2address(r.pubkey),compressed:r.compressed}},coinjs.addressDecode=function(addr){try{if(segwit_addr.isTaprootAddress(addr)){var data=segwit_addr.decode("bc",addr);return data.type="bech32m",data.outstring="5120"+Crypto.util.bytesToHex(data.program),data}var bytes=coinjs.base58decode(addr),front=bytes.slice(0,bytes.length-4),back=bytes.slice(bytes.length-4);if(Crypto.SHA256(Crypto.SHA256(front,{asBytes:!0}),{asBytes:!0}).slice(0,4)+""==back+""){var o={};if(o.bytes=front.slice(1),o.version=front[0],o.version==coinjs.pub)o.type="standard";else if(o.version==coinjs.multisig)o.type="multisig";else if(o.version==coinjs.multisigBech32)o.type="multisigBech32";else if(o.version==coinjs.priv)o.type="wifkey";else if(42==o.version){if(o.type="stealth",o.option=front[1],0!=o.option)return alert("Stealth Address option other than 0 is currently not supported!"),!1;if(o.scankey=Crypto.util.bytesToHex(front.slice(2,35)),o.n=front[35],o.n>1)return alert("Stealth Multisig is currently not supported!"),!1;if(o.spendkey=Crypto.util.bytesToHex(front.slice(36,69)),o.m=front[69],o.prefixlen=front[70],o.prefixlen>0)return alert("Stealth Address Prefixes are currently not supported!"),!1;o.prefix=front.slice(71)}else o.type="other";return o}throw"Invalid checksum"}catch(e){let bech32rs=coinjs.bech32redeemscript(addr);return bech32rs&&40==bech32rs.length?{type:"bech32",redeemscript:bech32rs}:!(!bech32rs||64!=bech32rs.length)&&{type:"multisigBech32",redeemscript:bech32rs}}},coinjs.addressBalance=function(address,callback){coinjs.ajax(coinjs.host+"?uid="+coinjs.uid+"&key="+coinjs.key+"&setmodule=addresses&request=bal&address="+address+"&r="+Math.random(),callback,"GET")},coinjs.pubkeydecompress=function(pubkey){if("string"==typeof pubkey&&pubkey.match(/^[a-f0-9]+$/i)){var curve=EllipticCurve.getSECCurveByName("secp256k1");try{var pt=curve.curve.decodePointHex(pubkey),x=pt.getX().toBigInteger(),y=pt.getY().toBigInteger(),publicKeyBytes=EllipticCurve.integerToBytes(x,32);return(publicKeyBytes=publicKeyBytes.concat(EllipticCurve.integerToBytes(y,32))).unshift(4),Crypto.util.bytesToHex(publicKeyBytes)}catch(e){return!1}}return!1},coinjs.bech32_polymod=function(values){for(var chk=1,BECH32_GENERATOR=[996825010,642813549,513874426,1027748829,705979059],p=0;p>25;chk=(33554431&chk)<<5^values[p];for(var i=0;i<5;++i)top>>i&1&&(chk^=BECH32_GENERATOR[i])}return chk},coinjs.bech32_hrpExpand=function(hrp){var p,ret=[];for(p=0;p>5);for(ret.push(0),p=0;p>5*(5-p)&31);return ret},coinjs.bech32_encode=function(hrp,data){for(var combined=data.concat(coinjs.bech32_createChecksum(hrp,data)),ret=hrp+"1",p=0;p126)return null;bechString.charCodeAt(p)>=97&&bechString.charCodeAt(p)<=122&&(has_lower=!0),bechString.charCodeAt(p)>=65&&bechString.charCodeAt(p)<=90&&(has_upper=!0)}if(has_lower&&has_upper)return null;var pos=(bechString=bechString.toLowerCase()).lastIndexOf("1");if(pos<1||pos+7>bechString.length||bechString.length>90)return null;var hrp=bechString.substring(0,pos),data=[];for(p=pos+1;p=outBits;)bits-=outBits,result.push(value>>bits&maxV);if(pad)bits>0&&result.push(value<=inBits)throw new Error("Excess padding");if(value<0){r.version=coinjs.uint(bytes.slice(0,4),4),r.depth=coinjs.uint(bytes.slice(4,5),1),r.parent_fingerprint=bytes.slice(5,9),r.child_index=coinjs.uint(bytes.slice(9,13),4),r.chain_code=bytes.slice(13,45),r.key_bytes=bytes.slice(45,78);var c=coinjs.compressed;if(coinjs.compressed=!0,0==r.key_bytes[0]){r.type="private";var privkey=r.key_bytes.slice(1,33),privkeyHex=Crypto.util.bytesToHex(privkey),pubkey=coinjs.newPubkey(privkeyHex);r.keys={privkey:privkeyHex,pubkey:pubkey,address:coinjs.pubkey2address(pubkey),wif:coinjs.privkey2wif(privkeyHex)}}else if(2==r.key_bytes[0]||3==r.key_bytes[0]){r.type="public";var pubkeyHex=Crypto.util.bytesToHex(r.key_bytes);r.keys={pubkey:pubkeyHex,address:coinjs.pubkey2address(pubkeyHex)}}else r.type="invalid";r.keys_extended=r.extend(),coinjs.compressed=c}return r},extend:function(){return coinjs.hd().make({depth:1*this.depth+1,parent_fingerprint:this.parent_fingerprint,child_index:this.child_index,chain_code:this.chain_code,privkey:this.keys.privkey,pubkey:this.keys.pubkey})},derive_path:function(path){if("m"==path||"M"==path||"m'"==path||"M'"==path)return this;var p=path.split("/"),hdp=coinjs.clone(this);for(var i in p)if((0!=i||"m"==c)&&"remove"!=i){var c=p[i],use_private=c.length>1&&"'"==c[c.length-1],child_index=2147483647&parseInt(use_private?c.slice(0,c.length-1):c);use_private&&(child_index+=2147483648);var key=(hdp=hdp.derive(child_index)).keys_extended.privkey&&""!=hdp.keys_extended.privkey?hdp.keys_extended.privkey:hdp.keys_extended.pubkey;hdp=coinjs.hd(key)}return hdp},derive:function(i){i=i||0;var k,key,pubkey,o,blob=Crypto.util.hexToBytes(this.keys.pubkey).concat(coinjs.numToBytes(i,4).reverse()),hash=new jsSHA(Crypto.util.bytesToHex(blob),"HEX").getHMAC(Crypto.util.bytesToHex(r.chain_code),"HEX","SHA-512","HEX"),il=new BigInteger(hash.slice(0,64),16),ir=Crypto.util.hexToBytes(hash.slice(64,128)),ecparams=EllipticCurve.getSECCurveByName("secp256k1");if(ecparams.getCurve(),(o=coinjs.clone(this)).chain_code=ir,o.child_index=i,"private"==this.type)k=il.add(new BigInteger([0].concat(Crypto.util.hexToBytes(this.keys.privkey)))).mod(ecparams.getN()),key=Crypto.util.bytesToHex(k.toByteArrayUnsigned()),pubkey=coinjs.newPubkey(key),o.keys={privkey:key,pubkey:pubkey,wif:coinjs.privkey2wif(key),address:coinjs.pubkey2address(pubkey)};else if("public"==this.type){q=ecparams.curve.decodePointHex(this.keys.pubkey);var curvePt=ecparams.getG().multiply(il).add(q),x=curvePt.getX().toBigInteger(),y=curvePt.getY().toBigInteger(),publicKeyBytesCompressed=EllipticCurve.integerToBytes(x,32);y.isEven()?publicKeyBytesCompressed.unshift(2):publicKeyBytesCompressed.unshift(3),pubkey=Crypto.util.bytesToHex(publicKeyBytesCompressed),o.keys={pubkey:pubkey,address:coinjs.pubkey2address(pubkey)}}return o.parent_fingerprint=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(r.keys.pubkey),{asBytes:!0}),{asBytes:!0}).slice(0,4),o.keys_extended=o.extend(),o},master:function(pass){var seed=pass?Crypto.SHA256(pass):coinjs.newPrivkey(),I=new jsSHA(seed,"HEX").getHMAC("Bitcoin seed","TEXT","SHA-512","HEX"),chain=(Crypto.util.hexToBytes(I.slice(0,64)),Crypto.util.hexToBytes(I.slice(64,128)));return coinjs.hd().make({depth:0,parent_fingerprint:[0,0,0,0],child_index:0,chain_code:chain,privkey:I.slice(0,64),pubkey:coinjs.newPubkey(I.slice(0,64))})},make:function(data){var k=[];k.push(1*data.depth),k=(k=(k=k.concat(data.parent_fingerprint)).concat(coinjs.numToBytes(data.child_index,4).reverse())).concat(data.chain_code);var o={};if(data.privkey){var prv=coinjs.numToBytes(coinjs.hdkey.prv,4).reverse();(prv=prv.concat(k)).push(0),prv=prv.concat(Crypto.util.hexToBytes(data.privkey));var checksum=Crypto.SHA256(Crypto.SHA256(prv,{asBytes:!0}),{asBytes:!0}).slice(0,4),ret=prv.concat(checksum);o.privkey=coinjs.base58encode(ret)}if(data.pubkey){var pub=coinjs.numToBytes(coinjs.hdkey.pub,4).reverse();pub=(pub=pub.concat(k)).concat(Crypto.util.hexToBytes(data.pubkey)),checksum=Crypto.SHA256(Crypto.SHA256(pub,{asBytes:!0}),{asBytes:!0}).slice(0,4),ret=pub.concat(checksum),o.pubkey=coinjs.base58encode(ret)}return o}};return r.parse()},coinjs.script=function(data){var r={};return data?"string"==typeof data?r.buffer=Crypto.util.hexToBytes(data):coinjs.isArray(data)?r.buffer=data:data instanceof coinjs.script?r.buffer=data.buffer:r.buffer=data:r.buffer=[],r.parse=function(){var self=this;r.chunks=[];var i=0;function readChunk(n){self.chunks.push(self.buffer.slice(i,i+n)),i+=n}for(;i=240&&(opcode=opcode<<8|this.buffer[i++]),opcode>0&&opcode<76?readChunk(opcode):76==opcode?readChunk(this.buffer[i++]):77==opcode?readChunk(this.buffer[i++]<<8|this.buffer[i++]):78==opcode?readChunk(this.buffer[i++]<<24|this.buffer[i++]<<16|this.buffer[i++]<<8|this.buffer[i++]):this.chunks.push(opcode),i<0)break}return!0},r.decodeRedeemScript=function(script){var r=!1;try{var s=coinjs.script(Crypto.util.hexToBytes(script));if(s.chunks.length>=3&&174==s.chunks[s.chunks.length-1]){(r={}).signaturesRequired=s.chunks[0]-80;for(var pubkeys=[],i=1;i=3&&174==s.chunks[s.chunks.length-1]){(r={}).signaturesRequired=s.chunks[0]-80;for(var pubkeys=[],i=1;i>>8&255)):(this.buffer.push(78),this.buffer.push(255&data.length),this.buffer.push(data.length>>>8&255),this.buffer.push(data.length>>>16&255),this.buffer.push(data.length>>>24&255)),this.buffer=this.buffer.concat(data),this.chunks.push(data),!0},r.parse(),r},coinjs.transaction=function(){var r={version:1,lock_time:0,ins:[],outs:[],witness:!1,timestamp:null,block:null,addinput:function(txid,index,script,sequence){var o={};return o.outpoint={hash:txid,index:index},o.script=coinjs.script(script||[]),o.sequence=sequence||(0==r.lock_time?4294967295:0),this.ins.push(o)},addoutput:function(address,value){var o={};o.value=new BigInteger(""+Math.round(1*value*1e8),10);var s=coinjs.script();return o.script=s.spendToScript(address),this.outs.push(o)},addstealth:function(stealth,value){var ephemeralKeyBigInt=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(coinjs.newPrivkey())),curve=EllipticCurve.getSECCurveByName("secp256k1"),p=EllipticCurve.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"),a=BigInteger.ZERO,b=EllipticCurve.fromHex("7"),calccurve=new EllipticCurve.CurveFp(p,a,b),ephemeralPt=curve.getG().multiply(ephemeralKeyBigInt),sharedPt=calccurve.decodePointHex(stealth.scankey).multiply(ephemeralKeyBigInt),stealthindexKeyBigInt=BigInteger.fromByteArrayUnsigned(Crypto.SHA256(sharedPt.getEncoded(!0),{asBytes:!0})),stealthindexPt=curve.getG().multiply(stealthindexKeyBigInt),addressPt=calccurve.decodePointHex(stealth.spendkey).add(stealthindexPt),sendaddress=coinjs.pubkey2address(Crypto.util.bytesToHex(addressPt.getEncoded(!0))),OPRETBytes=[6].concat(Crypto.util.randomBytes(4)).concat(ephemeralPt.getEncoded(!0)),q=coinjs.script();q.writeOp(106),q.writeBytes(OPRETBytes),v={},v.value=0,v.script=q,this.outs.push(v);var o={};o.value=new BigInteger(""+Math.round(1*value*1e8),10);var s=coinjs.script();return o.script=s.spendToScript(sendaddress),this.outs.push(o)},adddata:function(data){if(data.match(/^[a-f0-9]+$/gi)&&data.length<160&&data.length%2==0){var s=coinjs.script();return s.writeOp(106),s.writeBytes(Crypto.util.hexToBytes(data)),o={},o.value=0,o.script=s,this.outs.push(o)}return!1},listUnspent:function(address,callback){coinjs.ajax(coinjs.host+"?uid="+coinjs.uid+"&key="+coinjs.key+"&setmodule=addresses&request=unspent&address="+address+"&r="+Math.random(),callback,"GET")},getTransaction:function(txid,callback){coinjs.ajax(coinjs.host+"?uid="+coinjs.uid+"&key="+coinjs.key+"&setmodule=bitcoin&request=gettransaction&txid="+txid+"&r="+Math.random(),callback,"GET")},addUnspent:function(address,callback,script,segwit,sequence){var self=this;this.listUnspent(address,(function(data){var s=coinjs.script(),value=0,total=0,x={};GLOBAL.DOMParser?(parser=new DOMParser,xmlDoc=parser.parseFromString(data,"text/xml")):(xmlDoc=new ActiveXObject("Microsoft.XMLDOM"),xmlDoc.async=!1,xmlDoc.loadXML(data));var unspent=xmlDoc.getElementsByTagName("unspent")[0];if(unspent)for(i=1;i<=unspent.childElementCount;i++){var u=xmlDoc.getElementsByTagName("unspent_"+i)[0],txhash=u.getElementsByTagName("tx_hash")[0].childNodes[0].nodeValue.match(/.{1,2}/g).reverse().join("")+"",n=u.getElementsByTagName("tx_output_n")[0].childNodes[0].nodeValue,scr=script||u.getElementsByTagName("script")[0].childNodes[0].nodeValue;segwit&&((s=coinjs.script()).writeBytes(Crypto.util.hexToBytes(script)),s.writeOp(0),s.writeBytes(coinjs.numToBytes(1*u.getElementsByTagName("value")[0].childNodes[0].nodeValue,8)),scr=Crypto.util.bytesToHex(s.buffer));var seq=sequence||!1;self.addinput(txhash,n,scr,seq),value+=1*u.getElementsByTagName("value")[0].childNodes[0].nodeValue,total++}return x.result=xmlDoc.getElementsByTagName("result")[0].childNodes[0].nodeValue,x.unspent=unspent,x.value=value,x.total=total,x.response=xmlDoc.getElementsByTagName("response")[0].childNodes[0].nodeValue,callback(x)}))},addUnspentAndSign:function(wif,callback){var self=this,address=coinjs.wif2address(wif);self.addUnspent(address.address,(function(data){return self.sign(wif),callback(data)}))},broadcast:function(callback,txhex){var tx=txhex||this.serialize();coinjs.ajax(coinjs.host+"?uid="+coinjs.uid+"&key="+coinjs.key+"&setmodule=bitcoin&request=sendrawtransaction",callback,"POST",["rawtx="+tx])},transactionHash:function(index,sigHashType){for(var clone=coinjs.clone(this),shType=sigHashType||1,i=0;i=128)if(clone.ins=[clone.ins[index]],129==shType);else if(130==shType)clone.outs=[];else if(131==shType)for(clone.outs.length=index+1,i=0;i80&&scriptcode.unshift(scriptcode.length);var value=coinjs.numToBytes(extract.value,8),zero=coinjs.numToBytes(0,32),version=coinjs.numToBytes(parseInt(this.version),4),bufferTmp=[];if(!(sigHashType>=80))for(var i=0;i=1?Crypto.SHA256(Crypto.SHA256(bufferTmp,{asBytes:!0}),{asBytes:!0}):zero;if(bufferTmp=[],!(sigHashType>=80)&&2!=sigHashType&&3!=sigHashType)for(i=0;i=1?Crypto.SHA256(Crypto.SHA256(bufferTmp,{asBytes:!0}),{asBytes:!0}):zero,outpoint=Crypto.util.hexToBytes(this.ins[index].outpoint.hash).reverse();outpoint=outpoint.concat(coinjs.numToBytes(this.ins[index].outpoint.index,4));var nsequence=coinjs.numToBytes(this.ins[index].sequence,4),hashOutputs=zero;if(bufferTmp=[],2!=sigHashType&&3!=sigHashType){for(i=0;i80&&scriptcode.unshift(scriptcode.length);var value=coinjs.numToBytes(extract.value,8),zero=coinjs.numToBytes(0,32),version=coinjs.numToBytes(parseInt(this.version),4),bufferTmp=[];if(!(sigHashType>=80))for(var i=0;i=1?Crypto.SHA256(Crypto.SHA256(bufferTmp,{asBytes:!0}),{asBytes:!0}):zero;if(bufferTmp=[],!(sigHashType>=80)&&2!=sigHashType&&3!=sigHashType)for(i=0;i=1?Crypto.SHA256(Crypto.SHA256(bufferTmp,{asBytes:!0}),{asBytes:!0}):zero,outpoint=Crypto.util.hexToBytes(this.ins[index].outpoint.hash).reverse();outpoint=outpoint.concat(coinjs.numToBytes(this.ins[index].outpoint.index,4));var nsequence=coinjs.numToBytes(this.ins[index].sequence,4),hashOutputs=zero;if(bufferTmp=[],2!=sigHashType&&3!=sigHashType){for(i=0;i0&&(22==this.ins[index].script.chunks[0].length&&0==this.ins[index].script.chunks[0][0]||20==this.ins[index].script.chunks[0].length&&0==this.ins[index].script.chunks[1])){var sigs="true"==(signed=this.witness[index]&&2==this.witness[index].length?"true":"false")?1:0,value=-1;return this.ins[index].script.chunks[2]&&8==this.ins[index].script.chunks[2].length&&(value=coinjs.bytesToNum(this.ins[index].script.chunks[2])),{type:"segwit",signed:signed,signatures:sigs,script:Crypto.util.bytesToHex(this.ins[index].script.chunks[0]),value:value}}if(0==this.ins[index].script.chunks[0]&&174==this.ins[index].script.chunks[this.ins[index].script.chunks.length-1][this.ins[index].script.chunks[this.ins[index].script.chunks.length-1].length-1]){var sigcount=0;for(let i=1;i=80&&174==this.ins[index].script.chunks[this.ins[index].script.chunks.length-1])return{type:"multisig",signed:"false",signatures:0,script:Crypto.util.bytesToHex(this.ins[index].script.buffer)};if(3==this.ins[index].script.chunks.length&&this.ins[index].script.chunks[0][0]>=80&&174==this.ins[index].script.chunks[0][this.ins[index].script.chunks[0].length-1]&&0==this.ins[index].script.chunks[1]){let last_index=this.ins[index].script.chunks.length-1;return value=-1,last_index>=2&&8==this.ins[index].script.chunks[last_index].length&&(value=coinjs.bytesToNum(this.ins[index].script.chunks[last_index])),{type:"multisig_bech32",signed:"false",signatures:sigcount=this.witness[index]?this.witness[index].length-2:0,script:Crypto.util.bytesToHex(this.ins[index].script.chunks[0]),value:value}}var signed;return 0==this.ins[index].script.chunks.length?{type:"empty",signed:signed=this.witness[index]&&this.witness[index].length>=2?"true":"false",signatures:sigs="true"==signed?this.witness[index][0]?1:this.witness[index].length-2:0,script:""}:2==this.ins[index].script.chunks.length&&81==this.ins[index].script.chunks[0]&&32==this.ins[index].script.chunks[1].length&&32==this.ins[index].script.buffer[1]?{type:"bech32m",signed:"false",signatures:0,script:Crypto.util.bytesToHex(this.ins[index].script.buffer)}:{type:"unknown",signed:"false",signatures:0,script:Crypto.util.bytesToHex(this.ins[index].script.buffer)}}return!1},transactionSig:function(index,wif,sigHashType,txhash){var shType=sigHashType||1,hash=txhash||Crypto.util.hexToBytes(this.transactionHash(index,shType));if(hash){var curve=EllipticCurve.getSECCurveByName("secp256k1"),key=coinjs.wif2privkey(wif),priv=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(key.privkey)),n=curve.getN(),e=BigInteger.fromByteArrayUnsigned(hash),badrs=0;do{var k=this.deterministicK(wif,hash,badrs),r=curve.getG().multiply(k).getX().toBigInteger().mod(n),s=k.modInverse(n).multiply(e.add(priv.multiply(r))).mod(n);badrs++}while(r.compareTo(BigInteger.ZERO)<=0||s.compareTo(BigInteger.ZERO)<=0);var halfn=n.shiftRight(1);s.compareTo(halfn)>0&&(s=n.subtract(s));var sig=function(r,s){var rBa=r.toByteArraySigned(),sBa=s.toByteArraySigned(),sequence=[];return sequence.push(2),sequence.push(rBa.length),(sequence=sequence.concat(rBa)).push(2),sequence.push(sBa.length),(sequence=sequence.concat(sBa)).unshift(sequence.length),sequence.unshift(48),sequence}(r,s);return sig.push(parseInt(shType,10)),Crypto.util.bytesToHex(sig)}return!1},deterministicK:function(wif,hash,badrs){badrs=badrs||0;var key=coinjs.wif2privkey(wif),x=Crypto.util.hexToBytes(key.privkey),N=EllipticCurve.getSECCurveByName("secp256k1").getN(),v=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],k=[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];k=Crypto.HMAC(Crypto.SHA256,v.concat([0]).concat(x).concat(hash),k,{asBytes:!0}),v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0}),k=Crypto.HMAC(Crypto.SHA256,v.concat([1]).concat(x).concat(hash),k,{asBytes:!0}),v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});var T=[];T=v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});for(var KBigInt=BigInteger.fromByteArrayUnsigned(T),i=0;KBigInt.compareTo(N)>=0||KBigInt.compareTo(BigInteger.ZERO)<=0||i=decode_rs.signaturesRequired&&(this.ins[index].script=coinjs.script()),w.unshift(0),w.push(redeemScript),this.witness[index]=w}},signmultisig:function(index,wif,sigHashType){var redeemScript=174==this.ins[index].script.chunks[this.ins[index].script.chunks.length-1]?this.ins[index].script.buffer:this.ins[index].script.chunks[this.ins[index].script.chunks.length-1],pubkeyList=function(redeemScript){for(var r={},i=1;i=1)for(i=0;i0&&(s=n.subtract(s));var sig=function(r,s){var rBa=r.toByteArraySigned(),sBa=s.toByteArraySigned(),sequence=[];return sequence.push(2),sequence.push(rBa.length),(sequence=sequence.concat(rBa)).push(2),sequence.push(sBa.length),(sequence=sequence.concat(sBa)).unshift(sequence.length),sequence.unshift(48),sequence}(r,s);return sig.push(parseInt(shType,10)),Crypto.util.bytesToHex(sig)}return!1},deserialize:function(buffer){"string"==typeof buffer&&(buffer=Crypto.util.hexToBytes(buffer));var pos=0,witness=!1,readAsInt=function(bytes){return 0==bytes?0:(pos++,buffer[pos-1]+256*readAsInt(bytes-1))},readVarInt=function(){return pos++,buffer[pos-1]<253?buffer[pos-1]:readAsInt(buffer[pos-1]-251)},readBytes=function(bytes){return pos+=bytes,buffer.slice(pos-bytes,pos)},readVarString=function(){var size=readVarInt();return readBytes(size)},obj=new coinjs.transaction;obj.version=readAsInt(4),0==buffer[pos]&&1==buffer[pos+1]&&(witness=!0,obj.witness=[],pos+=2);for(var ins=readVarInt(),i=0;i=0)return!1;if(s.compareTo(BigInteger.ONE)<0||s.compareTo(n)>=0)return!1;var c=s.modInverse(n),u1=e.multiply(c).mod(n),u2=r.multiply(c).mod(n);return G.multiply(u1).add(Q.multiply(u2)).getX().toBigInteger().mod(n).equals(r)},coinjs.base58encode=function(buffer){for(var alphabet="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",base=BigInteger.valueOf(58),bi=BigInteger.fromByteArrayUnsigned(buffer),chars=[];bi.compareTo(base)>=0;){var mod=bi.mod(base);chars.unshift(alphabet[mod.intValue()]),bi=bi.subtract(mod).divide(base)}chars.unshift(alphabet[bi.intValue()]);for(var i=0;i=0;i--){var alphaIndex="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".indexOf(buffer[i]);if(alphaIndex<0)throw"Invalid character";bi=bi.add(BigInteger.valueOf(alphaIndex).multiply(base.pow(buffer.length-1-i))),"1"==buffer[i]?leadingZerosNum++:leadingZerosNum=0}for(var bytes=bi.toByteArrayUnsigned();leadingZerosNum-- >0;)bytes.unshift(0);return bytes},coinjs.ajax=function(u,f,m,a){var x=!1;try{x=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{x=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){x=new XMLHttpRequest}}if(0==x)return!1;x.open(m,u,!0),x.onreadystatechange=function(){4==x.readyState&&f&&f(x.responseText)},"POST"==m&&x.setRequestHeader("Content-type","application/x-www-form-urlencoded"),x.send(a)},coinjs.clone=function(obj){if(null==obj||"object"!=typeof obj)return obj;var temp=new obj.constructor;for(var key in obj)obj.hasOwnProperty(key)&&(temp[key]=coinjs.clone(obj[key]));return temp},coinjs.numToBytes=function(num,bytes){return void 0===bytes&&(bytes=8),0==bytes?[]:-1==num?Crypto.util.hexToBytes("ffffffffffffffff"):[num%256].concat(coinjs.numToBytes(Math.floor(num/256),bytes-1))},coinjs.numToScriptNumBytes=function(_number){for(var value=Math.abs(_number),size=function(i){return i>2147483647?5:i>8388607?4:i>32767?3:i>127?2:i>0?1:0}(value),result=[],i=0;i{const result=[];let len=string.length-2;for(;len>=0;)result.push(string.substr(len,2)),len-=2;return result.join("")},coinjs.getTransactionHash=function(transaction_in_hex,changeOutputEndianess){var x1,x2,x3,x4,x5;return x1=Crypto.util.hexToBytes(transaction_in_hex),x2=Crypto.SHA256(x1),x3=Crypto.util.hexToBytes(x2),x4=Crypto.SHA256(x3),x5=coinjs.changeEndianness(x4),1==changeOutputEndianess||void 0!==changeOutputEndianess&&0!=changeOutputEndianess||(x5=x4),x5},coinjs.compressedToUncompressed=function(compressed){var t1,curve=EllipticCurve.getSECCurveByName("secp256k1");return t1=curve.curve.decodePointHex(compressed),curve.curve.encodePointHex(t1)},coinjs.uncompressedToCompressed=function(uncompressed){var t1;return t1=uncompressed.charAt(uncompressed.length-1),(parseInt(t1,10)%2==1?"03":"02")+uncompressed.substr(2,64)},coinjs.verifySignatureHex=function(hashHex,sigHex,pubHexCompressed){var h1,s1,p1,p2;return h1=Crypto.util.hexToBytes(hashHex),s1=Crypto.util.hexToBytes(sigHex),p1=coinjs.compressedToUncompressed(pubHexCompressed),p2=Crypto.util.hexToBytes(p1),coinjs.verifySignature(h1,s1,p2)},coinjs.generateBitcoinSignature=function(private_key,hash,sighash_type_int=1){var wif;return wif=private_key.length<60?private_key:coinjs.privkey2wif(private_key),coinjs.transaction().transactionSigNoIndex(wif,sighash_type_int,hash)},coinjs.dSHA256=function(data){var t1,t2;return t1=Crypto.SHA256(Crypto.util.hexToBytes(data)),t2=Crypto.util.hexToBytes(t1),Crypto.SHA256(t2)},coinjs.fromBitcoinAmountFormat=function(data){var x1;return x1=coinjs.changeEndianness(data),parseInt(x1,16)/10**8},coinjs.toBitcoinAmountFormat=function(countBitcoin){var t3;return t3=(countBitcoin*10**8).toString(16),coinjs.changeEndianness(t3).padEnd(16,"0")},coinjs.scriptcodeCreatorBasic=function(scriptpubkey){return"0014"==scriptpubkey.substr(0,4)?"1976a9"+scriptpubkey.slice(2)+"88ac":(scriptpubkey.length/2).toString(16)+scriptpubkey},coinjs.ripemd160sha256=function(data){var t1;return t1=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(data),{asBytes:!0}),{asBytes:!0}),Crypto.util.bytesToHex(t1)},coinjs.random=function(length){var r="",l=length||25;for(let x=0;x<|./;'#][=-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".charAt(Math.floor(62*Math.random()));return r},function(){var SecretShare=GLOBAL.shamirSecretShare={},defaults={bits:8,radix:16,minBits:3,maxBits:20,bytesPerChar:2,maxBytesPerChar:6,primitivePolynomials:[null,null,1,3,3,5,3,3,29,17,9,5,83,27,43,3,45,9,39,39,9,5,3,33,27,9,71,39,9,5,83],warning:"WARNING:\nA secure random number generator was not found.\nUsing securedMathRandom(), which is NOT cryptographically strong!"},config={};function init(bits){if(bits&&("number"!=typeof bits||bits%1!=0||bitsdefaults.maxBits))throw new Error("Number of bits must be an integer between "+defaults.minBits+" and "+defaults.maxBits+", inclusive.");config.radix=defaults.radix,config.bits=bits||defaults.bits,config.size=Math.pow(2,config.bits),config.max=config.size-1;for(var logs=[],exps=[],x=1,primitive=defaults.primitivePolynomials[config.bits],i=0;i=config.size&&(x^=primitive,x&=config.max);config.logs=logs,config.exps=exps}function isInited(){return!!(config.bits&&config.size&&config.max&&config.logs&&config.exps&&config.logs.length===config.size&&config.exps.length===config.size)}function warn(){GLOBAL.console.warn(defaults.warning),"function"==typeof GLOBAL.alert&&config.alert&&GLOBAL.alert(defaults.warning)}function isSetRNG(){return"function"==typeof config.rng}function horner(x,coeffs){for(var logx=config.logs[x],fx=0,i=coeffs.length-1;i>=0;i--)fx=0!==fx?config.exps[(logx+config.logs[fx])%config.max]^coeffs[i]:coeffs[i];return fx}function inArray(arr,val){for(var i=0,len=arr.length;idefaults.maxBits))throw new Error("Number of bits must be an integer between "+defaults.minBits+" and "+defaults.maxBits+", inclusive.");var max=Math.pow(2,bits)-1,idLength=max.toString(config.radix).length,id=parseInt(share.substr(1,idLength),config.radix);if("number"!=typeof id||id%1!=0||id<1||id>max)throw new Error("Share id must be an integer between 1 and "+config.max+", inclusive.");if(!(share=share.substr(idLength+1)).length)throw new Error("Invalid share: zero-length share.");return{bits:bits,id:id,value:share}}function combine(at,shares){for(var setBits,share,x=[],y=[],result="",i=0,len=shares.length;iconfig.bits;i-=config.bits)parts.push(parseInt(str.slice(i-config.bits,i),2));return parts.push(parseInt(str.slice(0,i),2)),parts}function padLeft(str,bits){bits=bits||config.bits;var missing=str.length%bits;return(missing?new Array(bits-missing+1).join("0"):"")+str}function hex2bin(str){for(var num,bin="",i=str.length-1;i>=0;i--){if(num=parseInt(str[i],16),isNaN(num))throw new Error("Invalid hex character.");bin=padLeft(num.toString(2),4)+bin}return bin}function bin2hex(str){for(var num,hex="",i=(str=padLeft(str,4)).length;i>=4;i-=4){if(num=parseInt(str.slice(i-4,i),2),isNaN(num))throw new Error("Invalid binary character.");hex=num.toString(16)+hex}return hex}SecretShare.getConfig=function(){return{bits:config.bits,unsafePRNG:config.unsafePRNG}},SecretShare.init=init,SecretShare.setRNG=function(rng,alert){if(isInited()||this.init(),config.unsafePRNG=!1,"function"!=typeof(rng=rng||function(){var crypto;function construct(bits,arr,radix,size){for(var str="",i=0,len=arr.length-1;iconfig.bits||rng(config.bits).lengthconfig.max){var neededBits=Math.ceil(Math.log(numShares+1)/Math.LN2);throw new Error("Number of shares must be an integer between 2 and 2^bits-1 ("+config.max+"), inclusive. To create "+numShares+" shares, use at least "+neededBits+" bits.")}if("number"!=typeof threshold||threshold%1!=0||threshold<2)throw new Error("Threshold number of shares must be an integer between 2 and 2^bits-1 ("+config.max+"), inclusive.");if(threshold>config.max){neededBits=Math.ceil(Math.log(threshold+1)/Math.LN2);throw new Error("Threshold number of shares must be an integer between 2 and 2^bits-1 ("+config.max+"), inclusive. To use a threshold of "+threshold+", use at least "+neededBits+" bits.")}if("number"!=typeof padLength||padLength%1!=0)throw new Error("Zero-pad length must be an integer greater than 1.");config.unsafePRNG&&warn(),secret=split(secret="1"+hex2bin(secret),padLength);for(var x=new Array(numShares),y=new Array(numShares),i=0,len=secret.length;imax)throw new Error("Share id must be an integer between 1 and "+config.max+", inclusive.");var padding=max.toString(config.radix).length;return config.bits.toString(36).toUpperCase()+padLeft(id.toString(config.radix),padding)+combine(id,shares)},SecretShare._lagrange=lagrange,SecretShare.str2hex=function(str,bytesPerChar){if("string"!=typeof str)throw new Error("Input must be a character string.");if("number"!=typeof(bytesPerChar=bytesPerChar||defaults.bytesPerChar)||bytesPerChar%1!=0||bytesPerChar<1||bytesPerChar>defaults.maxBytesPerChar)throw new Error("Bytes per character must be an integer between 1 and "+defaults.maxBytesPerChar+", inclusive.");for(var num,hexChars=2*bytesPerChar,max=Math.pow(16,hexChars)-1,out="",i=0,len=str.length;imax){var neededBytes=Math.ceil(Math.log(num+1)/Math.log(256));throw new Error("Invalid character code ("+num+"). Maximum allowable is 256^bytes-1 ("+max+"). To convert this character, use at least "+neededBytes+" bytes.")}out=padLeft(num.toString(16),hexChars)+out}return out},SecretShare.hex2str=function(str,bytesPerChar){if("string"!=typeof str)throw new Error("Input must be a hexadecimal string.");if("number"!=typeof(bytesPerChar=bytesPerChar||defaults.bytesPerChar)||bytesPerChar%1!=0||bytesPerChar<1||bytesPerChar>defaults.maxBytesPerChar)throw new Error("Bytes per character must be an integer between 1 and "+defaults.maxBytesPerChar+", inclusive.");for(var hexChars=2*bytesPerChar,out="",i=0,len=(str=padLeft(str,hexChars)).length;icandidate.vectorClock?incumbent:candidate},this.distance=function(firstId,secondId){let distance=0,i=0;const min=Math.min(firstId.length,secondId.length),max=Math.max(firstId.length,secondId.length);for(;i=0?(this._update(node,index,contact),this):node.contacts.length0&&contacts.length[this.distance(a.id,id),a])).sort(((a,b)=>a[0]-b[0])).slice(0,n).map((a=>a[1]))},this.count=function(){let count=0;for(const nodes=[this.root];nodes.length>0;){const node=nodes.pop();null===node.contacts?nodes.push(node.right,node.left):count+=node.contacts.length}return count},this._determineNode=function(node,id,bitIndex){const bytesDescribedByBitIndex=bitIndex>>3,bitIndexWithinByte=bitIndex%8;return id.length<=bytesDescribedByBitIndex&&0!==bitIndexWithinByte?node.left:id[bytesDescribedByBitIndex]&1<<7-bitIndexWithinByte?node.right:node.left},this.get=function(id){this.ensureInt8("id",id);let bitIndex=0,node=this.root;for(;null===node.contacts;)node=this._determineNode(node,id,bitIndex++);const index=this._indexOf(node,id);return index>=0?node.contacts[index]:null},this._indexOf=function(node,id){for(let i=0;i=0&&node.contacts.splice(index,1)[0],this},this._split=function(node,bitIndex){node.left=this.createNode(),node.right=this.createNode();for(const contact of node.contacts)this._determineNode(node,contact.id,bitIndex).contacts.push(contact);node.contacts=null;const detNode=this._determineNode(node,this.localNodeId,bitIndex);(node.left===detNode?node.right:node.left).dontSplit=!0},this.toArray=function(){let result=[];for(const nodes=[this.root];nodes.length>0;){const node=nodes.pop();null===node.contacts?nodes.push(node.right,node.left):result=result.concat(node.contacts)}return result},this._update=function(node,index,contact){if(!this.arrayEquals(node.contacts[index].id,contact.id))throw new Error("wrong index for _update");const incumbent=node.contacts[index],selection=this.arbiter(incumbent,contact);selection===incumbent&&incumbent!==contact||(node.contacts.splice(index,1),node.contacts.push(selection))}}}("undefined"!=typeof global?global:window);
\ No newline at end of file
diff --git a/scripts/compactIDB.js b/scripts/compactIDB.js
new file mode 100644
index 0000000..ba843ec
--- /dev/null
+++ b/scripts/compactIDB.js
@@ -0,0 +1,257 @@
+(function (EXPORTS) { //compactIDB v2.1.2
+ /* Compact IndexedDB operations */
+ 'use strict';
+ const compactIDB = EXPORTS;
+
+ var defaultDB;
+
+ const indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
+ const IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
+ const IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
+
+ if (!indexedDB) {
+ console.error("Your browser doesn't support a stable version of IndexedDB.");
+ return;
+ }
+
+ compactIDB.setDefaultDB = dbName => defaultDB = dbName;
+
+ Object.defineProperty(compactIDB, 'default', {
+ get: () => defaultDB,
+ set: dbName => defaultDB = dbName
+ });
+
+ function getDBversion(dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ resolve(db.version)
+ db.close()
+ }).catch(error => reject(error))
+ })
+ }
+
+ function upgradeDB(dbName, createList = null, deleteList = null) {
+ return new Promise((resolve, reject) => {
+ getDBversion(dbName).then(version => {
+ var idb = indexedDB.open(dbName, version + 1);
+ idb.onerror = (event) => reject("Error in opening IndexedDB");
+ idb.onupgradeneeded = (event) => {
+ let db = event.target.result;
+ if (createList instanceof Object) {
+ if (Array.isArray(createList)) {
+ let tmp = {}
+ createList.forEach(o => tmp[o] = {})
+ createList = tmp
+ }
+ for (let o in createList) {
+ let obs = db.createObjectStore(o, createList[o].options || {});
+ if (createList[o].indexes instanceof Object)
+ for (let i in createList[o].indexes)
+ obs.createIndex(i, i, createList[o].indexes || {});
+ }
+ }
+ if (Array.isArray(deleteList))
+ deleteList.forEach(o => db.deleteObjectStore(o));
+ resolve('Database upgraded')
+ }
+ idb.onsuccess = (event) => event.target.result.close();
+ }).catch(error => reject(error))
+ })
+ }
+
+ compactIDB.initDB = function (dbName, objectStores = {}) {
+ return new Promise((resolve, reject) => {
+ if (!(objectStores instanceof Object))
+ return reject('ObjectStores must be an object or array')
+ defaultDB = defaultDB || dbName;
+ var idb = indexedDB.open(dbName);
+ idb.onerror = (event) => reject("Error in opening IndexedDB");
+ idb.onsuccess = (event) => {
+ var db = event.target.result;
+ let cList = Object.values(db.objectStoreNames);
+ var obs = {},
+ a_obs = {},
+ d_obs = [];
+ if (!Array.isArray(objectStores))
+ var obs = objectStores
+ else
+ objectStores.forEach(o => obs[o] = {})
+ let nList = Object.keys(obs)
+ for (let o of nList)
+ if (!cList.includes(o))
+ a_obs[o] = obs[o]
+ for (let o of cList)
+ if (!nList.includes(o))
+ d_obs.push(o)
+ if (!Object.keys(a_obs).length && !d_obs.length)
+ resolve("Initiated IndexedDB");
+ else
+ upgradeDB(dbName, a_obs, d_obs)
+ .then(result => resolve(result))
+ .catch(error => reject(error))
+ db.close();
+ }
+ });
+ }
+
+ const openDB = compactIDB.openDB = function (dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ var idb = indexedDB.open(dbName);
+ idb.onerror = (event) => reject("Error in opening IndexedDB");
+ idb.onupgradeneeded = (event) => {
+ event.target.result.close();
+ deleteDB(dbName).then(_ => null).catch(_ => null).finally(_ => reject("Datebase not found"))
+ }
+ idb.onsuccess = (event) => resolve(event.target.result);
+ });
+ }
+
+ const deleteDB = compactIDB.deleteDB = function (dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ var deleteReq = indexedDB.deleteDatabase(dbName);;
+ deleteReq.onerror = (event) => reject("Error deleting database!");
+ deleteReq.onsuccess = (event) => resolve("Database deleted successfully");
+ });
+ }
+
+ compactIDB.writeData = function (obsName, data, key = false, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readwrite").objectStore(obsName);
+ let writeReq = (key ? obs.put(data, key) : obs.put(data));
+ writeReq.onsuccess = (evt) => resolve(`Write data Successful`);
+ writeReq.onerror = (evt) => reject(
+ `Write data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
+ );
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ compactIDB.addData = function (obsName, data, key = false, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readwrite").objectStore(obsName);
+ let addReq = (key ? obs.add(data, key) : obs.add(data));
+ addReq.onsuccess = (evt) => resolve(`Add data successful`);
+ addReq.onerror = (evt) => reject(
+ `Add data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
+ );
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ compactIDB.removeData = function (obsName, key, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readwrite").objectStore(obsName);
+ let delReq = obs.delete(key);
+ delReq.onsuccess = (evt) => resolve(`Removed Data ${key}`);
+ delReq.onerror = (evt) => reject(
+ `Remove data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
+ );
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ compactIDB.clearData = function (obsName, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readwrite").objectStore(obsName);
+ let clearReq = obs.clear();
+ clearReq.onsuccess = (evt) => resolve(`Clear data Successful`);
+ clearReq.onerror = (evt) => reject(`Clear data Unsuccessful`);
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ compactIDB.readData = function (obsName, key, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readonly").objectStore(obsName);
+ let getReq = obs.get(key);
+ getReq.onsuccess = (evt) => resolve(evt.target.result);
+ getReq.onerror = (evt) => reject(
+ `Read data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
+ );
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ compactIDB.readAllData = function (obsName, dbName = defaultDB) {
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readonly").objectStore(obsName);
+ var tmpResult = {}
+ let curReq = obs.openCursor();
+ curReq.onsuccess = (evt) => {
+ var cursor = evt.target.result;
+ if (cursor) {
+ tmpResult[cursor.primaryKey] = cursor.value;
+ cursor.continue();
+ } else
+ resolve(tmpResult);
+ }
+ curReq.onerror = (evt) => reject(
+ `Read-All data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
+ );
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+ /* compactIDB.searchData = function (obsName, options = {}, dbName = defaultDB) {
+
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readonly").objectStore(obsName);
+ var filteredResult = {}
+ let keyRange;
+ if(options.lowerKey!==null && options.upperKey!==null)
+ keyRange = IDBKeyRange.bound(options.lowerKey, options.upperKey);
+ else if(options.lowerKey!==null)
+ keyRange = IDBKeyRange.lowerBound(options.lowerKey);
+ else if (options.upperKey!==null)
+ keyRange = IDBKeyRange.upperBound(options.upperBound);
+ else if (options.atKey)
+ let curReq = obs.openCursor(keyRange, )
+ }).catch(error => reject(error))
+ })
+ }*/
+
+ compactIDB.searchData = function (obsName, options = {}, dbName = defaultDB) {
+ options.lowerKey = options.atKey || options.lowerKey || 0
+ options.upperKey = options.atKey || options.upperKey || false
+ options.patternEval = options.patternEval || ((k, v) => true);
+ options.limit = options.limit || false;
+ options.reverse = options.reverse || false;
+ options.lastOnly = options.lastOnly || false
+ return new Promise((resolve, reject) => {
+ openDB(dbName).then(db => {
+ var obs = db.transaction(obsName, "readonly").objectStore(obsName);
+ var filteredResult = {}
+ let curReq = obs.openCursor(
+ options.upperKey ? IDBKeyRange.bound(options.lowerKey, options.upperKey) : IDBKeyRange.lowerBound(options.lowerKey),
+ options.lastOnly || options.reverse ? "prev" : "next");
+ curReq.onsuccess = (evt) => {
+ var cursor = evt.target.result;
+ if (!cursor || (options.limit && options.limit <= Object.keys(filteredResult).length))
+ return resolve(filteredResult); //reached end of key list or limit reached
+ else if (options.patternEval(cursor.primaryKey, cursor.value)) {
+ filteredResult[cursor.primaryKey] = cursor.value;
+ options.lastOnly ? resolve(filteredResult) : cursor.continue();
+ } else
+ cursor.continue();
+ }
+ curReq.onerror = (evt) => reject(`Search unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);
+ db.close();
+ }).catch(error => reject(error));
+ });
+ }
+
+
+})(window.compactIDB = {});
\ No newline at end of file
diff --git a/scripts/components.js b/scripts/components.js
new file mode 100644
index 0000000..b16ae8b
--- /dev/null
+++ b/scripts/components.js
@@ -0,0 +1,9 @@
+// Components downloaded: chips,copy,form,input,notifications,popup,spinner,theme-toggle
+const smChips = document.createElement("template"); smChips.innerHTML = '', customElements.define("sm-chips", class extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(smChips.content.cloneNode(!0)), this.chipsWrapper = this.shadowRoot.querySelector(".sm-chips"), this.coverLeft = this.shadowRoot.querySelector(".cover--left"), this.coverRight = this.shadowRoot.querySelector(".cover--right"), this.navButtonLeft = this.shadowRoot.querySelector(".nav-button--left"), this.navButtonRight = this.shadowRoot.querySelector(".nav-button--right"), this.slottedOptions = void 0, this._value = void 0, this.scrollDistance = 0, this.assignedElements = [], this.scrollLeft = this.scrollLeft.bind(this), this.scrollRight = this.scrollRight.bind(this), this.fireEvent = this.fireEvent.bind(this), this.setSelectedOption = this.setSelectedOption.bind(this) } get value() { return this._value } set value(t) { this.setSelectedOption(t) } scrollLeft() { this.chipsWrapper.scrollBy({ left: -this.scrollDistance, behavior: "smooth" }) } scrollRight() { this.chipsWrapper.scrollBy({ left: this.scrollDistance, behavior: "smooth" }) } setSelectedOption(t) { this._value !== t && (this._value = t, this.assignedElements.forEach(e => { e.value == t ? (e.setAttribute("selected", ""), e.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" })) : e.removeAttribute("selected") })) } fireEvent() { this.dispatchEvent(new CustomEvent("change", { bubbles: !0, composed: !0, detail: { value: this._value } })) } connectedCallback() { this.setAttribute("role", "listbox"); const t = this.shadowRoot.querySelector("slot"); t.addEventListener("slotchange", e => { n.disconnect(), i.disconnect(), this.observeSelf.disconnect(), clearTimeout(this.slotChangeTimeout), this.slotChangeTimeout = setTimeout(() => { this.assignedElements = t.assignedElements(), this.assignedElements.forEach(t => { t.hasAttribute("selected") && (this._value = t.value) }), this.observeSelf.observe(this) }, 0) }); const e = new ResizeObserver(t => { t.forEach(t => { if (t.contentBoxSize) { const e = Array.isArray(t.contentBoxSize) ? t.contentBoxSize[0] : t.contentBoxSize; this.scrollDistance = .6 * e.inlineSize } else this.scrollDistance = .6 * t.contentRect.width }) }); e.observe(this), this.observeSelf = new IntersectionObserver((t, e) => { t.forEach(t => { t.isIntersecting && !this.hasAttribute("multiline") && this.assignedElements.length > 0 && (n.observe(this.assignedElements[0]), i.observe(this.assignedElements[this.assignedElements.length - 1]), e.unobserve(this)) }) }, { threshold: 1 }), this.chipsWrapper.addEventListener("option-clicked", t => { this._value !== t.target.value && (this.setSelectedOption(t.target.value), this.fireEvent()) }); const n = new IntersectionObserver(t => { t.forEach(t => { t.isIntersecting ? (this.navButtonLeft.classList.add("hide"), this.coverLeft.classList.add("hide")) : (this.navButtonLeft.classList.remove("hide"), this.coverLeft.classList.remove("hide")) }) }, { threshold: 1, root: this }), i = new IntersectionObserver(t => { t.forEach(t => { t.isIntersecting ? (this.navButtonRight.classList.add("hide"), this.coverRight.classList.add("hide")) : (this.navButtonRight.classList.remove("hide"), this.coverRight.classList.remove("hide")) }) }, { threshold: 1, root: this }); this.navButtonLeft.addEventListener("click", this.scrollLeft), this.navButtonRight.addEventListener("click", this.scrollRight) } disconnectedCallback() { this.navButtonLeft.removeEventListener("click", this.scrollLeft), this.navButtonRight.removeEventListener("click", this.scrollRight) } }); const smChip = document.createElement("template"); smChip.innerHTML = ' ', customElements.define("sm-chip", class extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(smChip.content.cloneNode(!0)), this._value = void 0, this.radioButton = this.shadowRoot.querySelector("input"), this.fireEvent = this.fireEvent.bind(this), this.handleKeyDown = this.handleKeyDown.bind(this) } get value() { return this._value } fireEvent() { this.dispatchEvent(new CustomEvent("option-clicked", { bubbles: !0, composed: !0, detail: { value: this._value } })) } handleKeyDown(t) { "Enter" !== t.key && "Space" !== t.key || this.fireEvent() } connectedCallback() { this.setAttribute("role", "option"), this.setAttribute("tabindex", "0"), this._value = this.getAttribute("value"), this.addEventListener("click", this.fireEvent), this.addEventListener("keydown", this.handleKeyDown) } disconnectedCallback() { this.removeEventListener("click", this.fireEvent), this.removeEventListener("keydown", this.handleKeyDown) } });
+const smCopy = document.createElement("template"); smCopy.innerHTML = '', customElements.define("sm-copy", class extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(smCopy.content.cloneNode(!0)), this.copyContent = this.shadowRoot.querySelector(".copy-content"), this.copyButton = this.shadowRoot.querySelector(".copy-button"), this.copy = this.copy.bind(this) } static get observedAttributes() { return ["value"] } set value(t) { this.setAttribute("value", t) } get value() { return this.getAttribute("value") } fireEvent() { this.dispatchEvent(new CustomEvent("copy", { composed: !0, bubbles: !0, cancelable: !0 })) } copy() { navigator.clipboard.writeText(this.getAttribute("value")).then(t => this.fireEvent()).catch(t => console.error(t)) } connectedCallback() { this.copyButton.addEventListener("click", this.copy) } attributeChangedCallback(t, n, o) { if ("value" === t) { const t = this.copyContent.querySelector("slot"); if (!t) return; const n = t.assignedNodes(); n && n.length || (t.textContent = o) } } disconnectedCallback() { this.copyButton.removeEventListener("click", this.copy) } });
+const smForm = document.createElement("template"); smForm.innerHTML = ' ', customElements.define("sm-form", class extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(smForm.content.cloneNode(!0)), this.form = this.shadowRoot.querySelector("form"), this.invalidFieldsCount, this.skipSubmit = !1, this.isFormValid = void 0, this.supportedElements = "input, sm-input, sm-textarea, sm-checkbox, tags-input, file-input, sm-switch, sm-radio", this.formElements = [], this._requiredElements = [] } static get observedAttributes() { return ["skip-submit"] } get validity() { return this.isFormValid } debounce = (callback, wait) => { let timeoutId = null; return (...args) => { window.clearTimeout(timeoutId), timeoutId = window.setTimeout((() => { callback.apply(null, args) }), wait) } }; _checkValidity = () => { this.submitButton && 0 !== this._requiredElements.length && (this.invalidFieldsCount = 0, this._requiredElements.forEach((([elem, isWC]) => { (!elem.disabled && isWC && !elem.isValid || !isWC && !elem.checkValidity()) && this.invalidFieldsCount++ })), this.isFormValid !== (0 === this.invalidFieldsCount) && (this.isFormValid = 0 === this.invalidFieldsCount, this.dispatchEvent(new CustomEvent(this.isFormValid ? "valid" : "invalid", { bubbles: !0, composed: !0 })), this.skipSubmit || (this.submitButton.disabled = !this.isFormValid))) }; handleKeydown = e => { if ("Enter" === e.key && e.target.tagName.includes("INPUT")) if (0 === this.invalidFieldsCount) this.submitButton && this.submitButton.click(), this.dispatchEvent(new CustomEvent("submit", { bubbles: !0, composed: !0 })); else for (const [elem, isWC] of this._requiredElements) { if (isWC ? !elem.isValid : !elem.checkValidity()) { (elem?.shadowRoot?.lastElementChild || elem).animate([{ transform: "translateX(-1rem)" }, { transform: "translateX(1rem)" }, { transform: "translateX(-0.5rem)" }, { transform: "translateX(0.5rem)" }, { transform: "translateX(0)" }], { duration: 300, easing: "ease" }), isWC ? (elem.focusIn(), "SM-INPUT" === elem.tagName && "" === elem.value.trim() && elem.showError()) : elem.focus(); break } } }; reset = () => { this.formElements.forEach((([elem, isWC]) => { if (isWC) elem.reset(); else switch (elem.type) { case "checkbox": case "radio": elem.checked = !1; break; default: elem.value = "" } })), this._checkValidity() }; elementsChanged = () => { this.formElements = [...this.querySelectorAll(this.supportedElements)].map((elem => [elem, elem.tagName.includes("-")])), this._requiredElements = this.formElements.filter((([elem]) => elem.hasAttribute("required"))), this.submitButton = this.querySelector('[variant="primary"], [type="submit"]'), this.resetButton = this.querySelector('[type="reset"]'), this.resetButton && this.resetButton.addEventListener("click", this.reset), this._checkValidity() }; checkIfSupported = elem => 1 === elem.nodeType && (elem.tagName.includes("-") || "input" === elem.tagName || elem.querySelector(this.supportedElements)); connectedCallback() { const updateFormDecedents = this.debounce(this.elementsChanged, 100); this.addEventListener("input", this.debounce(this._checkValidity, 100)), this.addEventListener("keydown", this.debounce(this.handleKeydown, 100)), this.shadowRoot.querySelector("slot").addEventListener("slotchange", updateFormDecedents), this.mutationObserver = new MutationObserver((mutations => { mutations.forEach((mutation => { ("childList" === mutation.type && [...mutation.addedNodes].some((node => this.checkIfSupported(node))) || [...mutation.removedNodes].some((node => this.checkIfSupported(node)))) && updateFormDecedents() })) })), this.mutationObserver.observe(this, { childList: !0, subtree: !0 }) } attributeChangedCallback(name, oldValue, newValue) { "skip-submit" === name && (this.skipSubmit = this.hasAttribute("skip-submit")) } disconnectedCallback() { this.removeEventListener("input", this.debounce(this._checkValidity, 100)), this.removeEventListener("keydown", this.debounce(this.handleKeydown, 100)), this.mutationObserver.disconnect() } });
+const smInput = document.createElement("template"); smInput.innerHTML = ' ', customElements.define("sm-input", class SmInput extends HTMLElement { static hasAppendedStyles = !1; #validationState = { validatedFor: void 0, isValid: !1, errorMessage: "Please fill out this field." }; constructor() { super(), this.attachShadow({ mode: "open" }).append(smInput.content.cloneNode(!0)), this.inputParent = this.shadowRoot.querySelector(".input"), this.input = this.shadowRoot.querySelector("input"), this.clearBtn = this.shadowRoot.querySelector(".clear"), this.placeholderElement = this.shadowRoot.querySelector(".placeholder"), this.outerContainer = this.shadowRoot.querySelector(".outer-container"), this.optionList = this.shadowRoot.querySelector(".datalist"), this._helperText = "", this.isRequired = !1, this.datalist = [], this.validationFunction = void 0, this.reflectedAttributes = ["value", "required", "disabled", "type", "inputmode", "readonly", "min", "max", "pattern", "minlength", "maxlength", "step", "list", "autocomplete"] } static get observedAttributes() { return ["value", "placeholder", "required", "disabled", "type", "inputmode", "readonly", "min", "max", "pattern", "minlength", "maxlength", "step", "helper-text", "error-text", "list"] } get value() { return this.input.value } set value(val) { val !== this.input.value && (this.input.value = val, this._value = val, this.checkInput()) } get placeholder() { return this.getAttribute("placeholder") } set placeholder(val) { this.setAttribute("placeholder", val) } get type() { return this.getAttribute("type") } set type(val) { this.setAttribute("type", val) } get validity() { return this.input.validity } get disabled() { return this.hasAttribute("disabled") } set disabled(value) { value ? (this.inputParent.classList.add("disabled"), this.setAttribute("disabled", "")) : (this.inputParent.classList.remove("disabled"), this.removeAttribute("disabled")) } get readOnly() { return this.hasAttribute("readonly") } set readOnly(value) { value ? this.setAttribute("readonly", "") : this.removeAttribute("readonly") } set customValidation(val) { val && (this.validationFunction = val) } set errorText(val) { this.#validationState.errorText = val } showError = (errorText = this.#validationState.errorText) => { const appendedNew = this.appendFeedbackElement(); this.feedbackPopover.innerHTML = ` ${errorText} `, this.feedbackPopover.dataset.state = "error", appendedNew && this.feedbackPopover.animate([{ transform: "scale(0.95)", opacity: 0 }, { transform: "scale(1)", opacity: 1 }], { duration: 200, easing: "ease", fill: "forwards" }) }; set helperText(val) { this._helperText = val } get isValid() { if (this.#validationState.validatedFor === this.input.value) return this.#validationState.isValid; const _isValid = this.input.checkValidity(); let _validity = { isValid: !0, errorText: "" }; return this.validationFunction && (_validity = this.validationFunction(this.input.value)), _isValid && _validity.isValid ? (this.setAttribute("valid", ""), this.removeAttribute("invalid"), this.hideFeedback()) : (this.removeAttribute("valid"), this.setAttribute("invalid", ""), "" !== this.value.trim() && (_validity.errorText || this.#validationState.errorText) && this.showError(_validity.errorText || this.#validationState.errorText)), this.#validationState.validatedFor = this.input.value, this.#validationState.isValid = _isValid && _validity.isValid, this.#validationState.errorText = _validity.errorText || this.#validationState.errorText, this.#validationState.isValid } reset = () => { this.value = "" }; clear = () => { this.value = "", this.input.focus(), this.fireEvent() }; focusIn = () => { this.input.focus() }; focusOut = () => { this.input.blur() }; fireEvent = () => { let event = new Event("input", { bubbles: !0, cancelable: !0, composed: !0 }); this.dispatchEvent(event) }; searchDatalist = searchKey => { const filteredData = this.datalist.filter((item => item.toLowerCase().includes(searchKey.toLowerCase()))); if (filteredData.sort(((a, b) => a.toLowerCase().indexOf(searchKey.toLowerCase()) - b.toLowerCase().indexOf(searchKey.toLowerCase()))), filteredData.length) { if (this.optionList.children.length > filteredData.length) { const optionsToRemove = this.optionList.children.length - filteredData.length; for (let i = 0; i < optionsToRemove; i++)this.optionList.removeChild(this.optionList.lastChild) } filteredData.forEach(((item, index) => { if (this.optionList.children[index]) this.optionList.children[index].textContent = item; else { const option = document.createElement("li"); option.textContent = item, option.classList.add("datalist-item"), option.setAttribute("tabindex", "0"), this.optionList.appendChild(option) } })), this.optionList.classList.remove("hidden") } else this.optionList.classList.add("hidden") }; checkInput = e => { this.hasAttribute("readonly") || ("" !== this.input.value ? this.clearBtn.classList.remove("hidden") : this.clearBtn.classList.add("hidden")), this.hasAttribute("placeholder") && "" !== this.getAttribute("placeholder").trim() && ("" !== this.input.value ? (this.shouldAnimatePlaceholder && this.inputParent.classList.add("animate-placeholder"), this.placeholderElement.classList.toggle("hidden", !this.shouldAnimatePlaceholder), this.datalist.length && (this.searchTimeout && clearTimeout(this.searchTimeout), this.searchTimeout = setTimeout((() => { this.searchDatalist(this.input.value.trim()) }), 100))) : (this.shouldAnimatePlaceholder && this.inputParent.classList.remove("animate-placeholder"), this.placeholderElement.classList.remove("hidden"), this.hideFeedback(), this.datalist.length && (this.optionList.innerHTML = "", this.optionList.classList.add("hidden")))) }; allowOnlyNum = e => { e.ctrlKey || 1 === e.key.length && (("." !== e.key || !e.target.value.includes(".") && 0 !== e.target.value.length) && ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."].includes(e.key) || e.preventDefault()) }; handleOptionClick = e => { this.input.value = e.target.textContent, this.optionList.classList.add("hidden"), this.input.focus() }; handleInputNavigation = e => { "ArrowDown" === e.key ? (e.preventDefault(), this.optionList.children.length && this.optionList.children[0].focus()) : "ArrowUp" === e.key && (e.preventDefault(), this.optionList.children.length && this.optionList.children[this.optionList.children.length - 1].focus()) }; handleDatalistNavigation = e => { "ArrowUp" === e.key ? (e.preventDefault(), this.shadowRoot.activeElement.previousElementSibling ? this.shadowRoot.activeElement.previousElementSibling.focus() : this.input.focus()) : "ArrowDown" === e.key ? (e.preventDefault(), this.shadowRoot.activeElement.nextElementSibling ? this.shadowRoot.activeElement.nextElementSibling.focus() : this.input.focus()) : "Enter" !== e.key && " " !== e.key || (e.preventDefault(), this.input.value = e.target.textContent, this.optionList.classList.add("hidden"), this.input.focus()) }; handleFocus = e => { this.datalist.length && this.searchDatalist(this.input.value.trim()) }; handleBlur = e => { this.datalist.length && this.optionList.classList.add("hidden") }; applyGlobalCustomValidation = () => { if (void 0 !== window.smCompConfig && window.smCompConfig["sm-input"]) { const config = window.smCompConfig["sm-input"].find((config => this.matches(config.selector))); this.customValidation = config?.customValidation } }; updatePosition = () => { requestAnimationFrame((() => { if (this.dimensions = this.getBoundingClientRect(), this.scrollingParentDimensions = this.scrollingParent.getBoundingClientRect(), 0 === this.dimensions.width || 0 === this.dimensions.height) return; let topOffset = this.dimensions.top - this.scrollingParentDimensions.top + this.dimensions.height, leftOffset = this.dimensions.left - this.scrollingParentDimensions.left; const maxWidth = this.dimensions.width; this.feedbackPopover.style = `top: ${topOffset}px; left: ${leftOffset}px; max-width: ${maxWidth}px;` })) }; appendFeedbackElement = () => { if (this.feedbackPopover) return !1; this.feedbackPopover = document.createElement("div"), this.feedbackPopover.className = "feedback-popover", this.feedbackPopover.setAttribute("aria-live", "polite"), this.containment = this.closest("[data-sm-containment]"), this.scrollingParent = this.getNearestScrollingParent(this); return (this.containment || this.scrollingParent).appendChild(this.feedbackPopover), "" === this.scrollingParent.style.position && (this.scrollingParent.style.position = "relative"), this.containment || (this.observerHidFeedback = !1, this.intersectionObserver = new IntersectionObserver((entries => { if (this.feedbackPopover) if (entries[0].isIntersecting) { if (!this.observerHidFeedback) return; this.feedbackPopover.classList.remove("hidden"), this.observerHidFeedback = !1 } else this.feedbackPopover.classList.add("hidden"), this.observerHidFeedback = !0 })).observe(this)), this.updatePosition(), window.addEventListener("resize", this.updatePosition, { passive: !0 }), !0 }; getNearestScrollingParent = element => { let parent = element.parentNode; for (; parent;) { if (parent.scrollHeight > parent.clientHeight || parent.scrollWidth > parent.clientWidth || parent.tagName.includes("SM-") || parent.hasAttribute("data-scrollable")) return parent; parent = parent.parentNode } return document.body }; hideFeedback = () => { this.feedbackPopover && (this.feedbackPopover.animate([{ transform: "none", opacity: 1 }, { transform: "scale(0.95)", opacity: 0 }], { duration: 100, easing: "ease-in-out", fill: "forwards" }).onfinish = () => { this.intersectionObserver?.disconnect(), this.feedbackPopover.remove(), this.feedbackPopover = null, window.removeEventListener("resize", this.updatePosition, { passive: !0 }) }) }; connectedCallback() { SmInput.hasAppendedStyles || (document.head.insertAdjacentHTML("beforeend", ""), SmInput.hasAppendedStyles = !0), this.shouldAnimatePlaceholder = this.hasAttribute("animate"), this.shouldAnimatePlaceholder && "" !== this.placeholderElement && this.value && (this.inputParent.classList.add("animate-placeholder"), this.placeholderElement.classList.remove("hidden")), this.setAttribute("role", "textbox"), "loading" === document.readyState ? window.addEventListener("load", this.applyGlobalCustomValidation, { once: !0 }) : this.applyGlobalCustomValidation(), this.input.addEventListener("input", this.checkInput), this.clearBtn.addEventListener("click", this.clear), this.datalist.length && (this.optionList.addEventListener("click", this.handleOptionClick), this.input.addEventListener("keydown", this.handleInputNavigation), this.optionList.addEventListener("keydown", this.handleDatalistNavigation)), this.input.addEventListener("focusin", this.handleFocus), this.addEventListener("focusout", this.handleBlur) } attributeChangedCallback(name, oldValue, newValue) { if (oldValue !== newValue) switch (this.reflectedAttributes.includes(name) && (this.hasAttribute(name) ? this.input.setAttribute(name, this.getAttribute(name) ? this.getAttribute(name) : "") : this.input.removeAttribute(name)), name) { case "placeholder": this.placeholderElement.textContent = newValue, this.setAttribute("aria-label", newValue); break; case "value": this.checkInput(); break; case "type": this.hasAttribute("type") && "number" === this.getAttribute("type") ? (this.input.setAttribute("inputmode", "decimal"), this.input.addEventListener("keydown", this.allowOnlyNum)) : this.input.removeEventListener("keydown", this.allowOnlyNum); break; case "helper-text": this._helperText = newValue; break; case "error-text": this.#validationState.errorText = newValue; break; case "required": this.isRequired = this.hasAttribute("required"), this.isRequired ? this.setAttribute("aria-required", "true") : this.setAttribute("aria-required", "false"); break; case "readonly": this.hasAttribute("readonly") ? this.inputParent.classList.add("readonly") : this.inputParent.classList.remove("readonly"); break; case "disabled": this.hasAttribute("disabled") ? this.inputParent.classList.add("disabled") : this.inputParent.classList.remove("disabled"); break; case "list": this.hasAttribute("list") && "" !== this.getAttribute("list").trim() && (this.datalist = this.getAttribute("list").split(",")) } } disconnectedCallback() { this.input.removeEventListener("input", this.checkInput), this.clearBtn.removeEventListener("click", this.clear), this.input.removeEventListener("keydown", this.allowOnlyNum), this.optionList.removeEventListener("click", this.handleOptionClick), this.input.removeEventListener("keydown", this.handleInputNavigation), this.optionList.removeEventListener("keydown", this.handleDatalistNavigation), this.input.removeEventListener("focusin", this.handleFocus), this.removeEventListener("focusout", this.handleBlur), window.removeEventListener("resize", this.updatePosition, { passive: !0 }), this.feedbackPopover && this.feedbackPopover.remove(), this.intersectionObserver && this.intersectionObserver.disconnect() } });
+const smNotifications = document.createElement("template"); smNotifications.innerHTML = " ", customElements.define("sm-notifications", class extends HTMLElement { constructor() { super(), this.shadow = this.attachShadow({ mode: "open" }).append(smNotifications.content.cloneNode(!0)), this.notificationPanel = this.shadowRoot.querySelector(".notification-panel"), this.animationOptions = { duration: 300, fill: "forwards", easing: "cubic-bezier(0.175, 0.885, 0.32, 1.275)" }, this.push = this.push.bind(this), this.createNotification = this.createNotification.bind(this), this.removeNotification = this.removeNotification.bind(this), this.clearAll = this.clearAll.bind(this), this.remove = this.remove.bind(this), this.handleTouchMove = this.handleTouchMove.bind(this), this.startX = 0, this.currentX = 0, this.endX = 0, this.swipeDistance = 0, this.swipeDirection = "", this.swipeThreshold = 0, this.startTime = 0, this.swipeTime = 0, this.swipeTimeThreshold = 200, this.currentTarget = null, this.notificationTimeout = 5e3, this.mediaQuery = window.matchMedia("(min-width: 640px)"), this.handleOrientationChange = this.handleOrientationChange.bind(this), this.isBigViewport = !1 } set timeout(value) { isNaN(value) || (this.notificationTimeout = value) } randString(length) { let result = ""; const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; for (let i = 0; i < length; i++)result += characters.charAt(Math.floor(52 * Math.random())); return result } createNotification(message, options = {}) { const { pinned: pinned = !1, icon: icon, action: action, timeout: timeout = this.notificationTimeout } = options, notification = document.createElement("div"); return notification.id = this.randString(8), notification.className = "notification " + (pinned ? "pinned" : ""), notification.style.setProperty("--timeout", `${timeout}ms`), notification.innerHTML = ` ${icon ? `${icon}
` : ""} ${action ? `` : ""} `, action && notification.querySelector(".action").addEventListener("click", action.callback), notification.querySelector(".close").addEventListener("click", (() => { this.removeNotification(notification) })), pinned || setTimeout((() => { this.removeNotification(notification, this.isBigViewport ? "left" : "top") }), timeout), notification } push(message, options = {}) { const notification = this.createNotification(message, options); return this.isBigViewport ? this.notificationPanel.append(notification) : this.notificationPanel.prepend(notification), notification.scrollIntoView({ behavior: "smooth" }), this.notificationPanel.animate([{ transform: `translateY(${this.isBigViewport ? "" : "-"}${notification.clientHeight}px)` }, { transform: "none" }], this.animationOptions), notification.animate([{ transform: "translateY(-1rem)", opacity: "0" }, { transform: "none", opacity: "1" }], this.animationOptions).onfinish = e => { e.target.commitStyles(), e.target.cancel() }, notification.id } removeNotification(notification, direction = "left") { if (!notification) return; const sign = "left" === direction || "top" === direction ? "-" : "+"; this.isBigViewport || "top" !== direction ? notification.animate([{ transform: this.currentX ? `translateX(${this.currentX}px)` : "none", opacity: "1" }, { transform: `translateX(calc(${sign}${Math.abs(this.currentX)}px ${sign} 1rem))`, opacity: "0" }], this.animationOptions).onfinish = () => { notification.remove() } : notification.animate([{ transform: this.currentX ? `translateY(${this.currentX}px)` : "none", opacity: "1" }, { transform: `translateY(calc(${sign}${Math.abs(this.currentX)}px ${sign} 1rem))`, opacity: "0" }], this.animationOptions).onfinish = () => { notification.remove() } } remove(id) { const notification = this.notificationPanel.querySelector(`#${id}`); notification && this.removeNotification(notification) } clearAll() { Array.from(this.notificationPanel.children).forEach((child => { this.removeNotification(child) })) } handleTouchMove(e) { this.currentX = e.touches[0].clientX - this.startX, this.currentTarget.style.transform = `translateX(${this.currentX}px)` } handleOrientationChange(e) { this.isBigViewport = e.matches, e.matches } connectedCallback() { this.handleOrientationChange(this.mediaQuery), this.mediaQuery.addEventListener("change", this.handleOrientationChange), this.notificationPanel.addEventListener("touchstart", (e => { e.target.closest(".close") ? this.removeNotification(e.target.closest(".notification")) : e.target.closest(".notification") && (this.swipeThreshold = e.target.closest(".notification").getBoundingClientRect().width / 2, this.currentTarget = e.target.closest(".notification"), this.startTime = Date.now(), this.startX = e.touches[0].clientX, this.startY = e.touches[0].clientY, this.notificationPanel.addEventListener("touchmove", this.handleTouchMove, { passive: !0 })) }), { passive: !0 }), this.notificationPanel.addEventListener("touchend", (e => { this.endX = e.changedTouches[0].clientX, this.endY = e.changedTouches[0].clientY, this.swipeDistance = Math.abs(this.endX - this.startX), this.swipeTime = Date.now() - this.startTime, this.endX > this.startX ? this.swipeDirection = "right" : this.swipeDirection = "left", this.swipeTime < this.swipeTimeThreshold ? this.swipeDistance > 50 && this.removeNotification(this.currentTarget, this.swipeDirection) : this.swipeDistance > this.swipeThreshold ? this.removeNotification(this.currentTarget, this.swipeDirection) : this.currentTarget.animate([{ transform: `translateX(${this.currentX}px)` }, { transform: "none" }], this.animationOptions).onfinish = e => { e.target.commitStyles(), e.target.cancel() }, this.notificationPanel.removeEventListener("touchmove", this.handleTouchMove), this.currentX = 0 })) } disconnectedCallback() { mediaQueryList.removeEventListener("change", handleOrientationChange) } });
+class Stack { constructor() { this.items = [] } push(element) { this.items.push(element) } pop() { return 0 == this.items.length ? "Underflow" : this.items.pop() } peek() { return this.items[this.items.length - 1] } } const popupStack = new Stack, smPopup = document.createElement("template"); smPopup.innerHTML = '', customElements.define("sm-popup", class extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(smPopup.content.cloneNode(!0)), this.allowClosing = !1, this.isOpen = !1, this.offset = 0, this.touchStartY = 0, this.touchEndY = 0, this.touchStartTime = 0, this.touchEndTime = 0, this.touchEndAnimation = void 0, this.focusable, this.autoFocus, this.mutationObserver, this.popupContainer = this.shadowRoot.querySelector(".popup-container"), this.backdrop = this.shadowRoot.querySelector(".backdrop"), this.dialogBox = this.shadowRoot.querySelector(".popup"), this.popupBodySlot = this.shadowRoot.querySelector(".popup-body slot"), this.popupHeader = this.shadowRoot.querySelector(".popup-top") } static get observedAttributes() { return ["open"] } get open() { return this.isOpen } animateTo = (element, keyframes, options) => { const anime = element.animate(keyframes, { ...options, fill: "both" }); return anime.finished.then((() => { anime.commitStyles(), anime.cancel() })), anime }; resumeScrolling = () => { const scrollY = document.body.style.top; window.scrollTo(0, -1 * parseInt(scrollY || "0")), document.body.style.overflow = "", document.body.style.top = "initial" }; setStateOpen = () => { if (!this.isOpen || this.offset) { const animOptions = { duration: 300, easing: "ease" }, initialAnimation = window.innerWidth > 640 ? "scale(1.1)" : `translateY(${this.offset ? `${this.offset}px` : "100%"})`; this.animateTo(this.dialogBox, [{ opacity: this.offset ? 1 : 0, transform: initialAnimation }, { opacity: 1, transform: "none" }], animOptions) } }; show = (options = {}) => { const { pinned: pinned = !1, payload: payload } = options; if (this.isOpen) return; const animOptions = { duration: 300, easing: "ease" }; return this.payload = payload, popupStack.push({ popup: this, permission: pinned }), popupStack.items.length > 1 && this.animateTo(popupStack.items[popupStack.items.length - 2].popup.shadowRoot.querySelector(".popup"), [{ transform: "none" }, { transform: window.innerWidth > 640 ? "scale(0.95)" : "translateY(-1.5rem)" }], animOptions), this.popupContainer.classList.remove("hide"), this.offset || (this.backdrop.animate([{ opacity: 0 }, { opacity: 1 }], animOptions).onfinish = () => { this.resolveOpen(this.payload) }, this.dispatchEvent(new CustomEvent("popupopened", { bubbles: !0, composed: !0, detail: { payload: this.payload } })), document.body.style.overflow = "hidden", document.body.style.top = `-${window.scrollY}px`), this.setStateOpen(), this.pinned = pinned, this.isOpen = !0, setTimeout((() => { const elementToFocus = this.autoFocus || this.focusable?.[0] || this.dialogBox; elementToFocus && (elementToFocus.tagName.includes("-") ? elementToFocus.focusIn() : elementToFocus.focus()) }), 0), this.hasAttribute("open") || (this.setAttribute("open", ""), this.addEventListener("keydown", this.detectFocus), this.resizeObserver.observe(this), this.mutationObserver.observe(this, { attributes: !0, childList: !0, subtree: !0 }), this.popupHeader.addEventListener("touchstart", this.handleTouchStart, { passive: !0 }), this.backdrop.addEventListener("mousedown", this.handleSoftDismiss)), { opened: new Promise((resolve => { this.resolveOpen = resolve })), closed: new Promise((resolve => { this.resolveClose = resolve })) } }; hide = (options = {}) => { const { payload: payload } = options, animOptions = { duration: 150, easing: "ease" }; this.backdrop.animate([{ opacity: 1 }, { opacity: 0 }], animOptions), this.animateTo(this.dialogBox, [{ opacity: 1, transform: window.innerWidth > 640 ? "none" : `translateY(${this.offset ? `${this.offset}px` : "0"})` }, { opacity: 0, transform: window.innerWidth > 640 ? "scale(1.1)" : "translateY(100%)" }], animOptions).finished.finally((() => { this.popupContainer.classList.add("hide"), this.dialogBox.style = "", this.removeAttribute("open"), this.forms.length && this.forms.forEach((form => form.reset())), this.dispatchEvent(new CustomEvent("popupclosed", { bubbles: !0, composed: !0, detail: { payload: payload || this.payload } })), this.resolveClose(payload || this.payload), this.isOpen = !1 })), popupStack.pop(), popupStack.items.length ? this.animateTo(popupStack.items[popupStack.items.length - 1].popup.shadowRoot.querySelector(".popup"), [{ transform: window.innerWidth > 640 ? "scale(0.95)" : "translateY(-1.5rem)" }, { transform: "none" }], animOptions) : this.resumeScrolling(), this.resizeObserver.disconnect(), this.mutationObserver.disconnect(), this.removeEventListener("keydown", this.detectFocus), this.popupHeader.removeEventListener("touchstart", this.handleTouchStart, { passive: !0 }), this.backdrop.removeEventListener("mousedown", this.handleSoftDismiss) }; handleTouchStart = e => { this.offset = 0, this.popupHeader.addEventListener("touchmove", this.handleTouchMove, { passive: !0 }), this.popupHeader.addEventListener("touchend", this.handleTouchEnd, { passive: !0 }), this.touchStartY = e.changedTouches[0].clientY, this.touchStartTime = e.timeStamp }; handleTouchMove = e => { this.touchStartY < e.changedTouches[0].clientY && (this.offset = e.changedTouches[0].clientY - this.touchStartY, this.touchEndAnimation = window.requestAnimationFrame((() => { this.dialogBox.style.transform = `translateY(${this.offset}px)` }))) }; handleTouchEnd = e => { if (this.touchEndTime = e.timeStamp, cancelAnimationFrame(this.touchEndAnimation), this.touchEndY = e.changedTouches[0].clientY, this.threshold = .3 * this.dialogBox.getBoundingClientRect().height, this.touchEndTime - this.touchStartTime > 200) if (this.touchEndY - this.touchStartY > this.threshold) { if (this.pinned) return void this.setStateOpen(); this.hide() } else this.setStateOpen(); else if (this.touchEndY > this.touchStartY) { if (this.pinned) return void this.setStateOpen(); this.hide() } this.popupHeader.removeEventListener("touchmove", this.handleTouchMove, { passive: !0 }), this.popupHeader.removeEventListener("touchend", this.handleTouchEnd, { passive: !0 }) }; detectFocus = e => { if ("Tab" === e.key) { if (!this.focusable.length) return; if (!this.firstFocusable) for (let i = 0; i < this.focusable.length; i++)if (!this.focusable[i].disabled) { this.firstFocusable = this.focusable[i]; break } if (!this.lastFocusable) for (let i = this.focusable.length - 1; i >= 0; i--)if (!this.focusable[i].disabled) { this.lastFocusable = this.focusable[i]; break } e.shiftKey && document.activeElement === this.firstFocusable ? (e.preventDefault(), this.lastFocusable.tagName.includes("SM-") ? this.lastFocusable.focusIn() : this.lastFocusable.focus()) : e.shiftKey || document.activeElement !== this.lastFocusable || (e.preventDefault(), this.firstFocusable.tagName.includes("SM-") ? this.firstFocusable.focusIn() : this.firstFocusable.focus()) } }; updateFocusableList = () => { this.focusable = this.querySelectorAll('sm-button:not([disabled]), button:not([disabled]), [href], sm-input, input:not([readonly]), sm-select, select, sm-checkbox, sm-textarea, textarea, [tabindex]:not([tabindex="-1"])'), this.autoFocus = this.querySelector("[autofocus]"), this.firstFocusable = null, this.lastFocusable = null }; handleSoftDismiss = () => { this.pinned ? this.dialogBox.animate([{ transform: "translateX(-1rem)" }, { transform: "translateX(1rem)" }, { transform: "translateX(-0.5rem)" }, { transform: "translateX(0.5rem)" }, { transform: "translateX(0)" }], { duration: 300, easing: "ease" }) : this.hide() }; debounce = (callback, wait) => { let timeoutId = null; return (...args) => { window.clearTimeout(timeoutId), timeoutId = window.setTimeout((() => { callback.apply(null, args) }), wait) } }; connectedCallback() { this.popupBodySlot.addEventListener("slotchange", this.debounce((() => { this.forms = this.querySelectorAll("sm-form"), this.updateFocusableList() }), 0)), this.resizeObserver = new ResizeObserver((entries => { entries.forEach((entry => { if (entry.contentBoxSize) { const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize; this.threshold = .3 * contentBoxSize.blockSize.height } else this.threshold = .3 * entry.contentRect.height })) })), this.mutationObserver = new MutationObserver((entries => { this.updateFocusableList() })) } disconnectedCallback() { this.resizeObserver.disconnect(), this.mutationObserver.disconnect(), this.removeEventListener("keydown", this.detectFocus), this.popupHeader.removeEventListener("touchstart", this.handleTouchStart, { passive: !0 }), this.backdrop.removeEventListener("mousedown", this.handleSoftDismiss) } attributeChangedCallback(name) { "open" === name && this.hasAttribute("open") && this.show() } });
+const spinner = document.createElement("template"); spinner.innerHTML = ''; class SpinnerLoader extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(spinner.content.cloneNode(!0)) } } window.customElements.define("sm-spinner", SpinnerLoader);
+const themeToggle = document.createElement("template"); themeToggle.innerHTML = ' '; class ThemeToggle extends HTMLElement { constructor() { super(), this.attachShadow({ mode: "open" }).append(themeToggle.content.cloneNode(!0)), this.isChecked = !1, this.hasTheme = "light", this.toggleState = this.toggleState.bind(this), this.fireEvent = this.fireEvent.bind(this), this.handleThemeChange = this.handleThemeChange.bind(this) } static get observedAttributes() { return ["checked"] } daylight() { this.hasTheme = "light", document.body.dataset.theme = "light", this.setAttribute("aria-checked", "false") } nightlight() { this.hasTheme = "dark", document.body.dataset.theme = "dark", this.setAttribute("aria-checked", "true") } toggleState() { if (!document.startViewTransition) return this.toggleAttribute("checked"), void this.fireEvent(); document.startViewTransition(() => { this.toggleAttribute("checked"), this.fireEvent() }) } handleKeyDown(e) { " " === e.key && this.toggleState() } handleThemeChange(e) { e.detail.theme !== this.hasTheme && ("dark" === e.detail.theme ? this.setAttribute("checked", "") : this.removeAttribute("checked")) } fireEvent() { this.dispatchEvent(new CustomEvent("themechange", { bubbles: !0, composed: !0, detail: { theme: this.hasTheme } })) } connectedCallback() { this.setAttribute("role", "switch"), this.setAttribute("aria-label", "theme toggle"), "dark" === localStorage.getItem(`${window.location.hostname}-theme`) ? (this.nightlight(), this.setAttribute("checked", "")) : "light" === localStorage.getItem(`${window.location.hostname}-theme`) ? (this.daylight(), this.removeAttribute("checked")) : window.matchMedia("(prefers-color-scheme: dark)").matches ? (this.nightlight(), this.setAttribute("checked", "")) : (this.daylight(), this.removeAttribute("checked")), this.addEventListener("click", this.toggleState), this.addEventListener("keydown", this.handleKeyDown), document.addEventListener("themechange", this.handleThemeChange) } disconnectedCallback() { this.removeEventListener("click", this.toggleState), this.removeEventListener("keydown", this.handleKeyDown), document.removeEventListener("themechange", this.handleThemeChange) } attributeChangedCallback(e, t, n) { "checked" === e && (this.hasAttribute("checked") ? (this.nightlight(), localStorage.setItem(`${window.location.hostname}-theme`, "dark")) : (this.daylight(), localStorage.setItem(`${window.location.hostname}-theme`, "light"))) } } window.customElements.define("theme-toggle", ThemeToggle);
\ No newline at end of file
diff --git a/scripts/components.min.js b/scripts/components.min.js
new file mode 100644
index 0000000..44ac4a2
--- /dev/null
+++ b/scripts/components.min.js
@@ -0,0 +1 @@
+const smChips=document.createElement("template");smChips.innerHTML='',customElements.define("sm-chips",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(smChips.content.cloneNode(!0)),this.chipsWrapper=this.shadowRoot.querySelector(".sm-chips"),this.coverLeft=this.shadowRoot.querySelector(".cover--left"),this.coverRight=this.shadowRoot.querySelector(".cover--right"),this.navButtonLeft=this.shadowRoot.querySelector(".nav-button--left"),this.navButtonRight=this.shadowRoot.querySelector(".nav-button--right"),this.slottedOptions=void 0,this._value=void 0,this.scrollDistance=0,this.assignedElements=[],this.scrollLeft=this.scrollLeft.bind(this),this.scrollRight=this.scrollRight.bind(this),this.fireEvent=this.fireEvent.bind(this),this.setSelectedOption=this.setSelectedOption.bind(this)}get value(){return this._value}set value(t){this.setSelectedOption(t)}scrollLeft(){this.chipsWrapper.scrollBy({left:-this.scrollDistance,behavior:"smooth"})}scrollRight(){this.chipsWrapper.scrollBy({left:this.scrollDistance,behavior:"smooth"})}setSelectedOption(t){this._value!==t&&(this._value=t,this.assignedElements.forEach((e=>{e.value==t?(e.setAttribute("selected",""),e.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})):e.removeAttribute("selected")})))}fireEvent(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{value:this._value}}))}connectedCallback(){this.setAttribute("role","listbox");const t=this.shadowRoot.querySelector("slot");t.addEventListener("slotchange",(e=>{n.disconnect(),i.disconnect(),this.observeSelf.disconnect(),clearTimeout(this.slotChangeTimeout),this.slotChangeTimeout=setTimeout((()=>{this.assignedElements=t.assignedElements(),this.assignedElements.forEach((t=>{t.hasAttribute("selected")&&(this._value=t.value)})),this.observeSelf.observe(this)}),0)}));const e=new ResizeObserver((t=>{t.forEach((t=>{if(t.contentBoxSize){const e=Array.isArray(t.contentBoxSize)?t.contentBoxSize[0]:t.contentBoxSize;this.scrollDistance=.6*e.inlineSize}else this.scrollDistance=.6*t.contentRect.width}))}));e.observe(this),this.observeSelf=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.isIntersecting&&!this.hasAttribute("multiline")&&this.assignedElements.length>0&&(n.observe(this.assignedElements[0]),i.observe(this.assignedElements[this.assignedElements.length-1]),e.unobserve(this))}))}),{threshold:1}),this.chipsWrapper.addEventListener("option-clicked",(t=>{this._value!==t.target.value&&(this.setSelectedOption(t.target.value),this.fireEvent())}));const n=new IntersectionObserver((t=>{t.forEach((t=>{t.isIntersecting?(this.navButtonLeft.classList.add("hide"),this.coverLeft.classList.add("hide")):(this.navButtonLeft.classList.remove("hide"),this.coverLeft.classList.remove("hide"))}))}),{threshold:1,root:this}),i=new IntersectionObserver((t=>{t.forEach((t=>{t.isIntersecting?(this.navButtonRight.classList.add("hide"),this.coverRight.classList.add("hide")):(this.navButtonRight.classList.remove("hide"),this.coverRight.classList.remove("hide"))}))}),{threshold:1,root:this});this.navButtonLeft.addEventListener("click",this.scrollLeft),this.navButtonRight.addEventListener("click",this.scrollRight)}disconnectedCallback(){this.navButtonLeft.removeEventListener("click",this.scrollLeft),this.navButtonRight.removeEventListener("click",this.scrollRight)}});const smChip=document.createElement("template");smChip.innerHTML=' ',customElements.define("sm-chip",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(smChip.content.cloneNode(!0)),this._value=void 0,this.radioButton=this.shadowRoot.querySelector("input"),this.fireEvent=this.fireEvent.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}get value(){return this._value}fireEvent(){this.dispatchEvent(new CustomEvent("option-clicked",{bubbles:!0,composed:!0,detail:{value:this._value}}))}handleKeyDown(t){"Enter"!==t.key&&"Space"!==t.key||this.fireEvent()}connectedCallback(){this.setAttribute("role","option"),this.setAttribute("tabindex","0"),this._value=this.getAttribute("value"),this.addEventListener("click",this.fireEvent),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("click",this.fireEvent),this.removeEventListener("keydown",this.handleKeyDown)}});const smCopy=document.createElement("template");smCopy.innerHTML='',customElements.define("sm-copy",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(smCopy.content.cloneNode(!0)),this.copyContent=this.shadowRoot.querySelector(".copy-content"),this.copyButton=this.shadowRoot.querySelector(".copy-button"),this.copy=this.copy.bind(this)}static get observedAttributes(){return["value"]}set value(t){this.setAttribute("value",t)}get value(){return this.getAttribute("value")}fireEvent(){this.dispatchEvent(new CustomEvent("copy",{composed:!0,bubbles:!0,cancelable:!0}))}copy(){navigator.clipboard.writeText(this.getAttribute("value")).then((t=>this.fireEvent())).catch((t=>console.error(t)))}connectedCallback(){this.copyButton.addEventListener("click",this.copy)}attributeChangedCallback(t,n,o){if("value"===t){const t=this.copyContent.querySelector("slot");if(!t)return;const n=t.assignedNodes();n&&n.length||(t.textContent=o)}}disconnectedCallback(){this.copyButton.removeEventListener("click",this.copy)}});const smForm=document.createElement("template");smForm.innerHTML=' ',customElements.define("sm-form",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(smForm.content.cloneNode(!0)),this.form=this.shadowRoot.querySelector("form"),this.invalidFieldsCount,this.skipSubmit=!1,this.isFormValid=void 0,this.supportedElements="input, sm-input, sm-textarea, sm-checkbox, tags-input, file-input, sm-switch, sm-radio",this.formElements=[],this._requiredElements=[]}static get observedAttributes(){return["skip-submit"]}get validity(){return this.isFormValid}debounce=(callback,wait)=>{let timeoutId=null;return(...args)=>{window.clearTimeout(timeoutId),timeoutId=window.setTimeout((()=>{callback.apply(null,args)}),wait)}};_checkValidity=()=>{this.submitButton&&0!==this._requiredElements.length&&(this.invalidFieldsCount=0,this._requiredElements.forEach((([elem,isWC])=>{(!elem.disabled&&isWC&&!elem.isValid||!isWC&&!elem.checkValidity())&&this.invalidFieldsCount++})),this.isFormValid!==(0===this.invalidFieldsCount)&&(this.isFormValid=0===this.invalidFieldsCount,this.dispatchEvent(new CustomEvent(this.isFormValid?"valid":"invalid",{bubbles:!0,composed:!0})),this.skipSubmit||(this.submitButton.disabled=!this.isFormValid)))};handleKeydown=e=>{if("Enter"===e.key&&e.target.tagName.includes("INPUT"))if(0===this.invalidFieldsCount)this.submitButton&&this.submitButton.click(),this.dispatchEvent(new CustomEvent("submit",{bubbles:!0,composed:!0}));else for(const[elem,isWC]of this._requiredElements)if(isWC?!elem.isValid:!elem.checkValidity()){(elem?.shadowRoot?.lastElementChild||elem).animate([{transform:"translateX(-1rem)"},{transform:"translateX(1rem)"},{transform:"translateX(-0.5rem)"},{transform:"translateX(0.5rem)"},{transform:"translateX(0)"}],{duration:300,easing:"ease"}),isWC?(elem.focusIn(),"SM-INPUT"===elem.tagName&&""===elem.value.trim()&&elem.showError()):elem.focus();break}};reset=()=>{this.formElements.forEach((([elem,isWC])=>{if(isWC)elem.reset();else switch(elem.type){case"checkbox":case"radio":elem.checked=!1;break;default:elem.value=""}})),this._checkValidity()};elementsChanged=()=>{this.formElements=[...this.querySelectorAll(this.supportedElements)].map((elem=>[elem,elem.tagName.includes("-")])),this._requiredElements=this.formElements.filter((([elem])=>elem.hasAttribute("required"))),this.submitButton=this.querySelector('[variant="primary"], [type="submit"]'),this.resetButton=this.querySelector('[type="reset"]'),this.resetButton&&this.resetButton.addEventListener("click",this.reset),this._checkValidity()};checkIfSupported=elem=>1===elem.nodeType&&(elem.tagName.includes("-")||"input"===elem.tagName||elem.querySelector(this.supportedElements));connectedCallback(){const updateFormDecedents=this.debounce(this.elementsChanged,100);this.addEventListener("input",this.debounce(this._checkValidity,100)),this.addEventListener("keydown",this.debounce(this.handleKeydown,100)),this.shadowRoot.querySelector("slot").addEventListener("slotchange",updateFormDecedents),this.mutationObserver=new MutationObserver((mutations=>{mutations.forEach((mutation=>{("childList"===mutation.type&&[...mutation.addedNodes].some((node=>this.checkIfSupported(node)))||[...mutation.removedNodes].some((node=>this.checkIfSupported(node))))&&updateFormDecedents()}))})),this.mutationObserver.observe(this,{childList:!0,subtree:!0})}attributeChangedCallback(name,oldValue,newValue){"skip-submit"===name&&(this.skipSubmit=this.hasAttribute("skip-submit"))}disconnectedCallback(){this.removeEventListener("input",this.debounce(this._checkValidity,100)),this.removeEventListener("keydown",this.debounce(this.handleKeydown,100)),this.mutationObserver.disconnect()}});const smInput=document.createElement("template");smInput.innerHTML=' ',customElements.define("sm-input",class SmInput extends HTMLElement{static hasAppendedStyles=!1;#validationState={validatedFor:void 0,isValid:!1,errorMessage:"Please fill out this field."};constructor(){super(),this.attachShadow({mode:"open"}).append(smInput.content.cloneNode(!0)),this.inputParent=this.shadowRoot.querySelector(".input"),this.input=this.shadowRoot.querySelector("input"),this.clearBtn=this.shadowRoot.querySelector(".clear"),this.placeholderElement=this.shadowRoot.querySelector(".placeholder"),this.outerContainer=this.shadowRoot.querySelector(".outer-container"),this.optionList=this.shadowRoot.querySelector(".datalist"),this._helperText="",this.isRequired=!1,this.datalist=[],this.validationFunction=void 0,this.reflectedAttributes=["value","required","disabled","type","inputmode","readonly","min","max","pattern","minlength","maxlength","step","list","autocomplete"]}static get observedAttributes(){return["value","placeholder","required","disabled","type","inputmode","readonly","min","max","pattern","minlength","maxlength","step","helper-text","error-text","list"]}get value(){return this.input.value}set value(val){val!==this.input.value&&(this.input.value=val,this._value=val,this.checkInput())}get placeholder(){return this.getAttribute("placeholder")}set placeholder(val){this.setAttribute("placeholder",val)}get type(){return this.getAttribute("type")}set type(val){this.setAttribute("type",val)}get validity(){return this.input.validity}get disabled(){return this.hasAttribute("disabled")}set disabled(value){value?(this.inputParent.classList.add("disabled"),this.setAttribute("disabled","")):(this.inputParent.classList.remove("disabled"),this.removeAttribute("disabled"))}get readOnly(){return this.hasAttribute("readonly")}set readOnly(value){value?this.setAttribute("readonly",""):this.removeAttribute("readonly")}set customValidation(val){val&&(this.validationFunction=val)}set errorText(val){this.#validationState.errorText=val}showError=(errorText=this.#validationState.errorText)=>{const appendedNew=this.appendFeedbackElement();this.feedbackPopover.innerHTML=` ${errorText} `,this.feedbackPopover.dataset.state="error",appendedNew&&this.feedbackPopover.animate([{transform:"scale(0.95)",opacity:0},{transform:"scale(1)",opacity:1}],{duration:200,easing:"ease",fill:"forwards"})};set helperText(val){this._helperText=val}get isValid(){if(this.#validationState.validatedFor===this.input.value)return this.#validationState.isValid;const _isValid=this.input.checkValidity();let _validity={isValid:!0,errorText:""};return this.validationFunction&&(_validity=this.validationFunction(this.input.value)),_isValid&&_validity.isValid?(this.setAttribute("valid",""),this.removeAttribute("invalid"),this.hideFeedback()):(this.removeAttribute("valid"),this.setAttribute("invalid",""),""!==this.value.trim()&&(_validity.errorText||this.#validationState.errorText)&&this.showError(_validity.errorText||this.#validationState.errorText)),this.#validationState.validatedFor=this.input.value,this.#validationState.isValid=_isValid&&_validity.isValid,this.#validationState.errorText=_validity.errorText||this.#validationState.errorText,this.#validationState.isValid}reset=()=>{this.value=""};clear=()=>{this.value="",this.input.focus(),this.fireEvent()};focusIn=()=>{this.input.focus()};focusOut=()=>{this.input.blur()};fireEvent=()=>{let event=new Event("input",{bubbles:!0,cancelable:!0,composed:!0});this.dispatchEvent(event)};searchDatalist=searchKey=>{const filteredData=this.datalist.filter((item=>item.toLowerCase().includes(searchKey.toLowerCase())));if(filteredData.sort(((a,b)=>a.toLowerCase().indexOf(searchKey.toLowerCase())-b.toLowerCase().indexOf(searchKey.toLowerCase()))),filteredData.length){if(this.optionList.children.length>filteredData.length){const optionsToRemove=this.optionList.children.length-filteredData.length;for(let i=0;i{if(this.optionList.children[index])this.optionList.children[index].textContent=item;else{const option=document.createElement("li");option.textContent=item,option.classList.add("datalist-item"),option.setAttribute("tabindex","0"),this.optionList.appendChild(option)}})),this.optionList.classList.remove("hidden")}else this.optionList.classList.add("hidden")};checkInput=e=>{this.hasAttribute("readonly")||(""!==this.input.value?this.clearBtn.classList.remove("hidden"):this.clearBtn.classList.add("hidden")),this.hasAttribute("placeholder")&&""!==this.getAttribute("placeholder").trim()&&(""!==this.input.value?(this.shouldAnimatePlaceholder&&this.inputParent.classList.add("animate-placeholder"),this.placeholderElement.classList.toggle("hidden",!this.shouldAnimatePlaceholder),this.datalist.length&&(this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=setTimeout((()=>{this.searchDatalist(this.input.value.trim())}),100))):(this.shouldAnimatePlaceholder&&this.inputParent.classList.remove("animate-placeholder"),this.placeholderElement.classList.remove("hidden"),this.hideFeedback(),this.datalist.length&&(this.optionList.innerHTML="",this.optionList.classList.add("hidden"))))};allowOnlyNum=e=>{e.ctrlKey||1===e.key.length&&(("."!==e.key||!e.target.value.includes(".")&&0!==e.target.value.length)&&["0","1","2","3","4","5","6","7","8","9","."].includes(e.key)||e.preventDefault())};handleOptionClick=e=>{this.input.value=e.target.textContent,this.optionList.classList.add("hidden"),this.input.focus()};handleInputNavigation=e=>{"ArrowDown"===e.key?(e.preventDefault(),this.optionList.children.length&&this.optionList.children[0].focus()):"ArrowUp"===e.key&&(e.preventDefault(),this.optionList.children.length&&this.optionList.children[this.optionList.children.length-1].focus())};handleDatalistNavigation=e=>{"ArrowUp"===e.key?(e.preventDefault(),this.shadowRoot.activeElement.previousElementSibling?this.shadowRoot.activeElement.previousElementSibling.focus():this.input.focus()):"ArrowDown"===e.key?(e.preventDefault(),this.shadowRoot.activeElement.nextElementSibling?this.shadowRoot.activeElement.nextElementSibling.focus():this.input.focus()):"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.input.value=e.target.textContent,this.optionList.classList.add("hidden"),this.input.focus())};handleFocus=e=>{this.datalist.length&&this.searchDatalist(this.input.value.trim())};handleBlur=e=>{this.datalist.length&&this.optionList.classList.add("hidden")};applyGlobalCustomValidation=()=>{if(void 0!==window.smCompConfig&&window.smCompConfig["sm-input"]){const config=window.smCompConfig["sm-input"].find((config=>this.matches(config.selector)));this.customValidation=config?.customValidation}};updatePosition=()=>{requestAnimationFrame((()=>{if(this.dimensions=this.getBoundingClientRect(),this.scrollingParentDimensions=this.scrollingParent.getBoundingClientRect(),0===this.dimensions.width||0===this.dimensions.height)return;let topOffset=this.dimensions.top-this.scrollingParentDimensions.top+this.dimensions.height,leftOffset=this.dimensions.left-this.scrollingParentDimensions.left;const maxWidth=this.dimensions.width;this.feedbackPopover.style=`top: ${topOffset}px; left: ${leftOffset}px; max-width: ${maxWidth}px;`}))};appendFeedbackElement=()=>!this.feedbackPopover&&(this.feedbackPopover=document.createElement("div"),this.feedbackPopover.className="feedback-popover",this.feedbackPopover.setAttribute("aria-live","polite"),this.containment=this.closest("[data-sm-containment]"),this.scrollingParent=this.getNearestScrollingParent(this),(this.containment||this.scrollingParent).appendChild(this.feedbackPopover),""===this.scrollingParent.style.position&&(this.scrollingParent.style.position="relative"),this.containment||(this.observerHidFeedback=!1,this.intersectionObserver=new IntersectionObserver((entries=>{if(this.feedbackPopover)if(entries[0].isIntersecting){if(!this.observerHidFeedback)return;this.feedbackPopover.classList.remove("hidden"),this.observerHidFeedback=!1}else this.feedbackPopover.classList.add("hidden"),this.observerHidFeedback=!0})).observe(this)),this.updatePosition(),window.addEventListener("resize",this.updatePosition,{passive:!0}),!0);getNearestScrollingParent=element=>{let parent=element.parentNode;for(;parent;){if(parent.scrollHeight>parent.clientHeight||parent.scrollWidth>parent.clientWidth||parent.tagName.includes("SM-")||parent.hasAttribute("data-scrollable"))return parent;parent=parent.parentNode}return document.body};hideFeedback=()=>{this.feedbackPopover&&(this.feedbackPopover.animate([{transform:"none",opacity:1},{transform:"scale(0.95)",opacity:0}],{duration:100,easing:"ease-in-out",fill:"forwards"}).onfinish=()=>{this.intersectionObserver?.disconnect(),this.feedbackPopover.remove(),this.feedbackPopover=null,window.removeEventListener("resize",this.updatePosition,{passive:!0})})};connectedCallback(){SmInput.hasAppendedStyles||(document.head.insertAdjacentHTML("beforeend",""),SmInput.hasAppendedStyles=!0),this.shouldAnimatePlaceholder=this.hasAttribute("animate"),this.shouldAnimatePlaceholder&&""!==this.placeholderElement&&this.value&&(this.inputParent.classList.add("animate-placeholder"),this.placeholderElement.classList.remove("hidden")),this.setAttribute("role","textbox"),"loading"===document.readyState?window.addEventListener("load",this.applyGlobalCustomValidation,{once:!0}):this.applyGlobalCustomValidation(),this.input.addEventListener("input",this.checkInput),this.clearBtn.addEventListener("click",this.clear),this.datalist.length&&(this.optionList.addEventListener("click",this.handleOptionClick),this.input.addEventListener("keydown",this.handleInputNavigation),this.optionList.addEventListener("keydown",this.handleDatalistNavigation)),this.input.addEventListener("focusin",this.handleFocus),this.addEventListener("focusout",this.handleBlur)}attributeChangedCallback(name,oldValue,newValue){if(oldValue!==newValue)switch(this.reflectedAttributes.includes(name)&&(this.hasAttribute(name)?this.input.setAttribute(name,this.getAttribute(name)?this.getAttribute(name):""):this.input.removeAttribute(name)),name){case"placeholder":this.placeholderElement.textContent=newValue,this.setAttribute("aria-label",newValue);break;case"value":this.checkInput();break;case"type":this.hasAttribute("type")&&"number"===this.getAttribute("type")?(this.input.setAttribute("inputmode","decimal"),this.input.addEventListener("keydown",this.allowOnlyNum)):this.input.removeEventListener("keydown",this.allowOnlyNum);break;case"helper-text":this._helperText=newValue;break;case"error-text":this.#validationState.errorText=newValue;break;case"required":this.isRequired=this.hasAttribute("required"),this.isRequired?this.setAttribute("aria-required","true"):this.setAttribute("aria-required","false");break;case"readonly":this.hasAttribute("readonly")?this.inputParent.classList.add("readonly"):this.inputParent.classList.remove("readonly");break;case"disabled":this.hasAttribute("disabled")?this.inputParent.classList.add("disabled"):this.inputParent.classList.remove("disabled");break;case"list":this.hasAttribute("list")&&""!==this.getAttribute("list").trim()&&(this.datalist=this.getAttribute("list").split(","))}}disconnectedCallback(){this.input.removeEventListener("input",this.checkInput),this.clearBtn.removeEventListener("click",this.clear),this.input.removeEventListener("keydown",this.allowOnlyNum),this.optionList.removeEventListener("click",this.handleOptionClick),this.input.removeEventListener("keydown",this.handleInputNavigation),this.optionList.removeEventListener("keydown",this.handleDatalistNavigation),this.input.removeEventListener("focusin",this.handleFocus),this.removeEventListener("focusout",this.handleBlur),window.removeEventListener("resize",this.updatePosition,{passive:!0}),this.feedbackPopover&&this.feedbackPopover.remove(),this.intersectionObserver&&this.intersectionObserver.disconnect()}});const smNotifications=document.createElement("template");smNotifications.innerHTML=" ",customElements.define("sm-notifications",class extends HTMLElement{constructor(){super(),this.shadow=this.attachShadow({mode:"open"}).append(smNotifications.content.cloneNode(!0)),this.notificationPanel=this.shadowRoot.querySelector(".notification-panel"),this.animationOptions={duration:300,fill:"forwards",easing:"cubic-bezier(0.175, 0.885, 0.32, 1.275)"},this.push=this.push.bind(this),this.createNotification=this.createNotification.bind(this),this.removeNotification=this.removeNotification.bind(this),this.clearAll=this.clearAll.bind(this),this.remove=this.remove.bind(this),this.handleTouchMove=this.handleTouchMove.bind(this),this.startX=0,this.currentX=0,this.endX=0,this.swipeDistance=0,this.swipeDirection="",this.swipeThreshold=0,this.startTime=0,this.swipeTime=0,this.swipeTimeThreshold=200,this.currentTarget=null,this.notificationTimeout=5e3,this.mediaQuery=window.matchMedia("(min-width: 640px)"),this.handleOrientationChange=this.handleOrientationChange.bind(this),this.isBigViewport=!1}set timeout(value){isNaN(value)||(this.notificationTimeout=value)}randString(length){let result="";for(let i=0;i${icon}`:""} ${action?``:""} `,action&¬ification.querySelector(".action").addEventListener("click",action.callback),notification.querySelector(".close").addEventListener("click",(()=>{this.removeNotification(notification)})),pinned||setTimeout((()=>{this.removeNotification(notification,this.isBigViewport?"left":"top")}),timeout),notification}push(message,options={}){const notification=this.createNotification(message,options);return this.isBigViewport?this.notificationPanel.append(notification):this.notificationPanel.prepend(notification),notification.scrollIntoView({behavior:"smooth"}),this.notificationPanel.animate([{transform:`translateY(${this.isBigViewport?"":"-"}${notification.clientHeight}px)`},{transform:"none"}],this.animationOptions),notification.animate([{transform:"translateY(-1rem)",opacity:"0"},{transform:"none",opacity:"1"}],this.animationOptions).onfinish=e=>{e.target.commitStyles(),e.target.cancel()},notification.id}removeNotification(notification,direction="left"){if(!notification)return;const sign="left"===direction||"top"===direction?"-":"+";this.isBigViewport||"top"!==direction?notification.animate([{transform:this.currentX?`translateX(${this.currentX}px)`:"none",opacity:"1"},{transform:`translateX(calc(${sign}${Math.abs(this.currentX)}px ${sign} 1rem))`,opacity:"0"}],this.animationOptions).onfinish=()=>{notification.remove()}:notification.animate([{transform:this.currentX?`translateY(${this.currentX}px)`:"none",opacity:"1"},{transform:`translateY(calc(${sign}${Math.abs(this.currentX)}px ${sign} 1rem))`,opacity:"0"}],this.animationOptions).onfinish=()=>{notification.remove()}}remove(id){const notification=this.notificationPanel.querySelector(`#${id}`);notification&&this.removeNotification(notification)}clearAll(){Array.from(this.notificationPanel.children).forEach((child=>{this.removeNotification(child)}))}handleTouchMove(e){this.currentX=e.touches[0].clientX-this.startX,this.currentTarget.style.transform=`translateX(${this.currentX}px)`}handleOrientationChange(e){this.isBigViewport=e.matches,e.matches}connectedCallback(){this.handleOrientationChange(this.mediaQuery),this.mediaQuery.addEventListener("change",this.handleOrientationChange),this.notificationPanel.addEventListener("touchstart",(e=>{e.target.closest(".close")?this.removeNotification(e.target.closest(".notification")):e.target.closest(".notification")&&(this.swipeThreshold=e.target.closest(".notification").getBoundingClientRect().width/2,this.currentTarget=e.target.closest(".notification"),this.startTime=Date.now(),this.startX=e.touches[0].clientX,this.startY=e.touches[0].clientY,this.notificationPanel.addEventListener("touchmove",this.handleTouchMove,{passive:!0}))}),{passive:!0}),this.notificationPanel.addEventListener("touchend",(e=>{this.endX=e.changedTouches[0].clientX,this.endY=e.changedTouches[0].clientY,this.swipeDistance=Math.abs(this.endX-this.startX),this.swipeTime=Date.now()-this.startTime,this.endX>this.startX?this.swipeDirection="right":this.swipeDirection="left",this.swipeTime50&&this.removeNotification(this.currentTarget,this.swipeDirection):this.swipeDistance>this.swipeThreshold?this.removeNotification(this.currentTarget,this.swipeDirection):this.currentTarget.animate([{transform:`translateX(${this.currentX}px)`},{transform:"none"}],this.animationOptions).onfinish=e=>{e.target.commitStyles(),e.target.cancel()},this.notificationPanel.removeEventListener("touchmove",this.handleTouchMove),this.currentX=0}))}disconnectedCallback(){mediaQueryList.removeEventListener("change",handleOrientationChange)}});class Stack{constructor(){this.items=[]}push(element){this.items.push(element)}pop(){return 0==this.items.length?"Underflow":this.items.pop()}peek(){return this.items[this.items.length-1]}}const popupStack=new Stack,smPopup=document.createElement("template");smPopup.innerHTML='',customElements.define("sm-popup",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(smPopup.content.cloneNode(!0)),this.allowClosing=!1,this.isOpen=!1,this.offset=0,this.touchStartY=0,this.touchEndY=0,this.touchStartTime=0,this.touchEndTime=0,this.touchEndAnimation=void 0,this.focusable,this.autoFocus,this.mutationObserver,this.popupContainer=this.shadowRoot.querySelector(".popup-container"),this.backdrop=this.shadowRoot.querySelector(".backdrop"),this.dialogBox=this.shadowRoot.querySelector(".popup"),this.popupBodySlot=this.shadowRoot.querySelector(".popup-body slot"),this.popupHeader=this.shadowRoot.querySelector(".popup-top")}static get observedAttributes(){return["open"]}get open(){return this.isOpen}animateTo=(element,keyframes,options)=>{const anime=element.animate(keyframes,{...options,fill:"both"});return anime.finished.then((()=>{anime.commitStyles(),anime.cancel()})),anime};resumeScrolling=()=>{const scrollY=document.body.style.top;window.scrollTo(0,-1*parseInt(scrollY||"0")),document.body.style.overflow="",document.body.style.top="initial"};setStateOpen=()=>{if(!this.isOpen||this.offset){const animOptions={duration:300,easing:"ease"},initialAnimation=window.innerWidth>640?"scale(1.1)":`translateY(${this.offset?`${this.offset}px`:"100%"})`;this.animateTo(this.dialogBox,[{opacity:this.offset?1:0,transform:initialAnimation},{opacity:1,transform:"none"}],animOptions)}};show=(options={})=>{const{pinned:pinned=!1,payload:payload}=options;if(this.isOpen)return;const animOptions={duration:300,easing:"ease"};return this.payload=payload,popupStack.push({popup:this,permission:pinned}),popupStack.items.length>1&&this.animateTo(popupStack.items[popupStack.items.length-2].popup.shadowRoot.querySelector(".popup"),[{transform:"none"},{transform:window.innerWidth>640?"scale(0.95)":"translateY(-1.5rem)"}],animOptions),this.popupContainer.classList.remove("hide"),this.offset||(this.backdrop.animate([{opacity:0},{opacity:1}],animOptions).onfinish=()=>{this.resolveOpen(this.payload)},this.dispatchEvent(new CustomEvent("popupopened",{bubbles:!0,composed:!0,detail:{payload:this.payload}})),document.body.style.overflow="hidden",document.body.style.top=`-${window.scrollY}px`),this.setStateOpen(),this.pinned=pinned,this.isOpen=!0,setTimeout((()=>{const elementToFocus=this.autoFocus||this.focusable?.[0]||this.dialogBox;elementToFocus&&(elementToFocus.tagName.includes("-")?elementToFocus.focusIn():elementToFocus.focus())}),0),this.hasAttribute("open")||(this.setAttribute("open",""),this.addEventListener("keydown",this.detectFocus),this.resizeObserver.observe(this),this.mutationObserver.observe(this,{attributes:!0,childList:!0,subtree:!0}),this.popupHeader.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),this.backdrop.addEventListener("mousedown",this.handleSoftDismiss)),{opened:new Promise((resolve=>{this.resolveOpen=resolve})),closed:new Promise((resolve=>{this.resolveClose=resolve}))}};hide=(options={})=>{const{payload:payload}=options,animOptions={duration:150,easing:"ease"};this.backdrop.animate([{opacity:1},{opacity:0}],animOptions),this.animateTo(this.dialogBox,[{opacity:1,transform:window.innerWidth>640?"none":`translateY(${this.offset?`${this.offset}px`:"0"})`},{opacity:0,transform:window.innerWidth>640?"scale(1.1)":"translateY(100%)"}],animOptions).finished.finally((()=>{this.popupContainer.classList.add("hide"),this.dialogBox.style="",this.removeAttribute("open"),this.forms.length&&this.forms.forEach((form=>form.reset())),this.dispatchEvent(new CustomEvent("popupclosed",{bubbles:!0,composed:!0,detail:{payload:payload||this.payload}})),this.resolveClose(payload||this.payload),this.isOpen=!1})),popupStack.pop(),popupStack.items.length?this.animateTo(popupStack.items[popupStack.items.length-1].popup.shadowRoot.querySelector(".popup"),[{transform:window.innerWidth>640?"scale(0.95)":"translateY(-1.5rem)"},{transform:"none"}],animOptions):this.resumeScrolling(),this.resizeObserver.disconnect(),this.mutationObserver.disconnect(),this.removeEventListener("keydown",this.detectFocus),this.popupHeader.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),this.backdrop.removeEventListener("mousedown",this.handleSoftDismiss)};handleTouchStart=e=>{this.offset=0,this.popupHeader.addEventListener("touchmove",this.handleTouchMove,{passive:!0}),this.popupHeader.addEventListener("touchend",this.handleTouchEnd,{passive:!0}),this.touchStartY=e.changedTouches[0].clientY,this.touchStartTime=e.timeStamp};handleTouchMove=e=>{this.touchStartY{this.dialogBox.style.transform=`translateY(${this.offset}px)`})))};handleTouchEnd=e=>{if(this.touchEndTime=e.timeStamp,cancelAnimationFrame(this.touchEndAnimation),this.touchEndY=e.changedTouches[0].clientY,this.threshold=.3*this.dialogBox.getBoundingClientRect().height,this.touchEndTime-this.touchStartTime>200)if(this.touchEndY-this.touchStartY>this.threshold){if(this.pinned)return void this.setStateOpen();this.hide()}else this.setStateOpen();else if(this.touchEndY>this.touchStartY){if(this.pinned)return void this.setStateOpen();this.hide()}this.popupHeader.removeEventListener("touchmove",this.handleTouchMove,{passive:!0}),this.popupHeader.removeEventListener("touchend",this.handleTouchEnd,{passive:!0})};detectFocus=e=>{if("Tab"===e.key){if(!this.focusable.length)return;if(!this.firstFocusable)for(let i=0;i=0;i--)if(!this.focusable[i].disabled){this.lastFocusable=this.focusable[i];break}e.shiftKey&&document.activeElement===this.firstFocusable?(e.preventDefault(),this.lastFocusable.tagName.includes("SM-")?this.lastFocusable.focusIn():this.lastFocusable.focus()):e.shiftKey||document.activeElement!==this.lastFocusable||(e.preventDefault(),this.firstFocusable.tagName.includes("SM-")?this.firstFocusable.focusIn():this.firstFocusable.focus())}};updateFocusableList=()=>{this.focusable=this.querySelectorAll('sm-button:not([disabled]), button:not([disabled]), [href], sm-input, input:not([readonly]), sm-select, select, sm-checkbox, sm-textarea, textarea, [tabindex]:not([tabindex="-1"])'),this.autoFocus=this.querySelector("[autofocus]"),this.firstFocusable=null,this.lastFocusable=null};handleSoftDismiss=()=>{this.pinned?this.dialogBox.animate([{transform:"translateX(-1rem)"},{transform:"translateX(1rem)"},{transform:"translateX(-0.5rem)"},{transform:"translateX(0.5rem)"},{transform:"translateX(0)"}],{duration:300,easing:"ease"}):this.hide()};debounce=(callback,wait)=>{let timeoutId=null;return(...args)=>{window.clearTimeout(timeoutId),timeoutId=window.setTimeout((()=>{callback.apply(null,args)}),wait)}};connectedCallback(){this.popupBodySlot.addEventListener("slotchange",this.debounce((()=>{this.forms=this.querySelectorAll("sm-form"),this.updateFocusableList()}),0)),this.resizeObserver=new ResizeObserver((entries=>{entries.forEach((entry=>{if(entry.contentBoxSize){const contentBoxSize=Array.isArray(entry.contentBoxSize)?entry.contentBoxSize[0]:entry.contentBoxSize;this.threshold=.3*contentBoxSize.blockSize.height}else this.threshold=.3*entry.contentRect.height}))})),this.mutationObserver=new MutationObserver((entries=>{this.updateFocusableList()}))}disconnectedCallback(){this.resizeObserver.disconnect(),this.mutationObserver.disconnect(),this.removeEventListener("keydown",this.detectFocus),this.popupHeader.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),this.backdrop.removeEventListener("mousedown",this.handleSoftDismiss)}attributeChangedCallback(name){"open"===name&&this.hasAttribute("open")&&this.show()}});const spinner=document.createElement("template");spinner.innerHTML='';class SpinnerLoader extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(spinner.content.cloneNode(!0))}}window.customElements.define("sm-spinner",SpinnerLoader);const themeToggle=document.createElement("template");themeToggle.innerHTML=' ';class ThemeToggle extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(themeToggle.content.cloneNode(!0)),this.isChecked=!1,this.hasTheme="light",this.toggleState=this.toggleState.bind(this),this.fireEvent=this.fireEvent.bind(this),this.handleThemeChange=this.handleThemeChange.bind(this)}static get observedAttributes(){return["checked"]}daylight(){this.hasTheme="light",document.body.dataset.theme="light",this.setAttribute("aria-checked","false")}nightlight(){this.hasTheme="dark",document.body.dataset.theme="dark",this.setAttribute("aria-checked","true")}toggleState(){if(!document.startViewTransition)return this.toggleAttribute("checked"),void this.fireEvent();document.startViewTransition((()=>{this.toggleAttribute("checked"),this.fireEvent()}))}handleKeyDown(e){" "===e.key&&this.toggleState()}handleThemeChange(e){e.detail.theme!==this.hasTheme&&("dark"===e.detail.theme?this.setAttribute("checked",""):this.removeAttribute("checked"))}fireEvent(){this.dispatchEvent(new CustomEvent("themechange",{bubbles:!0,composed:!0,detail:{theme:this.hasTheme}}))}connectedCallback(){this.setAttribute("role","switch"),this.setAttribute("aria-label","theme toggle"),"dark"===localStorage.getItem(`${window.location.hostname}-theme`)?(this.nightlight(),this.setAttribute("checked","")):"light"===localStorage.getItem(`${window.location.hostname}-theme`)?(this.daylight(),this.removeAttribute("checked")):window.matchMedia("(prefers-color-scheme: dark)").matches?(this.nightlight(),this.setAttribute("checked","")):(this.daylight(),this.removeAttribute("checked")),this.addEventListener("click",this.toggleState),this.addEventListener("keydown",this.handleKeyDown),document.addEventListener("themechange",this.handleThemeChange)}disconnectedCallback(){this.removeEventListener("click",this.toggleState),this.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("themechange",this.handleThemeChange)}attributeChangedCallback(e,t,n){"checked"===e&&(this.hasAttribute("checked")?(this.nightlight(),localStorage.setItem(`${window.location.hostname}-theme`,"dark")):(this.daylight(),localStorage.setItem(`${window.location.hostname}-theme`,"light")))}}window.customElements.define("theme-toggle",ThemeToggle);
\ No newline at end of file
diff --git a/scripts/ethOperator.js b/scripts/ethOperator.js
new file mode 100644
index 0000000..59d00eb
--- /dev/null
+++ b/scripts/ethOperator.js
@@ -0,0 +1,562 @@
+(function (EXPORTS) { // ethOperator v1.0.2
+ /* ETC Crypto and API Operator */
+ if (!window.ethers)
+ return console.error('ethers.js not found')
+ const ethOperator = EXPORTS;
+ const isValidAddress = ethOperator.isValidAddress = (address) => {
+ try {
+ // Check if the address is a valid checksum address
+ const isValidChecksum = ethers.utils.isAddress(address);
+ // Check if the address is a valid non-checksum address
+ const isValidNonChecksum = ethers.utils.getAddress(address) === address.toLowerCase();
+ return isValidChecksum || isValidNonChecksum;
+ } catch (error) {
+ return false;
+ }
+ }
+ const ERC20ABI = [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ }
+ ]
+ const CONTRACT_ADDRESSES = {
+ // Ethereum Classic network token addresses
+ wetc: "0x1953cab0E5bFa6D4a9BaD6E05fD46C1CC6527a5a" // Wrapped ETC (canonical address)
+ }
+ /**
+ * Get Ethereum Classic provider (MetaMask or public RPC)
+ * @param {boolean} readOnly - If true, use public RPC; if false, use MetaMask when available
+ * @returns {ethers.providers.Provider} Ethereum Classic provider instance
+ */
+ const getProvider = ethOperator.getProvider = (readOnly = false) => {
+ if (!readOnly && window.ethereum) {
+ return new ethers.providers.Web3Provider(window.ethereum);
+ } else {
+ return new ethers.providers.JsonRpcProvider(`https://go.getblock.io/25daad33439f4cd0ae1ffdde6ff6b560`)
+ }
+ }
+ // Note: MetaMask connection is handled in the UI layer, not here
+ const getBalance = ethOperator.getBalance = async (address) => {
+ try {
+ if (!address || !isValidAddress(address))
+ return new Error('Invalid address');
+
+ // Use read-only provider (public RPC) for balance checks
+ const provider = getProvider(true);
+ const balanceWei = await provider.getBalance(address);
+ const balanceEth = parseFloat(ethers.utils.formatEther(balanceWei));
+ return balanceEth;
+ } catch (error) {
+ console.error('Balance error:', error.message);
+ return 0;
+ }
+ }
+ const getTokenBalance = ethOperator.getTokenBalance = async (address, token, { contractAddress } = {}) => {
+ try {
+ if (!token)
+ return new Error("Token not specified");
+ if (!CONTRACT_ADDRESSES[token] && !contractAddress)
+ return new Error('Contract address of token not available')
+
+ // Use read-only provider (public RPC) for token balance checks
+ const provider = getProvider(true);
+ const tokenAddress = CONTRACT_ADDRESSES[token] || contractAddress;
+ const tokenContract = new ethers.Contract(tokenAddress, ERC20ABI, provider);
+ let balance = await tokenContract.balanceOf(address);
+
+ // WETC uses 18 decimals (like native ETC), USDC and USDT use 6 decimals
+ const decimals = token === 'wetc' ? 18 : 6;
+ balance = parseFloat(ethers.utils.formatUnits(balance, decimals));
+ return balance;
+ } catch (e) {
+ console.error('Token balance error:', e);
+ return 0;
+ }
+ }
+
+ const estimateGas = ethOperator.estimateGas = async ({ privateKey, receiver, amount }) => {
+ try {
+ const provider = getProvider();
+ const signer = new ethers.Wallet(privateKey, provider);
+ return provider.estimateGas({
+ from: signer.address,
+ to: receiver,
+ value: ethers.utils.parseUnits(amount, "ether"),
+ });
+ } catch (e) {
+ throw new Error(e)
+ }
+ }
+
+ const sendTransaction = ethOperator.sendTransaction = async ({ privateKey, receiver, amount }) => {
+ try {
+ const provider = getProvider();
+ const signer = new ethers.Wallet(privateKey, provider);
+ const limit = await estimateGas({ privateKey, receiver, amount })
+
+ // Get current gas price from the network (Legacy transaction)
+ const gasPrice = await provider.getGasPrice();
+
+ // Creating and sending the transaction object (Type 0 Legacy)
+ return signer.sendTransaction({
+ to: receiver,
+ value: ethers.utils.parseUnits(amount, "ether"),
+ gasLimit: limit,
+ nonce: await signer.getTransactionCount(),
+ gasPrice: gasPrice,
+ type: 0
+ })
+ } catch (e) {
+ throw new Error(e)
+ }
+ }
+
+ /**
+ * Send ERC20 tokens (USDC, USDT, or WETC)
+ * @param {object} params - Transaction parameters
+ * @param {string} params.token - Token symbol ('usdc', 'usdt', or 'wetc')
+ * @param {string} params.privateKey - Sender's private key
+ * @param {string} params.amount - Amount to send
+ * @param {string} params.receiver - Recipient's Ethereum Classic address
+ * @param {string} params.contractAddress - Optional custom contract address
+ * @returns {Promise} Transaction promise
+ */
+ const sendToken = ethOperator.sendToken = async ({ token, privateKey, amount, receiver, contractAddress }) => {
+ const provider = getProvider();
+ const wallet = new ethers.Wallet(privateKey, provider);
+ const tokenContract = new ethers.Contract(CONTRACT_ADDRESSES[token] || contractAddress, ERC20ABI, wallet);
+ // Convert amount to smallest unit: WETC uses 18 decimals, USDC and USDT use 6 decimals
+ const decimals = token === 'wetc' ? 18 : 6;
+ const amountWei = ethers.utils.parseUnits(amount.toString(), decimals);
+
+ // Get gas price for legacy transaction
+ const gasPrice = await provider.getGasPrice();
+
+ return tokenContract.transfer(receiver, amountWei, {
+ gasPrice: gasPrice,
+ type: 0
+ })
+ }
+
+
+ const MORALIS_API_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJub25jZSI6IjNmMjE5NjM5LTQwYmYtNDhkMC1hNDMxLTI5YjA4YzhlYzE5MiIsIm9yZ0lkIjoiNDkwNTU1IiwidXNlcklkIjoiNTA0NzE5IiwidHlwZUlkIjoiYWNiMjQzOWUtMDEzYy00YjhjLWI2N2MtNjRlNGNhMjA4YTlkIiwidHlwZSI6IlBST0pFQ1QiLCJpYXQiOjE3Njg1MDcyNTIsImV4cCI6NDkyNDI2NzI1Mn0.X4Hn3VxLVRJL6HlAGPFQdWvQAdTXO20_Z8CpWhNt5CE';
+
+ /**
+ * Get transaction history for an Ethereum Classic address using BlockScout API
+ * @param {string} address - Ethereum Classic address
+ * @param {object} options - Optional parameters
+ * @returns {Promise} Array of transactions
+ */
+ const getTransactionHistory = ethOperator.getTransactionHistory = async (address, options = {}) => {
+ try {
+ if (!address || !isValidAddress(address)) {
+ throw new Error('Invalid Ethereum Classic address');
+ }
+
+ const {
+ page = 1,
+ offset = 100,
+ } = options;
+
+ // BlockScout API endpoint for Ethereum Classic
+ const blockscoutUrl = `https://blockscout.com/etc/mainnet/api?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&page=${page}&offset=${offset}&sort=desc`;
+
+ // List of CORS proxies for redundancy
+ const proxies = [
+ 'https://api.allorigins.win/get?url=',
+ 'https://corsproxy.io/?'
+ ];
+
+ // Retry logic (up to 5 attempts with proxy rotation)
+ let response, data, lastError;
+ for (let attempt = 1; attempt <= 5; attempt++) {
+ const currentProxy = proxies[(attempt - 1) % proxies.length];
+ try {
+ if (attempt > 1) {
+ const delay = 500 * attempt; // Exponential backoff for retries
+ await new Promise(resolve => setTimeout(resolve, delay));
+ console.log(`Retry ${attempt}/5 for ${address} using ${currentProxy}`);
+ }
+
+ const finalUrl = currentProxy + encodeURIComponent(blockscoutUrl);
+ response = await fetch(finalUrl);
+
+ if (response.ok) {
+ const result = await response.json();
+ // Handle different proxy response formats (AllOrigins wraps JSON, CORSProxy.io is direct)
+ const contents = result.contents ? result.contents : JSON.stringify(result);
+ data = typeof contents === 'string' ? JSON.parse(contents) : contents;
+ break; // Success!
+ }
+
+ lastError = `Status ${response.status} ${response.statusText}`;
+ } catch (err) {
+ lastError = err.message;
+ console.warn(`Proxy ${currentProxy} failed on attempt ${attempt}: ${lastError}`);
+ }
+ }
+
+ if (!data || !data.result || data.status !== '1') {
+ if (lastError && !data) {
+ throw new Error(`Failed to fetch transactions after 5 attempts. Last error: ${lastError}`);
+ }
+ // No transactions found or API returned status '0' (which usually means no txs for this address)
+ return [];
+ }
+
+ // Parse and format transactions from BlockScout response
+ return data.result.map(tx => {
+ const isReceived = tx.to && tx.to.toLowerCase() === address.toLowerCase();
+ const value = parseFloat(ethers.utils.formatEther(tx.value || '0'));
+
+ return {
+ hash: tx.hash,
+ from: tx.from,
+ to: tx.to,
+ value: value,
+ symbol: 'ETC',
+ timestamp: parseInt(tx.timeStamp),
+ blockNumber: parseInt(tx.blockNumber),
+ isReceived: isReceived,
+ isSent: !isReceived,
+ gasUsed: tx.gasUsed ? parseInt(tx.gasUsed) : 0,
+ gasPrice: tx.gasPrice ? parseFloat(ethers.utils.formatUnits(tx.gasPrice, 'gwei')) : 0,
+ isError: tx.isError === '1',
+ contractAddress: tx.contractAddress || null,
+ tokenName: null,
+ confirmations: parseInt(tx.confirmations || '0'),
+ nonce: tx.nonce ? parseInt(tx.nonce) : 0,
+ input: tx.input || '0x',
+ isTokenTransfer: false
+ };
+ });
+
+ } catch (error) {
+ console.error('Error fetching transaction history:', error);
+ throw error;
+ }
+ };
+
+ /**
+ * Get detailed information about a specific transaction
+ * @param {string} txHash - Transaction hash
+ * @returns {Promise