diff --git a/app/web/dist/bundle.js b/app/web/dist/bundle.js index 835119e..058551c 100644 --- a/app/web/dist/bundle.js +++ b/app/web/dist/bundle.js @@ -31,5 +31,5 @@ const Pb=BigInt(0),$b=BigInt(1);function Ub(e,t){const n=t.negate();return e?n:t const Jb=(e,t)=>(e+(e>=0?t:-t)/ek)/t;function Vb(e){if(!["compact","recovered","der"].includes(e))throw new Error('Signature format must be "compact", "recovered", or "der"');return e}function Yb(e,t){const n={};for(let r of Object.keys(t))n[r]=void 0===e[r]?t[r]:e[r];return JA(n.lowS,"lowS"),JA(n.prehash,"prehash"),void 0!==n.format&&Vb(n.format),n}class zb extends Error{constructor(e=""){super(e)}}const Wb={Err:zb,_tlv:{encode:(e,t)=>{const{Err:n}=Wb;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(1&t.length)throw new n("tlv.encode: unpadded data");const r=t.length/2,i=YA(r);if(i.length/2&128)throw new n("tlv.encode: long form length too big");const o=r>127?YA(i.length/2|128):"";return YA(e)+o+i+t},decode(e,t){const{Err:n}=Wb;let r=0;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(t.length<2||t[r++]!==e)throw new n("tlv.decode: wrong tlv");const i=t[r++];let o=0;if(!!(128&i)){const e=127&i;if(!e)throw new n("tlv.decode(long): indefinite length not supported");if(e>4)throw new n("tlv.decode(long): byte length is too big");const s=t.subarray(r,r+e);if(s.length!==e)throw new n("tlv.decode: length bytes not complete");if(0===s[0])throw new n("tlv.decode(long): zero leftmost byte");for(const e of s)o=o<<8|e;if(r+=e,o<128)throw new n("tlv.decode(long): not minimal encoding")}else o=i;const s=t.subarray(r,r+o);if(s.length!==o)throw new n("tlv.decode: wrong value length");return{v:s,l:t.subarray(r+o)}}},_int:{encode(e){const{Err:t}=Wb;if(ePb))throw new Error(`CURVE.${e} must be positive bigint`)}const i=Kb(t.p,n.Fp,r),o=Kb(t.n,n.Fn,r),s=["Gx","Gy","a","weierstrass"===e?"b":"d"];for(const e of s)if(!i.isValid(t[e]))throw new Error(`CURVE.${e} must be valid field element of CURVE.Fp`);return{CURVE:t=Object.freeze(Object.assign({},t)),Fp:i,Fn:o}}("weierstrass",e,t),{Fp:r,Fn:i}=n;let o=n.CURVE;const{h:s,n:a}=o;sb(t,{},{allowInfinityPoint:"boolean",clearCofactor:"function",isTorsionFree:"function",fromBytes:"function",toBytes:"function",endo:"object",wrapPrivateKey:"boolean"});const{endo:l}=t;if(l&&(!r.is0(o.a)||"bigint"!=typeof l.beta||!Array.isArray(l.basises)))throw new Error('invalid endo: expected "beta": bigint and "basises": array');const c=sk(r,i);function u(){if(!r.isOdd)throw new Error("compression is not supported: Field does not have .isOdd()")}const d=t.toBytes||function(e,t,n){const{x:i,y:o}=t.toAffine(),s=r.toBytes(i);if(JA(n,"isCompressed"),n){u();return zu(ok(!r.isOdd(o)),s)}return zu(Uint8Array.of(4),s,r.toBytes(o))},f=t.fromBytes||function(e){VA(e,void 0,"Point");const{publicKey:t,publicKeyUncompressed:n}=c,i=e.length,o=e[0],s=e.subarray(1);if(i!==t||2!==o&&3!==o){if(i===n&&4===o){const e=r.BYTES,t=r.fromBytes(s.subarray(0,e)),n=r.fromBytes(s.subarray(e,2*e));if(!p(t,n))throw new Error("bad point: is not on curve");return{x:t,y:n}}throw new Error(`bad point: got length ${i}, expected compressed=${t} or uncompressed=${n}`)}{const e=r.fromBytes(s);if(!r.isValid(e))throw new Error("bad point: is not on curve, wrong x");const t=h(e);let n;try{n=r.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("bad point: is not on curve, sqrt error"+t)}u();return!(1&~o)!==r.isOdd(n)&&(n=r.neg(n)),{x:e,y:n}}};function h(e){const t=r.sqr(e),n=r.mul(t,e);return r.add(r.add(n,r.mul(e,o.a)),o.b)}function p(e,t){const n=r.sqr(t),i=h(e);return r.eql(n,i)}if(!p(o.Gx,o.Gy))throw new Error("bad curve params: generator point");const g=r.mul(r.pow(o.a,tk),nk),m=r.mul(r.sqr(o.b),BigInt(27));if(r.is0(r.add(g,m)))throw new Error("bad curve params: a or b");function y(e,t,n=!1){if(!r.isValid(t)||n&&r.is0(t))throw new Error(`bad point coordinate ${e}`);return t}function w(e){if(!(e instanceof I))throw new Error("ProjectivePoint expected")}function v(e){if(!l||!l.basises)throw new Error("no endo");return function(e,t,n){const[[r,i],[o,s]]=t,a=Jb(s*e,n),l=Jb(-i*e,n);let c=e-a*r-l*o,u=-a*i-l*s;const d=c=h||u=h)throw new Error("splitScalar (endomorphism): failed, k="+e);return{k1neg:d,k1:c,k2neg:f,k2:u}}(e,l.basises,i.ORDER)}const A=ab((e,t)=>{const{X:n,Y:i,Z:o}=e;if(r.eql(o,r.ONE))return{x:n,y:i};const s=e.is0();null==t&&(t=s?r.ONE:r.inv(o));const a=r.mul(n,t),l=r.mul(i,t),c=r.mul(o,t);if(s)return{x:r.ZERO,y:r.ZERO};if(!r.eql(c,r.ONE))throw new Error("invZ was invalid");return{x:a,y:l}}),b=ab(e=>{if(e.is0()){if(t.allowInfinityPoint&&!r.is0(e.Y))return;throw new Error("bad point: ZERO")}const{x:n,y:i}=e.toAffine();if(!r.isValid(n)||!r.isValid(i))throw new Error("bad point: x or y not field elements");if(!p(n,i))throw new Error("bad point: equation left != right");if(!e.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function k(e,t,n,i,o){return n=new I(r.mul(n.X,e),n.Y,n.Z),t=Ub(i,t),n=Ub(o,n),t.add(n)}class I{constructor(e,t,n){this.X=y("x",e),this.Y=y("y",t,!0),this.Z=y("z",n),Object.freeze(this)}static CURVE(){return o}static fromAffine(e){const{x:t,y:n}=e||{};if(!e||!r.isValid(t)||!r.isValid(n))throw new Error("invalid affine point");if(e instanceof I)throw new Error("projective point not allowed");return r.is0(t)&&r.is0(n)?I.ZERO:new I(t,n,r.ONE)}static fromBytes(e){const t=I.fromAffine(f(VA(e,void 0,"point")));return t.assertValidity(),t}static fromHex(e){return I.fromBytes(tb("pointHex",e))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(e=8,t=!0){return C.createCache(this,e),t||this.multiply(tk),this}assertValidity(){b(this)}hasEvenY(){const{y:e}=this.toAffine();if(!r.isOdd)throw new Error("Field doesn't support isOdd");return!r.isOdd(e)}equals(e){w(e);const{X:t,Y:n,Z:i}=this,{X:o,Y:s,Z:a}=e,l=r.eql(r.mul(t,a),r.mul(o,i)),c=r.eql(r.mul(n,a),r.mul(s,i));return l&&c}negate(){return new I(this.X,r.neg(this.Y),this.Z)}double(){const{a:e,b:t}=o,n=r.mul(t,tk),{X:i,Y:s,Z:a}=this;let l=r.ZERO,c=r.ZERO,u=r.ZERO,d=r.mul(i,i),f=r.mul(s,s),h=r.mul(a,a),p=r.mul(i,s);return p=r.add(p,p),u=r.mul(i,a),u=r.add(u,u),l=r.mul(e,u),c=r.mul(n,h),c=r.add(l,c),l=r.sub(f,c),c=r.add(f,c),c=r.mul(l,c),l=r.mul(p,l),u=r.mul(n,u),h=r.mul(e,h),p=r.sub(d,h),p=r.mul(e,p),p=r.add(p,u),u=r.add(d,d),d=r.add(u,d),d=r.add(d,h),d=r.mul(d,p),c=r.add(c,d),h=r.mul(s,a),h=r.add(h,h),d=r.mul(h,p),l=r.sub(l,d),u=r.mul(h,f),u=r.add(u,u),u=r.add(u,u),new I(l,c,u)}add(e){w(e);const{X:t,Y:n,Z:i}=this,{X:s,Y:a,Z:l}=e;let c=r.ZERO,u=r.ZERO,d=r.ZERO;const f=o.a,h=r.mul(o.b,tk);let p=r.mul(t,s),g=r.mul(n,a),m=r.mul(i,l),y=r.add(t,n),v=r.add(s,a);y=r.mul(y,v),v=r.add(p,g),y=r.sub(y,v),v=r.add(t,i);let A=r.add(s,l);return v=r.mul(v,A),A=r.add(p,m),v=r.sub(v,A),A=r.add(n,i),c=r.add(a,l),A=r.mul(A,c),c=r.add(g,m),A=r.sub(A,c),d=r.mul(f,v),c=r.mul(h,m),d=r.add(c,d),c=r.sub(g,d),d=r.add(g,d),u=r.mul(c,d),g=r.add(p,p),g=r.add(g,p),m=r.mul(f,m),v=r.mul(h,v),g=r.add(g,m),m=r.sub(p,m),m=r.mul(f,m),v=r.add(v,m),p=r.mul(g,v),u=r.add(u,p),p=r.mul(A,v),c=r.mul(y,c),c=r.sub(c,p),p=r.mul(y,g),d=r.mul(A,d),d=r.add(d,p),new I(c,u,d)}subtract(e){return this.add(e.negate())}is0(){return this.equals(I.ZERO)}multiply(e){const{endo:n}=t;if(!i.isValidNot0(e))throw new Error("invalid scalar: out of range");let r,o;const s=e=>C.cached(this,e,e=>Tb(I,e));if(n){const{k1neg:t,k1:i,k2neg:a,k2:l}=v(e),{p:c,f:u}=s(i),{p:d,f:f}=s(l);o=u.add(f),r=k(n.beta,c,d,t,a)}else{const{p:t,f:n}=s(e);r=t,o=n}return Tb(I,[r,o])[0]}multiplyUnsafe(e){const{endo:n}=t,r=this;if(!i.isValid(e))throw new Error("invalid scalar: out of range");if(e===Zb||r.is0())return I.ZERO;if(e===Xb)return r;if(C.hasCache(this))return this.multiply(e);if(n){const{k1neg:t,k1:i,k2neg:o,k2:s}=v(e),{p1:a,p2:l}=function(e,t,n,r){let i=t,o=e.ZERO,s=e.ZERO;for(;n>Pb||r>Pb;)n&$b&&(o=o.add(i)),r&$b&&(s=s.add(i)),i=i.double(),n>>=$b,r>>=$b;return{p1:o,p2:s}}(I,r,i,s);return k(n.beta,a,l,t,o)}return C.unsafe(r,e)}multiplyAndAddUnsafe(e,t,n){const r=this.multiplyUnsafe(t).add(e.multiplyUnsafe(n));return r.is0()?void 0:r}toAffine(e){return A(this,e)}isTorsionFree(){const{isTorsionFree:e}=t;return s===Xb||(e?e(I,this):C.unsafe(this,a).is0())}clearCofactor(){const{clearCofactor:e}=t;return s===Xb?this:e?e(I,this):this.multiplyUnsafe(s)}isSmallOrder(){return this.multiplyUnsafe(s).is0()}toBytes(e=!0){return JA(e,"isCompressed"),this.assertValidity(),d(I,this,e)}toHex(e=!0){return Mu(this.toBytes(e))}toString(){return``}get px(){return this.X}get py(){return this.X}get pz(){return this.Z}toRawBytes(e=!0){return this.toBytes(e)}_setWindowSize(e){this.precompute(e)}static normalizeZ(e){return Tb(I,e)}static msm(e,t){return qb(I,i,e,t)}static fromPrivateKey(e){return I.BASE.multiply(rk(i,e))}}I.BASE=new I(o.Gx,o.Gy,r.ONE),I.ZERO=new I(r.ZERO,r.ONE,r.ZERO),I.Fp=r,I.Fn=i;const E=i.BITS,C=new Gb(I,t.endo?Math.ceil(E/2):E);return I.BASE.precompute(8),I}function ok(e){return Uint8Array.of(e?2:3)}function sk(e,t){return{secretKey:t.BYTES,publicKey:1+e.BYTES,publicKeyUncompressed:1+2*e.BYTES,publicKeyHasPrefix:!0,signature:2*t.BYTES}}function ak(e,t={}){const{Fn:n}=e,r=t.randomBytes||Xu,i=Object.assign(sk(e.Fp,n),{seed:Rb(n.ORDER)});function o(e){try{return!!rk(n,e)}catch(e){return!1}}function s(e=r(i.seed)){return function(e,t,n=!1){const r=e.length,i=Db(t),o=Rb(t);if(r<16||r1024)throw new Error("expected "+o+"-1024 bytes of input, got "+r);const s=wb(n?ZA(e):WA(e),t-cb)+cb;return n?eb(s,i):XA(s,i)}(VA(e,i.seed,"seed"),n.ORDER)}function a(t,r=!0){return e.BASE.multiply(rk(n,t)).toBytes(r)}function l(t){if("bigint"==typeof t)return!1;if(t instanceof e)return!0;const{secretKey:r,publicKey:o,publicKeyUncompressed:s}=i;if(n.allowedLengths||r===o)return;const a=tb("key",t).length;return a===o||a===s}const c={isValidSecretKey:o,isValidPublicKey:function(t,n){const{publicKey:r,publicKeyUncompressed:o}=i;try{const i=t.length;return(!0!==n||i===r)&&((!1!==n||i===o)&&!!e.fromBytes(t))}catch(e){return!1}},randomSecretKey:s,isValidPrivateKey:o,randomPrivateKey:s,normPrivateKeyToScalar:e=>rk(n,e),precompute:(t=8,n=e.BASE)=>n.precompute(t,!1)};return Object.freeze({getPublicKey:a,getSharedSecret:function(t,r,i=!0){if(!0===l(t))throw new Error("first arg must be private key");if(!1===l(r))throw new Error("second arg must be public key");const o=rk(n,t);return e.fromHex(r).multiply(o).toBytes(i)},keygen:function(e){const t=s(e);return{secretKey:t,publicKey:a(t)}},Point:e,utils:c,lengths:i})}function lk(e,t,n={}){Pu(t),sb(n,{},{hmac:"function",lowS:"boolean",randomBytes:"function",bits2int:"function",bits2int_modN:"function"});const r=n.randomBytes||Xu,i=n.hmac||((e,...n)=>GA(t,e,zu(...n))),{Fp:o,Fn:s}=e,{ORDER:a,BITS:l}=s,{keygen:c,getPublicKey:u,getSharedSecret:d,utils:f,lengths:h}=ak(e,n),p={prehash:!1,lowS:"boolean"==typeof n.lowS&&n.lowS,format:void 0,extraEntropy:!1},g="compact";function m(e){return e>a>>Xb}function y(e,t){if(!s.isValidNot0(t))throw new Error(`invalid signature ${e}: out of range 1..Point.Fn.ORDER`);return t}class w{constructor(e,t,n){this.r=y("r",e),this.s=y("s",t),null!=n&&(this.recovery=n),Object.freeze(this)}static fromBytes(e,t=g){let n;if(function(e,t){Vb(t);const n=h.signature;VA(e,"compact"===t?n:"recovered"===t?n+1:void 0,`${t} signature`)}(e,t),"der"===t){const{r:t,s:n}=Wb.toSig(VA(e));return new w(t,n)}"recovered"===t&&(n=e[0],t="compact",e=e.subarray(1));const r=s.BYTES,i=e.subarray(0,r),o=e.subarray(r,2*r);return new w(s.fromBytes(i),s.fromBytes(o),n)}static fromHex(e,t){return this.fromBytes(Vu(e),t)}addRecoveryBit(e){return new w(this.r,this.s,e)}recoverPublicKey(t){const n=o.ORDER,{r:r,s:i,recovery:l}=this;if(null==l||![0,1,2,3].includes(l))throw new Error("recovery id invalid");if(a*ek1)throw new Error("recovery id is ambiguous for h>1 curve");const c=2===l||3===l?r+a:r;if(!o.isValid(c))throw new Error("recovery id 2 or 3 invalid");const u=o.toBytes(c),d=e.fromBytes(zu(ok(!(1&l)),u)),f=s.inv(c),h=A(tb("msgHash",t)),p=s.create(-h*f),g=s.create(i*f),m=e.BASE.multiplyUnsafe(p).add(d.multiplyUnsafe(g));if(m.is0())throw new Error("point at infinify");return m.assertValidity(),m}hasHighS(){return m(this.s)}toBytes(e=g){if(Vb(e),"der"===e)return Vu(Wb.hexFromSig(this));const t=s.toBytes(this.r),n=s.toBytes(this.s);if("recovered"===e){if(null==this.recovery)throw new Error("recovery bit must be present");return zu(Uint8Array.of(this.recovery),t,n)}return zu(t,n)}toHex(e){return Mu(this.toBytes(e))}assertValidity(){}static fromCompact(e){return w.fromBytes(tb("sig",e),"compact")}static fromDER(e){return w.fromBytes(tb("sig",e),"der")}normalizeS(){return this.hasHighS()?new w(this.r,s.neg(this.s),this.recovery):this}toDERRawBytes(){return this.toBytes("der")}toDERHex(){return Mu(this.toBytes("der"))}toCompactRawBytes(){return this.toBytes("compact")}toCompactHex(){return Mu(this.toBytes("compact"))}}const v=n.bits2int||function(e){if(e.length>8192)throw new Error("input is too large");const t=WA(e),n=8*e.length-l;return n>0?t>>BigInt(n):t},A=n.bits2int_modN||function(e){return s.create(v(e))},b=ob(l);function k(e){return rb("num < 2^"+l,e,Zb,b),s.toBytes(e)}function I(e,n){return VA(e,void 0,"message"),n?VA(t(e),void 0,"prehashed message"):e}return Object.freeze({keygen:c,getPublicKey:u,getSharedSecret:d,utils:f,lengths:h,Point:e,sign:function(n,o,a={}){n=tb("message",n);const{seed:l,k2sig:c}=function(t,n,i){if(["recovered","canonical"].some(e=>e in i))throw new Error("sign() legacy options not supported");const{lowS:o,prehash:a,extraEntropy:l}=Yb(i,p);t=I(t,a);const c=A(t),u=rk(s,n),d=[k(u),k(c)];if(null!=l&&!1!==l){const e=!0===l?r(h.secretKey):l;d.push(tb("extraEntropy",e))}const f=zu(...d),g=c;return{seed:f,k2sig:function(t){const n=v(t);if(!s.isValidNot0(n))return;const r=s.inv(n),i=e.BASE.multiply(n).toAffine(),a=s.create(i.x);if(a===Zb)return;const l=s.create(r*s.create(g+a*u));if(l===Zb)return;let c=(i.x===a?0:2)|Number(i.y&Xb),d=l;return o&&m(l)&&(d=s.neg(l),c^=1),new w(a,d,c)}}}(n,o,a),u=function(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");const r=e=>new Uint8Array(e),i=e=>Uint8Array.of(e);let o=r(e),s=r(e),a=0;const l=()=>{o.fill(1),s.fill(0),a=0},c=(...e)=>n(s,o,...e),u=(e=r(0))=>{s=c(i(0),e),o=c(),0!==e.length&&(s=c(i(1),e),o=c())},d=()=>{if(a++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e{let n;for(l(),u(e);!(n=t(d()));)u();return l(),n}}(t.outputLen,s.BYTES,i);return u(l,c)},verify:function(t,n,r,i={}){const{lowS:o,prehash:a,format:l}=Yb(i,p);if(r=tb("publicKey",r),n=I(tb("message",n),a),"strict"in i)throw new Error("options.strict was renamed to lowS");const c=void 0===l?function(e){let t;const n="string"==typeof e||Qu(e),r=!n&&null!==e&&"object"==typeof e&&"bigint"==typeof e.r&&"bigint"==typeof e.s;if(!n&&!r)throw new Error("invalid signature, expected Uint8Array, hex string or Signature instance");if(r)t=new w(e.r,e.s);else if(n){try{t=w.fromBytes(tb("sig",e),"der")}catch(e){if(!(e instanceof Wb.Err))throw e}if(!t)try{t=w.fromBytes(tb("sig",e),"compact")}catch(e){return!1}}return t||!1}(t):w.fromBytes(tb("sig",t),l);if(!1===c)return!1;try{const t=e.fromBytes(r);if(o&&c.hasHighS())return!1;const{r:i,s:a}=c,l=A(n),u=s.inv(a),d=s.create(l*u),f=s.create(i*u),h=e.BASE.multiplyUnsafe(d).add(t.multiplyUnsafe(f));if(h.is0())return!1;return s.create(h.x)===i}catch(e){return!1}},recoverPublicKey:function(e,t,n={}){const{prehash:r}=Yb(n,p);return t=I(t,r),w.fromBytes(e,"recovered").recoverPublicKey(t).toBytes()},Signature:w,hash:t})}function ck(e){const{CURVE:t,curveOpts:n}=function(e){const t={a:e.a,b:e.b,p:e.Fp.ORDER,n:e.n,h:e.h,Gx:e.Gx,Gy:e.Gy},n=e.Fp;let r=e.allowedPrivateKeyLengths?Array.from(new Set(e.allowedPrivateKeyLengths.map(e=>Math.ceil(e/2)))):void 0;return{CURVE:t,curveOpts:{Fp:n,Fn:Qb(t.n,{BITS:e.nBitLength,allowedLengths:r,modFromBytes:e.wrapPrivateKey}),allowInfinityPoint:e.allowInfinityPoint,endo:e.endo,isTorsionFree:e.isTorsionFree,clearCofactor:e.clearCofactor,fromBytes:e.fromBytes,toBytes:e.toBytes}}}(e),r={hmac:e.hmac,randomBytes:e.randomBytes,lowS:e.lowS,bits2int:e.bits2int,bits2int_modN:e.bits2int_modN};return{CURVE:t,curveOpts:n,hash:e.hash,ecdsaOpts:r}}function uk(e){const{CURVE:t,curveOpts:n,hash:r,ecdsaOpts:i}=ck(e);return function(e,t){const n=t.Point;return Object.assign({},t,{ProjectivePoint:n,CURVE:Object.assign({},e,Fb(n.Fn.ORDER,n.Fn.BITS))})}(e,lk(ik(t,n),r,i))} /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ -const dk={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},fk={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},hk=BigInt(2);const pk=Qb(dk.p,{sqrt:function(e){const t=dk.p,n=BigInt(3),r=BigInt(6),i=BigInt(11),o=BigInt(22),s=BigInt(23),a=BigInt(44),l=BigInt(88),c=e*e*e%t,u=c*c*e%t,d=vb(u,n,t)*u%t,f=vb(d,n,t)*u%t,h=vb(f,hk,t)*c%t,p=vb(h,i,t)*h%t,g=vb(p,o,t)*p%t,m=vb(g,a,t)*g%t,y=vb(m,l,t)*m%t,w=vb(y,a,t)*g%t,v=vb(w,n,t)*u%t,A=vb(v,s,t)*p%t,b=vb(A,r,t)*c%t,k=vb(b,hk,t);if(!pk.eql(pk.sqr(k),e))throw new Error("Cannot find square root");return k}}),gk=function(e,t){const n=t=>uk({...e,hash:t});return{...n(t),create:n}}({...dk,Fp:pk,lowS:!0,endo:fk},HA),mk=HA,yk="nip46";function wk(e){let t=0n;for(const n of e)t=t<<8n|BigInt(n);return t}function vk(e){const t=gk.utils.randomPrivateKey(),n=gk.ProjectivePoint.fromHex(function(e){const t=(new TextEncoder).encode("Secp256k1_HashToCurve_Cashu_"),n=mk(new Uint8Array([...t,...e]));for(let e=0;e<65536;e++){const t=new Uint8Array(4);new DataView(t.buffer).setUint32(0,e,!0);const r=new Uint8Array([...n,...t]),i=mk(r),o=new Uint8Array([2,...i]);try{if(!gk.ProjectivePoint.fromHex(o).equals(gk.ProjectivePoint.ZERO))return o}catch{}}throw new Error("Failed to hash to curve after 65536 attempts")}(e)),r=gk.ProjectivePoint.BASE.multiply(wk(t));return{B_:n.add(r).toRawBytes(!0),secret:e,r:t}}function Ak(e){const t={k:e.keysetId,s:Mu(e.secret),c:Mu(e.signature),p:Mu(e.pubkey),e:e.expiry,sc:e.scope,kinds:e.kinds,kind_ranges:e.kindRanges},n=JSON.stringify(t);return"cashuA"+btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function bk(e,t,n,r,i,o){const s=vk(crypto.getRandomValues(new Uint8Array(32))),a={blinded_message:Mu(s.B_),scope:t,kinds:i,kind_ranges:o},l=`${e}/cashu/mint`,c=await r(l,"POST"),u=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:c},body:JSON.stringify(a)});if(!u.ok){const e=await u.text();throw new Error(`Mint request failed: ${e}`)}const d=await u.json(),f=Vu(d.blinded_signature),h=Vu(d.mint_pubkey),p=function(e,t,n){const r=gk.ProjectivePoint.fromHex(e),i=gk.ProjectivePoint.fromHex(n).multiply(wk(t));return r.subtract(i).toRawBytes(!0)}(f,s.r,h);return{keysetId:d.keyset_id,secret:s.secret,signature:p,pubkey:n,expiry:d.expiry,scope:t,kinds:i,kindRanges:o}}async function kk(e){let t=e.replace("wss://","https://").replace("ws://","http://").replace(/\/$/,"");try{const e=await fetch(`${t}/cashu/info`);if(!e.ok)return null;const n=await e.json();return n.mintUrl=t,n}catch{return null}}const Ik="connect",Ek="get_public_key",Ck="sign_event",xk="nip04_encrypt",Bk="nip04_decrypt",Sk="ping";class Fk{constructor(e,t,n){this.relayUrl=e,this.userPubkey=t,this.userPrivkey=n,this.ws=null,this.connected=!1,this.allowedSecrets=new Set,this.connectedClients=new Map,this.requestLog=[],this.heartbeatInterval=null,this.subscriptionId=null,this.catToken=null,this.onClientConnected=null,this.onClientDisconnected=null,this.onRequest=null,this.onStatusChange=null}addAllowedSecret(e){this.allowedSecrets.add(e)}removeAllowedSecret(e){this.allowedSecrets.delete(e)}setCatToken(e){this.catToken=e}async connect(){return new Promise((e,t)=>{let n=this.relayUrl;if(n.startsWith("http://")?n="ws://"+n.slice(7):n.startsWith("https://")?n="wss://"+n.slice(8):n.startsWith("ws://")||n.startsWith("wss://")||(n="wss://"+n),this.catToken){const e=Ak(this.catToken),t=new URL(n);t.searchParams.set("token",e),n=t.toString()}console.log("[BunkerService] Connecting to:",n.split("?")[0]);const r=new WebSocket(n),i=setTimeout(()=>{r.close(),t(new Error("Connection timeout"))},1e4);r.onopen=()=>{clearTimeout(i),this.ws=r,this.connected=!0,console.log("[BunkerService] Connected to relay"),this.subscriptionId=function(e=16){const t=new Uint8Array(e);return crypto.getRandomValues(t),Mu(t)}(8);const t=JSON.stringify(["REQ",this.subscriptionId,{kinds:[24133],"#p":[this.userPubkey],since:Math.floor(Date.now()/1e3)-60}]);r.send(t),console.log("[BunkerService] Subscribed to NIP-46 events"),this.startHeartbeat(),this.onStatusChange&&this.onStatusChange("connected"),e()},r.onerror=e=>{clearTimeout(i),console.error("[BunkerService] WebSocket error:",e),t(new Error("WebSocket error"))},r.onclose=()=>{this.connected=!1,this.ws=null,this.stopHeartbeat(),console.log("[BunkerService] Disconnected from relay"),this.onStatusChange&&this.onStatusChange("disconnected")},r.onmessage=e=>{this.handleMessage(e.data)}})}startHeartbeat(e=3e4){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=JSON.stringify(["REQ",this.subscriptionId,{kinds:[24133],"#p":[this.userPubkey],since:Math.floor(Date.now()/1e3)-60}]);this.ws.send(e)}},e)}stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}disconnect(){this.stopHeartbeat(),this.ws&&(this.subscriptionId&&this.ws.send(JSON.stringify(["CLOSE",this.subscriptionId])),this.ws.close(),this.ws=null),this.connected=!1,this.connectedClients.clear()}async handleMessage(e){try{const t=JSON.parse(e);if(!Array.isArray(t))return;const[n,...r]=t;if("EVENT"===n){const[,e]=r;24133===e.kind&&await this.handleNIP46Request(e)}else"OK"===n?console.log("[BunkerService] Event published:",r[0]?.substring(0,8)):"NOTICE"===n&&console.warn("[BunkerService] Relay notice:",r[0])}catch(e){console.error("[BunkerService] Failed to parse message:",e)}}async handleNIP46Request(e){try{const t=Mu(this.userPrivkey),n=await gs.decrypt(t,e.pubkey,e.content),r=JSON.parse(n);console.log("[BunkerService] Received request:",r.method,"from:",e.pubkey.substring(0,8)),this.requestLog.push({id:r.id,method:r.method,from:e.pubkey,timestamp:Date.now()}),this.requestLog.length>100&&this.requestLog.shift(),this.onRequest&&this.onRequest(r,e.pubkey);let i=null,o=null;try{switch(r.method){case Ik:i=await this.handleConnect(r,e.pubkey);break;case Ek:i=await this.handleGetPublicKey(r,e.pubkey);break;case Ck:i=await this.handleSignEvent(r,e.pubkey);break;case xk:i=await this.handleNip04Encrypt(r,e.pubkey);break;case Bk:i=await this.handleNip04Decrypt(r,e.pubkey);break;case Sk:i="pong";break;default:o=`Unknown method: ${r.method}`}}catch(e){console.error("[BunkerService] Error handling request:",e),o=e.message}await this.sendResponse(r.id,i,o,e.pubkey)}catch(e){console.error("[BunkerService] Failed to handle NIP-46 request:",e)}}async handleConnect(e,t){const[n,r]=e.params;if(this.allowedSecrets.size>0&&(!r||!this.allowedSecrets.has(r)))throw new Error("Invalid or missing connection secret");return this.connectedClients.set(t,{clientPubkey:n||t,connectedAt:Date.now(),lastActivity:Date.now()}),console.log("[BunkerService] Client connected:",t.substring(0,8)),this.onClientConnected&&this.onClientConnected(t),"ack"}async handleGetPublicKey(e,t){return this.connectedClients.has(t)&&(this.connectedClients.get(t).lastActivity=Date.now()),this.userPubkey}async handleSignEvent(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n]=e.params,r=JSON.parse(n);if(r.pubkey&&r.pubkey!==this.userPubkey)throw new Error("Event pubkey does not match signer pubkey");r.pubkey=this.userPubkey;const i=JSON.stringify([0,r.pubkey,r.created_at,r.kind,r.tags,r.content]),o=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(i));r.id=Mu(new Uint8Array(o));const s=gk.sign(Vu(r.id),this.userPrivkey);return r.sig=s.toCompactHex(),console.log("[BunkerService] Signed event:",r.id.substring(0,8),"kind:",r.kind),JSON.stringify(r)}async handleNip04Encrypt(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n,r]=e.params,i=Mu(this.userPrivkey);return await gs.encrypt(i,n,r)}async handleNip04Decrypt(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n,r]=e.params,i=Mu(this.userPrivkey);return await gs.decrypt(i,n,r)}async sendResponse(e,t,n,r){if(!this.ws||!this.connected)return void console.error("[BunkerService] Cannot send response: not connected");const i={id:e,result:null!==t?t:void 0,error:null!==n?n:void 0},o=Mu(this.userPrivkey),s=await gs.encrypt(o,r,JSON.stringify(i)),a={kind:24133,pubkey:this.userPubkey,created_at:Math.floor(Date.now()/1e3),content:s,tags:[["p",r]]},l=JSON.stringify([0,a.pubkey,a.created_at,a.kind,a.tags,a.content]),c=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(l));a.id=Mu(new Uint8Array(c));const u=gk.sign(Vu(a.id),this.userPrivkey);a.sig=u.toCompactHex(),this.ws.send(JSON.stringify(["EVENT",a])),console.log("[BunkerService] Sent response for:",e)}isConnected(){return this.connected}getConnectedClients(){return Array.from(this.connectedClients.entries()).map(([e,t])=>({pubkey:e,...t}))}getRequestLog(){return[...this.requestLog]}}function Qk(e,t,n){const r=e.slice();return r[48]=t[n],r}function Dk(e,t,n){const r=e.slice();return r[52]=t[n],r}function Rk(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to access remote signing.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-13nqrp7"),A(o,"class","login-btn svelte-13nqrp7"),A(n,"class","login-prompt svelte-13nqrp7")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[24]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Pk(e){let t,n,r,i,o,s,a,l,f=(e[3]||"read-only")+"";return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Access Denied",i=m(),o=h("p"),s=g("You need write access to use remote signing. Your current access level: "),a=h("strong"),l=g(f),A(r,"class","svelte-13nqrp7"),A(o,"class","svelte-13nqrp7"),A(n,"class","access-denied svelte-13nqrp7"),A(t,"class","bunker-view svelte-13nqrp7")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(o,a),c(a,l)},p(e,t){8&t[0]&&f!==(f=(e[3]||"read-only")+"")&&k(l,f)},d(e){e&&d(t)}}}function $k(e){let t,n,r,i,o,s,a,l,f,p,y,v=e[7]?"Loading...":"Refresh",b=e[8]&&Tk(e),I=e[4]?.cashu_enabled&&"none"!==e[4]?.acl_mode&&Nk();function E(e,t){return e[7]&&!e[4]?Ok:e[4]?Lk:void 0}let C=E(e),x=C&&C(e);return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Remote Signing (NIP-46 Bunker)",i=m(),o=h("button"),s=g(v),a=m(),b&&b.c(),l=m(),I&&I.c(),f=m(),x&&x.c(),A(r,"class","svelte-13nqrp7"),A(o,"class","refresh-btn svelte-13nqrp7"),o.disabled=e[7],A(n,"class","header-section svelte-13nqrp7"),A(t,"class","bunker-view svelte-13nqrp7")},m(d,h){u(d,t,h),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(t,a),b&&b.m(t,null),c(t,l),I&&I.m(t,null),c(t,f),x&&x.m(t,null),p||(y=w(o,"click",e[21]),p=!0)},p(e,n){128&n[0]&&v!==(v=e[7]?"Loading...":"Refresh")&&k(s,v),128&n[0]&&(o.disabled=e[7]),e[8]?b?b.p(e,n):(b=Tk(e),b.c(),b.m(t,l)):b&&(b.d(1),b=null),e[4]?.cashu_enabled&&"none"!==e[4]?.acl_mode?I||(I=Nk(),I.c(),I.m(t,f)):I&&(I.d(1),I=null),C===(C=E(e))&&x?x.p(e,n):(x&&x.d(1),x=C&&C(e),x&&(x.c(),x.m(t,null)))},d(e){e&&d(t),b&&b.d(),I&&I.d(),x&&x.d(),p=!1,y()}}}function Uk(t){let n;return{c(){n=h("div"),n.innerHTML='

Remote Signing Not Available

\n

This relay does not have bunker mode enabled, or ACL mode is set to "none".

\n

Remote signing requires the relay operator to enable ACL mode "follows" or "managed".

',A(n,"class","bunker-view svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Tk(e){let t,n;return{c(){t=h("div"),n=g(e[8]),A(t,"class","error-message svelte-13nqrp7")},m(e,r){u(e,t,r),c(t,n)},p(e,t){256&t[0]&&k(n,e[8])},d(e){e&&d(t)}}}function Nk(e){let t;return{c(){t=h("div"),t.innerHTML="CAT Required: This relay requires Cashu Access Tokens (CAT) for bunker connections.\n Your client must support CAT authentication or connections will be rejected.",A(t,"class","cat-warning svelte-13nqrp7")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Lk(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,S,F,Q,D,R,P,$,U,T,N,L,O,M,_,H,j,G,q,K,J,V,Y,z,W,Z=e[10]?"Active":"Inactive",X=e[4].relay_url+"",ee="relay"===e[9]?"Copied!":"Copy";function te(e,t){return e[2]?Mk:_k}let ne=te(e),re=ne(e),ie=e[10]&&e[6].length>0&&Kk(e);return{c(){t=h("div"),t.innerHTML='

How it works: Start the bunker service to allow remote apps (like Smesh) to request signatures from your ORLY account.\n Share the QR code or bunker URL with your client app.

',n=m(),i=h("div"),o=h("div"),s=h("h4"),s.textContent="Bunker Service",a=m(),l=h("div"),f=h("span"),p=m(),y=g(Z),v=m(),re.c(),b=m(),ie&&ie.c(),I=m(),E=h("div"),C=h("h4"),C.textContent="Connection Details",x=m(),S=h("div"),F=h("span"),F.textContent="Relay:",Q=m(),D=h("code"),R=g(X),P=m(),$=h("button"),U=g(ee),T=m(),N=h("div"),L=h("span"),L.textContent="Your npub:",O=m(),M=h("code"),_=g(e[1]),H=m(),j=h("div"),G=h("span"),G.textContent="Secret:",q=m(),K=h("code"),J=g(e[5]),V=m(),Y=h("button"),Y.textContent="Regenerate",A(t,"class","instructions svelte-13nqrp7"),A(s,"class","svelte-13nqrp7"),A(f,"class","status-dot svelte-13nqrp7"),A(l,"class","service-status svelte-13nqrp7"),B(l,"active",e[10]),A(o,"class","service-header svelte-13nqrp7"),A(i,"class","service-control svelte-13nqrp7"),A(C,"class","svelte-13nqrp7"),A(F,"class","label svelte-13nqrp7"),A(D,"class","svelte-13nqrp7"),A($,"class","copy-btn svelte-13nqrp7"),A(S,"class","info-row svelte-13nqrp7"),A(L,"class","label svelte-13nqrp7"),A(M,"class","npub svelte-13nqrp7"),A(N,"class","info-row svelte-13nqrp7"),A(G,"class","label svelte-13nqrp7"),A(K,"class","secret svelte-13nqrp7"),A(Y,"class","copy-btn svelte-13nqrp7"),A(j,"class","info-row svelte-13nqrp7"),A(E,"class","connection-info svelte-13nqrp7")},m(r,d){u(r,t,d),u(r,n,d),u(r,i,d),c(i,o),c(o,s),c(o,a),c(o,l),c(l,f),c(l,p),c(l,y),c(i,v),re.m(i,null),u(r,b,d),ie&&ie.m(r,d),u(r,I,d),u(r,E,d),c(E,C),c(E,x),c(E,S),c(S,F),c(S,Q),c(S,D),c(D,R),c(S,P),c(S,$),c($,U),c(E,T),c(E,N),c(N,L),c(N,O),c(N,M),c(M,_),c(E,H),c(E,j),c(j,G),c(j,q),c(j,K),c(K,J),c(j,V),c(j,Y),z||(W=[w($,"click",e[37]),w(Y,"click",e[22])],z=!0)},p(e,t){1024&t[0]&&Z!==(Z=e[10]?"Active":"Inactive")&&k(y,Z),1024&t[0]&&B(l,"active",e[10]),ne===(ne=te(e))&&re?re.p(e,t):(re.d(1),re=ne(e),re&&(re.c(),re.m(i,null))),e[10]&&e[6].length>0?ie?ie.p(e,t):(ie=Kk(e),ie.c(),ie.m(I.parentNode,I)):ie&&(ie.d(1),ie=null),16&t[0]&&X!==(X=e[4].relay_url+"")&&k(R,X),512&t[0]&&ee!==(ee="relay"===e[9]?"Copied!":"Copy")&&k(U,ee),2&t[0]&&k(_,e[1]),32&t[0]&&k(J,e[5])},d(e){e&&d(t),e&&d(n),e&&d(i),re.d(),e&&d(b),ie&&ie.d(e),e&&d(I),e&&d(E),z=!1,r(W)}}}function Ok(t){let n;return{c(){n=h("div"),n.textContent="Loading bunker information...",A(n,"class","loading svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Mk(e){let t,n,r;function i(e,t){return e[10]?jk:Hk}let o=i(e),s=o(e),a=e[10]&&e[12].length>0&&Gk(e);return{c(){t=h("div"),s.c(),n=m(),a&&a.c(),r=y(),A(t,"class","service-actions svelte-13nqrp7")},m(e,i){u(e,t,i),s.m(t,null),u(e,n,i),a&&a.m(e,i),u(e,r,i)},p(e,n){o===(o=i(e))&&s?s.p(e,n):(s.d(1),s=o(e),s&&(s.c(),s.m(t,null))),e[10]&&e[12].length>0?a?a.p(e,n):(a=Gk(e),a.c(),a.m(r.parentNode,r)):a&&(a.d(1),a=null)},d(e){e&&d(t),s.d(),e&&d(n),a&&a.d(e),e&&d(r)}}}function _k(t){let n;return{c(){n=h("div"),n.textContent="Bunker service requires nsec login. Please log in with your private key to enable remote signing.",A(n,"class","no-privkey-warning svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Hk(e){let t,n,r,i,o=e[11]?"Starting...":"Start Service";return{c(){t=h("button"),n=g(o),A(t,"class","start-btn svelte-13nqrp7"),t.disabled=e[11]},m(o,s){u(o,t,s),c(t,n),r||(i=w(t,"click",e[19]),r=!0)},p(e,r){2048&r[0]&&o!==(o=e[11]?"Starting...":"Start Service")&&k(n,o),2048&r[0]&&(t.disabled=e[11])},d(e){e&&d(t),r=!1,i()}}}function jk(t){let n,r,i;return{c(){n=h("button"),n.textContent="Stop Service",A(n,"class","stop-btn svelte-13nqrp7")},m(e,o){u(e,n,o),r||(i=w(n,"click",t[20]),r=!0)},p:e,d(e){e&&d(n),r=!1,i()}}}function Gk(e){let t,n,r,i,o,s,a=e[12].length+"",l=e[12],p=[];for(let t=0;te[48].id;for(let t=0;tl.p(e,t)):(l=u(r,e),l.c()),w.set(r,y[g]=l),r in m&&v.set(r,Math.abs(g-m[r]))}const b=new Set,k=new Set;function I(e){W(e,1),e.m(l,d),a.set(e.key,e),d=e.first,p--}for(;h&&p;){const t=y[p-1],n=e[h-1],r=t.key,i=n.key;t===n?(d=t.first,h--,p--):w.has(i)?!a.has(r)||b.has(r)?I(t):k.has(i)?h--:v.get(r)>v.get(i)?(k.add(r),I(t)):(b.add(i),h--):(c(n,a),h--)}for(;h--;){const t=e[h];w.has(t.key)||c(t,a)}for(;p;)I(y[p-1]);return r(A),y}(v,t,I,1,e,k,b,p,ee,Wk,null,Qk))},d(e){e&&d(t);for(let e=0;et,r.anchor=null},p(t,i){e=t,r.ctx=e,64&i[0]&&n!==(n=e[18](e[48]))&&X(n,r)||function(e,t,n){const r=t.slice(),{resolved:i}=e;e.current===e.then&&(r[e.value]=i),e.current===e.catch&&(r[e.error]=i),e.block.p(r,n)}(r,e,i)},d(e){e&&d(t),r.block.d(),r.token=null,r=null}}}function Vk(t){let n;return{c(){n=h("div"),n.textContent="Failed to generate QR",A(n,"class","error-message svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Yk(e){let t,n,i,o,s,l,f,p,y,v,b,I,E,C,x,S,F,Q,D,R,P,$,U,T,N,L,O,M,_,H=new Date(e[48].createdAt).toLocaleString()+"",j=new Date(1e3*e[48].token.expiry).toLocaleString()+"",G=`bunker://${e[1]}?relay=${encodeURIComponent(e[4].relay_url)}${e[5]?`&secret=${e[5]}`:""}&cat=${e[48].encoded}`;function q(){return e[35](e[48])}function K(...t){return e[36](e[48],...t)}return{c(){t=h("div"),n=h("div"),i=h("img"),s=m(),l=h("div"),l.textContent="Copied!",f=m(),p=h("div"),y=h("div"),v=h("span"),v.textContent="Created:",b=m(),I=h("span"),E=g(H),C=m(),x=h("div"),S=h("span"),S.textContent="Expires:",F=m(),Q=h("span"),D=g(j),R=m(),P=h("div"),$=h("span"),$.textContent="Bunker URL:",U=m(),T=h("code"),N=g(G),L=m(),O=h("div"),O.textContent="Click QR code to copy URL",a(i.src,o=e[51])||A(i,"src",o),A(i,"alt","Token QR Code"),A(i,"class","qr-code small svelte-13nqrp7"),A(l,"class","qr-overlay svelte-13nqrp7"),B(l,"visible",e[9]===e[48].id),A(n,"class","qr-container small clickable svelte-13nqrp7"),A(n,"role","button"),A(n,"tabindex","0"),A(n,"title","Click to copy bunker URL"),A(v,"class","label svelte-13nqrp7"),A(y,"class","info-item svelte-13nqrp7"),A(S,"class","label svelte-13nqrp7"),A(x,"class","info-item svelte-13nqrp7"),A($,"class","label svelte-13nqrp7"),A(T,"class","bunker-url small svelte-13nqrp7"),A(P,"class","info-item url-item svelte-13nqrp7"),A(O,"class","copy-hint svelte-13nqrp7"),A(p,"class","token-info svelte-13nqrp7"),A(t,"class","token-detail-content svelte-13nqrp7")},m(e,r){u(e,t,r),c(t,n),c(n,i),c(n,s),c(n,l),c(t,f),c(t,p),c(p,y),c(y,v),c(y,b),c(y,I),c(I,E),c(p,C),c(p,x),c(x,S),c(x,F),c(x,Q),c(Q,D),c(p,R),c(p,P),c(P,$),c(P,U),c(P,T),c(T,N),c(p,L),c(p,O),M||(_=[w(n,"click",q),w(n,"keypress",K)],M=!0)},p(t,n){e=t,64&n[0]&&!a(i.src,o=e[51])&&A(i,"src",o),576&n[0]&&B(l,"visible",e[9]===e[48].id),64&n[0]&&H!==(H=new Date(e[48].createdAt).toLocaleString()+"")&&k(E,H),64&n[0]&&j!==(j=new Date(1e3*e[48].token.expiry).toLocaleString()+"")&&k(D,j),114&n[0]&&G!==(G=`bunker://${e[1]}?relay=${encodeURIComponent(e[4].relay_url)}${e[5]?`&secret=${e[5]}`:""}&cat=${e[48].encoded}`)&&k(N,G)},d(e){e&&d(t),M=!1,r(_)}}}function zk(t){let n;return{c(){n=h("div"),n.textContent="Loading QR...",A(n,"class","qr-placeholder small svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Wk(e,t){let n,i,o,s,a,l,f,p,y,b,I,E,C,x,S,F,Q,D,R,P,$=t[48].isExpanded?"▼":"▶",U=new Date(t[48].createdAt).toLocaleDateString()+"",T=new Date(1e3*t[48].token.expiry).toLocaleDateString()+"";function N(...e){return t[31](t[48],...e)}function L(){return t[32](t[48])}function O(){return t[33](t[48])}function M(...e){return t[34](t[48],...e)}let _=t[48].isExpanded&&Jk(t);return{key:e,first:null,c(){n=h("div"),i=h("div"),o=h("span"),s=g($),a=m(),l=h("input"),p=m(),y=h("span"),b=g(U),I=m(),E=h("span"),C=g("Expires: "),x=g(T),S=m(),F=h("button"),F.textContent="Revoke",Q=m(),_&&_.c(),D=m(),A(o,"class","expand-icon svelte-13nqrp7"),A(l,"type","text"),A(l,"class","token-name-input svelte-13nqrp7"),l.value=f=t[48].name,A(l,"placeholder","Token name"),A(y,"class","token-created svelte-13nqrp7"),A(E,"class","token-expiry svelte-13nqrp7"),A(F,"class","revoke-btn svelte-13nqrp7"),A(F,"title","Revoke this token"),A(i,"class","token-main svelte-13nqrp7"),A(i,"role","button"),A(i,"tabindex","0"),A(n,"class","token-row svelte-13nqrp7"),B(n,"expanded",t[48].isExpanded),this.first=n},m(e,r){u(e,n,r),c(n,i),c(i,o),c(o,s),c(i,a),c(i,l),c(i,p),c(i,y),c(y,b),c(i,I),c(i,E),c(E,C),c(E,x),c(i,S),c(i,F),c(n,Q),_&&_.m(n,null),c(n,D),R||(P=[w(l,"input",N),w(l,"click",v(t[30])),w(F,"click",v(L)),w(i,"click",O),w(i,"keypress",M)],R=!0)},p(e,r){t=e,64&r[0]&&$!==($=t[48].isExpanded?"▼":"▶")&&k(s,$),64&r[0]&&f!==(f=t[48].name)&&l.value!==f&&(l.value=f),64&r[0]&&U!==(U=new Date(t[48].createdAt).toLocaleDateString()+"")&&k(b,U),64&r[0]&&T!==(T=new Date(1e3*t[48].token.expiry).toLocaleDateString()+"")&&k(x,T),t[48].isExpanded?_?_.p(t,r):(_=Jk(t),_.c(),_.m(n,D)):_&&(_.d(1),_=null),64&r[0]&&B(n,"expanded",t[48].isExpanded)},d(e){e&&d(n),_&&_.d(),R=!1,r(P)}}}function Zk(t){let n;function r(e,t){return e[4]?.available?e[13]?$k:e[0]?Pk:Rk:Uk}let i=r(t),o=i(t);return{c(){o.c(),n=y()},m(e,t){o.m(e,t),u(e,n,t)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n.parentNode,n)))},i:e,o:e,d(e){o.d(e),e&&d(n)}}}function Xk(){const e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,"0")).join("")}function eI(e,t,n){let r,i,o,s,{isLoggedIn:a=!1}=t,{userPubkey:l=""}=t,{userSigner:c=null}=t,{userPrivkey:u=null}=t,{currentEffectiveRole:d=""}=t;const f=P();let h=null,p=!1,g="",m="",y="",w=null,v=!1,A=!1,b=[],k=null,I=[],E=null;const C=["brave","calm","clever","cosmic","cozy","daring","eager","fancy","gentle","happy","jolly","keen","lively","merry","nimble","peppy","quick","rustic","shiny","swift","tender","vivid","witty","zesty"],x=["badger","bunny","coral","dolphin","falcon","gecko","heron","iguana","jaguar","koala","lemur","mango","narwhal","otter","panda","quail","rabbit","salmon","turtle","urchin","viper","walrus","yak","zebra"];async function B(e,t){const r=await bk(e.mintUrl,yk,Vu(l),t,[24133]),i=Ak(r),o=crypto.randomUUID().split("-")[0],s={id:o,name:`${C[Math.floor(Math.random()*C.length)]}-${x[Math.floor(Math.random()*x.length)]}`,token:r,encoded:i,createdAt:Date.now(),isExpanded:!1};return n(6,I=[...I,s]),E||n(26,E=o),console.log(`Client token "${s.name}" created, expires:`,new Date(1e3*r.expiry).toISOString()),s}function S(e){n(6,I=I.filter(t=>t.id!==e)),E===e&&n(26,E=I.length>0?I[0].id:null),T()}function F(e){n(6,I=I.map(t=>t.id===e?{...t,isExpanded:!t.isExpanded}:t))}function Q(e,t){n(6,I=I.map(n=>n.id===e?{...n,name:t}:n))}async function U(){n(7,p=!0),n(8,g="");try{n(4,h=await async function(){const e=`${window.location.origin}/api/bunker/info`,t=await fetch(e);if(!t.ok){const e=await t.text();throw new Error(e||`Failed to get bunker info: ${t.statusText}`)}return await t.json()}()),y||n(5,y=Xk()),await T()}catch(e){console.error("Error loading bunker info:",e),n(8,g=e.message||"Failed to load bunker information")}finally{n(7,p=!1)}}async function T(){o&&await ov.toDataURL(o,{width:280,margin:2,color:{dark:"#000000",light:"#ffffff"}}),s&&await ov.toDataURL(s,{width:280,margin:2,color:{dark:"#000000",light:"#ffffff"}})}function N(e,t){navigator.clipboard.writeText(e),n(9,m=t),setTimeout(()=>{n(9,m="")},2e3)}D(async()=>{await U()}),R(()=>{w&&(w.disconnect(),w=null,n(10,v=!1))});return e.$$set=e=>{"isLoggedIn"in e&&n(0,a=e.isLoggedIn),"userPubkey"in e&&n(1,l=e.userPubkey),"userSigner"in e&&n(25,c=e.userSigner),"userPrivkey"in e&&n(2,u=e.userPrivkey),"currentEffectiveRole"in e&&n(3,d=e.currentEffectiveRole)},e.$$.update=()=>{11&e.$$.dirty[0]&&n(13,r=a&&l&&("write"===d||"admin"===d||"owner"===d)),67108928&e.$$.dirty[0]&&n(29,i=I.find(e=>e.id===E)),536870962&e.$$.dirty[0]&&n(28,o=h&&l&&i?`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${i.encoded}`:""),16&e.$$.dirty[0]&&n(27,s=h?`nostr+connect://${h.relay_url}`:""),402653184&e.$$.dirty[0]&&(o||s)&&T()},[a,l,u,d,h,y,I,p,g,m,v,A,b,r,async function(){if(h?.cashu_enabled)try{const e=await kk(h.relay_url);if(!e)return;const t=async(e,t)=>`Nostr ${await $A(c,l,t,e)}`;await B(e,t),await T()}catch(e){console.error("Failed to add token:",e),n(8,g=e.message||"Failed to add token")}},S,F,Q,async function(e){if(!h||!l)return null;const t=`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`;return await ov.toDataURL(t,{width:200,margin:2,color:{dark:"#000000",light:"#ffffff"}})},async function(){if(u&&l&&h){n(11,A=!0),n(8,g="");try{if(h.cashu_enabled){console.log("CAT required, minting tokens...");const e=await kk(h.relay_url);if(e){const t=async(e,t)=>`Nostr ${await $A(c,l,t,e)}`;k=await bk(e.mintUrl,yk,Vu(l),t,[24133]),console.log("Service CAT token acquired, expires:",new Date(1e3*k.expiry).toISOString()),await B(e,t)}}w=new Fk(h.relay_url,l,u),y&&w.addAllowedSecret(y),k&&w.setCatToken(k),w.onClientConnected=e=>{n(12,b=w.getConnectedClients())},w.onStatusChange=e=>{n(10,v="connected"===e),"disconnected"===e&&n(12,b=[])},await w.connect(),n(10,v=!0),await T(),console.log("Bunker service started successfully")}catch(e){console.error("Failed to start bunker service:",e),n(8,g=e.message||"Failed to start bunker service"),w=null,n(10,v=!1),catToken=null,catTokenEncoded=""}finally{n(11,A=!1)}}else n(8,g="Missing private key or bunker info")},function(){w&&(w.disconnect(),w=null),n(10,v=!1),n(12,b=[]),k=null,n(6,I=[]),n(26,E=null),T()},U,async function(){n(5,y=Xk()),await T()},N,function(){f("openLoginModal")},c,E,s,o,i,function(t){$.call(this,e,t)},(e,t)=>Q(e.id,t.target.value),e=>S(e.id),e=>F(e.id),(e,t)=>"Enter"===t.key&&F(e.id),e=>{N(`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`,e.id)},(e,t)=>{if("Enter"===t.key){N(`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`,e.id)}},()=>N(h.relay_url,"relay")]}class tI extends ae{constructor(e){super(),se(this,e,eI,Zk,o,{isLoggedIn:0,userPubkey:1,userSigner:25,userPrivkey:2,currentEffectiveRole:3},null,[-1,-1])}}function nI(e,t,n){const r=e.slice();return r[29]=t[n],r}function rI(e,t,n){const r=e.slice();return r[32]=t[n],r}function iI(e){let t,n,r;function i(e,t){return e[0]?sI:aI}let o=i(e),s=o(e);return{c(){t=h("div"),n=h("p"),n.textContent="Log viewer is only available to relay owners.",r=m(),s.c(),A(n,"class","svelte-w6h7aj"),A(t,"class","login-prompt svelte-w6h7aj")},m(e,i){u(e,t,i),c(t,n),c(t,r),s.m(t,null)},p(e,n){o===(o=i(e))&&s?s.p(e,n):(s.d(1),s=o(e),s&&(s.c(),s.m(t,null)))},d(e){e&&d(t),s.d()}}}function oI(e){let t,n,i,o,s,a,l,p,y,v,b,I,E,x,B,S,F,Q,D,R,P,$,U,T,N,L,O,M,H,j,G,q=e[3]?"Loading...":"Refresh",K=e[2].length+"",J=e[12],V=[];for(let t=0;te[18].call(y)),A(a,"class","level-selector svelte-w6h7aj"),A(b,"class","clear-btn svelte-w6h7aj"),b.disabled=E=e[3]||0===e[2].length,A(B,"class","refresh-btn svelte-w6h7aj"),B.disabled=e[3],A(s,"class","header-controls svelte-w6h7aj"),A(n,"class","header-section svelte-w6h7aj"),A(R,"class","log-info svelte-w6h7aj"),A(H,"class","log-list svelte-w6h7aj"),A(t,"class","log-view svelte-w6h7aj")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(a,p),c(a,y);for(let e=0;eNo logs available.

",A(n,"class","empty-state svelte-w6h7aj")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function fI(e){let t,n,r,i,o=e[29].file+"",s=e[29].line+"";return{c(){t=h("span"),n=g(o),r=g(":"),i=g(s),A(t,"class","log-location svelte-w6h7aj")},m(e,o){u(e,t,o),c(t,n),c(t,r),c(t,i)},p(e,t){4&t[0]&&o!==(o=e[29].file+"")&&k(n,o),4&t[0]&&s!==(s=e[29].line+"")&&k(i,s)},d(e){e&&d(t)}}}function hI(e){let t,n,r,i,o,s,a,l,f,p,y,w=wI(e[29].timestamp)+"",v=e[29].level+"",b=e[29].message+"",I=e[29].file&&fI(e);return{c(){t=h("div"),n=h("span"),r=g(w),i=m(),o=h("span"),s=g(v),l=m(),I&&I.c(),f=m(),p=h("span"),y=g(b),A(n,"class","log-timestamp svelte-w6h7aj"),A(o,"class",a="log-level "+vI(e[29].level)+" svelte-w6h7aj"),A(p,"class","log-message svelte-w6h7aj"),A(t,"class","log-entry svelte-w6h7aj")},m(e,a){u(e,t,a),c(t,n),c(n,r),c(t,i),c(t,o),c(o,s),c(t,l),I&&I.m(t,null),c(t,f),c(t,p),c(p,y)},p(e,n){4&n[0]&&w!==(w=wI(e[29].timestamp)+"")&&k(r,w),4&n[0]&&v!==(v=e[29].level+"")&&k(s,v),4&n[0]&&a!==(a="log-level "+vI(e[29].level)+" svelte-w6h7aj")&&A(o,"class",a),e[29].file?I?I.p(e,n):(I=fI(e),I.c(),I.m(t,f)):I&&(I.d(1),I=null),4&n[0]&&b!==(b=e[29].message+"")&&k(y,b)},d(e){e&&d(t),I&&I.d()}}}function pI(e){let t;return{c(){t=h("span"),t.textContent="End of logs"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function gI(e){let t;return{c(){t=h("span"),t.textContent="Scroll for more"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function mI(e){let t;return{c(){t=h("span"),t.textContent="Loading more..."},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function yI(t){let n;function r(e,t){return e[4]?oI:iI}let i=r(t),o=i(t);return{c(){o.c(),n=y()},m(e,t){o.m(e,t),u(e,n,t)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n.parentNode,n)))},i:e,o:e,d(e){o.d(e),e&&d(n)}}}function wI(e){if(!e)return"";return new Date(e).toLocaleString()}function vI(e){switch(e?.toUpperCase()){case"TRC":case"TRACE":return"level-trace";case"DBG":case"DEBUG":return"level-debug";case"INF":case"INFO":default:return"level-info";case"WRN":case"WARN":return"level-warn";case"ERR":case"ERROR":return"level-error";case"FTL":case"FATAL":return"level-fatal"}}function AI(e,t,n){let r,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{userSigner:s=null}=t;const a=P();let l=[],c=!1,u=!0,d=0,f=0,h="",p="info",g="info";const m=["trace","debug","info","warn","error","fatal"];let y,w,v;async function A(e="GET",t="/api/logs"){if(!s)return null;try{const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",`${window.location.origin}${t}`],["method",e]],content:""},r=await s.signEvent(n);return btoa(JSON.stringify(r)).replace(/\+/g,"-").replace(/\//g,"_")}catch(e){return console.error("Error creating auth header:",e),null}}async function b(e=!1){if(!c){n(3,c=!0),n(7,h=""),e&&(d=0,n(2,l=[]));try{const t=`/api/logs?offset=${d}&limit=100`,r=await A("GET",t),i=`${window.location.origin}${t}`,o=await fetch(i,{headers:r?{Authorization:`Nostr ${r}`}:{}});if(!o.ok)throw new Error(`Failed to load logs: ${o.statusText}`);const s=await o.json();n(2,l=e?s.logs||[]:[...l,...s.logs||[]]),n(6,f=s.total||0),n(5,u=s.has_more||!1),d=l.length}catch(e){console.error("Error loading logs:",e),n(7,h=e.message||"Failed to load logs")}finally{n(3,c=!1)}}}async function k(){try{const e=await fetch(`${window.location.origin}/api/logs/level`);if(e.ok){const t=await e.json();n(8,p=t.level||"info"),n(9,g=p)}}catch(e){console.error("Error loading log level:",e)}}D(()=>{r&&(b(!0),k(),function(){if(!w)return;v=new IntersectionObserver(e=>{e[0].isIntersecting&&u&&!c&&u&&!c&&b(!1)},{threshold:.1}),v.observe(w)}())}),R(()=>{v&&v.disconnect()});return e.$$set=e=>{"isLoggedIn"in e&&n(0,i=e.isLoggedIn),"userRole"in e&&n(1,o=e.userRole),"userSigner"in e&&n(17,s=e.userSigner)},e.$$.update=()=>{3&e.$$.dirty[0]&&n(4,r=i&&"owner"===o),28&e.$$.dirty[0]&&r&&0===l.length&&!c&&(b(!0),k())},[i,o,l,c,r,u,f,h,p,g,y,w,m,b,async function(){if(g!==p)try{const e=await A("POST","/api/logs/level"),t=await fetch(`${window.location.origin}/api/logs/level`,{method:"POST",headers:{"Content-Type":"application/json",...e?{Authorization:`Nostr ${e}`}:{}},body:JSON.stringify({level:g})});if(!t.ok)throw new Error(`Failed to set log level: ${t.statusText}`);const r=await t.json();n(8,p=r.level),n(9,g=p)}catch(e){console.error("Error setting log level:",e),n(7,h=e.message||"Failed to set log level"),n(9,g=p)}},async function(){if(confirm("Are you sure you want to clear all logs?"))try{const e=await A("POST","/api/logs/clear"),t=await fetch(`${window.location.origin}/api/logs/clear`,{method:"POST",headers:e?{Authorization:`Nostr ${e}`}:{}});if(!t.ok)throw new Error(`Failed to clear logs: ${t.statusText}`);n(2,l=[]),d=0,n(5,u=!1),n(6,f=0)}catch(e){console.error("Error clearing logs:",e),n(7,h=e.message||"Failed to clear logs")}},function(){a("openLoginModal")},s,function(){g=x(this),n(9,g),n(12,m)},()=>b(!0),function(e){T[e?"unshift":"push"](()=>{w=e,n(11,w)})},function(e){T[e?"unshift":"push"](()=>{y=e,n(10,y)})}]}class bI extends ae{constructor(e){super(),se(this,e,AI,yI,o,{isLoggedIn:0,userRole:1,userSigner:17},null,[-1,-1])}}function kI(e){let t,n,r,i,o,s,a,l,f,p,y;return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Active Filter",i=m(),o=h("button"),o.textContent="🧹 Sweep",s=m(),a=h("div"),l=h("pre"),f=g(e[2]),A(r,"class","svelte-1tyqaa5"),A(o,"class","sweep-btn svelte-1tyqaa5"),A(o,"title","Clear filter"),A(n,"class","filter-display-header svelte-1tyqaa5"),A(l,"class","filter-json svelte-1tyqaa5"),A(a,"class","filter-json-container svelte-1tyqaa5"),A(t,"class","filter-display svelte-1tyqaa5")},m(d,h){u(d,t,h),c(t,n),c(n,r),c(n,i),c(n,o),c(t,s),c(t,a),c(a,l),c(l,f),p||(y=w(o,"click",e[3]),p=!0)},p(e,t){4&t&&k(f,e[2])},d(e){e&&d(t),p=!1,y()}}}function II(t){let n,r=t[0]&&t[1]&&kI(t);return{c(){r&&r.c(),n=y()},m(e,t){r&&r.m(e,t),u(e,n,t)},p(e,[t]){e[0]&&e[1]?r?r.p(e,t):(r=kI(e),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:e,o:e,d(e){r&&r.d(e),e&&d(n)}}}function EI(e,t,n){let r,i;const o=P();let{filter:s={}}=t,{showFilter:a=!0}=t;return e.$$set=e=>{"filter"in e&&n(4,s=e.filter),"showFilter"in e&&n(0,a=e.showFilter)},e.$$.update=()=>{16&e.$$.dirty&&n(2,r=function(e){return JSON.stringify(e,null,2)}(s)),16&e.$$.dirty&&n(1,i=Object.keys(s).length>0)},[a,i,r,function(){o("sweep")},s]}class CI extends ae{constructor(e){super(),se(this,e,EI,II,o,{filter:4,showFilter:0})}}function xI(e){return Bh[e]||`Kind ${e}`}function BI(e){return e?e.slice(0,8)+"..."+e.slice(-8):"unknown"}function SI(e,t=100){return e?e.length>t?e.slice(0,t)+"...":e:""}function FI(e){return e?new Date(1e3*e).toLocaleString():""}class QI{constructor(e,t,n){this.relayUrl=e,this.userSigner=t,this.userPubkey=n,this.ws=null,this.challenge=null,this.isAuthenticated=!1,this.authPromise=null}async connect(){return new Promise((e,t)=>{this.ws=new WebSocket(this.relayUrl),this.ws.onopen=()=>{console.log("WebSocket connected to relay:",this.relayUrl),e()},this.ws.onmessage=async e=>{try{const t=JSON.parse(e.data);await this.handleMessage(t)}catch(e){console.error("Error parsing relay message:",e)}},this.ws.onerror=e=>{console.error("WebSocket error:",e),t(new Error("Failed to connect to relay"))},this.ws.onclose=()=>{console.log("WebSocket connection closed"),this.isAuthenticated=!1,this.challenge=null},setTimeout(()=>{this.ws.readyState!==WebSocket.OPEN&&t(new Error("Connection timeout"))},1e4)})}async handleMessage(e){const[t,...n]=e;switch(t){case"AUTH":this.challenge=n[0],console.log("Received AUTH challenge:",this.challenge),await this.authenticate();break;case"OK":const[e,r,i]=n;e&&r?(console.log("Authentication successful for event:",e),this.isAuthenticated=!0,this.authPromise&&(this.authPromise.resolve(),this.authPromise=null)):e&&!r&&(console.error("Authentication failed:",i),this.authPromise&&(this.authPromise.reject(new Error(i||"Authentication failed")),this.authPromise=null));break;case"NOTICE":console.log("Relay notice:",n[0]);break;default:console.log("Unhandled message type:",t,n)}}async authenticate(){if(!this.challenge)throw new Error("No challenge received from relay");if(!this.userSigner)throw new Error("No signer available for authentication");try{const e={kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",this.relayUrl],["challenge",this.challenge]],content:"",pubkey:this.userPubkey},t=["AUTH",await this.userSigner.signEvent(e)];return this.ws.send(JSON.stringify(t)),console.log("Sent authentication event to relay"),new Promise((e,t)=>{this.authPromise={resolve:e,reject:t},setTimeout(()=>{this.authPromise&&(this.authPromise.reject(new Error("Authentication timeout")),this.authPromise=null)},1e4)})}catch(e){throw console.error("Authentication error:",e),e}}async publishEvent(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");return new Promise((t,n)=>{const r=["EVENT",e];this.ws.send(JSON.stringify(r));const i=this.ws.onmessage,o=setTimeout(()=>{this.ws.onmessage=i,n(new Error("Publish timeout"))},15e3);this.ws.onmessage=async r=>{try{const s=JSON.parse(r.data),[a,l,c,u]=s;if("OK"===a&&l===e.id)if(c)clearTimeout(o),this.ws.onmessage=i,console.log("Event published successfully:",l),t({success:!0,eventId:l,reason:u});else{if(console.error("Event publish failed:",u),u&&u.includes("auth-required"))return void console.log("Authentication required, waiting for AUTH challenge...");clearTimeout(o),this.ws.onmessage=i,n(new Error(`Publish failed: ${u}`))}else if("AUTH"===a){this.challenge=s[1],console.log("Received AUTH challenge during publish:",this.challenge);try{await this.authenticate(),console.log("Authentication successful, retrying event publish...");const t=["EVENT",e];this.ws.send(JSON.stringify(t))}catch(e){clearTimeout(o),this.ws.onmessage=i,n(new Error(`Authentication failed: ${e.message}`))}}else await this.handleMessage(s)}catch(e){clearTimeout(o),this.ws.onmessage=i,n(e)}}})}close(){this.ws&&(this.ws.close(),this.ws=null),this.isAuthenticated=!1,this.challenge=null}getAuthenticated(){return this.isAuthenticated}}async function DI(e,t,n,r){const i=new QI(e,n,r);try{await i.connect();return await i.publishEvent(t)}finally{i.close()}}function RI(e,t,n){const r=e.slice();return r[170]=t[n],r}function PI(e,t,n){const r=e.slice();return r[180]=t[n],r}function $I(e,t,n){const r=e.slice();return r[173]=t[n],r}function UI(e,t,n){const r=e.slice();r[173]=t[n];const i=r[53](r[173]);return r[174]=i,r}function TI(e,t,n){const r=e.slice();return r[177]=t[n],r}function NI(t){let n;function r(e,t){return e[1]?WI:zI}let i=r(t),o=i(t);return{c(){n=h("div"),o.c(),A(n,"class","welcome-message svelte-u3u5mw")},m(e,t){u(e,n,t),o.m(n,null)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n,null)))},i:e,o:e,d(e){e&&d(n),o.d()}}}function LI(e){let t,n,r=e[6],i=[];for(let t=0;tZ(i[e],1,1,()=>{i[e]=null});return{c(){for(let e=0;e=0||""!==t[37]&&parseInt(t[37])>=0,P=xh,$=[];for(let e=0;eEvent Recovery \n

Search and recover old versions of replaceable events

',o=m(),s=h("div"),a=h("div"),l=h("div"),p=h("label"),p.textContent="Select Event Kind:",g=m(),y=h("select"),v=h("option"),v.textContent="Choose a replaceable kind...";for(let e=0;e<$.length;e+=1)$[e].c();k=m(),E=h("div"),x=h("label"),x.textContent="Or enter custom kind number:",B=m(),S=h("input"),F=m(),U&&U.c(),A(p,"for","recovery-kind"),A(p,"class","svelte-u3u5mw"),v.__value=null,v.value=v.__value,A(y,"id","recovery-kind"),A(y,"class","svelte-u3u5mw"),void 0===t[36]&&_(()=>t[116].call(y)),A(l,"class","kind-selector svelte-u3u5mw"),A(x,"for","custom-kind"),A(x,"class","svelte-u3u5mw"),A(S,"id","custom-kind"),A(S,"type","number"),A(S,"placeholder","e.g., 10001"),A(S,"min","0"),A(S,"class","svelte-u3u5mw"),A(E,"class","custom-kind-input svelte-u3u5mw"),A(a,"class","recovery-controls svelte-u3u5mw"),A(s,"class","recovery-controls-card svelte-u3u5mw"),A(n,"class","recovery-tab svelte-u3u5mw")},m(e,r){u(e,n,r),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(l,p),c(l,g),c(l,y),c(y,v);for(let e=0;e<$.length;e+=1)$[e]&&$[e].m(y,null);C(y,t[36],!0),c(a,k),c(a,E),c(E,x),c(E,B),c(E,S),I(S,t[37]),c(n,F),U&&U.m(n,null),Q||(D=[w(y,"change",t[116]),w(y,"change",t[51]),w(S,"input",t[117]),w(S,"input",t[52])],Q=!0)},p(e,t){if(0&t){let n;for(P=xh,n=0;n=0||""!==e[37]&&parseInt(e[37])>=0),R?U?U.p(e,t):(U=lE(e),U.c(),U.m(n,null)):U&&(U.d(1),U=null)},i:e,o:e,d(e){e&&d(n),f($,e),U&&U.d(),Q=!1,r(D)}}}function MI(e){let t,n;return t=new bI({props:{isLoggedIn:e[1],userRole:e[4],userSigner:e[13]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),16&n[0]&&(r.userRole=e[4]),8192&n[0]&&(r.userSigner=e[13]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function _I(e){let t,n,r;function i(t){e[115](t)}let o={isLoggedIn:e[1],userRole:e[4],isPolicyAdmin:RE,policyEnabled:e[8],isLoadingPolicy:e[28],policyMessage:e[29],policyMessageType:e[30],validationErrors:e[31],policyFollows:e[32]};return void 0!==e[27]&&(o.policyJson=e[27]),t=new uw({props:o}),T.push(()=>te(t,"policyJson",i)),t.$on("loadPolicy",e[61]),t.$on("validatePolicy",e[62]),t.$on("savePolicy",e[63]),t.$on("formatJson",e[64]),t.$on("addPolicyAdmin",e[65]),t.$on("removePolicyAdmin",e[66]),t.$on("refreshFollows",e[67]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),256&r[0]&&(i.policyEnabled=e[8]),268435456&r[0]&&(i.isLoadingPolicy=e[28]),536870912&r[0]&&(i.policyMessage=e[29]),1073741824&r[0]&&(i.policyMessageType=e[30]),1&r[1]&&(i.validationErrors=e[31]),2&r[1]&&(i.policyFollows=e[32]),!n&&134217728&r[0]&&(n=!0,i.policyJson=e[27],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function HI(e){let t,n,r;function i(t){e[112](t)}let o={isLoggedIn:e[1],userRole:e[4],sprocketStatus:e[21],isLoadingSprocket:e[23],sprocketUploadFile:e[26],sprocketMessage:e[24],sprocketMessageType:e[25],sprocketVersions:e[22]};return void 0!==e[20]&&(o.sprocketScript=e[20]),t=new qy({props:o}),T.push(()=>te(t,"sprocketScript",i)),t.$on("restartSprocket",e[56]),t.$on("deleteSprocket",e[57]),t.$on("sprocketFileSelect",e[68]),t.$on("uploadSprocketScript",e[69]),t.$on("saveSprocket",e[55]),t.$on("loadSprocket",e[54]),t.$on("loadVersions",e[58]),t.$on("loadVersion",e[113]),t.$on("deleteVersion",e[114]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),2097152&r[0]&&(i.sprocketStatus=e[21]),8388608&r[0]&&(i.isLoadingSprocket=e[23]),67108864&r[0]&&(i.sprocketUploadFile=e[26]),16777216&r[0]&&(i.sprocketMessage=e[24]),33554432&r[0]&&(i.sprocketMessageType=e[25]),4194304&r[0]&&(i.sprocketVersions=e[22]),!n&&1048576&r[0]&&(n=!0,i.sprocketScript=e[20],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function jI(e){let t,n,r,i;const o=[vE,wE,yE],s=[];function a(e,t){return"managed"!==e[9]?0:e[1]&&"owner"===e[4]?1:2}return n=a(e),r=s[n]=o[n](e),{c(){t=h("div"),r.c(),A(t,"class","managed-acl-view svelte-u3u5mw")},m(e,r){u(e,t,r),s[n].m(t,null),i=!0},p(e,i){let l=n;n=a(e),n===l?s[n].p(e,i):(Y(),Z(s[l],1,1,()=>{s[l]=null}),z(),r=s[n],r?r.p(e,i):(r=s[n]=o[n](e),r.c()),W(r,1),r.m(t,null))},i(e){i||(W(r),i=!0)},o(e){Z(r),i=!1},d(e){e&&d(t),s[n].d()}}}function GI(e){let t,n,r;function i(t){e[111](t)}let o={userPubkey:e[2],userRole:e[4],policyEnabled:e[8],publishError:e[35]};return void 0!==e[34]&&(o.composeEventJson=e[34]),t=new Py({props:o}),T.push(()=>te(t,"composeEventJson",i)),t.$on("reformatJson",e[91]),t.$on("signEvent",e[92]),t.$on("publishEvent",e[93]),t.$on("clearError",e[94]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};4&r[0]&&(i.userPubkey=e[2]),16&r[0]&&(i.userRole=e[4]),256&r[0]&&(i.policyEnabled=e[8]),16&r[1]&&(i.publishError=e[35]),!n&&8&r[1]&&(n=!0,i.composeEventJson=e[34],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function qI(e){let t,n;return t=new tI({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],userPrivkey:e[14],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),4&n[0]&&(r.userPubkey=e[2]),8192&n[0]&&(r.userSigner=e[13]),16384&n[0]&&(r.userPrivkey=e[14]),1024&n[0]&&(r.currentEffectiveRole=e[10]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function KI(e){let t,n;return t=new iv({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),4&n[0]&&(r.userPubkey=e[2]),8192&n[0]&&(r.userSigner=e[13]),1024&n[0]&&(r.currentEffectiveRole=e[10]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function JI(e){let t,n;return t=new hy({props:{isLoggedIn:e[1],userRole:e[4],userPubkey:e[2],filteredEvents:e[42],expandedEvents:e[19],isLoadingEvents:e[7],showOnlyMyEvents:DE,showFilterBuilder:e[16]}}),t.$on("scroll",e[90]),t.$on("toggleEventExpansion",e[107]),t.$on("deleteEvent",e[108]),t.$on("copyEventToClipboard",e[109]),t.$on("toggleChange",e[46]),t.$on("loadAllEvents",e[110]),t.$on("toggleFilterBuilder",e[77]),t.$on("filterApply",e[78]),t.$on("filterClear",e[79]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),16&n[0]&&(r.userRole=e[4]),4&n[0]&&(r.userPubkey=e[2]),2048&n[1]&&(r.filteredEvents=e[42]),524288&n[0]&&(r.expandedEvents=e[19]),128&n[0]&&(r.isLoadingEvents=e[7]),65536&n[0]&&(r.showFilterBuilder=e[16]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function VI(e){let t,n;return t=new hm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],selectedFile:e[17],aclMode:e[9],importMessage:e[18]}}),t.$on("fileSelect",e[87]),t.$on("importEvents",e[88]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),131072&n[0]&&(r.selectedFile=e[17]),512&n[0]&&(r.aclMode=e[9]),262144&n[0]&&(r.importMessage=e[18]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function YI(e){let t,n;return t=new sm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],aclMode:e[9]}}),t.$on("exportMyEvents",e[86]),t.$on("exportAllEvents",e[85]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),512&n[0]&&(r.aclMode=e[9]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function zI(t){let n;return{c(){n=h("p"),n.textContent="Log in to access your user dashboard",A(n,"class","svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function WI(e){let t,n,r,i=(e[3]?.name||e[2].slice(0,8)+"...")+"";return{c(){t=h("p"),n=g("Welcome "),r=g(i),A(t,"class","svelte-u3u5mw")},m(e,i){u(e,t,i),c(t,n),c(t,r)},p(e,t){12&t[0]&&i!==(i=(e[3]?.name||e[2].slice(0,8)+"...")+"")&&k(r,i)},d(e){e&&d(t)}}}function ZI(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,B,S,F,Q,D,R=e[180].label+"",P=e[43].get(e[180].id)?.isLoading,$=!e[43].get(e[180].id)?.hasMore&&e[43].get(e[180].id)?.events?.length>0;function U(){return e[121](e[180])}function T(e,t){return 64&t[0]&&(E=null),64&t[0]&&(C=null),null==E&&(E=!!(e[43].get(e[180].id)?.events?.length>0)),E?eE:(null==C&&(C=!e[43].get(e[180].id)?.isLoading),C?XI:void 0)}v=new CI({props:{filter:e[43].get(e[180].id)?.filter||{}}}),v.$on("sweep",function(){return e[122](e[180])});let N=T(e,[-1,-1,-1,-1,-1,-1]),L=N&&N(e),O=P&&iE(),M=$&&oE();function _(...t){return e[127](e[180],...t)}return{c(){t=h("div"),n=h("div"),i=h("h2"),o=g("🔍 "),s=g(R),a=m(),l=h("button"),f=g("🔄 Refresh"),y=m(),ne(v.$$.fragment),b=m(),I=h("div"),L&&L.c(),x=m(),O&&O.c(),B=m(),M&&M.c(),S=m(),A(i,"class","svelte-u3u5mw"),A(l,"class","refresh-btn svelte-u3u5mw"),l.disabled=p=e[43].get(e[180].id)?.isLoading,A(n,"class","search-results-header svelte-u3u5mw"),A(I,"class","search-results-content svelte-u3u5mw"),A(t,"class","search-results-view svelte-u3u5mw")},m(e,r){u(e,t,r),c(t,n),c(n,i),c(i,o),c(i,s),c(n,a),c(n,l),c(l,f),c(t,y),re(v,t,null),c(t,b),c(t,I),L&&L.m(I,null),c(I,x),O&&O.m(I,null),c(I,B),M&&M.m(I,null),c(t,S),F=!0,Q||(D=[w(l,"click",U),w(I,"scroll",_)],Q=!0)},p(t,n){e=t,(!F||64&n[0])&&R!==(R=e[180].label+"")&&k(s,R),(!F||64&n[0]&&p!==(p=e[43].get(e[180].id)?.isLoading))&&(l.disabled=p);const r={};64&n[0]&&(r.filter=e[43].get(e[180].id)?.filter||{}),v.$set(r),N===(N=T(e,n))&&L?L.p(e,n):(L&&L.d(1),L=N&&N(e),L&&(L.c(),L.m(I,x))),64&n[0]&&(P=e[43].get(e[180].id)?.isLoading),P?O||(O=iE(),O.c(),O.m(I,B)):O&&(O.d(1),O=null),64&n[0]&&($=!e[43].get(e[180].id)?.hasMore&&e[43].get(e[180].id)?.events?.length>0),$?M||(M=oE(),M.c(),M.m(I,null)):M&&(M.d(1),M=null)},i(e){F||(W(v.$$.fragment,e),F=!0)},o(e){Z(v.$$.fragment,e),F=!1},d(e){e&&d(t),ie(v),L&&L.d(),O&&O.d(),M&&M.d(),Q=!1,r(D)}}}function XI(t){let n;return{c(){n=h("div"),n.innerHTML='

No search results found.

',A(n,"class","no-search-results svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function eE(e){let t,n=e[43].get(e[180].id).events,r=[];for(let t=0;t👤',o=m(),s=h("div"),a=h("div"),l=g(L),f=m(),p=h("div"),y=h("span"),v=g(O),b=m(),I=h("span"),E=g(M),C=m(),x=h("div"),S=h("div"),F=g(_),Q=m(),D=h("div"),R=g(H),P=m(),G&&G.c(),$=m(),J&&J.c(),U=m(),A(i,"class","search-result-avatar svelte-u3u5mw"),A(a,"class","search-result-author svelte-u3u5mw"),A(y,"class","kind-number svelte-u3u5mw"),A(I,"class","kind-name svelte-u3u5mw"),A(p,"class","search-result-kind svelte-u3u5mw"),A(s,"class","search-result-info svelte-u3u5mw"),A(S,"class","event-timestamp svelte-u3u5mw"),A(D,"class","event-content-single-line svelte-u3u5mw"),A(x,"class","search-result-content svelte-u3u5mw"),A(n,"class","search-result-row svelte-u3u5mw"),A(n,"role","button"),A(n,"tabindex","0"),A(t,"class","search-result-item svelte-u3u5mw"),B(t,"expanded",e[19].has(e[173].id))},m(e,r){u(e,t,r),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(s,f),c(s,p),c(p,y),c(y,v),c(p,b),c(p,I),c(I,E),c(n,C),c(n,x),c(x,S),c(S,F),c(x,Q),c(x,D),c(D,R),c(n,P),G&&G.m(n,null),c(t,$),J&&J.m(t,null),c(t,U),T||(N=[w(n,"click",q),w(n,"keydown",K)],T=!0)},p(r,i){e=r,64&i[0]&&L!==(L=BI(e[173].pubkey)+"")&&k(l,L),64&i[0]&&O!==(O=e[173].kind+"")&&k(v,O),64&i[0]&&M!==(M=xI(e[173].kind)+"")&&k(E,M),64&i[0]&&_!==(_=FI(e[173].created_at)+"")&&k(F,_),64&i[0]&&H!==(H=SI(e[173].content)+"")&&k(R,H),5!==e[173].kind&&("admin"===e[4]||"owner"===e[4]||"write"===e[4]&&e[173].pubkey&&e[173].pubkey===e[2])?G?G.p(e,i):(G=tE(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),524352&i[0]&&(j=e[19].has(e[173].id)),j?J?J.p(e,i):(J=nE(e),J.c(),J.m(t,U)):J&&(J.d(1),J=null),524352&i[0]|4096&i[1]&&B(t,"expanded",e[19].has(e[173].id))},d(e){e&&d(t),G&&G.d(),J&&J.d(),T=!1,r(N)}}}function iE(e){let t;return{c(){t=h("div"),t.innerHTML='
\n

Searching...

',A(t,"class","loading-search-results svelte-u3u5mw")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function oE(e){let t;return{c(){t=h("div"),t.innerHTML='

No more search results to load.

',A(t,"class","end-of-search-results svelte-u3u5mw")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function sE(e){let t,n,r=e[180].id===e[5]&&ZI(e);return{c(){r&&r.c(),t=y()},m(e,i){r&&r.m(e,i),u(e,t,i),n=!0},p(e,n){e[180].id===e[5]?r?(r.p(e,n),96&n[0]&&W(r,1)):(r=ZI(e),r.c(),W(r,1),r.m(t.parentNode,t)):r&&(Y(),Z(r,1,1,()=>{r=null}),z())},i(e){n||(W(r),n=!0)},o(e){Z(r),n=!1},d(e){r&&r.d(e),e&&d(t)}}}function aE(t){let n,r,i=t[177].label+"";return{c(){n=h("option"),r=g(i),n.__value=t[177].value,n.value=n.__value},m(e,t){u(e,n,t),c(n,r)},p:e,d(e){e&&d(n)}}}function lE(e){let t;function n(e,t){return e[39]?dE:0===e[38].length?uE:cE}let r=n(e),i=r(e);return{c(){t=h("div"),i.c(),A(t,"class","recovery-results svelte-u3u5mw")},m(e,n){u(e,t,n),i.m(t,null)},p(e,o){r===(r=n(e))&&i?i.p(e,o):(i.d(1),i=r(e),i&&(i.c(),i.m(t,null)))},d(e){e&&d(t),i.d()}}}function cE(e){let t,n,r,i=e[38],o=[];for(let t=0;tORLY_ACL_MODE=managed in your\n environment variables and restart the relay.',A(r,"class","svelte-u3u5mw"),A(o,"class","svelte-u3u5mw"),A(a,"class","svelte-u3u5mw"),A(w,"class","svelte-u3u5mw"),A(n,"class","acl-mode-warning svelte-u3u5mw")},m(e,t){u(e,n,t),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),c(a,l),c(a,f),c(f,p),c(n,y),c(n,w)},p(e,t){512&t[0]&&v!==(v=(e[9]||"unknown")+"")&&k(p,v)},i:e,o:e,d(e){e&&d(n)}}}function AE(e){let t,n,i,o,s,a,l,f,p,g;function y(e,t){return e[3]?kE:e[1]&&e[2]?bE:void 0}let b=y(e),k=b&&b(e);return{c(){t=h("div"),n=h("div"),i=h("div"),o=h("h2"),o.textContent="Settings",s=m(),a=h("button"),a.textContent="✕",l=m(),f=h("div"),k&&k.c(),A(o,"class","svelte-u3u5mw"),A(a,"class","close-btn svelte-u3u5mw"),A(i,"class","drawer-header svelte-u3u5mw"),A(f,"class","drawer-content"),A(n,"class","settings-drawer svelte-u3u5mw"),B(n,"dark-theme",e[0]),A(t,"class","drawer-overlay svelte-u3u5mw"),A(t,"role","button"),A(t,"tabindex","0")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(i,o),c(i,s),c(i,a),c(n,l),c(n,f),k&&k.m(f,null),p||(g=[w(a,"click",e[76]),w(n,"click",v(e[102])),w(n,"keydown",v(e[103])),w(t,"click",e[76]),w(t,"keydown",e[129])],p=!0)},p(e,t){b===(b=y(e))&&k?k.p(e,t):(k&&k.d(1),k=b&&b(e),k&&(k.c(),k.m(f,null))),1&t[0]&&B(n,"dark-theme",e[0])},d(e){e&&d(t),k&&k.d(),p=!1,r(g)}}}function bE(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,B,S=e[2].slice(0,16)+"",F=e[2].slice(-8)+"";return{c(){t=h("div"),n=h("button"),n.textContent="Log out",i=m(),o=h("h3"),o.textContent="Profile Loading",s=m(),a=h("p"),a.textContent="Your profile metadata is being loaded...",l=m(),f=h("button"),f.textContent="Retry Loading Profile",p=m(),y=h("div"),v=h("strong"),v.textContent="Public Key:",b=m(),I=g(S),E=g("..."),C=g(F),A(n,"class","logout-btn floating svelte-u3u5mw"),A(o,"class","svelte-u3u5mw"),A(a,"class","svelte-u3u5mw"),A(f,"class","retry-profile-btn svelte-u3u5mw"),A(y,"class","user-pubkey-display svelte-u3u5mw"),A(t,"class","profile-loading-section svelte-u3u5mw")},m(r,d){u(r,t,d),c(t,n),c(t,i),c(t,o),c(t,s),c(t,a),c(t,l),c(t,f),c(t,p),c(t,y),c(y,v),c(y,b),c(y,I),c(y,E),c(y,C),x||(B=[w(n,"click",e[73]),w(f,"click",e[84])],x=!0)},p(e,t){4&t[0]&&S!==(S=e[2].slice(0,16)+"")&&k(I,S),4&t[0]&&F!==(F=e[2].slice(-8)+"")&&k(C,F)},d(e){e&&d(t),x=!1,r(B)}}}function kE(e){let t,n,r,i,o,s,a,l,f,p,v,b,I,E,C,x=(e[3].name||"Unknown User")+"",B=e[3].banner&&IE(e);function S(e,t){return e[3].picture?CE:EE}let F=S(e),Q=F(e),D=e[3].nip05&&xE(e),R=e[3].about&&BE(e),P=e[4]&&"read"!==e[4]&&SE(e);return{c(){t=h("div"),n=h("div"),B&&B.c(),r=m(),i=h("button"),i.textContent="Log out",o=m(),Q.c(),s=m(),a=h("div"),l=h("h3"),f=g(x),p=m(),D&&D.c(),v=m(),R&&R.c(),b=m(),P&&P.c(),I=y(),A(i,"class","logout-btn floating svelte-u3u5mw"),A(l,"class","profile-username svelte-u3u5mw"),A(a,"class","name-row svelte-u3u5mw"),A(n,"class","profile-hero svelte-u3u5mw"),A(t,"class","profile-section svelte-u3u5mw")},m(d,h){u(d,t,h),c(t,n),B&&B.m(n,null),c(n,r),c(n,i),c(n,o),Q.m(n,null),c(n,s),c(n,a),c(a,l),c(l,f),c(a,p),D&&D.m(a,null),c(t,v),R&&R.m(t,null),u(d,b,h),P&&P.m(d,h),u(d,I,h),E||(C=w(i,"click",e[73]),E=!0)},p(e,i){e[3].banner?B?B.p(e,i):(B=IE(e),B.c(),B.m(n,r)):B&&(B.d(1),B=null),F===(F=S(e))&&Q?Q.p(e,i):(Q.d(1),Q=F(e),Q&&(Q.c(),Q.m(n,s))),8&i[0]&&x!==(x=(e[3].name||"Unknown User")+"")&&k(f,x),e[3].nip05?D?D.p(e,i):(D=xE(e),D.c(),D.m(a,null)):D&&(D.d(1),D=null),e[3].about?R?R.p(e,i):(R=BE(e),R.c(),R.m(t,null)):R&&(R.d(1),R=null),e[4]&&"read"!==e[4]?P?P.p(e,i):(P=SE(e),P.c(),P.m(I.parentNode,I)):P&&(P.d(1),P=null)},d(e){e&&d(t),B&&B.d(),Q.d(),D&&D.d(),R&&R.d(),e&&d(b),P&&P.d(e),e&&d(I),E=!1,C()}}}function IE(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[3].banner)||A(t,"src",n),A(t,"alt","Profile banner"),A(t,"class","profile-banner svelte-u3u5mw")},m(e,n){u(e,t,n)},p(e,r){8&r[0]&&!a(t.src,n=e[3].banner)&&A(t,"src",n)},d(e){e&&d(t)}}}function EE(t){let n;return{c(){n=h("div"),n.textContent="👤",A(n,"class","profile-avatar-placeholder overlap svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function CE(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[3].picture)||A(t,"src",n),A(t,"alt","User avatar"),A(t,"class","profile-avatar overlap svelte-u3u5mw")},m(e,n){u(e,t,n)},p(e,r){8&r[0]&&!a(t.src,n=e[3].picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function xE(e){let t,n,r=e[3].nip05+"";return{c(){t=h("span"),n=g(r),A(t,"class","profile-nip05-inline svelte-u3u5mw")},m(e,r){u(e,t,r),c(t,n)},p(e,t){8&t[0]&&r!==(r=e[3].nip05+"")&&k(n,r)},d(e){e&&d(t)}}}function BE(e){let t,n;return{c(){t=h("div"),n=h("p"),A(n,"class","profile-about svelte-u3u5mw"),A(t,"class","about-card svelte-u3u5mw")},m(r,i){u(r,t,i),c(t,n),n.innerHTML=e[41]},p(e,t){1024&t[1]&&(n.innerHTML=e[41])},d(e){e&&d(t)}}}function SE(e){let t,n,r,i,o,s,a=e[96](),l=[];for(let t=0;tte(y,"showModal",C)),y.$on("login",e[72]),y.$on("close",e[74]),{c(){ne(t.$$.fragment),n=m(),r=h("div"),ne(i.$$.fragment),o=m(),s=h("main"),f.c(),p=m(),E&&E.c(),g=m(),ne(y.$$.fragment),A(s,"class","main-content svelte-u3u5mw"),A(r,"class","app-container svelte-u3u5mw"),B(r,"dark-theme",e[0])},m(e,a){re(t,e,a),u(e,n,a),u(e,r,a),re(i,r,null),c(r,o),c(r,s),k[l].m(s,null),u(e,p,a),E&&E.m(e,a),u(e,g,a),re(y,e,a),v=!0},p(e,n){const o={};1&n[0]&&(o.isDarkTheme=e[0]),2&n[0]&&(o.isLoggedIn=e[1]),16&n[0]&&(o.userRole=e[4]),1024&n[0]&&(o.currentEffectiveRole=e[10]),8&n[0]&&(o.userProfile=e[3]),4&n[0]&&(o.userPubkey=e[2]),t.$set(o);const a={};1&n[0]&&(a.isDarkTheme=e[0]),2048&n[0]&&(a.tabs=e[11]),32&n[0]&&(a.selectedTab=e[5]),4&n[1]&&(a.version=e[33]),i.$set(a);let c=l;l=I(e,n),l===c?k[l].p(e,n):(Y(),Z(k[c],1,1,()=>{k[c]=null}),z(),f=k[l],f?f.p(e,n):(f=k[l]=b[l](e),f.c()),W(f,1),f.m(s,null)),(!v||1&n[0])&&B(r,"dark-theme",e[0]),e[15]?E?E.p(e,n):(E=AE(e),E.c(),E.m(g.parentNode,g)):E&&(E.d(1),E=null);const u={};1&n[0]&&(u.isDarkTheme=e[0]),!w&&4096&n[0]&&(w=!0,u.showModal=e[12],H(()=>w=!1)),y.$set(u)},i(e){v||(W(t.$$.fragment,e),W(i.$$.fragment,e),W(f),W(y.$$.fragment,e),v=!0)},o(e){Z(t.$$.fragment,e),Z(i.$$.fragment,e),Z(f),Z(y.$$.fragment,e),v=!1},d(e){ie(t,e),e&&d(n),e&&d(r),ie(i),k[l].d(),e&&d(p),E&&E.d(e),e&&d(g),ie(y,e)}}}let DE=!1,RE=!1;function PE(e,t,n){let r,i,o,s,a;"undefined"!=typeof window&&(window.debugIndexedDB=Kh);let l=!1,c=!1,u=!1,d="",f="",h=null,p="",g=null,m=null,y=!1,w=localStorage.getItem("selectedTab")||"export",v=!1,A={},k=[],I=[],E=null,C="",B=new Set,S=!1,F=!0,Q=null,D="",R=new Map,P=[],U=0,T=[],N=!0,L=null,O="",M=null,_=[],H=!1,j="",G="info",q=!1,K=null,J="",V=!1,Y=!1,z="",W="info",Z=[],X=[],ee="",te="",ne="",re="",ie=null,oe="",se=[],ae=!1,le=!0,ce=null;function ue(e){B.has(e)?B.delete(e):B.add(e),n(19,B)}async function de(e,t){const n=JSON.stringify(e),r=await async function(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){console.error("Failed to copy to clipboard:",t);try{const t=document.createElement("textarea");return t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),!0}catch(e){return console.error("Fallback copy also failed:",e),!1}}}(n);!function(e,t=!0){if(!e)return;const n=e.textContent,r=e.style.backgroundColor;t?(e.textContent="",e.style.backgroundColor="#4CAF50"):(e.textContent="L",e.style.backgroundColor="#f44336"),setTimeout(()=>{e.textContent=n,e.style.backgroundColor=r},2e3)}(t.target.closest(".copy-json-btn"),r),r||alert("Failed to copy to clipboard. Please copy manually.")}async function fe(e){if(!u)return void alert("Please log in first");const t=I.find(t=>t.id===e);if(!t)return void alert("Event not found");if("admin"===p||"owner"===p||"write"===p&&t.pubkey&&t.pubkey===d){if(confirm("Are you sure you want to delete this event?"))try{if(!g)throw new Error("Signer not available for signing");const r={kind:5,created_at:Math.floor(Date.now()/1e3),tags:[["e",e]],content:""};console.log("Created delete event template:",r),console.log("User pubkey:",d),console.log("Target event:",t),console.log("Target event pubkey:",t.pubkey);const i=await g.signEvent(r);console.log("Signed delete event:",i),console.log("Signed delete event pubkey:",i.pubkey),console.log("Delete event tags:",i.tags);const o=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`;try{const e=await DI(o,i,g,d);e.success?console.log("Delete event published successfully to ORLY relay"):console.error("Failed to publish delete event:",e.reason)}catch(e){console.error("Error publishing delete event:",e)}const s=t.pubkey&&t.pubkey===d;if(s){const t=await Qh.publish(i);if(console.log("Delete event published:",t),!(t.success&&t.okCount>0))throw new Error("No relays accepted the delete event");{await new Promise(e=>setTimeout(e,2e3));try{const n=await Hh(e,{timeout:5e3});n?(console.warn("Event still exists after deletion attempt:",n),alert(`Warning: Delete event was accepted by ${t.okCount} relay(s), but the event still exists on the relay. This may indicate the relay does not properly handle delete events.`)):console.log("Event successfully deleted and verified")}catch(e){console.log("Could not fetch event after deletion (likely deleted):",e.message)}try{const t=await jh(e,{timeout:5e3});if(t.length>0){console.log(`Delete event verification: Found ${t.length} delete event(s) targeting ${e}`);const n=t.find(e=>e.pubkey&&e.pubkey===d);n?console.log("Our delete event found in database:",n.id):console.warn("Our delete event not found in database, but other delete events exist")}else console.warn("No delete events found in database for target event:",e)}catch(e){console.log("Could not verify delete event in database:",e.message)}n(97,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),P=P.filter(t=>t.id!==e);for(const[t,n]of R)n.events&&(n.events=n.events.filter(t=>t.id!==e),R.set(t,n));me(),console.log("Reloading events to show delete event...");const r=DE&&u&&d?[d]:null;await Te(!0,r),alert(`Event deleted successfully (accepted by ${t.okCount} relay(s))`)}}else{const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,r=new Fh;await r.connectToRelay(t);const o=await r.publish(i);if(console.log("Delete event published to local relay only:",o),!(o.success&&o.okCount>0))throw new Error("Local relay did not accept the delete event");{await new Promise(e=>setTimeout(e,2e3));try{const t=await Hh(e,{timeout:5e3});t?(console.warn("Event still exists after deletion attempt:",t),alert(`Warning: Delete event was accepted by ${o.okCount} relay(s), but the event still exists on the relay. This may indicate the relay does not properly handle delete events.`)):console.log("Event successfully deleted and verified")}catch(e){console.log("Could not fetch event after deletion (likely deleted):",e.message)}try{const t=await jh(e,{timeout:5e3});if(t.length>0){console.log(`Delete event verification: Found ${t.length} delete event(s) targeting ${e}`);const n=t.find(e=>e.pubkey&&e.pubkey===d);n?console.log("Our delete event found in database:",n.id):console.warn("Our delete event not found in database, but other delete events exist")}else console.warn("No delete events found in database for target event:",e)}catch(e){console.log("Could not verify delete event in database:",e.message)}n(97,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),P=P.filter(t=>t.id!==e);for(const[t,n]of R)n.events&&(n.events=n.events.filter(t=>t.id!==e),R.set(t,n));me(),console.log("Reloading events to show delete event...");const t=DE&&u&&d?[d]:null;await Te(!0,t),alert("Event deleted successfully (local relay only - admin/owner deleting other user's event)")}}}catch(e){console.error("Failed to delete event:",e),alert("Failed to delete event: "+e.message)}}else alert("You do not have permission to delete this event")}async function he(){const e=oe?parseInt(oe):ie;if(null==e||isNaN(e))console.log("No valid kind to load, kindToUse:",e);else if(u){console.log("Loading recovery events for kind:",e,"user:",d),n(39,ae=!0);try{const t=[{kinds:[e],authors:[d],limit:100}];ce&&(t[0].until=ce),console.log("Recovery filters:",t);const r=await qh(t,{timeout:3e4,cacheFirst:!0});console.log("Recovery events received:",r.length),console.log("Recovery events kinds:",r.map(e=>e.kind)),n(38,se=ce?[...se,...r]:r),r.length>0?(ce=Math.min(...r.map(e=>e.created_at)),n(40,le=100===r.length)):n(40,le=!1)}catch(e){console.error("Failed to load recovery events:",e)}finally{n(39,ae=!1)}}else console.log("Not logged in, cannot load recovery events")}async function pe(e){if(confirm("Are you sure you want to repost this event?"))try{const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`;console.log("Reposting event to local relay:",t,e);const r={...e};if(r.created_at=Math.floor(Date.now()/1e3),r.id="",r.sig="",e.kind>=3e4&&e.kind<=39999){const t=e.tags.find(e=>"d"===e[0]);t&&(r.tags=r.tags.filter(e=>"d"!==e[0]),r.tags.push(t))}if(g){const e=await g.signEvent(r);console.log("Signed event for repost:",e);const i=await Qh.publish(e,[t]);console.log("Repost publish result:",i),i.success&&i.okCount>0?(alert("Event reposted successfully!"),n(40,le=!1),await he()):alert("Failed to repost event. Check console for details.")}else alert("No signer available. Please log in.")}catch(e){console.error("Error reposting event:",e),alert("Error reposting event: "+e.message)}}async function ge(e){if(confirm("Are you sure you want to repost this event to all your write relays?"))try{const t=await async function(){if(!d)return[];try{const e=await Nh([{kinds:[10002],authors:[d],limit:1}]);if(0===e.length)return console.log("No relay list event found for user"),[];const t=e[0];console.log("Found relay list event:",t);const n=[];for(const e of t.tags)if("r"===e[0]&&e.length>=2){const t=e[1],r=e.length>=3?e[2]:null;r&&"write"!==r||n.push(t)}return console.log("Found write relays:",n),n}catch(e){return console.error("Error fetching user write relays:",e),[]}}(),r=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,i=[r,...t.filter(e=>e!==r)];1===i.length&&alert("No write relays found in your relay list. Only posting to local relay."),console.log("Reposting event to all relays:",i,e);const o={...e};if(o.created_at=Math.floor(Date.now()/1e3),o.id="",o.sig="",e.kind>=3e4&&e.kind<=39999){const t=e.tags.find(e=>"d"===e[0]);t&&(o.tags=o.tags.filter(e=>"d"!==e[0]),o.tags.push(t))}if(g){const e=await g.signEvent(o);console.log("Signed event for repost to all:",e);const t=await Qh.publish(e,i);console.log("Repost to all publish result:",t),t.success&&t.okCount>0?(alert(`Event reposted successfully to ${i.length} relays!`),n(40,le=!1),await he()):alert("Failed to repost event. Check console for details.")}else alert("No signer available. Please log in.")}catch(e){console.error("Error reposting event to all:",e),alert("Error reposting event to all: "+e.message)}}if("undefined"!=typeof window&&window.matchMedia){const e=window.matchMedia("(prefers-color-scheme: dark)");l=e.matches,e.addEventListener("change",e=>{n(0,l=e.matches)})}if("undefined"!=typeof localStorage){const e=localStorage.getItem("nostr_auth_method"),t=localStorage.getItem("nostr_pubkey");e&&t&&(u=!0,d=t,f=e,"extension"===e&&window.nostr&&(g=window.nostr),Pe(),$e()),function(){if("undefined"==typeof localStorage)return;try{const t=localStorage.getItem("app_state");if(t){const r=JSON.parse(t);r.selectedTab&&Ce.some(e=>e.id===r.selectedTab)&&n(5,w=r.selectedTab),r.expandedEvents&&n(19,B=new Set(r.expandedEvents)),r.globalEventsCache&&(P=r.globalEventsCache),r.globalCacheTimestamp&&(U=r.globalCacheTimestamp),void 0!==r.hasMoreEvents&&(F=r.hasMoreEvents),r.oldestEventTimestamp&&(Q=r.oldestEventTimestamp),void 0!==r.hasMoreMyEvents&&(N=r.hasMoreMyEvents),r.oldestMyEventTimestamp&&(L=r.oldestMyEventTimestamp),P.length>0&&((e=U)&&Date.now()-et.created_at-e.created_at),U=Date.now(),me()}async function we(){if(u&&"owner"===p&&q)try{n(23,H=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});e.ok?n(21,M=await e.json()):ke("Failed to load sprocket status","error")}catch(e){ke(`Error loading sprocket status: ${e.message}`,"error")}finally{n(23,H=!1)}}async function ve(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/versions",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/versions")}`,"Content-Type":"application/json"}});e.ok?n(22,_=await e.json()):ke("Failed to load versions","error")}catch(e){ke(`Error loading versions: ${e.message}`,"error")}finally{n(23,H=!1)}}async function Ae(e){u&&"owner"===p&&(n(20,O=e.content),ke(`Loaded version: ${e.name}`,"success"))}async function be(e){if(u&&"owner"===p&&confirm(`Are you sure you want to delete version ${e}?`))try{n(23,H=!0);const t=await fetch("/api/sprocket/delete-version",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/delete-version")}`,"Content-Type":"application/json"},body:JSON.stringify({filename:e})});if(t.ok)ke(`Version ${e} deleted successfully`,"success"),await ve();else{ke(`Failed to delete version: ${await t.text()}`,"error")}}catch(e){ke(`Error deleting version: ${e.message}`,"error")}finally{n(23,H=!1)}}function ke(e,t="info"){n(24,j=e),n(25,G=t),setTimeout(()=>{n(24,j="")},5e3)}function Ie(e,t="info"){n(29,z=e),n(30,W=t),"error"!==t&&setTimeout(()=>{n(29,z="")},5e3)}async function Ee(){if(n(31,Z=[]),!J.trim())return n(31,Z=["Policy JSON is empty"]),Ie("Validation failed","error"),!1;try{const e=JSON.parse(J);if("object"!=typeof e||null===e)return n(31,Z=["Policy must be a JSON object"]),Ie("Validation failed","error"),!1;if(e.policy_admins)if(Array.isArray(e.policy_admins))for(const t of e.policy_admins)"string"==typeof t&&/^[0-9a-fA-F]{64}$/.test(t)||Z.push(`Invalid policy_admin pubkey: ${t}`);else Z.push("policy_admins must be an array");if(e.rules)if("object"!=typeof e.rules)Z.push("rules must be an object");else for(const[t,n]of Object.entries(e.rules))if(/^\d+$/.test(t)||Z.push(`Invalid kind number: ${t}`),n.tag_validation&&"object"==typeof n.tag_validation)for(const[e,t]of Object.entries(n.tag_validation))try{new RegExp(t)}catch(n){Z.push(`Invalid regex for tag '${e}': ${t}`)}return e.default_policy&&!["allow","deny"].includes(e.default_policy)&&Z.push("default_policy must be 'allow' or 'deny'"),Z.length>0?(Ie("Validation failed - see errors below","error"),!1):(Ie("Validation passed","success"),!0)}catch(e){return n(31,Z=[`JSON parse error: ${e.message}`]),Ie("Invalid JSON syntax","error"),!1}}const Ce=[{id:"export",icon:"📤",label:"Export"},{id:"import",icon:"💾",label:"Import",requiresAdmin:!0},{id:"events",icon:"📡",label:"Events"},{id:"blossom",icon:"🌸",label:"Blossom"},{id:"bunker",icon:"🔐",label:"Bunker",requiresWrite:!0},{id:"compose",icon:"✏️",label:"Compose",requiresWrite:!0},{id:"recovery",icon:"🔄",label:"Recovery"},{id:"managed-acl",icon:"🛡️",label:"Managed ACL",requiresOwner:!0},{id:"sprocket",icon:"⚙️",label:"Sprocket",requiresOwner:!0},{id:"policy",icon:"📜",label:"Policy",requiresOwner:!0},{id:"logs",icon:"📋",label:"Logs",requiresOwner:!0}];function xe(e){n(5,w=e),"sprocket"===e&&u&&"owner"===p&&q&&(we(),ve()),me()}function Be(){n(15,y=!1)}function Se(e){Fe(e)}function Fe(e){n(6,k=k.filter(t=>t.id!==e)),R.delete(e),w===e&&n(5,w="export")}async function Qe(e,t=!0){const n=R.get(e);if(n&&!n.isLoading){n.isLoading=!0,R.set(e,n);try{const r={...n.filter};!t&&n.oldestTimestamp&&(r.until=n.oldestTimestamp),t||(r.limit=200),console.log("Loading search results with filter:",r);const i=await _h([r],{timeout:3e4});if(console.log("Received search results:",i.length,"events"),n.events=t?i.sort((e,t)=>t.created_at-e.created_at):[...n.events,...i].sort((e,t)=>t.created_at-e.created_at),i.length>0){const e=Math.min(...i.map(e=>e.created_at));(!n.oldestTimestamp||e0){const e=o.filter(e=>e.pubkey&&e.pubkey!==d);e.length>0&&console.warn("Server returned non-user events:",e.length,"out of",o.length)}if(e?(n(97,I=o.sort((e,t)=>t.created_at-e.created_at)),ye(o)):(n(97,I=[...I,...o].sort((e,t)=>t.created_at-e.created_at)),ye(I)),o.length>0){const e=Math.min(...o.map(e=>e.created_at));(!Q||e{if("events"===w){const e=document.querySelectorAll(".events-view-content")[0];e&&e.scrollHeight<=e.clientHeight&&Ne()}},100)}catch(e){console.error("Failed to load events:",e),alert("Failed to load events: "+e.message)}finally{n(7,S=!1)}}}async function Ne(){await Te(!1)}let Le=!1;async function Oe(e,t){if(!u||!d)throw new Error("Not logged in");const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",window.location.origin+e],["method",t.toUpperCase()]],content:"",pubkey:d};let r;if(g&&"extension"===f)try{r=await g.signEvent(n)}catch(e){throw new Error("Failed to sign with extension: "+e.message)}else{if("nsec"!==f)throw new Error("No valid signer available");n.id="mock-id-"+Date.now(),n.sig="mock-signature-"+Date.now(),r=n}const i=JSON.stringify(r);return`Nostr ${btoa(i)}`}async function Me(e,t){if(!u||!d)throw new Error("Not logged in");const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",window.location.origin+t],["method",e.toUpperCase()]],content:"",pubkey:d};let r;if(g&&"extension"===f)try{r=await g.signEvent(n)}catch(e){throw new Error("Failed to sign with extension: "+e.message)}else{if("nsec"!==f)throw new Error("No valid signer available");n.id="mock-id-"+Date.now(),n.sig="mock-signature-"+Date.now(),r=n}const i=JSON.stringify(r);return btoa(i)}function _e(e,t){const n=e.toLowerCase();if(n.includes("policy")||n.includes("blocked")||n.includes("denied")){let n=`Policy Error: ${e}`;return null!==t&&(n+=`\n\nKind ${t} may be restricted by the relay's policy configuration.`),V&&(n+="\n\nThe relay has policy enforcement enabled. Contact a relay administrator to allow this event kind or adjust your permissions."),n}if(n.includes("auth")||n.includes("permission")||n.includes("unauthorized"))return`Permission Error: ${e}\n\nYour current permissions may not allow publishing this type of event. Current role: ${p||"unknown"}. Contact a relay administrator to upgrade your permissions.`;if(n.includes("kind")||n.includes("not allowed")||n.includes("restricted")){let n=`Event Type Error: ${e}`;return null!==t&&(n+=`\n\nKind ${t} is not currently allowed on this relay.`),n+="\n\nThe relay administrator may need to update the policy configuration to allow this event kind.",n}return n.includes("rate")||n.includes("limit")||n.includes("too many")?`Rate Limit Error: ${e}\n\nPlease wait a moment before trying again.`:n.includes("size")||n.includes("too large")||n.includes("content")?`Size Limit Error: ${e}\n\nThe event may exceed the relay's size limits. Try reducing the content length.`:`Publishing failed: ${e}`}function He(e){n(98,D=e),localStorage.setItem("viewAsRole",e),console.log("View as role changed to:",e,"Current effective role:",a)}D=localStorage.getItem("viewAsRole")||"";return e.$$.update=()=>{var t;if(6&e.$$.dirty[0]|16&e.$$.dirty[3]&&n(42,r=I.sort((e,t)=>t.created_at-e.created_at)),8&e.$$.dirty[0]&&n(41,i=h?.about?(t=h.about,t?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):"").replace(/\n{2,}/g,"
"):""),16&e.$$.dirty[0]|32&e.$$.dirty[3]&&n(10,a=D&&""!==D?D:p),1810&e.$$.dirty[0]|96&e.$$.dirty[3]&&n(101,o=Ce.filter(e=>{const t=a;return!(e.requiresAdmin&&(!u||"admin"!==t&&"owner"!==t))&&(!(e.requiresOwner&&(!u||"owner"!==t))&&(!(e.requiresWrite&&(!u||"read"===t))&&(!("sprocket"===e.id&&!q)&&(!("policy"===e.id&&!V)&&(("managed-acl"!==e.id||"managed"===ee)&&(console.log(`Tab ${e.id} filter check:`,{isLoggedIn:u,userRole:p,viewAsRole:D,currentRole:t,requiresAdmin:e.requiresAdmin,requiresOwner:e.requiresOwner,requiresWrite:e.requiresWrite,visible:!0}),!0))))))})),64&e.$$.dirty[0]|256&e.$$.dirty[3]&&n(11,s=[...o,...k]),2578&e.$$.dirty[0]|256&e.$$.dirty[3]&&console.log("Tabs debug:",{isLoggedIn:u,userRole:p,aclMode:ee,filteredBaseTabs:o.map(e=>e.id),allTabs:s.map(e=>e.id)}),1&e.$$.dirty[0]&&"undefined"!=typeof document&&(l?document.body.classList.add("dark-theme"):document.body.classList.remove("dark-theme")),14&e.$$.dirty[0]&&u&&d&&!h&&Re(),182&e.$$.dirty[0]|144&e.$$.dirty[3]&&"events"===w&&u&&("read"===p||"write"===p||"admin"===p||"owner"===p)&&0===I.length&&!Le&&!S){n(100,Le=!0);Te(!0,null)}32&e.$$.dirty[0]|16&e.$$.dirty[3]&&("events"!==w||"events"===w&&I.length>0)&&n(100,Le=!1),32&e.$$.dirty[0]&&localStorage.setItem("selectedTab",w)},[l,u,d,h,p,w,k,S,V,ee,a,s,c,g,m,y,v,E,C,B,O,M,_,H,j,G,K,J,Y,z,W,Z,X,te,ne,re,ie,oe,se,ae,le,i,r,R,ue,de,async function(){console.log("Toggle changed, showOnlyMyEvents:",DE),n(100,Le=!1),await Te(!0,null)},fe,he,pe,ge,function(){console.log("selectRecoveryKind called, recoverySelectedKind:",ie),null!=ie?(n(37,oe=""),n(38,se=[]),ce=null,n(40,le=!0),he()):console.log("No kind selected, skipping load")},function(){console.log("handleCustomKindInput called, recoveryCustomKind:",oe);const e=parseInt(oe);""!==oe&&!isNaN(e)&&e>=0&&(n(36,ie=null),n(38,se=[]),ce=null,n(40,le=!0),he())},function(e){const t=se.filter(t=>t.kind===e.kind&&t.pubkey===e.pubkey),n=Math.max(...t.map(e=>e.created_at));return e.created_at===n},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(20,O=t.script_content||""),n(21,M=t),ke("Script loaded successfully","success")}else ke("Failed to load script","error")}catch(e){ke(`Error loading script: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:O});if(e.ok)ke("Script saved and updated successfully","success"),await we(),await ve();else{ke(`Failed to save script: ${await e.text()}`,"error")}}catch(e){ke(`Error saving script: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/restart",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/restart")}`,"Content-Type":"application/json"}});if(e.ok)ke("Sprocket restarted successfully","success"),await we();else{ke(`Failed to restart sprocket: ${await e.text()}`,"error")}}catch(e){ke(`Error restarting sprocket: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p&&confirm("Are you sure you want to delete the sprocket script? This will stop the current process."))try{n(23,H=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:""});if(e.ok)n(20,O=""),ke("Sprocket script deleted successfully","success"),await we(),await ve();else{ke(`Failed to delete script: ${await e.text()}`,"error")}}catch(e){ke(`Error deleting script: ${e.message}`,"error")}finally{n(23,H=!1)}},ve,Ae,be,async function(){if(u&&("owner"===p||RE))try{n(28,Y=!0),n(31,Z=[]);const e={kinds:[12345],limit:1},t=await qh(e);if(t&&t.length>0){n(27,J=t[0].content);try{n(27,J=JSON.stringify(JSON.parse(J),null,2))}catch(e){}Ie("Policy loaded successfully","success")}else{const e=await fetch("/api/policy",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/policy")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(27,J=JSON.stringify(t,null,2)),Ie("Policy loaded from file","success")}else Ie("No policy configuration found","info"),n(27,J="")}}catch(e){Ie(`Error loading policy: ${e.message}`,"error")}finally{n(28,Y=!1)}},Ee,async function(){if(!u||"owner"!==p&&!RE)return;if(await Ee())try{n(28,Y=!0);const e={kind:12345,created_at:Math.floor(Date.now()/1e3),tags:[],content:J},t=await DI(e,g);t.success?Ie("Policy updated successfully","success"):Ie(`Failed to publish policy: ${t.error||"Unknown error"}`,"error")}catch(e){Ie(`Error saving policy: ${e.message}`,"error")}finally{n(28,Y=!1)}},function(){try{const e=JSON.parse(J);n(27,J=JSON.stringify(e,null,2)),Ie("JSON formatted","success")}catch(e){Ie(`Cannot format: ${e.message}`,"error")}},function(e){const t=e.detail;if(!t)return void Ie("Please enter a pubkey","error");const r=function(e){if(!e)return null;if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(e.startsWith("npub1"))try{const t="qpzry9x8gf2tvdw0s3jn54khce6mua7l",n=e.slice(5);let r=[];for(const e of n){const n=t.indexOf(e.toLowerCase());if(-1===n)throw new Error("Invalid character in npub");r.push(...[...Array(5)].map((e,t)=>n>>4-t&1))}r=r.slice(0,-30);const i=[];for(let e=0;e+8<=r.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|r[e+n];i.push(t)}return i.map(e=>e.toString(16).padStart(2,"0")).join("")}catch(e){return console.error("Failed to decode npub:",e),null}return null}(t);if(r&&64===r.length)try{const e=JSON.parse(J||"{}");if(e.policy_admins||(e.policy_admins=[]),e.policy_admins.includes(r))return void Ie("Admin already in list","warning");e.policy_admins.push(r),n(27,J=JSON.stringify(e,null,2)),Ie("Admin added - click 'Save & Publish' to apply","info")}catch(e){Ie(`Error adding admin: ${e.message}`,"error")}else Ie("Invalid pubkey format. Use hex (64 chars) or npub","error")},function(e){const t=e.detail;try{const e=JSON.parse(J||"{}");e.policy_admins&&(e.policy_admins=e.policy_admins.filter(e=>e!==t),n(27,J=JSON.stringify(e,null,2)),Ie("Admin removed - click 'Save & Publish' to apply","info"))}catch(e){Ie(`Error removing admin: ${e.message}`,"error")}},async function(){if(u&&("owner"===p||RE))try{n(28,Y=!0),n(32,X=[]);let e=[];try{e=JSON.parse(J||"{}").policy_admins||[]}catch(e){return void Ie("Cannot parse policy JSON to get admins","error")}if(0===e.length)return void Ie("No policy admins configured","warning");const t={kinds:[3],authors:e,limit:e.length},r=await qh(t),i=new Set;for(const e of r)if(e.tags)for(const t of e.tags)"p"===t[0]&&t[1]&&64===t[1].length&&i.add(t[1]);n(32,X=Array.from(i)),Ie(`Loaded ${X.length} follows from ${r.length} admin(s)`,"success")}catch(e){Ie(`Error loading follows: ${e.message}`,"error")}finally{n(28,Y=!1)}},function(e){n(26,K=e.target.files[0])},async function(){if(u&&"owner"===p&&K)try{n(23,H=!0);const e=await K.text(),t=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:e});if(t.ok)n(20,O=e),ke("Script uploaded and updated successfully","success"),await we(),await ve();else{ke(`Failed to upload script: ${await t.text()}`,"error")}}catch(e){ke(`Error uploading script: ${e.message}`,"error")}finally{n(23,H=!1),n(26,K=null);const e=document.getElementById("sprocket-upload-file");e&&(e.value="")}},xe,function(){u||n(12,c=!0)},async function(e){const{method:t,pubkey:r,privateKey:i,signer:o}=e.detail;n(1,u=!0),n(2,d=r),f=t,n(13,g=o),n(12,c=!1),n(14,m="nsec"===t&&i?i:null);try{if(await Gh(),"extension"===t&&o)Qh.setSigner(o);else if("nsec"===t&&i){const e=new xf(i);Qh.setSigner(e)}n(3,h=await Oh(r)),console.log("Profile loaded:",h)}catch(e){console.error("Failed to load profile:",e)}await Pe(),await $e()},function(){n(1,u=!1),n(2,d=""),f="",n(3,h=null),n(4,p=""),n(13,g=null),n(14,m=null),n(15,y=!1),T=[],n(97,I=[]),P=[],U=0,me(),"undefined"!=typeof localStorage&&(localStorage.removeItem("nostr_auth_method"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_privkey"))},function(){n(12,c=!1)},function(){n(15,y=!0)},Be,function(){n(16,v=!v)},function(e){const{searchText:t,selectedKinds:n,pubkeys:r,eventIds:i,tags:o,sinceTimestamp:s,untilTimestamp:a,limit:l}=e.detail,c=function({searchText:e=null,kinds:t=[],authors:n=[],ids:r=[],tags:i=[],since:o=null,until:s=null,limit:a=null}){const l={};return e&&e.trim()&&(l.search=e.trim()),t&&t.length>0&&(l.kinds=t),n&&n.length>0&&(l.authors=n),r&&r.length>0&&(l.ids=r),i&&i.length>0&&i.forEach(e=>{if(e.name&&e.value){const t=`#${e.name}`;l[t]||(l[t]=[]),l[t].push(e.value)}}),o&&(l.since=o),s&&(l.until=s),a&&a>0&&(l.limit=a),l}({searchText:t,kinds:n,authors:r,ids:i,tags:o,since:s,until:a,limit:l||100});A=c,Te(!0,null)},function(){A={},Te(!0,null)},Se,Fe,Qe,De,Re,async function(){await Ue([])},async function(){await Ue([d])},function(e){n(17,E=e.detail.target.files[0])},async function(){if("none"!==ee&&(!u||"admin"!==p&&"owner"!==p))return n(18,C="Admin or owner permission required"),void setTimeout(()=>{n(18,C="")},5e3);if(!E)return n(18,C="Please select a file"),void setTimeout(()=>{n(18,C="")},5e3);try{n(18,C="Uploading...");const e={};"none"!==ee&&u&&(e.Authorization=await Oe("/api/import","POST"));const t=new FormData;t.append("file",E);const r=await fetch("/api/import",{method:"POST",headers:e,body:t});if(!r.ok)throw new Error(`Import failed: ${r.status} ${r.statusText}`);await r.json();n(18,C="Upload complete"),n(17,E=null),document.getElementById("import-file").value="",setTimeout(()=>{n(18,C="")},5e3)}catch(e){console.error("Import failed:",e),n(18,C="Import failed: "+e.message),setTimeout(()=>{n(18,C="")},5e3)}},Te,function(e){const{scrollTop:t,scrollHeight:n,clientHeight:r}=e.target;n-t-r<100&&Ne()},function(){try{if(!ne.trim())return void alert("Please enter some JSON to reformat");const e=JSON.parse(ne);n(34,ne=JSON.stringify(e,null,2))}catch(e){alert("Invalid JSON: "+e.message)}},async function(){try{if(!ne.trim())return void alert("Please enter an event to sign");if(!u||!d)return void alert("Please log in to sign events");if(!g)return void alert("No signer available. Please log in with a valid authentication method.");const e=JSON.parse(ne);e.pubkey=d,e.created_at=Math.floor(Date.now()/1e3),delete e.id,delete e.sig;const t=await g.signEvent(e);n(34,ne=JSON.stringify(t,null,2)),alert("Event signed successfully!")}catch(e){console.error("Error signing event:",e),alert("Error signing event: "+e.message)}},async function(){n(35,re="");try{if(!ne.trim())return void n(35,re="Please enter an event to publish");if(!u)return void n(35,re="Please log in to publish events");if(!g)return void n(35,re="No signer available. Please log in with a valid authentication method.");let e;try{e=JSON.parse(ne)}catch(e){return void n(35,re=`Invalid JSON: ${e.message}`)}if(!e.id||!e.sig)return void n(35,re='Event must be signed before publishing. Please click "Sign" first.');if("read"===p)return void n(35,re=`Permission denied: Your current role is "${p}" which does not allow publishing events. Contact a relay administrator to upgrade your permissions.`);const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,r=await DI(t,e,g,d);if(r.success)n(35,re=""),alert("Event published successfully to ORLY relay!");else{const t=r.reason||"Unknown error";n(35,re=_e(t,e.kind))}}catch(e){console.error("Error publishing event:",e);const t=e.message||"Unknown error";n(35,re=_e(t,null))}},function(){n(35,re="")},He,function(){const e=["owner","admin","write","read"],t=e.indexOf(p);return-1===t?["read"]:e.slice(t)},I,D,q,Le,o,function(t){$.call(this,e,t)},function(t){$.call(this,e,t)},e=>e.id===w,e=>xe(e.detail),e=>Fe(e.detail),e=>ue(e.detail),e=>fe(e.detail),e=>de(e.detail.event,e.detail.e),e=>Te(e.detail.refresh,e.detail.authors),function(e){ne=e,n(34,ne)},function(e){O=e,n(20,O)},e=>Ae(e.detail),e=>be(e.detail),function(e){J=e,n(27,J)},function(){ie=x(this),n(36,ie)},function(){oe=b(this.value),n(37,oe)},e=>ge(e),e=>pe(e),(e,t)=>de(e,t),e=>Qe(e.id,!0),e=>Se(e.id),e=>fe(e.id),e=>ue(e.id),(e,t)=>"Enter"===t.key&&ue(e.id),(e,t)=>de(e,t),(e,t)=>De(t,e.id),e=>He(e===p?"":e),e=>"Escape"===e.key&&Be(),function(e){c=e,n(12,c)}]}return new class extends ae{constructor(e){super(),se(this,e,PE,QE,o,{},null,[-1,-1,-1,-1,-1,-1])}}({target:document.body,props:{name:"world"}})}(); +const dk={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},fk={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},hk=BigInt(2);const pk=Qb(dk.p,{sqrt:function(e){const t=dk.p,n=BigInt(3),r=BigInt(6),i=BigInt(11),o=BigInt(22),s=BigInt(23),a=BigInt(44),l=BigInt(88),c=e*e*e%t,u=c*c*e%t,d=vb(u,n,t)*u%t,f=vb(d,n,t)*u%t,h=vb(f,hk,t)*c%t,p=vb(h,i,t)*h%t,g=vb(p,o,t)*p%t,m=vb(g,a,t)*g%t,y=vb(m,l,t)*m%t,w=vb(y,a,t)*g%t,v=vb(w,n,t)*u%t,A=vb(v,s,t)*p%t,b=vb(A,r,t)*c%t,k=vb(b,hk,t);if(!pk.eql(pk.sqr(k),e))throw new Error("Cannot find square root");return k}}),gk=function(e,t){const n=t=>uk({...e,hash:t});return{...n(t),create:n}}({...dk,Fp:pk,lowS:!0,endo:fk},HA),mk=HA,yk="nip46";function wk(e){let t=0n;for(const n of e)t=t<<8n|BigInt(n);return t}function vk(e){const t=gk.utils.randomPrivateKey(),n=gk.ProjectivePoint.fromHex(function(e){const t=(new TextEncoder).encode("Secp256k1_HashToCurve_Cashu_"),n=mk(new Uint8Array([...t,...e]));for(let e=0;e<65536;e++){const t=new Uint8Array(4);new DataView(t.buffer).setUint32(0,e,!0);const r=new Uint8Array([...n,...t]),i=mk(r),o=new Uint8Array([2,...i]);try{if(!gk.ProjectivePoint.fromHex(o).equals(gk.ProjectivePoint.ZERO))return o}catch{}}throw new Error("Failed to hash to curve after 65536 attempts")}(e)),r=gk.ProjectivePoint.BASE.multiply(wk(t));return{B_:n.add(r).toRawBytes(!0),secret:e,r:t}}function Ak(e){const t={k:e.keysetId,s:Mu(e.secret),c:Mu(e.signature),p:Mu(e.pubkey),e:e.expiry,sc:e.scope,kinds:e.kinds,kind_ranges:e.kindRanges},n=JSON.stringify(t);return"cashuA"+btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function bk(e,t,n,r,i,o){const s=vk(crypto.getRandomValues(new Uint8Array(32))),a={blinded_message:Mu(s.B_),scope:t,kinds:i,kind_ranges:o},l=`${e}/cashu/mint`,c=await r(l,"POST"),u=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:c},body:JSON.stringify(a)});if(!u.ok){const e=await u.text();throw new Error(`Mint request failed: ${e}`)}const d=await u.json(),f=Vu(d.blinded_signature),h=Vu(d.mint_pubkey),p=function(e,t,n){const r=gk.ProjectivePoint.fromHex(e),i=gk.ProjectivePoint.fromHex(n).multiply(wk(t));return r.subtract(i).toRawBytes(!0)}(f,s.r,h);return{keysetId:d.keyset_id,secret:s.secret,signature:p,pubkey:n,expiry:d.expiry,scope:t,kinds:i,kindRanges:o}}async function kk(e){let t=e.replace("wss://","https://").replace("ws://","http://").replace(/\/$/,"");try{const e=await fetch(`${t}/cashu/info`);if(!e.ok)return null;const n=await e.json();return n.mintUrl=t,n}catch{return null}}const Ik="connect",Ek="get_public_key",Ck="sign_event",xk="nip04_encrypt",Bk="nip04_decrypt",Sk="ping";class Fk{constructor(e,t,n){this.relayUrl=e,this.userPubkey=t,this.userPrivkey=n,this.ws=null,this.connected=!1,this.allowedSecrets=new Set,this.connectedClients=new Map,this.requestLog=[],this.heartbeatInterval=null,this.subscriptionId=null,this.catToken=null,this.onClientConnected=null,this.onClientDisconnected=null,this.onRequest=null,this.onStatusChange=null}addAllowedSecret(e){this.allowedSecrets.add(e)}removeAllowedSecret(e){this.allowedSecrets.delete(e)}setCatToken(e){this.catToken=e}async connect(){return new Promise((e,t)=>{let n=this.relayUrl;if(n.startsWith("http://")?n="ws://"+n.slice(7):n.startsWith("https://")?n="wss://"+n.slice(8):n.startsWith("ws://")||n.startsWith("wss://")||(n="wss://"+n),this.catToken){const e=Ak(this.catToken),t=new URL(n);t.searchParams.set("token",e),n=t.toString()}console.log("[BunkerService] Connecting to:",n.split("?")[0]);const r=new WebSocket(n),i=setTimeout(()=>{r.close(),t(new Error("Connection timeout"))},1e4);r.onopen=()=>{clearTimeout(i),this.ws=r,this.connected=!0,console.log("[BunkerService] Connected to relay"),this.subscriptionId=function(e=16){const t=new Uint8Array(e);return crypto.getRandomValues(t),Mu(t)}(8);const t=JSON.stringify(["REQ",this.subscriptionId,{kinds:[24133],"#p":[this.userPubkey],since:Math.floor(Date.now()/1e3)-60}]);r.send(t),console.log("[BunkerService] Subscribed to NIP-46 events"),this.startHeartbeat(),this.onStatusChange&&this.onStatusChange("connected"),e()},r.onerror=e=>{clearTimeout(i),console.error("[BunkerService] WebSocket error:",e),t(new Error("WebSocket error"))},r.onclose=()=>{this.connected=!1,this.ws=null,this.stopHeartbeat(),console.log("[BunkerService] Disconnected from relay"),this.onStatusChange&&this.onStatusChange("disconnected")},r.onmessage=e=>{this.handleMessage(e.data)}})}startHeartbeat(e=3e4){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=JSON.stringify(["REQ",this.subscriptionId,{kinds:[24133],"#p":[this.userPubkey],since:Math.floor(Date.now()/1e3)-60}]);this.ws.send(e)}},e)}stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}disconnect(){this.stopHeartbeat(),this.ws&&(this.subscriptionId&&this.ws.send(JSON.stringify(["CLOSE",this.subscriptionId])),this.ws.close(),this.ws=null),this.connected=!1,this.connectedClients.clear()}async handleMessage(e){try{const t=JSON.parse(e);if(!Array.isArray(t))return;const[n,...r]=t;if("EVENT"===n){const[,e]=r;24133===e.kind&&await this.handleNIP46Request(e)}else"OK"===n?console.log("[BunkerService] Event published:",r[0]?.substring(0,8)):"NOTICE"===n&&console.warn("[BunkerService] Relay notice:",r[0])}catch(e){console.error("[BunkerService] Failed to parse message:",e)}}async handleNIP46Request(e){try{const t=Mu(this.userPrivkey),n=await gs.decrypt(t,e.pubkey,e.content),r=JSON.parse(n);console.log("[BunkerService] Received request:",r.method,"from:",e.pubkey.substring(0,8)),this.requestLog.push({id:r.id,method:r.method,from:e.pubkey,timestamp:Date.now()}),this.requestLog.length>100&&this.requestLog.shift(),this.onRequest&&this.onRequest(r,e.pubkey);let i=null,o=null;try{switch(r.method){case Ik:i=await this.handleConnect(r,e.pubkey);break;case Ek:i=await this.handleGetPublicKey(r,e.pubkey);break;case Ck:i=await this.handleSignEvent(r,e.pubkey);break;case xk:i=await this.handleNip04Encrypt(r,e.pubkey);break;case Bk:i=await this.handleNip04Decrypt(r,e.pubkey);break;case Sk:i="pong";break;default:o=`Unknown method: ${r.method}`}}catch(e){console.error("[BunkerService] Error handling request:",e),o=e.message}await this.sendResponse(r.id,i,o,e.pubkey)}catch(e){console.error("[BunkerService] Failed to handle NIP-46 request:",e)}}async handleConnect(e,t){const[n,r]=e.params;if(this.allowedSecrets.size>0&&(!r||!this.allowedSecrets.has(r)))throw new Error("Invalid or missing connection secret");return this.connectedClients.set(t,{clientPubkey:n||t,connectedAt:Date.now(),lastActivity:Date.now()}),console.log("[BunkerService] Client connected:",t.substring(0,8)),this.onClientConnected&&this.onClientConnected(t),"ack"}async handleGetPublicKey(e,t){return this.connectedClients.has(t)&&(this.connectedClients.get(t).lastActivity=Date.now()),this.userPubkey}async handleSignEvent(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n]=e.params,r=JSON.parse(n);if(r.pubkey&&r.pubkey!==this.userPubkey)throw new Error("Event pubkey does not match signer pubkey");r.pubkey=this.userPubkey;const i=JSON.stringify([0,r.pubkey,r.created_at,r.kind,r.tags,r.content]),o=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(i));r.id=Mu(new Uint8Array(o));const s=gk.sign(Vu(r.id),this.userPrivkey);return r.sig=s.toCompactHex(),console.log("[BunkerService] Signed event:",r.id.substring(0,8),"kind:",r.kind),JSON.stringify(r)}async handleNip04Encrypt(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n,r]=e.params,i=Mu(this.userPrivkey);return await gs.encrypt(i,n,r)}async handleNip04Decrypt(e,t){if(!this.connectedClients.has(t))throw new Error("Not connected");this.connectedClients.get(t).lastActivity=Date.now();const[n,r]=e.params,i=Mu(this.userPrivkey);return await gs.decrypt(i,n,r)}async sendResponse(e,t,n,r){if(!this.ws||!this.connected)return void console.error("[BunkerService] Cannot send response: not connected");const i={id:e,result:null!==t?t:void 0,error:null!==n?n:void 0},o=Mu(this.userPrivkey),s=await gs.encrypt(o,r,JSON.stringify(i)),a={kind:24133,pubkey:this.userPubkey,created_at:Math.floor(Date.now()/1e3),content:s,tags:[["p",r]]},l=JSON.stringify([0,a.pubkey,a.created_at,a.kind,a.tags,a.content]),c=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(l));a.id=Mu(new Uint8Array(c));const u=gk.sign(Vu(a.id),this.userPrivkey);a.sig=u.toCompactHex(),this.ws.send(JSON.stringify(["EVENT",a])),console.log("[BunkerService] Sent response for:",e)}isConnected(){return this.connected}getConnectedClients(){return Array.from(this.connectedClients.entries()).map(([e,t])=>({pubkey:e,...t}))}getRequestLog(){return[...this.requestLog]}}function Qk(e,t,n){const r=e.slice();return r[48]=t[n],r}function Dk(e,t,n){const r=e.slice();return r[52]=t[n],r}function Rk(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to access remote signing.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-13nqrp7"),A(o,"class","login-btn svelte-13nqrp7"),A(n,"class","login-prompt svelte-13nqrp7")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[24]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Pk(e){let t,n,r,i,o,s,a,l,f=(e[3]||"read-only")+"";return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Access Denied",i=m(),o=h("p"),s=g("You need write access to use remote signing. Your current access level: "),a=h("strong"),l=g(f),A(r,"class","svelte-13nqrp7"),A(o,"class","svelte-13nqrp7"),A(n,"class","access-denied svelte-13nqrp7"),A(t,"class","bunker-view svelte-13nqrp7")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(o,a),c(a,l)},p(e,t){8&t[0]&&f!==(f=(e[3]||"read-only")+"")&&k(l,f)},d(e){e&&d(t)}}}function $k(e){let t,n,r,i,o,s,a,l,f,p,y,v=e[7]?"Loading...":"Refresh",b=e[8]&&Tk(e),I=e[4]?.cashu_enabled&&"none"!==e[4]?.acl_mode&&Nk();function E(e,t){return e[7]&&!e[4]?Ok:e[4]?Lk:void 0}let C=E(e),x=C&&C(e);return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Remote Signing (NIP-46 Bunker)",i=m(),o=h("button"),s=g(v),a=m(),b&&b.c(),l=m(),I&&I.c(),f=m(),x&&x.c(),A(r,"class","svelte-13nqrp7"),A(o,"class","refresh-btn svelte-13nqrp7"),o.disabled=e[7],A(n,"class","header-section svelte-13nqrp7"),A(t,"class","bunker-view svelte-13nqrp7")},m(d,h){u(d,t,h),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(t,a),b&&b.m(t,null),c(t,l),I&&I.m(t,null),c(t,f),x&&x.m(t,null),p||(y=w(o,"click",e[21]),p=!0)},p(e,n){128&n[0]&&v!==(v=e[7]?"Loading...":"Refresh")&&k(s,v),128&n[0]&&(o.disabled=e[7]),e[8]?b?b.p(e,n):(b=Tk(e),b.c(),b.m(t,l)):b&&(b.d(1),b=null),e[4]?.cashu_enabled&&"none"!==e[4]?.acl_mode?I||(I=Nk(),I.c(),I.m(t,f)):I&&(I.d(1),I=null),C===(C=E(e))&&x?x.p(e,n):(x&&x.d(1),x=C&&C(e),x&&(x.c(),x.m(t,null)))},d(e){e&&d(t),b&&b.d(),I&&I.d(),x&&x.d(),p=!1,y()}}}function Uk(t){let n;return{c(){n=h("div"),n.innerHTML='

Remote Signing Not Available

\n

This relay does not have bunker mode enabled, or ACL mode is set to "none".

\n

Remote signing requires the relay operator to enable ACL mode "follows" or "managed".

',A(n,"class","bunker-view svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Tk(e){let t,n;return{c(){t=h("div"),n=g(e[8]),A(t,"class","error-message svelte-13nqrp7")},m(e,r){u(e,t,r),c(t,n)},p(e,t){256&t[0]&&k(n,e[8])},d(e){e&&d(t)}}}function Nk(e){let t;return{c(){t=h("div"),t.innerHTML="CAT Required: This relay requires Cashu Access Tokens (CAT) for bunker connections.\n Your client must support CAT authentication or connections will be rejected.",A(t,"class","cat-warning svelte-13nqrp7")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Lk(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,S,F,Q,D,R,P,$,U,T,N,L,O,M,_,H,j,G,q,K,J,V,Y,z,W,Z=e[10]?"Active":"Inactive",X=e[4].relay_url+"",ee="relay"===e[9]?"Copied!":"Copy";function te(e,t){return e[2]?Mk:_k}let ne=te(e),re=ne(e),ie=e[6].length>0&&Kk(e);return{c(){t=h("div"),t.innerHTML='

How it works: Start the bunker service to allow remote apps (like Smesh) to request signatures from your ORLY account.\n Share the QR code or bunker URL with your client app.

',n=m(),i=h("div"),o=h("div"),s=h("h4"),s.textContent="Bunker Service",a=m(),l=h("div"),f=h("span"),p=m(),y=g(Z),v=m(),re.c(),b=m(),ie&&ie.c(),I=m(),E=h("div"),C=h("h4"),C.textContent="Connection Details",x=m(),S=h("div"),F=h("span"),F.textContent="Relay:",Q=m(),D=h("code"),R=g(X),P=m(),$=h("button"),U=g(ee),T=m(),N=h("div"),L=h("span"),L.textContent="Your npub:",O=m(),M=h("code"),_=g(e[1]),H=m(),j=h("div"),G=h("span"),G.textContent="Secret:",q=m(),K=h("code"),J=g(e[5]),V=m(),Y=h("button"),Y.textContent="Regenerate",A(t,"class","instructions svelte-13nqrp7"),A(s,"class","svelte-13nqrp7"),A(f,"class","status-dot svelte-13nqrp7"),A(l,"class","service-status svelte-13nqrp7"),B(l,"active",e[10]),A(o,"class","service-header svelte-13nqrp7"),A(i,"class","service-control svelte-13nqrp7"),A(C,"class","svelte-13nqrp7"),A(F,"class","label svelte-13nqrp7"),A(D,"class","svelte-13nqrp7"),A($,"class","copy-btn svelte-13nqrp7"),A(S,"class","info-row svelte-13nqrp7"),A(L,"class","label svelte-13nqrp7"),A(M,"class","npub svelte-13nqrp7"),A(N,"class","info-row svelte-13nqrp7"),A(G,"class","label svelte-13nqrp7"),A(K,"class","secret svelte-13nqrp7"),A(Y,"class","copy-btn svelte-13nqrp7"),A(j,"class","info-row svelte-13nqrp7"),A(E,"class","connection-info svelte-13nqrp7")},m(r,d){u(r,t,d),u(r,n,d),u(r,i,d),c(i,o),c(o,s),c(o,a),c(o,l),c(l,f),c(l,p),c(l,y),c(i,v),re.m(i,null),u(r,b,d),ie&&ie.m(r,d),u(r,I,d),u(r,E,d),c(E,C),c(E,x),c(E,S),c(S,F),c(S,Q),c(S,D),c(D,R),c(S,P),c(S,$),c($,U),c(E,T),c(E,N),c(N,L),c(N,O),c(N,M),c(M,_),c(E,H),c(E,j),c(j,G),c(j,q),c(j,K),c(K,J),c(j,V),c(j,Y),z||(W=[w($,"click",e[37]),w(Y,"click",e[22])],z=!0)},p(e,t){1024&t[0]&&Z!==(Z=e[10]?"Active":"Inactive")&&k(y,Z),1024&t[0]&&B(l,"active",e[10]),ne===(ne=te(e))&&re?re.p(e,t):(re.d(1),re=ne(e),re&&(re.c(),re.m(i,null))),e[6].length>0?ie?ie.p(e,t):(ie=Kk(e),ie.c(),ie.m(I.parentNode,I)):ie&&(ie.d(1),ie=null),16&t[0]&&X!==(X=e[4].relay_url+"")&&k(R,X),512&t[0]&&ee!==(ee="relay"===e[9]?"Copied!":"Copy")&&k(U,ee),2&t[0]&&k(_,e[1]),32&t[0]&&k(J,e[5])},d(e){e&&d(t),e&&d(n),e&&d(i),re.d(),e&&d(b),ie&&ie.d(e),e&&d(I),e&&d(E),z=!1,r(W)}}}function Ok(t){let n;return{c(){n=h("div"),n.textContent="Loading bunker information...",A(n,"class","loading svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Mk(e){let t,n,r;function i(e,t){return e[10]?jk:Hk}let o=i(e),s=o(e),a=e[10]&&e[12].length>0&&Gk(e);return{c(){t=h("div"),s.c(),n=m(),a&&a.c(),r=y(),A(t,"class","service-actions svelte-13nqrp7")},m(e,i){u(e,t,i),s.m(t,null),u(e,n,i),a&&a.m(e,i),u(e,r,i)},p(e,n){o===(o=i(e))&&s?s.p(e,n):(s.d(1),s=o(e),s&&(s.c(),s.m(t,null))),e[10]&&e[12].length>0?a?a.p(e,n):(a=Gk(e),a.c(),a.m(r.parentNode,r)):a&&(a.d(1),a=null)},d(e){e&&d(t),s.d(),e&&d(n),a&&a.d(e),e&&d(r)}}}function _k(t){let n;return{c(){n=h("div"),n.textContent="Bunker service requires nsec login. Please log in with your private key to enable remote signing.",A(n,"class","no-privkey-warning svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Hk(e){let t,n,r,i,o=e[11]?"Starting...":"Start Service";return{c(){t=h("button"),n=g(o),A(t,"class","start-btn svelte-13nqrp7"),t.disabled=e[11]},m(o,s){u(o,t,s),c(t,n),r||(i=w(t,"click",e[19]),r=!0)},p(e,r){2048&r[0]&&o!==(o=e[11]?"Starting...":"Start Service")&&k(n,o),2048&r[0]&&(t.disabled=e[11])},d(e){e&&d(t),r=!1,i()}}}function jk(t){let n,r,i;return{c(){n=h("button"),n.textContent="Stop Service",A(n,"class","stop-btn svelte-13nqrp7")},m(e,o){u(e,n,o),r||(i=w(n,"click",t[20]),r=!0)},p:e,d(e){e&&d(n),r=!1,i()}}}function Gk(e){let t,n,r,i,o,s,a=e[12].length+"",l=e[12],p=[];for(let t=0;te[48].id;for(let t=0;tl.p(e,t)):(l=u(r,e),l.c()),w.set(r,y[g]=l),r in m&&v.set(r,Math.abs(g-m[r]))}const b=new Set,k=new Set;function I(e){W(e,1),e.m(l,d),a.set(e.key,e),d=e.first,p--}for(;h&&p;){const t=y[p-1],n=e[h-1],r=t.key,i=n.key;t===n?(d=t.first,h--,p--):w.has(i)?!a.has(r)||b.has(r)?I(t):k.has(i)?h--:v.get(r)>v.get(i)?(k.add(r),I(t)):(b.add(i),h--):(c(n,a),h--)}for(;h--;){const t=e[h];w.has(t.key)||c(t,a)}for(;p;)I(y[p-1]);return r(A),y}(v,t,I,1,e,k,b,p,ee,Wk,null,Qk))},d(e){e&&d(t);for(let e=0;et,r.anchor=null},p(t,i){e=t,r.ctx=e,64&i[0]&&n!==(n=e[18](e[48]))&&X(n,r)||function(e,t,n){const r=t.slice(),{resolved:i}=e;e.current===e.then&&(r[e.value]=i),e.current===e.catch&&(r[e.error]=i),e.block.p(r,n)}(r,e,i)},d(e){e&&d(t),r.block.d(),r.token=null,r=null}}}function Vk(t){let n;return{c(){n=h("div"),n.textContent="Failed to generate QR",A(n,"class","error-message svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Yk(e){let t,n,i,o,s,l,f,p,y,v,b,I,E,C,x,S,F,Q,D,R,P,$,U,T,N,L,O,M,_,H=new Date(e[48].createdAt).toLocaleString()+"",j=new Date(1e3*e[48].token.expiry).toLocaleString()+"",G=`bunker://${e[1]}?relay=${encodeURIComponent(e[4].relay_url)}${e[5]?`&secret=${e[5]}`:""}&cat=${e[48].encoded}`;function q(){return e[35](e[48])}function K(...t){return e[36](e[48],...t)}return{c(){t=h("div"),n=h("div"),i=h("img"),s=m(),l=h("div"),l.textContent="Copied!",f=m(),p=h("div"),y=h("div"),v=h("span"),v.textContent="Created:",b=m(),I=h("span"),E=g(H),C=m(),x=h("div"),S=h("span"),S.textContent="Expires:",F=m(),Q=h("span"),D=g(j),R=m(),P=h("div"),$=h("span"),$.textContent="Bunker URL:",U=m(),T=h("code"),N=g(G),L=m(),O=h("div"),O.textContent="Click QR code to copy URL",a(i.src,o=e[51])||A(i,"src",o),A(i,"alt","Token QR Code"),A(i,"class","qr-code small svelte-13nqrp7"),A(l,"class","qr-overlay svelte-13nqrp7"),B(l,"visible",e[9]===e[48].id),A(n,"class","qr-container small clickable svelte-13nqrp7"),A(n,"role","button"),A(n,"tabindex","0"),A(n,"title","Click to copy bunker URL"),A(v,"class","label svelte-13nqrp7"),A(y,"class","info-item svelte-13nqrp7"),A(S,"class","label svelte-13nqrp7"),A(x,"class","info-item svelte-13nqrp7"),A($,"class","label svelte-13nqrp7"),A(T,"class","bunker-url small svelte-13nqrp7"),A(P,"class","info-item url-item svelte-13nqrp7"),A(O,"class","copy-hint svelte-13nqrp7"),A(p,"class","token-info svelte-13nqrp7"),A(t,"class","token-detail-content svelte-13nqrp7")},m(e,r){u(e,t,r),c(t,n),c(n,i),c(n,s),c(n,l),c(t,f),c(t,p),c(p,y),c(y,v),c(y,b),c(y,I),c(I,E),c(p,C),c(p,x),c(x,S),c(x,F),c(x,Q),c(Q,D),c(p,R),c(p,P),c(P,$),c(P,U),c(P,T),c(T,N),c(p,L),c(p,O),M||(_=[w(n,"click",q),w(n,"keypress",K)],M=!0)},p(t,n){e=t,64&n[0]&&!a(i.src,o=e[51])&&A(i,"src",o),576&n[0]&&B(l,"visible",e[9]===e[48].id),64&n[0]&&H!==(H=new Date(e[48].createdAt).toLocaleString()+"")&&k(E,H),64&n[0]&&j!==(j=new Date(1e3*e[48].token.expiry).toLocaleString()+"")&&k(D,j),114&n[0]&&G!==(G=`bunker://${e[1]}?relay=${encodeURIComponent(e[4].relay_url)}${e[5]?`&secret=${e[5]}`:""}&cat=${e[48].encoded}`)&&k(N,G)},d(e){e&&d(t),M=!1,r(_)}}}function zk(t){let n;return{c(){n=h("div"),n.textContent="Loading QR...",A(n,"class","qr-placeholder small svelte-13nqrp7")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Wk(e,t){let n,i,o,s,a,l,f,p,y,b,I,E,C,x,S,F,Q,D,R,P,$=t[48].isExpanded?"▼":"▶",U=new Date(t[48].createdAt).toLocaleDateString()+"",T=new Date(1e3*t[48].token.expiry).toLocaleDateString()+"";function N(...e){return t[31](t[48],...e)}function L(){return t[32](t[48])}function O(){return t[33](t[48])}function M(...e){return t[34](t[48],...e)}let _=t[48].isExpanded&&Jk(t);return{key:e,first:null,c(){n=h("div"),i=h("div"),o=h("span"),s=g($),a=m(),l=h("input"),p=m(),y=h("span"),b=g(U),I=m(),E=h("span"),C=g("Expires: "),x=g(T),S=m(),F=h("button"),F.textContent="Revoke",Q=m(),_&&_.c(),D=m(),A(o,"class","expand-icon svelte-13nqrp7"),A(l,"type","text"),A(l,"class","token-name-input svelte-13nqrp7"),l.value=f=t[48].name,A(l,"placeholder","Token name"),A(y,"class","token-created svelte-13nqrp7"),A(E,"class","token-expiry svelte-13nqrp7"),A(F,"class","revoke-btn svelte-13nqrp7"),A(F,"title","Revoke this token"),A(i,"class","token-main svelte-13nqrp7"),A(i,"role","button"),A(i,"tabindex","0"),A(n,"class","token-row svelte-13nqrp7"),B(n,"expanded",t[48].isExpanded),this.first=n},m(e,r){u(e,n,r),c(n,i),c(i,o),c(o,s),c(i,a),c(i,l),c(i,p),c(i,y),c(y,b),c(i,I),c(i,E),c(E,C),c(E,x),c(i,S),c(i,F),c(n,Q),_&&_.m(n,null),c(n,D),R||(P=[w(l,"input",N),w(l,"click",v(t[30])),w(F,"click",v(L)),w(i,"click",O),w(i,"keypress",M)],R=!0)},p(e,r){t=e,64&r[0]&&$!==($=t[48].isExpanded?"▼":"▶")&&k(s,$),64&r[0]&&f!==(f=t[48].name)&&l.value!==f&&(l.value=f),64&r[0]&&U!==(U=new Date(t[48].createdAt).toLocaleDateString()+"")&&k(b,U),64&r[0]&&T!==(T=new Date(1e3*t[48].token.expiry).toLocaleDateString()+"")&&k(x,T),t[48].isExpanded?_?_.p(t,r):(_=Jk(t),_.c(),_.m(n,D)):_&&(_.d(1),_=null),64&r[0]&&B(n,"expanded",t[48].isExpanded)},d(e){e&&d(n),_&&_.d(),R=!1,r(P)}}}function Zk(t){let n;function r(e,t){return e[4]?.available?e[13]?$k:e[0]?Pk:Rk:Uk}let i=r(t),o=i(t);return{c(){o.c(),n=y()},m(e,t){o.m(e,t),u(e,n,t)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n.parentNode,n)))},i:e,o:e,d(e){o.d(e),e&&d(n)}}}function Xk(){const e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,"0")).join("")}function eI(e,t,n){let r,i,o,s,{isLoggedIn:a=!1}=t,{userPubkey:l=""}=t,{userSigner:c=null}=t,{userPrivkey:u=null}=t,{currentEffectiveRole:d=""}=t;const f=P();let h=null,p=!1,g="",m="",y="",w=null,v=!1,A=!1,b=[],k=null,I=[],E=null;const C=["brave","calm","clever","cosmic","cozy","daring","eager","fancy","gentle","happy","jolly","keen","lively","merry","nimble","peppy","quick","rustic","shiny","swift","tender","vivid","witty","zesty"],x=["badger","bunny","coral","dolphin","falcon","gecko","heron","iguana","jaguar","koala","lemur","mango","narwhal","otter","panda","quail","rabbit","salmon","turtle","urchin","viper","walrus","yak","zebra"];async function B(e,t){const r=await bk(e.mintUrl,yk,Vu(l),t,[24133]),i=Ak(r),o=crypto.randomUUID().split("-")[0],s={id:o,name:`${C[Math.floor(Math.random()*C.length)]}-${x[Math.floor(Math.random()*x.length)]}`,token:r,encoded:i,createdAt:Date.now(),isExpanded:!1};return n(6,I=[...I,s]),E||n(26,E=o),console.log(`Client token "${s.name}" created, expires:`,new Date(1e3*r.expiry).toISOString()),s}function S(e){n(6,I=I.filter(t=>t.id!==e)),E===e&&n(26,E=I.length>0?I[0].id:null),T()}function F(e){n(6,I=I.map(t=>t.id===e?{...t,isExpanded:!t.isExpanded}:t))}function Q(e,t){n(6,I=I.map(n=>n.id===e?{...n,name:t}:n))}async function U(){n(7,p=!0),n(8,g="");try{n(4,h=await async function(){const e=`${window.location.origin}/api/bunker/info`,t=await fetch(e);if(!t.ok){const e=await t.text();throw new Error(e||`Failed to get bunker info: ${t.statusText}`)}return await t.json()}()),y||n(5,y=Xk()),await T()}catch(e){console.error("Error loading bunker info:",e),n(8,g=e.message||"Failed to load bunker information")}finally{n(7,p=!1)}}async function T(){o&&await ov.toDataURL(o,{width:280,margin:2,color:{dark:"#000000",light:"#ffffff"}}),s&&await ov.toDataURL(s,{width:280,margin:2,color:{dark:"#000000",light:"#ffffff"}})}function N(e,t){navigator.clipboard.writeText(e),n(9,m=t),setTimeout(()=>{n(9,m="")},2e3)}D(async()=>{await U()}),R(()=>{w&&(w.disconnect(),w=null,n(10,v=!1))});return e.$$set=e=>{"isLoggedIn"in e&&n(0,a=e.isLoggedIn),"userPubkey"in e&&n(1,l=e.userPubkey),"userSigner"in e&&n(25,c=e.userSigner),"userPrivkey"in e&&n(2,u=e.userPrivkey),"currentEffectiveRole"in e&&n(3,d=e.currentEffectiveRole)},e.$$.update=()=>{11&e.$$.dirty[0]&&n(13,r=a&&l&&("write"===d||"admin"===d||"owner"===d)),67108928&e.$$.dirty[0]&&n(29,i=I.find(e=>e.id===E)),536870962&e.$$.dirty[0]&&n(28,o=h&&l&&i?`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${i.encoded}`:""),16&e.$$.dirty[0]&&n(27,s=h?`nostr+connect://${h.relay_url}`:""),402653184&e.$$.dirty[0]&&(o||s)&&T()},[a,l,u,d,h,y,I,p,g,m,v,A,b,r,async function(){if(h?.cashu_enabled)try{const e=await kk(h.relay_url);if(!e)return;const t=async(e,t)=>`Nostr ${await $A(c,l,t,e)}`;await B(e,t),await T()}catch(e){console.error("Failed to add token:",e),n(8,g=e.message||"Failed to add token")}},S,F,Q,async function(e){if(!h||!l)return null;const t=`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`;return await ov.toDataURL(t,{width:200,margin:2,color:{dark:"#000000",light:"#ffffff"}})},async function(){if(v||A)console.log("Service already active or starting, ignoring");else if(u&&l&&h){n(11,A=!0),n(8,g="");try{if(h.cashu_enabled){console.log("CAT required, minting tokens...");const e=await kk(h.relay_url);if(e){const t=async(e,t)=>`Nostr ${await $A(c,l,t,e)}`;k=await bk(e.mintUrl,yk,Vu(l),t,[24133]),console.log("Service CAT token acquired, expires:",new Date(1e3*k.expiry).toISOString()),await B(e,t)}}w=new Fk(h.relay_url,l,u),y&&w.addAllowedSecret(y),k&&w.setCatToken(k),w.onClientConnected=e=>{n(12,b=w.getConnectedClients())},w.onStatusChange=e=>{console.log("[BunkerView] Service status changed:",e),n(10,v="connected"===e),"disconnected"===e&&n(12,b=[])},await w.connect(),n(10,v=!0),await T(),console.log("Bunker service started successfully")}catch(e){console.error("Failed to start bunker service:",e),n(8,g=e.message||"Failed to start bunker service"),w=null,n(10,v=!1),k=null,n(6,I=[]),n(26,E=null)}finally{n(11,A=!1)}}else n(8,g="Missing private key or bunker info")},function(){w&&(w.disconnect(),w=null),n(10,v=!1),n(12,b=[]),k=null,n(6,I=[]),n(26,E=null),T()},U,async function(){n(5,y=Xk()),await T()},N,function(){f("openLoginModal")},c,E,s,o,i,function(t){$.call(this,e,t)},(e,t)=>Q(e.id,t.target.value),e=>S(e.id),e=>F(e.id),(e,t)=>"Enter"===t.key&&F(e.id),e=>{N(`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`,e.id)},(e,t)=>{if("Enter"===t.key){N(`bunker://${l}?relay=${encodeURIComponent(h.relay_url)}${y?`&secret=${y}`:""}&cat=${e.encoded}`,e.id)}},()=>N(h.relay_url,"relay")]}class tI extends ae{constructor(e){super(),se(this,e,eI,Zk,o,{isLoggedIn:0,userPubkey:1,userSigner:25,userPrivkey:2,currentEffectiveRole:3},null,[-1,-1])}}function nI(e,t,n){const r=e.slice();return r[29]=t[n],r}function rI(e,t,n){const r=e.slice();return r[32]=t[n],r}function iI(e){let t,n,r;function i(e,t){return e[0]?sI:aI}let o=i(e),s=o(e);return{c(){t=h("div"),n=h("p"),n.textContent="Log viewer is only available to relay owners.",r=m(),s.c(),A(n,"class","svelte-w6h7aj"),A(t,"class","login-prompt svelte-w6h7aj")},m(e,i){u(e,t,i),c(t,n),c(t,r),s.m(t,null)},p(e,n){o===(o=i(e))&&s?s.p(e,n):(s.d(1),s=o(e),s&&(s.c(),s.m(t,null)))},d(e){e&&d(t),s.d()}}}function oI(e){let t,n,i,o,s,a,l,p,y,v,b,I,E,x,B,S,F,Q,D,R,P,$,U,T,N,L,O,M,H,j,G,q=e[3]?"Loading...":"Refresh",K=e[2].length+"",J=e[12],V=[];for(let t=0;te[18].call(y)),A(a,"class","level-selector svelte-w6h7aj"),A(b,"class","clear-btn svelte-w6h7aj"),b.disabled=E=e[3]||0===e[2].length,A(B,"class","refresh-btn svelte-w6h7aj"),B.disabled=e[3],A(s,"class","header-controls svelte-w6h7aj"),A(n,"class","header-section svelte-w6h7aj"),A(R,"class","log-info svelte-w6h7aj"),A(H,"class","log-list svelte-w6h7aj"),A(t,"class","log-view svelte-w6h7aj")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(a,p),c(a,y);for(let e=0;eNo logs available.

",A(n,"class","empty-state svelte-w6h7aj")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function fI(e){let t,n,r,i,o=e[29].file+"",s=e[29].line+"";return{c(){t=h("span"),n=g(o),r=g(":"),i=g(s),A(t,"class","log-location svelte-w6h7aj")},m(e,o){u(e,t,o),c(t,n),c(t,r),c(t,i)},p(e,t){4&t[0]&&o!==(o=e[29].file+"")&&k(n,o),4&t[0]&&s!==(s=e[29].line+"")&&k(i,s)},d(e){e&&d(t)}}}function hI(e){let t,n,r,i,o,s,a,l,f,p,y,w=wI(e[29].timestamp)+"",v=e[29].level+"",b=e[29].message+"",I=e[29].file&&fI(e);return{c(){t=h("div"),n=h("span"),r=g(w),i=m(),o=h("span"),s=g(v),l=m(),I&&I.c(),f=m(),p=h("span"),y=g(b),A(n,"class","log-timestamp svelte-w6h7aj"),A(o,"class",a="log-level "+vI(e[29].level)+" svelte-w6h7aj"),A(p,"class","log-message svelte-w6h7aj"),A(t,"class","log-entry svelte-w6h7aj")},m(e,a){u(e,t,a),c(t,n),c(n,r),c(t,i),c(t,o),c(o,s),c(t,l),I&&I.m(t,null),c(t,f),c(t,p),c(p,y)},p(e,n){4&n[0]&&w!==(w=wI(e[29].timestamp)+"")&&k(r,w),4&n[0]&&v!==(v=e[29].level+"")&&k(s,v),4&n[0]&&a!==(a="log-level "+vI(e[29].level)+" svelte-w6h7aj")&&A(o,"class",a),e[29].file?I?I.p(e,n):(I=fI(e),I.c(),I.m(t,f)):I&&(I.d(1),I=null),4&n[0]&&b!==(b=e[29].message+"")&&k(y,b)},d(e){e&&d(t),I&&I.d()}}}function pI(e){let t;return{c(){t=h("span"),t.textContent="End of logs"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function gI(e){let t;return{c(){t=h("span"),t.textContent="Scroll for more"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function mI(e){let t;return{c(){t=h("span"),t.textContent="Loading more..."},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function yI(t){let n;function r(e,t){return e[4]?oI:iI}let i=r(t),o=i(t);return{c(){o.c(),n=y()},m(e,t){o.m(e,t),u(e,n,t)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n.parentNode,n)))},i:e,o:e,d(e){o.d(e),e&&d(n)}}}function wI(e){if(!e)return"";return new Date(e).toLocaleString()}function vI(e){switch(e?.toUpperCase()){case"TRC":case"TRACE":return"level-trace";case"DBG":case"DEBUG":return"level-debug";case"INF":case"INFO":default:return"level-info";case"WRN":case"WARN":return"level-warn";case"ERR":case"ERROR":return"level-error";case"FTL":case"FATAL":return"level-fatal"}}function AI(e,t,n){let r,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{userSigner:s=null}=t;const a=P();let l=[],c=!1,u=!0,d=0,f=0,h="",p="info",g="info";const m=["trace","debug","info","warn","error","fatal"];let y,w,v;async function A(e="GET",t="/api/logs"){if(!s)return null;try{const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",`${window.location.origin}${t}`],["method",e]],content:""},r=await s.signEvent(n);return btoa(JSON.stringify(r)).replace(/\+/g,"-").replace(/\//g,"_")}catch(e){return console.error("Error creating auth header:",e),null}}async function b(e=!1){if(!c){n(3,c=!0),n(7,h=""),e&&(d=0,n(2,l=[]));try{const t=`/api/logs?offset=${d}&limit=100`,r=await A("GET",t),i=`${window.location.origin}${t}`,o=await fetch(i,{headers:r?{Authorization:`Nostr ${r}`}:{}});if(!o.ok)throw new Error(`Failed to load logs: ${o.statusText}`);const s=await o.json();n(2,l=e?s.logs||[]:[...l,...s.logs||[]]),n(6,f=s.total||0),n(5,u=s.has_more||!1),d=l.length}catch(e){console.error("Error loading logs:",e),n(7,h=e.message||"Failed to load logs")}finally{n(3,c=!1)}}}async function k(){try{const e=await fetch(`${window.location.origin}/api/logs/level`);if(e.ok){const t=await e.json();n(8,p=t.level||"info"),n(9,g=p)}}catch(e){console.error("Error loading log level:",e)}}D(()=>{r&&(b(!0),k(),function(){if(!w)return;v=new IntersectionObserver(e=>{e[0].isIntersecting&&u&&!c&&u&&!c&&b(!1)},{threshold:.1}),v.observe(w)}())}),R(()=>{v&&v.disconnect()});return e.$$set=e=>{"isLoggedIn"in e&&n(0,i=e.isLoggedIn),"userRole"in e&&n(1,o=e.userRole),"userSigner"in e&&n(17,s=e.userSigner)},e.$$.update=()=>{3&e.$$.dirty[0]&&n(4,r=i&&"owner"===o),28&e.$$.dirty[0]&&r&&0===l.length&&!c&&(b(!0),k())},[i,o,l,c,r,u,f,h,p,g,y,w,m,b,async function(){if(g!==p)try{const e=await A("POST","/api/logs/level"),t=await fetch(`${window.location.origin}/api/logs/level`,{method:"POST",headers:{"Content-Type":"application/json",...e?{Authorization:`Nostr ${e}`}:{}},body:JSON.stringify({level:g})});if(!t.ok)throw new Error(`Failed to set log level: ${t.statusText}`);const r=await t.json();n(8,p=r.level),n(9,g=p)}catch(e){console.error("Error setting log level:",e),n(7,h=e.message||"Failed to set log level"),n(9,g=p)}},async function(){if(confirm("Are you sure you want to clear all logs?"))try{const e=await A("POST","/api/logs/clear"),t=await fetch(`${window.location.origin}/api/logs/clear`,{method:"POST",headers:e?{Authorization:`Nostr ${e}`}:{}});if(!t.ok)throw new Error(`Failed to clear logs: ${t.statusText}`);n(2,l=[]),d=0,n(5,u=!1),n(6,f=0)}catch(e){console.error("Error clearing logs:",e),n(7,h=e.message||"Failed to clear logs")}},function(){a("openLoginModal")},s,function(){g=x(this),n(9,g),n(12,m)},()=>b(!0),function(e){T[e?"unshift":"push"](()=>{w=e,n(11,w)})},function(e){T[e?"unshift":"push"](()=>{y=e,n(10,y)})}]}class bI extends ae{constructor(e){super(),se(this,e,AI,yI,o,{isLoggedIn:0,userRole:1,userSigner:17},null,[-1,-1])}}function kI(e){let t,n,r,i,o,s,a,l,f,p,y;return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Active Filter",i=m(),o=h("button"),o.textContent="🧹 Sweep",s=m(),a=h("div"),l=h("pre"),f=g(e[2]),A(r,"class","svelte-1tyqaa5"),A(o,"class","sweep-btn svelte-1tyqaa5"),A(o,"title","Clear filter"),A(n,"class","filter-display-header svelte-1tyqaa5"),A(l,"class","filter-json svelte-1tyqaa5"),A(a,"class","filter-json-container svelte-1tyqaa5"),A(t,"class","filter-display svelte-1tyqaa5")},m(d,h){u(d,t,h),c(t,n),c(n,r),c(n,i),c(n,o),c(t,s),c(t,a),c(a,l),c(l,f),p||(y=w(o,"click",e[3]),p=!0)},p(e,t){4&t&&k(f,e[2])},d(e){e&&d(t),p=!1,y()}}}function II(t){let n,r=t[0]&&t[1]&&kI(t);return{c(){r&&r.c(),n=y()},m(e,t){r&&r.m(e,t),u(e,n,t)},p(e,[t]){e[0]&&e[1]?r?r.p(e,t):(r=kI(e),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:e,o:e,d(e){r&&r.d(e),e&&d(n)}}}function EI(e,t,n){let r,i;const o=P();let{filter:s={}}=t,{showFilter:a=!0}=t;return e.$$set=e=>{"filter"in e&&n(4,s=e.filter),"showFilter"in e&&n(0,a=e.showFilter)},e.$$.update=()=>{16&e.$$.dirty&&n(2,r=function(e){return JSON.stringify(e,null,2)}(s)),16&e.$$.dirty&&n(1,i=Object.keys(s).length>0)},[a,i,r,function(){o("sweep")},s]}class CI extends ae{constructor(e){super(),se(this,e,EI,II,o,{filter:4,showFilter:0})}}function xI(e){return Bh[e]||`Kind ${e}`}function BI(e){return e?e.slice(0,8)+"..."+e.slice(-8):"unknown"}function SI(e,t=100){return e?e.length>t?e.slice(0,t)+"...":e:""}function FI(e){return e?new Date(1e3*e).toLocaleString():""}class QI{constructor(e,t,n){this.relayUrl=e,this.userSigner=t,this.userPubkey=n,this.ws=null,this.challenge=null,this.isAuthenticated=!1,this.authPromise=null}async connect(){return new Promise((e,t)=>{this.ws=new WebSocket(this.relayUrl),this.ws.onopen=()=>{console.log("WebSocket connected to relay:",this.relayUrl),e()},this.ws.onmessage=async e=>{try{const t=JSON.parse(e.data);await this.handleMessage(t)}catch(e){console.error("Error parsing relay message:",e)}},this.ws.onerror=e=>{console.error("WebSocket error:",e),t(new Error("Failed to connect to relay"))},this.ws.onclose=()=>{console.log("WebSocket connection closed"),this.isAuthenticated=!1,this.challenge=null},setTimeout(()=>{this.ws.readyState!==WebSocket.OPEN&&t(new Error("Connection timeout"))},1e4)})}async handleMessage(e){const[t,...n]=e;switch(t){case"AUTH":this.challenge=n[0],console.log("Received AUTH challenge:",this.challenge),await this.authenticate();break;case"OK":const[e,r,i]=n;e&&r?(console.log("Authentication successful for event:",e),this.isAuthenticated=!0,this.authPromise&&(this.authPromise.resolve(),this.authPromise=null)):e&&!r&&(console.error("Authentication failed:",i),this.authPromise&&(this.authPromise.reject(new Error(i||"Authentication failed")),this.authPromise=null));break;case"NOTICE":console.log("Relay notice:",n[0]);break;default:console.log("Unhandled message type:",t,n)}}async authenticate(){if(!this.challenge)throw new Error("No challenge received from relay");if(!this.userSigner)throw new Error("No signer available for authentication");try{const e={kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",this.relayUrl],["challenge",this.challenge]],content:"",pubkey:this.userPubkey},t=["AUTH",await this.userSigner.signEvent(e)];return this.ws.send(JSON.stringify(t)),console.log("Sent authentication event to relay"),new Promise((e,t)=>{this.authPromise={resolve:e,reject:t},setTimeout(()=>{this.authPromise&&(this.authPromise.reject(new Error("Authentication timeout")),this.authPromise=null)},1e4)})}catch(e){throw console.error("Authentication error:",e),e}}async publishEvent(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");return new Promise((t,n)=>{const r=["EVENT",e];this.ws.send(JSON.stringify(r));const i=this.ws.onmessage,o=setTimeout(()=>{this.ws.onmessage=i,n(new Error("Publish timeout"))},15e3);this.ws.onmessage=async r=>{try{const s=JSON.parse(r.data),[a,l,c,u]=s;if("OK"===a&&l===e.id)if(c)clearTimeout(o),this.ws.onmessage=i,console.log("Event published successfully:",l),t({success:!0,eventId:l,reason:u});else{if(console.error("Event publish failed:",u),u&&u.includes("auth-required"))return void console.log("Authentication required, waiting for AUTH challenge...");clearTimeout(o),this.ws.onmessage=i,n(new Error(`Publish failed: ${u}`))}else if("AUTH"===a){this.challenge=s[1],console.log("Received AUTH challenge during publish:",this.challenge);try{await this.authenticate(),console.log("Authentication successful, retrying event publish...");const t=["EVENT",e];this.ws.send(JSON.stringify(t))}catch(e){clearTimeout(o),this.ws.onmessage=i,n(new Error(`Authentication failed: ${e.message}`))}}else await this.handleMessage(s)}catch(e){clearTimeout(o),this.ws.onmessage=i,n(e)}}})}close(){this.ws&&(this.ws.close(),this.ws=null),this.isAuthenticated=!1,this.challenge=null}getAuthenticated(){return this.isAuthenticated}}async function DI(e,t,n,r){const i=new QI(e,n,r);try{await i.connect();return await i.publishEvent(t)}finally{i.close()}}function RI(e,t,n){const r=e.slice();return r[170]=t[n],r}function PI(e,t,n){const r=e.slice();return r[180]=t[n],r}function $I(e,t,n){const r=e.slice();return r[173]=t[n],r}function UI(e,t,n){const r=e.slice();r[173]=t[n];const i=r[53](r[173]);return r[174]=i,r}function TI(e,t,n){const r=e.slice();return r[177]=t[n],r}function NI(t){let n;function r(e,t){return e[1]?WI:zI}let i=r(t),o=i(t);return{c(){n=h("div"),o.c(),A(n,"class","welcome-message svelte-u3u5mw")},m(e,t){u(e,n,t),o.m(n,null)},p(e,t){i===(i=r(e))&&o?o.p(e,t):(o.d(1),o=i(e),o&&(o.c(),o.m(n,null)))},i:e,o:e,d(e){e&&d(n),o.d()}}}function LI(e){let t,n,r=e[6],i=[];for(let t=0;tZ(i[e],1,1,()=>{i[e]=null});return{c(){for(let e=0;e=0||""!==t[37]&&parseInt(t[37])>=0,P=xh,$=[];for(let e=0;eEvent Recovery \n

Search and recover old versions of replaceable events

',o=m(),s=h("div"),a=h("div"),l=h("div"),p=h("label"),p.textContent="Select Event Kind:",g=m(),y=h("select"),v=h("option"),v.textContent="Choose a replaceable kind...";for(let e=0;e<$.length;e+=1)$[e].c();k=m(),E=h("div"),x=h("label"),x.textContent="Or enter custom kind number:",B=m(),S=h("input"),F=m(),U&&U.c(),A(p,"for","recovery-kind"),A(p,"class","svelte-u3u5mw"),v.__value=null,v.value=v.__value,A(y,"id","recovery-kind"),A(y,"class","svelte-u3u5mw"),void 0===t[36]&&_(()=>t[116].call(y)),A(l,"class","kind-selector svelte-u3u5mw"),A(x,"for","custom-kind"),A(x,"class","svelte-u3u5mw"),A(S,"id","custom-kind"),A(S,"type","number"),A(S,"placeholder","e.g., 10001"),A(S,"min","0"),A(S,"class","svelte-u3u5mw"),A(E,"class","custom-kind-input svelte-u3u5mw"),A(a,"class","recovery-controls svelte-u3u5mw"),A(s,"class","recovery-controls-card svelte-u3u5mw"),A(n,"class","recovery-tab svelte-u3u5mw")},m(e,r){u(e,n,r),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(l,p),c(l,g),c(l,y),c(y,v);for(let e=0;e<$.length;e+=1)$[e]&&$[e].m(y,null);C(y,t[36],!0),c(a,k),c(a,E),c(E,x),c(E,B),c(E,S),I(S,t[37]),c(n,F),U&&U.m(n,null),Q||(D=[w(y,"change",t[116]),w(y,"change",t[51]),w(S,"input",t[117]),w(S,"input",t[52])],Q=!0)},p(e,t){if(0&t){let n;for(P=xh,n=0;n=0||""!==e[37]&&parseInt(e[37])>=0),R?U?U.p(e,t):(U=lE(e),U.c(),U.m(n,null)):U&&(U.d(1),U=null)},i:e,o:e,d(e){e&&d(n),f($,e),U&&U.d(),Q=!1,r(D)}}}function MI(e){let t,n;return t=new bI({props:{isLoggedIn:e[1],userRole:e[4],userSigner:e[13]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),16&n[0]&&(r.userRole=e[4]),8192&n[0]&&(r.userSigner=e[13]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function _I(e){let t,n,r;function i(t){e[115](t)}let o={isLoggedIn:e[1],userRole:e[4],isPolicyAdmin:RE,policyEnabled:e[8],isLoadingPolicy:e[28],policyMessage:e[29],policyMessageType:e[30],validationErrors:e[31],policyFollows:e[32]};return void 0!==e[27]&&(o.policyJson=e[27]),t=new uw({props:o}),T.push(()=>te(t,"policyJson",i)),t.$on("loadPolicy",e[61]),t.$on("validatePolicy",e[62]),t.$on("savePolicy",e[63]),t.$on("formatJson",e[64]),t.$on("addPolicyAdmin",e[65]),t.$on("removePolicyAdmin",e[66]),t.$on("refreshFollows",e[67]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),256&r[0]&&(i.policyEnabled=e[8]),268435456&r[0]&&(i.isLoadingPolicy=e[28]),536870912&r[0]&&(i.policyMessage=e[29]),1073741824&r[0]&&(i.policyMessageType=e[30]),1&r[1]&&(i.validationErrors=e[31]),2&r[1]&&(i.policyFollows=e[32]),!n&&134217728&r[0]&&(n=!0,i.policyJson=e[27],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function HI(e){let t,n,r;function i(t){e[112](t)}let o={isLoggedIn:e[1],userRole:e[4],sprocketStatus:e[21],isLoadingSprocket:e[23],sprocketUploadFile:e[26],sprocketMessage:e[24],sprocketMessageType:e[25],sprocketVersions:e[22]};return void 0!==e[20]&&(o.sprocketScript=e[20]),t=new qy({props:o}),T.push(()=>te(t,"sprocketScript",i)),t.$on("restartSprocket",e[56]),t.$on("deleteSprocket",e[57]),t.$on("sprocketFileSelect",e[68]),t.$on("uploadSprocketScript",e[69]),t.$on("saveSprocket",e[55]),t.$on("loadSprocket",e[54]),t.$on("loadVersions",e[58]),t.$on("loadVersion",e[113]),t.$on("deleteVersion",e[114]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),2097152&r[0]&&(i.sprocketStatus=e[21]),8388608&r[0]&&(i.isLoadingSprocket=e[23]),67108864&r[0]&&(i.sprocketUploadFile=e[26]),16777216&r[0]&&(i.sprocketMessage=e[24]),33554432&r[0]&&(i.sprocketMessageType=e[25]),4194304&r[0]&&(i.sprocketVersions=e[22]),!n&&1048576&r[0]&&(n=!0,i.sprocketScript=e[20],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function jI(e){let t,n,r,i;const o=[vE,wE,yE],s=[];function a(e,t){return"managed"!==e[9]?0:e[1]&&"owner"===e[4]?1:2}return n=a(e),r=s[n]=o[n](e),{c(){t=h("div"),r.c(),A(t,"class","managed-acl-view svelte-u3u5mw")},m(e,r){u(e,t,r),s[n].m(t,null),i=!0},p(e,i){let l=n;n=a(e),n===l?s[n].p(e,i):(Y(),Z(s[l],1,1,()=>{s[l]=null}),z(),r=s[n],r?r.p(e,i):(r=s[n]=o[n](e),r.c()),W(r,1),r.m(t,null))},i(e){i||(W(r),i=!0)},o(e){Z(r),i=!1},d(e){e&&d(t),s[n].d()}}}function GI(e){let t,n,r;function i(t){e[111](t)}let o={userPubkey:e[2],userRole:e[4],policyEnabled:e[8],publishError:e[35]};return void 0!==e[34]&&(o.composeEventJson=e[34]),t=new Py({props:o}),T.push(()=>te(t,"composeEventJson",i)),t.$on("reformatJson",e[91]),t.$on("signEvent",e[92]),t.$on("publishEvent",e[93]),t.$on("clearError",e[94]),{c(){ne(t.$$.fragment)},m(e,n){re(t,e,n),r=!0},p(e,r){const i={};4&r[0]&&(i.userPubkey=e[2]),16&r[0]&&(i.userRole=e[4]),256&r[0]&&(i.policyEnabled=e[8]),16&r[1]&&(i.publishError=e[35]),!n&&8&r[1]&&(n=!0,i.composeEventJson=e[34],H(()=>n=!1)),t.$set(i)},i(e){r||(W(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ie(t,e)}}}function qI(e){let t,n;return t=new tI({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],userPrivkey:e[14],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),4&n[0]&&(r.userPubkey=e[2]),8192&n[0]&&(r.userSigner=e[13]),16384&n[0]&&(r.userPrivkey=e[14]),1024&n[0]&&(r.currentEffectiveRole=e[10]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function KI(e){let t,n;return t=new iv({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),4&n[0]&&(r.userPubkey=e[2]),8192&n[0]&&(r.userSigner=e[13]),1024&n[0]&&(r.currentEffectiveRole=e[10]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function JI(e){let t,n;return t=new hy({props:{isLoggedIn:e[1],userRole:e[4],userPubkey:e[2],filteredEvents:e[42],expandedEvents:e[19],isLoadingEvents:e[7],showOnlyMyEvents:DE,showFilterBuilder:e[16]}}),t.$on("scroll",e[90]),t.$on("toggleEventExpansion",e[107]),t.$on("deleteEvent",e[108]),t.$on("copyEventToClipboard",e[109]),t.$on("toggleChange",e[46]),t.$on("loadAllEvents",e[110]),t.$on("toggleFilterBuilder",e[77]),t.$on("filterApply",e[78]),t.$on("filterClear",e[79]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),16&n[0]&&(r.userRole=e[4]),4&n[0]&&(r.userPubkey=e[2]),2048&n[1]&&(r.filteredEvents=e[42]),524288&n[0]&&(r.expandedEvents=e[19]),128&n[0]&&(r.isLoadingEvents=e[7]),65536&n[0]&&(r.showFilterBuilder=e[16]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function VI(e){let t,n;return t=new hm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],selectedFile:e[17],aclMode:e[9],importMessage:e[18]}}),t.$on("fileSelect",e[87]),t.$on("importEvents",e[88]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),131072&n[0]&&(r.selectedFile=e[17]),512&n[0]&&(r.aclMode=e[9]),262144&n[0]&&(r.importMessage=e[18]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function YI(e){let t,n;return t=new sm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],aclMode:e[9]}}),t.$on("exportMyEvents",e[86]),t.$on("exportAllEvents",e[85]),t.$on("openLoginModal",e[71]),{c(){ne(t.$$.fragment)},m(e,r){re(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),512&n[0]&&(r.aclMode=e[9]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ie(t,e)}}}function zI(t){let n;return{c(){n=h("p"),n.textContent="Log in to access your user dashboard",A(n,"class","svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function WI(e){let t,n,r,i=(e[3]?.name||e[2].slice(0,8)+"...")+"";return{c(){t=h("p"),n=g("Welcome "),r=g(i),A(t,"class","svelte-u3u5mw")},m(e,i){u(e,t,i),c(t,n),c(t,r)},p(e,t){12&t[0]&&i!==(i=(e[3]?.name||e[2].slice(0,8)+"...")+"")&&k(r,i)},d(e){e&&d(t)}}}function ZI(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,B,S,F,Q,D,R=e[180].label+"",P=e[43].get(e[180].id)?.isLoading,$=!e[43].get(e[180].id)?.hasMore&&e[43].get(e[180].id)?.events?.length>0;function U(){return e[121](e[180])}function T(e,t){return 64&t[0]&&(E=null),64&t[0]&&(C=null),null==E&&(E=!!(e[43].get(e[180].id)?.events?.length>0)),E?eE:(null==C&&(C=!e[43].get(e[180].id)?.isLoading),C?XI:void 0)}v=new CI({props:{filter:e[43].get(e[180].id)?.filter||{}}}),v.$on("sweep",function(){return e[122](e[180])});let N=T(e,[-1,-1,-1,-1,-1,-1]),L=N&&N(e),O=P&&iE(),M=$&&oE();function _(...t){return e[127](e[180],...t)}return{c(){t=h("div"),n=h("div"),i=h("h2"),o=g("🔍 "),s=g(R),a=m(),l=h("button"),f=g("🔄 Refresh"),y=m(),ne(v.$$.fragment),b=m(),I=h("div"),L&&L.c(),x=m(),O&&O.c(),B=m(),M&&M.c(),S=m(),A(i,"class","svelte-u3u5mw"),A(l,"class","refresh-btn svelte-u3u5mw"),l.disabled=p=e[43].get(e[180].id)?.isLoading,A(n,"class","search-results-header svelte-u3u5mw"),A(I,"class","search-results-content svelte-u3u5mw"),A(t,"class","search-results-view svelte-u3u5mw")},m(e,r){u(e,t,r),c(t,n),c(n,i),c(i,o),c(i,s),c(n,a),c(n,l),c(l,f),c(t,y),re(v,t,null),c(t,b),c(t,I),L&&L.m(I,null),c(I,x),O&&O.m(I,null),c(I,B),M&&M.m(I,null),c(t,S),F=!0,Q||(D=[w(l,"click",U),w(I,"scroll",_)],Q=!0)},p(t,n){e=t,(!F||64&n[0])&&R!==(R=e[180].label+"")&&k(s,R),(!F||64&n[0]&&p!==(p=e[43].get(e[180].id)?.isLoading))&&(l.disabled=p);const r={};64&n[0]&&(r.filter=e[43].get(e[180].id)?.filter||{}),v.$set(r),N===(N=T(e,n))&&L?L.p(e,n):(L&&L.d(1),L=N&&N(e),L&&(L.c(),L.m(I,x))),64&n[0]&&(P=e[43].get(e[180].id)?.isLoading),P?O||(O=iE(),O.c(),O.m(I,B)):O&&(O.d(1),O=null),64&n[0]&&($=!e[43].get(e[180].id)?.hasMore&&e[43].get(e[180].id)?.events?.length>0),$?M||(M=oE(),M.c(),M.m(I,null)):M&&(M.d(1),M=null)},i(e){F||(W(v.$$.fragment,e),F=!0)},o(e){Z(v.$$.fragment,e),F=!1},d(e){e&&d(t),ie(v),L&&L.d(),O&&O.d(),M&&M.d(),Q=!1,r(D)}}}function XI(t){let n;return{c(){n=h("div"),n.innerHTML='

No search results found.

',A(n,"class","no-search-results svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function eE(e){let t,n=e[43].get(e[180].id).events,r=[];for(let t=0;t👤',o=m(),s=h("div"),a=h("div"),l=g(L),f=m(),p=h("div"),y=h("span"),v=g(O),b=m(),I=h("span"),E=g(M),C=m(),x=h("div"),S=h("div"),F=g(_),Q=m(),D=h("div"),R=g(H),P=m(),G&&G.c(),$=m(),J&&J.c(),U=m(),A(i,"class","search-result-avatar svelte-u3u5mw"),A(a,"class","search-result-author svelte-u3u5mw"),A(y,"class","kind-number svelte-u3u5mw"),A(I,"class","kind-name svelte-u3u5mw"),A(p,"class","search-result-kind svelte-u3u5mw"),A(s,"class","search-result-info svelte-u3u5mw"),A(S,"class","event-timestamp svelte-u3u5mw"),A(D,"class","event-content-single-line svelte-u3u5mw"),A(x,"class","search-result-content svelte-u3u5mw"),A(n,"class","search-result-row svelte-u3u5mw"),A(n,"role","button"),A(n,"tabindex","0"),A(t,"class","search-result-item svelte-u3u5mw"),B(t,"expanded",e[19].has(e[173].id))},m(e,r){u(e,t,r),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),c(a,l),c(s,f),c(s,p),c(p,y),c(y,v),c(p,b),c(p,I),c(I,E),c(n,C),c(n,x),c(x,S),c(S,F),c(x,Q),c(x,D),c(D,R),c(n,P),G&&G.m(n,null),c(t,$),J&&J.m(t,null),c(t,U),T||(N=[w(n,"click",q),w(n,"keydown",K)],T=!0)},p(r,i){e=r,64&i[0]&&L!==(L=BI(e[173].pubkey)+"")&&k(l,L),64&i[0]&&O!==(O=e[173].kind+"")&&k(v,O),64&i[0]&&M!==(M=xI(e[173].kind)+"")&&k(E,M),64&i[0]&&_!==(_=FI(e[173].created_at)+"")&&k(F,_),64&i[0]&&H!==(H=SI(e[173].content)+"")&&k(R,H),5!==e[173].kind&&("admin"===e[4]||"owner"===e[4]||"write"===e[4]&&e[173].pubkey&&e[173].pubkey===e[2])?G?G.p(e,i):(G=tE(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),524352&i[0]&&(j=e[19].has(e[173].id)),j?J?J.p(e,i):(J=nE(e),J.c(),J.m(t,U)):J&&(J.d(1),J=null),524352&i[0]|4096&i[1]&&B(t,"expanded",e[19].has(e[173].id))},d(e){e&&d(t),G&&G.d(),J&&J.d(),T=!1,r(N)}}}function iE(e){let t;return{c(){t=h("div"),t.innerHTML='
\n

Searching...

',A(t,"class","loading-search-results svelte-u3u5mw")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function oE(e){let t;return{c(){t=h("div"),t.innerHTML='

No more search results to load.

',A(t,"class","end-of-search-results svelte-u3u5mw")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function sE(e){let t,n,r=e[180].id===e[5]&&ZI(e);return{c(){r&&r.c(),t=y()},m(e,i){r&&r.m(e,i),u(e,t,i),n=!0},p(e,n){e[180].id===e[5]?r?(r.p(e,n),96&n[0]&&W(r,1)):(r=ZI(e),r.c(),W(r,1),r.m(t.parentNode,t)):r&&(Y(),Z(r,1,1,()=>{r=null}),z())},i(e){n||(W(r),n=!0)},o(e){Z(r),n=!1},d(e){r&&r.d(e),e&&d(t)}}}function aE(t){let n,r,i=t[177].label+"";return{c(){n=h("option"),r=g(i),n.__value=t[177].value,n.value=n.__value},m(e,t){u(e,n,t),c(n,r)},p:e,d(e){e&&d(n)}}}function lE(e){let t;function n(e,t){return e[39]?dE:0===e[38].length?uE:cE}let r=n(e),i=r(e);return{c(){t=h("div"),i.c(),A(t,"class","recovery-results svelte-u3u5mw")},m(e,n){u(e,t,n),i.m(t,null)},p(e,o){r===(r=n(e))&&i?i.p(e,o):(i.d(1),i=r(e),i&&(i.c(),i.m(t,null)))},d(e){e&&d(t),i.d()}}}function cE(e){let t,n,r,i=e[38],o=[];for(let t=0;tORLY_ACL_MODE=managed in your\n environment variables and restart the relay.',A(r,"class","svelte-u3u5mw"),A(o,"class","svelte-u3u5mw"),A(a,"class","svelte-u3u5mw"),A(w,"class","svelte-u3u5mw"),A(n,"class","acl-mode-warning svelte-u3u5mw")},m(e,t){u(e,n,t),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),c(a,l),c(a,f),c(f,p),c(n,y),c(n,w)},p(e,t){512&t[0]&&v!==(v=(e[9]||"unknown")+"")&&k(p,v)},i:e,o:e,d(e){e&&d(n)}}}function AE(e){let t,n,i,o,s,a,l,f,p,g;function y(e,t){return e[3]?kE:e[1]&&e[2]?bE:void 0}let b=y(e),k=b&&b(e);return{c(){t=h("div"),n=h("div"),i=h("div"),o=h("h2"),o.textContent="Settings",s=m(),a=h("button"),a.textContent="✕",l=m(),f=h("div"),k&&k.c(),A(o,"class","svelte-u3u5mw"),A(a,"class","close-btn svelte-u3u5mw"),A(i,"class","drawer-header svelte-u3u5mw"),A(f,"class","drawer-content"),A(n,"class","settings-drawer svelte-u3u5mw"),B(n,"dark-theme",e[0]),A(t,"class","drawer-overlay svelte-u3u5mw"),A(t,"role","button"),A(t,"tabindex","0")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(i,o),c(i,s),c(i,a),c(n,l),c(n,f),k&&k.m(f,null),p||(g=[w(a,"click",e[76]),w(n,"click",v(e[102])),w(n,"keydown",v(e[103])),w(t,"click",e[76]),w(t,"keydown",e[129])],p=!0)},p(e,t){b===(b=y(e))&&k?k.p(e,t):(k&&k.d(1),k=b&&b(e),k&&(k.c(),k.m(f,null))),1&t[0]&&B(n,"dark-theme",e[0])},d(e){e&&d(t),k&&k.d(),p=!1,r(g)}}}function bE(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,E,C,x,B,S=e[2].slice(0,16)+"",F=e[2].slice(-8)+"";return{c(){t=h("div"),n=h("button"),n.textContent="Log out",i=m(),o=h("h3"),o.textContent="Profile Loading",s=m(),a=h("p"),a.textContent="Your profile metadata is being loaded...",l=m(),f=h("button"),f.textContent="Retry Loading Profile",p=m(),y=h("div"),v=h("strong"),v.textContent="Public Key:",b=m(),I=g(S),E=g("..."),C=g(F),A(n,"class","logout-btn floating svelte-u3u5mw"),A(o,"class","svelte-u3u5mw"),A(a,"class","svelte-u3u5mw"),A(f,"class","retry-profile-btn svelte-u3u5mw"),A(y,"class","user-pubkey-display svelte-u3u5mw"),A(t,"class","profile-loading-section svelte-u3u5mw")},m(r,d){u(r,t,d),c(t,n),c(t,i),c(t,o),c(t,s),c(t,a),c(t,l),c(t,f),c(t,p),c(t,y),c(y,v),c(y,b),c(y,I),c(y,E),c(y,C),x||(B=[w(n,"click",e[73]),w(f,"click",e[84])],x=!0)},p(e,t){4&t[0]&&S!==(S=e[2].slice(0,16)+"")&&k(I,S),4&t[0]&&F!==(F=e[2].slice(-8)+"")&&k(C,F)},d(e){e&&d(t),x=!1,r(B)}}}function kE(e){let t,n,r,i,o,s,a,l,f,p,v,b,I,E,C,x=(e[3].name||"Unknown User")+"",B=e[3].banner&&IE(e);function S(e,t){return e[3].picture?CE:EE}let F=S(e),Q=F(e),D=e[3].nip05&&xE(e),R=e[3].about&&BE(e),P=e[4]&&"read"!==e[4]&&SE(e);return{c(){t=h("div"),n=h("div"),B&&B.c(),r=m(),i=h("button"),i.textContent="Log out",o=m(),Q.c(),s=m(),a=h("div"),l=h("h3"),f=g(x),p=m(),D&&D.c(),v=m(),R&&R.c(),b=m(),P&&P.c(),I=y(),A(i,"class","logout-btn floating svelte-u3u5mw"),A(l,"class","profile-username svelte-u3u5mw"),A(a,"class","name-row svelte-u3u5mw"),A(n,"class","profile-hero svelte-u3u5mw"),A(t,"class","profile-section svelte-u3u5mw")},m(d,h){u(d,t,h),c(t,n),B&&B.m(n,null),c(n,r),c(n,i),c(n,o),Q.m(n,null),c(n,s),c(n,a),c(a,l),c(l,f),c(a,p),D&&D.m(a,null),c(t,v),R&&R.m(t,null),u(d,b,h),P&&P.m(d,h),u(d,I,h),E||(C=w(i,"click",e[73]),E=!0)},p(e,i){e[3].banner?B?B.p(e,i):(B=IE(e),B.c(),B.m(n,r)):B&&(B.d(1),B=null),F===(F=S(e))&&Q?Q.p(e,i):(Q.d(1),Q=F(e),Q&&(Q.c(),Q.m(n,s))),8&i[0]&&x!==(x=(e[3].name||"Unknown User")+"")&&k(f,x),e[3].nip05?D?D.p(e,i):(D=xE(e),D.c(),D.m(a,null)):D&&(D.d(1),D=null),e[3].about?R?R.p(e,i):(R=BE(e),R.c(),R.m(t,null)):R&&(R.d(1),R=null),e[4]&&"read"!==e[4]?P?P.p(e,i):(P=SE(e),P.c(),P.m(I.parentNode,I)):P&&(P.d(1),P=null)},d(e){e&&d(t),B&&B.d(),Q.d(),D&&D.d(),R&&R.d(),e&&d(b),P&&P.d(e),e&&d(I),E=!1,C()}}}function IE(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[3].banner)||A(t,"src",n),A(t,"alt","Profile banner"),A(t,"class","profile-banner svelte-u3u5mw")},m(e,n){u(e,t,n)},p(e,r){8&r[0]&&!a(t.src,n=e[3].banner)&&A(t,"src",n)},d(e){e&&d(t)}}}function EE(t){let n;return{c(){n=h("div"),n.textContent="👤",A(n,"class","profile-avatar-placeholder overlap svelte-u3u5mw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function CE(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[3].picture)||A(t,"src",n),A(t,"alt","User avatar"),A(t,"class","profile-avatar overlap svelte-u3u5mw")},m(e,n){u(e,t,n)},p(e,r){8&r[0]&&!a(t.src,n=e[3].picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function xE(e){let t,n,r=e[3].nip05+"";return{c(){t=h("span"),n=g(r),A(t,"class","profile-nip05-inline svelte-u3u5mw")},m(e,r){u(e,t,r),c(t,n)},p(e,t){8&t[0]&&r!==(r=e[3].nip05+"")&&k(n,r)},d(e){e&&d(t)}}}function BE(e){let t,n;return{c(){t=h("div"),n=h("p"),A(n,"class","profile-about svelte-u3u5mw"),A(t,"class","about-card svelte-u3u5mw")},m(r,i){u(r,t,i),c(t,n),n.innerHTML=e[41]},p(e,t){1024&t[1]&&(n.innerHTML=e[41])},d(e){e&&d(t)}}}function SE(e){let t,n,r,i,o,s,a=e[96](),l=[];for(let t=0;tte(y,"showModal",C)),y.$on("login",e[72]),y.$on("close",e[74]),{c(){ne(t.$$.fragment),n=m(),r=h("div"),ne(i.$$.fragment),o=m(),s=h("main"),f.c(),p=m(),E&&E.c(),g=m(),ne(y.$$.fragment),A(s,"class","main-content svelte-u3u5mw"),A(r,"class","app-container svelte-u3u5mw"),B(r,"dark-theme",e[0])},m(e,a){re(t,e,a),u(e,n,a),u(e,r,a),re(i,r,null),c(r,o),c(r,s),k[l].m(s,null),u(e,p,a),E&&E.m(e,a),u(e,g,a),re(y,e,a),v=!0},p(e,n){const o={};1&n[0]&&(o.isDarkTheme=e[0]),2&n[0]&&(o.isLoggedIn=e[1]),16&n[0]&&(o.userRole=e[4]),1024&n[0]&&(o.currentEffectiveRole=e[10]),8&n[0]&&(o.userProfile=e[3]),4&n[0]&&(o.userPubkey=e[2]),t.$set(o);const a={};1&n[0]&&(a.isDarkTheme=e[0]),2048&n[0]&&(a.tabs=e[11]),32&n[0]&&(a.selectedTab=e[5]),4&n[1]&&(a.version=e[33]),i.$set(a);let c=l;l=I(e,n),l===c?k[l].p(e,n):(Y(),Z(k[c],1,1,()=>{k[c]=null}),z(),f=k[l],f?f.p(e,n):(f=k[l]=b[l](e),f.c()),W(f,1),f.m(s,null)),(!v||1&n[0])&&B(r,"dark-theme",e[0]),e[15]?E?E.p(e,n):(E=AE(e),E.c(),E.m(g.parentNode,g)):E&&(E.d(1),E=null);const u={};1&n[0]&&(u.isDarkTheme=e[0]),!w&&4096&n[0]&&(w=!0,u.showModal=e[12],H(()=>w=!1)),y.$set(u)},i(e){v||(W(t.$$.fragment,e),W(i.$$.fragment,e),W(f),W(y.$$.fragment,e),v=!0)},o(e){Z(t.$$.fragment,e),Z(i.$$.fragment,e),Z(f),Z(y.$$.fragment,e),v=!1},d(e){ie(t,e),e&&d(n),e&&d(r),ie(i),k[l].d(),e&&d(p),E&&E.d(e),e&&d(g),ie(y,e)}}}let DE=!1,RE=!1;function PE(e,t,n){let r,i,o,s,a;"undefined"!=typeof window&&(window.debugIndexedDB=Kh);let l=!1,c=!1,u=!1,d="",f="",h=null,p="",g=null,m=null,y=!1,w=localStorage.getItem("selectedTab")||"export",v=!1,A={},k=[],I=[],E=null,C="",B=new Set,S=!1,F=!0,Q=null,D="",R=new Map,P=[],U=0,T=[],N=!0,L=null,O="",M=null,_=[],H=!1,j="",G="info",q=!1,K=null,J="",V=!1,Y=!1,z="",W="info",Z=[],X=[],ee="",te="",ne="",re="",ie=null,oe="",se=[],ae=!1,le=!0,ce=null;function ue(e){B.has(e)?B.delete(e):B.add(e),n(19,B)}async function de(e,t){const n=JSON.stringify(e),r=await async function(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){console.error("Failed to copy to clipboard:",t);try{const t=document.createElement("textarea");return t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),!0}catch(e){return console.error("Fallback copy also failed:",e),!1}}}(n);!function(e,t=!0){if(!e)return;const n=e.textContent,r=e.style.backgroundColor;t?(e.textContent="",e.style.backgroundColor="#4CAF50"):(e.textContent="L",e.style.backgroundColor="#f44336"),setTimeout(()=>{e.textContent=n,e.style.backgroundColor=r},2e3)}(t.target.closest(".copy-json-btn"),r),r||alert("Failed to copy to clipboard. Please copy manually.")}async function fe(e){if(!u)return void alert("Please log in first");const t=I.find(t=>t.id===e);if(!t)return void alert("Event not found");if("admin"===p||"owner"===p||"write"===p&&t.pubkey&&t.pubkey===d){if(confirm("Are you sure you want to delete this event?"))try{if(!g)throw new Error("Signer not available for signing");const r={kind:5,created_at:Math.floor(Date.now()/1e3),tags:[["e",e]],content:""};console.log("Created delete event template:",r),console.log("User pubkey:",d),console.log("Target event:",t),console.log("Target event pubkey:",t.pubkey);const i=await g.signEvent(r);console.log("Signed delete event:",i),console.log("Signed delete event pubkey:",i.pubkey),console.log("Delete event tags:",i.tags);const o=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`;try{const e=await DI(o,i,g,d);e.success?console.log("Delete event published successfully to ORLY relay"):console.error("Failed to publish delete event:",e.reason)}catch(e){console.error("Error publishing delete event:",e)}const s=t.pubkey&&t.pubkey===d;if(s){const t=await Qh.publish(i);if(console.log("Delete event published:",t),!(t.success&&t.okCount>0))throw new Error("No relays accepted the delete event");{await new Promise(e=>setTimeout(e,2e3));try{const n=await Hh(e,{timeout:5e3});n?(console.warn("Event still exists after deletion attempt:",n),alert(`Warning: Delete event was accepted by ${t.okCount} relay(s), but the event still exists on the relay. This may indicate the relay does not properly handle delete events.`)):console.log("Event successfully deleted and verified")}catch(e){console.log("Could not fetch event after deletion (likely deleted):",e.message)}try{const t=await jh(e,{timeout:5e3});if(t.length>0){console.log(`Delete event verification: Found ${t.length} delete event(s) targeting ${e}`);const n=t.find(e=>e.pubkey&&e.pubkey===d);n?console.log("Our delete event found in database:",n.id):console.warn("Our delete event not found in database, but other delete events exist")}else console.warn("No delete events found in database for target event:",e)}catch(e){console.log("Could not verify delete event in database:",e.message)}n(97,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),P=P.filter(t=>t.id!==e);for(const[t,n]of R)n.events&&(n.events=n.events.filter(t=>t.id!==e),R.set(t,n));me(),console.log("Reloading events to show delete event...");const r=DE&&u&&d?[d]:null;await Te(!0,r),alert(`Event deleted successfully (accepted by ${t.okCount} relay(s))`)}}else{const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,r=new Fh;await r.connectToRelay(t);const o=await r.publish(i);if(console.log("Delete event published to local relay only:",o),!(o.success&&o.okCount>0))throw new Error("Local relay did not accept the delete event");{await new Promise(e=>setTimeout(e,2e3));try{const t=await Hh(e,{timeout:5e3});t?(console.warn("Event still exists after deletion attempt:",t),alert(`Warning: Delete event was accepted by ${o.okCount} relay(s), but the event still exists on the relay. This may indicate the relay does not properly handle delete events.`)):console.log("Event successfully deleted and verified")}catch(e){console.log("Could not fetch event after deletion (likely deleted):",e.message)}try{const t=await jh(e,{timeout:5e3});if(t.length>0){console.log(`Delete event verification: Found ${t.length} delete event(s) targeting ${e}`);const n=t.find(e=>e.pubkey&&e.pubkey===d);n?console.log("Our delete event found in database:",n.id):console.warn("Our delete event not found in database, but other delete events exist")}else console.warn("No delete events found in database for target event:",e)}catch(e){console.log("Could not verify delete event in database:",e.message)}n(97,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),P=P.filter(t=>t.id!==e);for(const[t,n]of R)n.events&&(n.events=n.events.filter(t=>t.id!==e),R.set(t,n));me(),console.log("Reloading events to show delete event...");const t=DE&&u&&d?[d]:null;await Te(!0,t),alert("Event deleted successfully (local relay only - admin/owner deleting other user's event)")}}}catch(e){console.error("Failed to delete event:",e),alert("Failed to delete event: "+e.message)}}else alert("You do not have permission to delete this event")}async function he(){const e=oe?parseInt(oe):ie;if(null==e||isNaN(e))console.log("No valid kind to load, kindToUse:",e);else if(u){console.log("Loading recovery events for kind:",e,"user:",d),n(39,ae=!0);try{const t=[{kinds:[e],authors:[d],limit:100}];ce&&(t[0].until=ce),console.log("Recovery filters:",t);const r=await qh(t,{timeout:3e4,cacheFirst:!0});console.log("Recovery events received:",r.length),console.log("Recovery events kinds:",r.map(e=>e.kind)),n(38,se=ce?[...se,...r]:r),r.length>0?(ce=Math.min(...r.map(e=>e.created_at)),n(40,le=100===r.length)):n(40,le=!1)}catch(e){console.error("Failed to load recovery events:",e)}finally{n(39,ae=!1)}}else console.log("Not logged in, cannot load recovery events")}async function pe(e){if(confirm("Are you sure you want to repost this event?"))try{const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`;console.log("Reposting event to local relay:",t,e);const r={...e};if(r.created_at=Math.floor(Date.now()/1e3),r.id="",r.sig="",e.kind>=3e4&&e.kind<=39999){const t=e.tags.find(e=>"d"===e[0]);t&&(r.tags=r.tags.filter(e=>"d"!==e[0]),r.tags.push(t))}if(g){const e=await g.signEvent(r);console.log("Signed event for repost:",e);const i=await Qh.publish(e,[t]);console.log("Repost publish result:",i),i.success&&i.okCount>0?(alert("Event reposted successfully!"),n(40,le=!1),await he()):alert("Failed to repost event. Check console for details.")}else alert("No signer available. Please log in.")}catch(e){console.error("Error reposting event:",e),alert("Error reposting event: "+e.message)}}async function ge(e){if(confirm("Are you sure you want to repost this event to all your write relays?"))try{const t=await async function(){if(!d)return[];try{const e=await Nh([{kinds:[10002],authors:[d],limit:1}]);if(0===e.length)return console.log("No relay list event found for user"),[];const t=e[0];console.log("Found relay list event:",t);const n=[];for(const e of t.tags)if("r"===e[0]&&e.length>=2){const t=e[1],r=e.length>=3?e[2]:null;r&&"write"!==r||n.push(t)}return console.log("Found write relays:",n),n}catch(e){return console.error("Error fetching user write relays:",e),[]}}(),r=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,i=[r,...t.filter(e=>e!==r)];1===i.length&&alert("No write relays found in your relay list. Only posting to local relay."),console.log("Reposting event to all relays:",i,e);const o={...e};if(o.created_at=Math.floor(Date.now()/1e3),o.id="",o.sig="",e.kind>=3e4&&e.kind<=39999){const t=e.tags.find(e=>"d"===e[0]);t&&(o.tags=o.tags.filter(e=>"d"!==e[0]),o.tags.push(t))}if(g){const e=await g.signEvent(o);console.log("Signed event for repost to all:",e);const t=await Qh.publish(e,i);console.log("Repost to all publish result:",t),t.success&&t.okCount>0?(alert(`Event reposted successfully to ${i.length} relays!`),n(40,le=!1),await he()):alert("Failed to repost event. Check console for details.")}else alert("No signer available. Please log in.")}catch(e){console.error("Error reposting event to all:",e),alert("Error reposting event to all: "+e.message)}}if("undefined"!=typeof window&&window.matchMedia){const e=window.matchMedia("(prefers-color-scheme: dark)");l=e.matches,e.addEventListener("change",e=>{n(0,l=e.matches)})}if("undefined"!=typeof localStorage){const e=localStorage.getItem("nostr_auth_method"),t=localStorage.getItem("nostr_pubkey");e&&t&&(u=!0,d=t,f=e,"extension"===e&&window.nostr&&(g=window.nostr),Pe(),$e()),function(){if("undefined"==typeof localStorage)return;try{const t=localStorage.getItem("app_state");if(t){const r=JSON.parse(t);r.selectedTab&&Ce.some(e=>e.id===r.selectedTab)&&n(5,w=r.selectedTab),r.expandedEvents&&n(19,B=new Set(r.expandedEvents)),r.globalEventsCache&&(P=r.globalEventsCache),r.globalCacheTimestamp&&(U=r.globalCacheTimestamp),void 0!==r.hasMoreEvents&&(F=r.hasMoreEvents),r.oldestEventTimestamp&&(Q=r.oldestEventTimestamp),void 0!==r.hasMoreMyEvents&&(N=r.hasMoreMyEvents),r.oldestMyEventTimestamp&&(L=r.oldestMyEventTimestamp),P.length>0&&((e=U)&&Date.now()-et.created_at-e.created_at),U=Date.now(),me()}async function we(){if(u&&"owner"===p&&q)try{n(23,H=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});e.ok?n(21,M=await e.json()):ke("Failed to load sprocket status","error")}catch(e){ke(`Error loading sprocket status: ${e.message}`,"error")}finally{n(23,H=!1)}}async function ve(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/versions",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/versions")}`,"Content-Type":"application/json"}});e.ok?n(22,_=await e.json()):ke("Failed to load versions","error")}catch(e){ke(`Error loading versions: ${e.message}`,"error")}finally{n(23,H=!1)}}async function Ae(e){u&&"owner"===p&&(n(20,O=e.content),ke(`Loaded version: ${e.name}`,"success"))}async function be(e){if(u&&"owner"===p&&confirm(`Are you sure you want to delete version ${e}?`))try{n(23,H=!0);const t=await fetch("/api/sprocket/delete-version",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/delete-version")}`,"Content-Type":"application/json"},body:JSON.stringify({filename:e})});if(t.ok)ke(`Version ${e} deleted successfully`,"success"),await ve();else{ke(`Failed to delete version: ${await t.text()}`,"error")}}catch(e){ke(`Error deleting version: ${e.message}`,"error")}finally{n(23,H=!1)}}function ke(e,t="info"){n(24,j=e),n(25,G=t),setTimeout(()=>{n(24,j="")},5e3)}function Ie(e,t="info"){n(29,z=e),n(30,W=t),"error"!==t&&setTimeout(()=>{n(29,z="")},5e3)}async function Ee(){if(n(31,Z=[]),!J.trim())return n(31,Z=["Policy JSON is empty"]),Ie("Validation failed","error"),!1;try{const e=JSON.parse(J);if("object"!=typeof e||null===e)return n(31,Z=["Policy must be a JSON object"]),Ie("Validation failed","error"),!1;if(e.policy_admins)if(Array.isArray(e.policy_admins))for(const t of e.policy_admins)"string"==typeof t&&/^[0-9a-fA-F]{64}$/.test(t)||Z.push(`Invalid policy_admin pubkey: ${t}`);else Z.push("policy_admins must be an array");if(e.rules)if("object"!=typeof e.rules)Z.push("rules must be an object");else for(const[t,n]of Object.entries(e.rules))if(/^\d+$/.test(t)||Z.push(`Invalid kind number: ${t}`),n.tag_validation&&"object"==typeof n.tag_validation)for(const[e,t]of Object.entries(n.tag_validation))try{new RegExp(t)}catch(n){Z.push(`Invalid regex for tag '${e}': ${t}`)}return e.default_policy&&!["allow","deny"].includes(e.default_policy)&&Z.push("default_policy must be 'allow' or 'deny'"),Z.length>0?(Ie("Validation failed - see errors below","error"),!1):(Ie("Validation passed","success"),!0)}catch(e){return n(31,Z=[`JSON parse error: ${e.message}`]),Ie("Invalid JSON syntax","error"),!1}}const Ce=[{id:"export",icon:"📤",label:"Export"},{id:"import",icon:"💾",label:"Import",requiresAdmin:!0},{id:"events",icon:"📡",label:"Events"},{id:"blossom",icon:"🌸",label:"Blossom"},{id:"bunker",icon:"🔐",label:"Bunker",requiresWrite:!0},{id:"compose",icon:"✏️",label:"Compose",requiresWrite:!0},{id:"recovery",icon:"🔄",label:"Recovery"},{id:"managed-acl",icon:"🛡️",label:"Managed ACL",requiresOwner:!0},{id:"sprocket",icon:"⚙️",label:"Sprocket",requiresOwner:!0},{id:"policy",icon:"📜",label:"Policy",requiresOwner:!0},{id:"logs",icon:"📋",label:"Logs",requiresOwner:!0}];function xe(e){n(5,w=e),"sprocket"===e&&u&&"owner"===p&&q&&(we(),ve()),me()}function Be(){n(15,y=!1)}function Se(e){Fe(e)}function Fe(e){n(6,k=k.filter(t=>t.id!==e)),R.delete(e),w===e&&n(5,w="export")}async function Qe(e,t=!0){const n=R.get(e);if(n&&!n.isLoading){n.isLoading=!0,R.set(e,n);try{const r={...n.filter};!t&&n.oldestTimestamp&&(r.until=n.oldestTimestamp),t||(r.limit=200),console.log("Loading search results with filter:",r);const i=await _h([r],{timeout:3e4});if(console.log("Received search results:",i.length,"events"),n.events=t?i.sort((e,t)=>t.created_at-e.created_at):[...n.events,...i].sort((e,t)=>t.created_at-e.created_at),i.length>0){const e=Math.min(...i.map(e=>e.created_at));(!n.oldestTimestamp||e0){const e=o.filter(e=>e.pubkey&&e.pubkey!==d);e.length>0&&console.warn("Server returned non-user events:",e.length,"out of",o.length)}if(e?(n(97,I=o.sort((e,t)=>t.created_at-e.created_at)),ye(o)):(n(97,I=[...I,...o].sort((e,t)=>t.created_at-e.created_at)),ye(I)),o.length>0){const e=Math.min(...o.map(e=>e.created_at));(!Q||e{if("events"===w){const e=document.querySelectorAll(".events-view-content")[0];e&&e.scrollHeight<=e.clientHeight&&Ne()}},100)}catch(e){console.error("Failed to load events:",e),alert("Failed to load events: "+e.message)}finally{n(7,S=!1)}}}async function Ne(){await Te(!1)}let Le=!1;async function Oe(e,t){if(!u||!d)throw new Error("Not logged in");const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",window.location.origin+e],["method",t.toUpperCase()]],content:"",pubkey:d};let r;if(g&&"extension"===f)try{r=await g.signEvent(n)}catch(e){throw new Error("Failed to sign with extension: "+e.message)}else{if("nsec"!==f)throw new Error("No valid signer available");n.id="mock-id-"+Date.now(),n.sig="mock-signature-"+Date.now(),r=n}const i=JSON.stringify(r);return`Nostr ${btoa(i)}`}async function Me(e,t){if(!u||!d)throw new Error("Not logged in");const n={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",window.location.origin+t],["method",e.toUpperCase()]],content:"",pubkey:d};let r;if(g&&"extension"===f)try{r=await g.signEvent(n)}catch(e){throw new Error("Failed to sign with extension: "+e.message)}else{if("nsec"!==f)throw new Error("No valid signer available");n.id="mock-id-"+Date.now(),n.sig="mock-signature-"+Date.now(),r=n}const i=JSON.stringify(r);return btoa(i)}function _e(e,t){const n=e.toLowerCase();if(n.includes("policy")||n.includes("blocked")||n.includes("denied")){let n=`Policy Error: ${e}`;return null!==t&&(n+=`\n\nKind ${t} may be restricted by the relay's policy configuration.`),V&&(n+="\n\nThe relay has policy enforcement enabled. Contact a relay administrator to allow this event kind or adjust your permissions."),n}if(n.includes("auth")||n.includes("permission")||n.includes("unauthorized"))return`Permission Error: ${e}\n\nYour current permissions may not allow publishing this type of event. Current role: ${p||"unknown"}. Contact a relay administrator to upgrade your permissions.`;if(n.includes("kind")||n.includes("not allowed")||n.includes("restricted")){let n=`Event Type Error: ${e}`;return null!==t&&(n+=`\n\nKind ${t} is not currently allowed on this relay.`),n+="\n\nThe relay administrator may need to update the policy configuration to allow this event kind.",n}return n.includes("rate")||n.includes("limit")||n.includes("too many")?`Rate Limit Error: ${e}\n\nPlease wait a moment before trying again.`:n.includes("size")||n.includes("too large")||n.includes("content")?`Size Limit Error: ${e}\n\nThe event may exceed the relay's size limits. Try reducing the content length.`:`Publishing failed: ${e}`}function He(e){n(98,D=e),localStorage.setItem("viewAsRole",e),console.log("View as role changed to:",e,"Current effective role:",a)}D=localStorage.getItem("viewAsRole")||"";return e.$$.update=()=>{var t;if(6&e.$$.dirty[0]|16&e.$$.dirty[3]&&n(42,r=I.sort((e,t)=>t.created_at-e.created_at)),8&e.$$.dirty[0]&&n(41,i=h?.about?(t=h.about,t?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):"").replace(/\n{2,}/g,"
"):""),16&e.$$.dirty[0]|32&e.$$.dirty[3]&&n(10,a=D&&""!==D?D:p),1810&e.$$.dirty[0]|96&e.$$.dirty[3]&&n(101,o=Ce.filter(e=>{const t=a;return!(e.requiresAdmin&&(!u||"admin"!==t&&"owner"!==t))&&(!(e.requiresOwner&&(!u||"owner"!==t))&&(!(e.requiresWrite&&(!u||"read"===t))&&(!("sprocket"===e.id&&!q)&&(!("policy"===e.id&&!V)&&(("managed-acl"!==e.id||"managed"===ee)&&(console.log(`Tab ${e.id} filter check:`,{isLoggedIn:u,userRole:p,viewAsRole:D,currentRole:t,requiresAdmin:e.requiresAdmin,requiresOwner:e.requiresOwner,requiresWrite:e.requiresWrite,visible:!0}),!0))))))})),64&e.$$.dirty[0]|256&e.$$.dirty[3]&&n(11,s=[...o,...k]),2578&e.$$.dirty[0]|256&e.$$.dirty[3]&&console.log("Tabs debug:",{isLoggedIn:u,userRole:p,aclMode:ee,filteredBaseTabs:o.map(e=>e.id),allTabs:s.map(e=>e.id)}),1&e.$$.dirty[0]&&"undefined"!=typeof document&&(l?document.body.classList.add("dark-theme"):document.body.classList.remove("dark-theme")),14&e.$$.dirty[0]&&u&&d&&!h&&Re(),182&e.$$.dirty[0]|144&e.$$.dirty[3]&&"events"===w&&u&&("read"===p||"write"===p||"admin"===p||"owner"===p)&&0===I.length&&!Le&&!S){n(100,Le=!0);Te(!0,null)}32&e.$$.dirty[0]|16&e.$$.dirty[3]&&("events"!==w||"events"===w&&I.length>0)&&n(100,Le=!1),32&e.$$.dirty[0]&&localStorage.setItem("selectedTab",w)},[l,u,d,h,p,w,k,S,V,ee,a,s,c,g,m,y,v,E,C,B,O,M,_,H,j,G,K,J,Y,z,W,Z,X,te,ne,re,ie,oe,se,ae,le,i,r,R,ue,de,async function(){console.log("Toggle changed, showOnlyMyEvents:",DE),n(100,Le=!1),await Te(!0,null)},fe,he,pe,ge,function(){console.log("selectRecoveryKind called, recoverySelectedKind:",ie),null!=ie?(n(37,oe=""),n(38,se=[]),ce=null,n(40,le=!0),he()):console.log("No kind selected, skipping load")},function(){console.log("handleCustomKindInput called, recoveryCustomKind:",oe);const e=parseInt(oe);""!==oe&&!isNaN(e)&&e>=0&&(n(36,ie=null),n(38,se=[]),ce=null,n(40,le=!0),he())},function(e){const t=se.filter(t=>t.kind===e.kind&&t.pubkey===e.pubkey),n=Math.max(...t.map(e=>e.created_at));return e.created_at===n},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(20,O=t.script_content||""),n(21,M=t),ke("Script loaded successfully","success")}else ke("Failed to load script","error")}catch(e){ke(`Error loading script: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:O});if(e.ok)ke("Script saved and updated successfully","success"),await we(),await ve();else{ke(`Failed to save script: ${await e.text()}`,"error")}}catch(e){ke(`Error saving script: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p)try{n(23,H=!0);const e=await fetch("/api/sprocket/restart",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/restart")}`,"Content-Type":"application/json"}});if(e.ok)ke("Sprocket restarted successfully","success"),await we();else{ke(`Failed to restart sprocket: ${await e.text()}`,"error")}}catch(e){ke(`Error restarting sprocket: ${e.message}`,"error")}finally{n(23,H=!1)}},async function(){if(u&&"owner"===p&&confirm("Are you sure you want to delete the sprocket script? This will stop the current process."))try{n(23,H=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:""});if(e.ok)n(20,O=""),ke("Sprocket script deleted successfully","success"),await we(),await ve();else{ke(`Failed to delete script: ${await e.text()}`,"error")}}catch(e){ke(`Error deleting script: ${e.message}`,"error")}finally{n(23,H=!1)}},ve,Ae,be,async function(){if(u&&("owner"===p||RE))try{n(28,Y=!0),n(31,Z=[]);const e={kinds:[12345],limit:1},t=await qh(e);if(t&&t.length>0){n(27,J=t[0].content);try{n(27,J=JSON.stringify(JSON.parse(J),null,2))}catch(e){}Ie("Policy loaded successfully","success")}else{const e=await fetch("/api/policy",{method:"GET",headers:{Authorization:`Nostr ${await Me("GET","/api/policy")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(27,J=JSON.stringify(t,null,2)),Ie("Policy loaded from file","success")}else Ie("No policy configuration found","info"),n(27,J="")}}catch(e){Ie(`Error loading policy: ${e.message}`,"error")}finally{n(28,Y=!1)}},Ee,async function(){if(!u||"owner"!==p&&!RE)return;if(await Ee())try{n(28,Y=!0);const e={kind:12345,created_at:Math.floor(Date.now()/1e3),tags:[],content:J},t=await DI(e,g);t.success?Ie("Policy updated successfully","success"):Ie(`Failed to publish policy: ${t.error||"Unknown error"}`,"error")}catch(e){Ie(`Error saving policy: ${e.message}`,"error")}finally{n(28,Y=!1)}},function(){try{const e=JSON.parse(J);n(27,J=JSON.stringify(e,null,2)),Ie("JSON formatted","success")}catch(e){Ie(`Cannot format: ${e.message}`,"error")}},function(e){const t=e.detail;if(!t)return void Ie("Please enter a pubkey","error");const r=function(e){if(!e)return null;if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(e.startsWith("npub1"))try{const t="qpzry9x8gf2tvdw0s3jn54khce6mua7l",n=e.slice(5);let r=[];for(const e of n){const n=t.indexOf(e.toLowerCase());if(-1===n)throw new Error("Invalid character in npub");r.push(...[...Array(5)].map((e,t)=>n>>4-t&1))}r=r.slice(0,-30);const i=[];for(let e=0;e+8<=r.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|r[e+n];i.push(t)}return i.map(e=>e.toString(16).padStart(2,"0")).join("")}catch(e){return console.error("Failed to decode npub:",e),null}return null}(t);if(r&&64===r.length)try{const e=JSON.parse(J||"{}");if(e.policy_admins||(e.policy_admins=[]),e.policy_admins.includes(r))return void Ie("Admin already in list","warning");e.policy_admins.push(r),n(27,J=JSON.stringify(e,null,2)),Ie("Admin added - click 'Save & Publish' to apply","info")}catch(e){Ie(`Error adding admin: ${e.message}`,"error")}else Ie("Invalid pubkey format. Use hex (64 chars) or npub","error")},function(e){const t=e.detail;try{const e=JSON.parse(J||"{}");e.policy_admins&&(e.policy_admins=e.policy_admins.filter(e=>e!==t),n(27,J=JSON.stringify(e,null,2)),Ie("Admin removed - click 'Save & Publish' to apply","info"))}catch(e){Ie(`Error removing admin: ${e.message}`,"error")}},async function(){if(u&&("owner"===p||RE))try{n(28,Y=!0),n(32,X=[]);let e=[];try{e=JSON.parse(J||"{}").policy_admins||[]}catch(e){return void Ie("Cannot parse policy JSON to get admins","error")}if(0===e.length)return void Ie("No policy admins configured","warning");const t={kinds:[3],authors:e,limit:e.length},r=await qh(t),i=new Set;for(const e of r)if(e.tags)for(const t of e.tags)"p"===t[0]&&t[1]&&64===t[1].length&&i.add(t[1]);n(32,X=Array.from(i)),Ie(`Loaded ${X.length} follows from ${r.length} admin(s)`,"success")}catch(e){Ie(`Error loading follows: ${e.message}`,"error")}finally{n(28,Y=!1)}},function(e){n(26,K=e.target.files[0])},async function(){if(u&&"owner"===p&&K)try{n(23,H=!0);const e=await K.text(),t=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:e});if(t.ok)n(20,O=e),ke("Script uploaded and updated successfully","success"),await we(),await ve();else{ke(`Failed to upload script: ${await t.text()}`,"error")}}catch(e){ke(`Error uploading script: ${e.message}`,"error")}finally{n(23,H=!1),n(26,K=null);const e=document.getElementById("sprocket-upload-file");e&&(e.value="")}},xe,function(){u||n(12,c=!0)},async function(e){const{method:t,pubkey:r,privateKey:i,signer:o}=e.detail;n(1,u=!0),n(2,d=r),f=t,n(13,g=o),n(12,c=!1),n(14,m="nsec"===t&&i?i:null);try{if(await Gh(),"extension"===t&&o)Qh.setSigner(o);else if("nsec"===t&&i){const e=new xf(i);Qh.setSigner(e)}n(3,h=await Oh(r)),console.log("Profile loaded:",h)}catch(e){console.error("Failed to load profile:",e)}await Pe(),await $e()},function(){n(1,u=!1),n(2,d=""),f="",n(3,h=null),n(4,p=""),n(13,g=null),n(14,m=null),n(15,y=!1),T=[],n(97,I=[]),P=[],U=0,me(),"undefined"!=typeof localStorage&&(localStorage.removeItem("nostr_auth_method"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_privkey"))},function(){n(12,c=!1)},function(){n(15,y=!0)},Be,function(){n(16,v=!v)},function(e){const{searchText:t,selectedKinds:n,pubkeys:r,eventIds:i,tags:o,sinceTimestamp:s,untilTimestamp:a,limit:l}=e.detail,c=function({searchText:e=null,kinds:t=[],authors:n=[],ids:r=[],tags:i=[],since:o=null,until:s=null,limit:a=null}){const l={};return e&&e.trim()&&(l.search=e.trim()),t&&t.length>0&&(l.kinds=t),n&&n.length>0&&(l.authors=n),r&&r.length>0&&(l.ids=r),i&&i.length>0&&i.forEach(e=>{if(e.name&&e.value){const t=`#${e.name}`;l[t]||(l[t]=[]),l[t].push(e.value)}}),o&&(l.since=o),s&&(l.until=s),a&&a>0&&(l.limit=a),l}({searchText:t,kinds:n,authors:r,ids:i,tags:o,since:s,until:a,limit:l||100});A=c,Te(!0,null)},function(){A={},Te(!0,null)},Se,Fe,Qe,De,Re,async function(){await Ue([])},async function(){await Ue([d])},function(e){n(17,E=e.detail.target.files[0])},async function(){if("none"!==ee&&(!u||"admin"!==p&&"owner"!==p))return n(18,C="Admin or owner permission required"),void setTimeout(()=>{n(18,C="")},5e3);if(!E)return n(18,C="Please select a file"),void setTimeout(()=>{n(18,C="")},5e3);try{n(18,C="Uploading...");const e={};"none"!==ee&&u&&(e.Authorization=await Oe("/api/import","POST"));const t=new FormData;t.append("file",E);const r=await fetch("/api/import",{method:"POST",headers:e,body:t});if(!r.ok)throw new Error(`Import failed: ${r.status} ${r.statusText}`);await r.json();n(18,C="Upload complete"),n(17,E=null),document.getElementById("import-file").value="",setTimeout(()=>{n(18,C="")},5e3)}catch(e){console.error("Import failed:",e),n(18,C="Import failed: "+e.message),setTimeout(()=>{n(18,C="")},5e3)}},Te,function(e){const{scrollTop:t,scrollHeight:n,clientHeight:r}=e.target;n-t-r<100&&Ne()},function(){try{if(!ne.trim())return void alert("Please enter some JSON to reformat");const e=JSON.parse(ne);n(34,ne=JSON.stringify(e,null,2))}catch(e){alert("Invalid JSON: "+e.message)}},async function(){try{if(!ne.trim())return void alert("Please enter an event to sign");if(!u||!d)return void alert("Please log in to sign events");if(!g)return void alert("No signer available. Please log in with a valid authentication method.");const e=JSON.parse(ne);e.pubkey=d,e.created_at=Math.floor(Date.now()/1e3),delete e.id,delete e.sig;const t=await g.signEvent(e);n(34,ne=JSON.stringify(t,null,2)),alert("Event signed successfully!")}catch(e){console.error("Error signing event:",e),alert("Error signing event: "+e.message)}},async function(){n(35,re="");try{if(!ne.trim())return void n(35,re="Please enter an event to publish");if(!u)return void n(35,re="Please log in to publish events");if(!g)return void n(35,re="No signer available. Please log in with a valid authentication method.");let e;try{e=JSON.parse(ne)}catch(e){return void n(35,re=`Invalid JSON: ${e.message}`)}if(!e.id||!e.sig)return void n(35,re='Event must be signed before publishing. Please click "Sign" first.');if("read"===p)return void n(35,re=`Permission denied: Your current role is "${p}" which does not allow publishing events. Contact a relay administrator to upgrade your permissions.`);const t=`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`,r=await DI(t,e,g,d);if(r.success)n(35,re=""),alert("Event published successfully to ORLY relay!");else{const t=r.reason||"Unknown error";n(35,re=_e(t,e.kind))}}catch(e){console.error("Error publishing event:",e);const t=e.message||"Unknown error";n(35,re=_e(t,null))}},function(){n(35,re="")},He,function(){const e=["owner","admin","write","read"],t=e.indexOf(p);return-1===t?["read"]:e.slice(t)},I,D,q,Le,o,function(t){$.call(this,e,t)},function(t){$.call(this,e,t)},e=>e.id===w,e=>xe(e.detail),e=>Fe(e.detail),e=>ue(e.detail),e=>fe(e.detail),e=>de(e.detail.event,e.detail.e),e=>Te(e.detail.refresh,e.detail.authors),function(e){ne=e,n(34,ne)},function(e){O=e,n(20,O)},e=>Ae(e.detail),e=>be(e.detail),function(e){J=e,n(27,J)},function(){ie=x(this),n(36,ie)},function(){oe=b(this.value),n(37,oe)},e=>ge(e),e=>pe(e),(e,t)=>de(e,t),e=>Qe(e.id,!0),e=>Se(e.id),e=>fe(e.id),e=>ue(e.id),(e,t)=>"Enter"===t.key&&ue(e.id),(e,t)=>de(e,t),(e,t)=>De(t,e.id),e=>He(e===p?"":e),e=>"Escape"===e.key&&Be(),function(e){c=e,n(12,c)}]}return new class extends ae{constructor(e){super(),se(this,e,PE,QE,o,{},null,[-1,-1,-1,-1,-1,-1])}}({target:document.body,props:{name:"world"}})}(); //# sourceMappingURL=bundle.js.map diff --git a/app/web/dist/bundle.js.map b/app/web/dist/bundle.js.map index 73c8cc9..bba76bf 100644 --- a/app/web/dist/bundle.js.map +++ b/app/web/dist/bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"bundle.js","sources":["../node_modules/svelte/internal/index.mjs","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/_assert.js","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/crypto.js","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/utils.js","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/_sha2.js","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/sha256.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/abstract/utils.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/abstract/modular.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/abstract/curve.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/abstract/weierstrass.js","../node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes/esm/hmac.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/_shortw_utils.js","../node_modules/nostr-tools/node_modules/@noble/curves/esm/secp256k1.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/crypto.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/utils.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/_assert.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/_sha2.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/sha256.js","../node_modules/nostr-tools/lib/esm/pool.js","../node_modules/nostr-tools/node_modules/@scure/base/lib/esm/index.js","../node_modules/@noble/ciphers/esm/_assert.js","../node_modules/@noble/ciphers/esm/utils.js","../node_modules/@noble/ciphers/esm/aes.js","../node_modules/@noble/ciphers/esm/_arx.js","../node_modules/@noble/ciphers/esm/chacha.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/hmac.js","../node_modules/nostr-tools/node_modules/@noble/hashes/esm/hkdf.js","../node_modules/nostr-tools/lib/esm/index.js","../node_modules/nostr-tools/lib/esm/kinds.js","../node_modules/tslib/tslib.es6.mjs","../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../node_modules/rxjs/dist/esm5/internal/Subscription.js","../node_modules/rxjs/dist/esm5/internal/config.js","../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../node_modules/rxjs/dist/esm5/internal/util/noop.js","../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../node_modules/rxjs/dist/esm5/internal/util/identity.js","../node_modules/rxjs/dist/esm5/internal/Observable.js","../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../node_modules/rxjs/dist/esm5/internal/util/lift.js","../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js","../node_modules/rxjs/dist/esm5/internal/Subject.js","../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../node_modules/rxjs/dist/esm5/internal/ReplaySubject.js","../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../node_modules/rxjs/dist/esm5/internal/observable/empty.js","../node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../node_modules/rxjs/dist/esm5/internal/util/args.js","../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../node_modules/rxjs/dist/esm5/internal/observable/from.js","../node_modules/rxjs/dist/esm5/internal/observable/of.js","../node_modules/rxjs/dist/esm5/internal/operators/map.js","../node_modules/rxjs/dist/esm5/internal/util/mapOneOrManyArgs.js","../node_modules/rxjs/dist/esm5/internal/util/argsArgArrayOrObject.js","../node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js","../node_modules/rxjs/dist/esm5/internal/util/createObject.js","../node_modules/rxjs/dist/esm5/internal/operators/mergeMap.js","../node_modules/rxjs/dist/esm5/internal/operators/mergeInternals.js","../node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js","../node_modules/rxjs/dist/esm5/internal/observable/concat.js","../node_modules/rxjs/dist/esm5/internal/operators/concatAll.js","../node_modules/rxjs/dist/esm5/internal/observable/defer.js","../node_modules/rxjs/dist/esm5/internal/observable/timer.js","../node_modules/rxjs/dist/esm5/internal/util/isDate.js","../node_modules/rxjs/dist/esm5/internal/observable/merge.js","../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../node_modules/rxjs/dist/esm5/internal/operators/take.js","../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../node_modules/rxjs/dist/esm5/internal/operators/endWith.js","../node_modules/rxjs/dist/esm5/internal/operators/finalize.js","../node_modules/rxjs/dist/esm5/internal/operators/merge.js","../node_modules/rxjs/dist/esm5/internal/operators/mergeWith.js","../node_modules/rxjs/dist/esm5/internal/operators/scan.js","../node_modules/rxjs/dist/esm5/internal/operators/scanInternals.js","../node_modules/rxjs/dist/esm5/internal/operators/share.js","../node_modules/rxjs/dist/esm5/internal/operators/switchMap.js","../node_modules/rxjs/dist/esm5/internal/operators/tap.js","../node_modules/applesauce-core/dist/helpers/tags.js","../node_modules/nostr-tools/lib/esm/pure.js","../node_modules/applesauce-core/dist/helpers/cache.js","../node_modules/nostr-tools/lib/esm/utils.js","../node_modules/applesauce-core/dist/helpers/event.js","../node_modules/applesauce-core/dist/helpers/time.js","../node_modules/applesauce-core/dist/helpers/expiration.js","../node_modules/nostr-tools/lib/esm/nip19.js","../node_modules/applesauce-core/dist/helpers/url.js","../node_modules/applesauce-core/dist/helpers/relays.js","../node_modules/applesauce-core/dist/helpers/string.js","../node_modules/@noble/hashes/esm/crypto.js","../node_modules/@noble/hashes/esm/utils.js","../node_modules/applesauce-core/dist/helpers/pointers.js","../node_modules/applesauce-core/dist/helpers/groups.js","../node_modules/applesauce-core/dist/helpers/encrypted-content.js","../node_modules/applesauce-core/dist/helpers/hidden-content.js","../node_modules/applesauce-core/dist/helpers/hidden-tags.js","../node_modules/applesauce-core/dist/helpers/event-tags.js","../node_modules/applesauce-core/dist/helpers/lru.js","../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../node_modules/applesauce-core/dist/logger.js","../node_modules/applesauce-core/dist/event-store/event-memory.js","../node_modules/hash-sum/hash-sum.js","../node_modules/applesauce-core/dist/helpers/filter.js","../node_modules/applesauce-core/dist/models/blossom.js","../node_modules/applesauce-core/dist/helpers/blossom.js","../node_modules/applesauce-core/dist/helpers/profile.js","../node_modules/applesauce-core/dist/helpers/json.js","../node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.js","../node_modules/light-bolt11-decoder/bolt11.js","../node_modules/applesauce-core/dist/helpers/comment.js","../node_modules/applesauce-core/dist/helpers/contacts.js","../node_modules/applesauce-core/dist/helpers/encrypted-content-cache.js","../node_modules/applesauce-core/dist/helpers/event-cache.js","../node_modules/applesauce-core/dist/helpers/lnurl.js","../node_modules/applesauce-core/dist/helpers/mailboxes.js","../node_modules/applesauce-core/dist/helpers/mutes.js","../node_modules/applesauce-core/dist/helpers/reports.js","../node_modules/applesauce-core/dist/helpers/threading.js","../node_modules/applesauce-core/dist/observable/claim-events.js","../node_modules/applesauce-core/dist/observable/claim-latest.js","../node_modules/applesauce-core/dist/observable/defined.js","../node_modules/applesauce-core/dist/observable/with-immediate-value.js","../node_modules/applesauce-core/dist/models/common.js","../node_modules/rxjs/dist/esm5/internal/operators/ignoreElements.js","../node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js","../node_modules/rxjs/dist/esm5/internal/operators/repeat.js","../node_modules/applesauce-core/dist/observable/watch-event-updates.js","../node_modules/applesauce-core/dist/models/contacts.js","../node_modules/applesauce-core/dist/models/comments.js","../node_modules/applesauce-core/dist/models/mailboxes.js","../node_modules/applesauce-core/dist/models/mutes.js","../node_modules/applesauce-core/dist/models/profile.js","../node_modules/applesauce-core/dist/models/reactions.js","../node_modules/applesauce-core/dist/models/thread.js","../node_modules/applesauce-core/dist/event-store/model-mixin.js","../node_modules/applesauce-core/dist/event-store/event-store.js","../node_modules/applesauce-core/dist/helpers/delete.js","../node_modules/applesauce-core/dist/promise/deferred.js","../node_modules/applesauce-signers/dist/signers/amber-clipboard-signer.js","../node_modules/applesauce-signers/dist/helpers/nostr-connect.js","../node_modules/applesauce-signers/dist/signers/private-key-signer.js","../node_modules/applesauce-signers/node_modules/@noble/secp256k1/lib/esm/index.js","../node_modules/applesauce-signers/node_modules/@scure/base/lib/esm/index.js","../node_modules/applesauce-signers/dist/signers/serial-port-signer.js","../src/constants.js","../src/nostr.js","../node_modules/hash-wasm/dist/index.esm.js","../src/nsec-crypto.js","../src/LoginModal.svelte","../src/ManagedACL.svelte","../src/Header.svelte","../src/Sidebar.svelte","../src/ExportView.svelte","../src/ImportView.svelte","../src/helpers.tsx","../src/FilterBuilder.svelte","../src/EventsView.svelte","../src/eventKinds.js","../src/EventTemplateSelector.svelte","../src/ComposeView.svelte","../src/SprocketView.svelte","../src/PolicyView.svelte","../src/BlossomView.svelte","../node_modules/qrcode/lib/core/utils.js","../node_modules/qrcode/lib/core/bit-buffer.js","../node_modules/qrcode/lib/core/error-correction-level.js","../node_modules/qrcode/lib/core/bit-matrix.js","../node_modules/qrcode/lib/core/alignment-pattern.js","../node_modules/qrcode/lib/core/finder-pattern.js","../node_modules/qrcode/lib/core/mask-pattern.js","../node_modules/qrcode/lib/core/error-correction-code.js","../node_modules/qrcode/lib/core/galois-field.js","../node_modules/qrcode/lib/core/polynomial.js","../node_modules/qrcode/lib/core/reed-solomon-encoder.js","../node_modules/qrcode/lib/core/version-check.js","../node_modules/qrcode/lib/core/regex.js","../node_modules/qrcode/lib/core/mode.js","../node_modules/qrcode/lib/core/version.js","../node_modules/qrcode/lib/core/format-info.js","../node_modules/qrcode/lib/core/numeric-data.js","../node_modules/qrcode/lib/core/alphanumeric-data.js","../node_modules/qrcode/lib/core/byte-data.js","../node_modules/qrcode/lib/core/kanji-data.js","../node_modules/dijkstrajs/dijkstra.js","../node_modules/qrcode/lib/core/segments.js","../node_modules/qrcode/lib/core/qrcode.js","../node_modules/qrcode/lib/renderer/utils.js","../node_modules/qrcode/lib/renderer/canvas.js","../node_modules/qrcode/lib/renderer/svg-tag.js","../node_modules/qrcode/lib/browser.js","../node_modules/qrcode/lib/can-promise.js","../src/api.js","../node_modules/@noble/hashes/esm/_md.js","../node_modules/@noble/hashes/esm/sha2.js","../node_modules/@noble/hashes/esm/hmac.js","../node_modules/@noble/curves/esm/utils.js","../node_modules/@noble/curves/esm/abstract/modular.js","../node_modules/@noble/curves/esm/abstract/curve.js","../node_modules/@noble/curves/esm/abstract/weierstrass.js","../node_modules/@noble/curves/esm/secp256k1.js","../node_modules/@noble/curves/esm/_shortw_utils.js","../node_modules/@noble/hashes/esm/sha256.js","../src/cashu-client.js","../src/bunker-service.js","../src/BunkerView.svelte","../src/LogView.svelte","../src/FilterDisplay.svelte","../src/utils.js","../src/websocket-auth.js","../src/App.svelte","../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not \n let children = target.childNodes;\n // If target is , there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for